Merge "Use display name in category page subheadings if provided"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 28 Jul 2016 03:30:55 +0000 (03:30 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 28 Jul 2016 03:30:55 +0000 (03:30 +0000)
689 files changed:
.stylelintrc
Gemfile
Gemfile.lock
HISTORY
RELEASE-NOTES-1.27 [deleted file]
RELEASE-NOTES-1.28
autoload.php
composer.json
docs/distributors.txt
docs/extension.schema.json
docs/extension.schema.v1.json [new file with mode: 0644]
docs/hooks.txt
img_auth.php
includes/AutoLoader.php
includes/Category.php
includes/CategoryViewer.php
includes/DefaultSettings.php
includes/Defines.php
includes/DummyLinker.php
includes/EditPage.php
includes/FileDeleteForm.php
includes/GlobalFunctions.php
includes/Html.php
includes/HttpFunctions.php
includes/Linker.php
includes/ListToggle.php
includes/MediaWiki.php
includes/MediaWikiServices.php
includes/Message.php
includes/MovePage.php
includes/OutputPage.php
includes/PHPVersionCheck.php
includes/PHPVersionError.php [deleted file]
includes/Pingback.php [new file with mode: 0644]
includes/Revision.php
includes/RevisionList.php
includes/Sanitizer.php
includes/ServiceWiring.php
includes/Setup.php
includes/SiteConfiguration.php
includes/StreamFile.php
includes/Title.php
includes/WatchedItem.php
includes/WatchedItemQueryService.php [new file with mode: 0644]
includes/WatchedItemStore.php
includes/WebRequest.php
includes/WebResponse.php
includes/WikiMap.php
includes/actions/Action.php
includes/actions/HistoryAction.php
includes/api/ApiAMCreateAccount.php
includes/api/ApiBase.php
includes/api/ApiCSPReport.php [new file with mode: 0644]
includes/api/ApiClientLogin.php
includes/api/ApiEditPage.php
includes/api/ApiExpandTemplates.php
includes/api/ApiFeedContributions.php
includes/api/ApiHelp.php
includes/api/ApiLinkAccount.php
includes/api/ApiLogin.php
includes/api/ApiMain.php
includes/api/ApiOpenSearch.php
includes/api/ApiParse.php
includes/api/ApiPurge.php
includes/api/ApiQuery.php
includes/api/ApiQueryPrefixSearch.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiQueryWatchlistRaw.php
includes/api/ApiStashEdit.php
includes/api/ApiUpload.php
includes/api/SearchApi.php
includes/api/i18n/azb.json [new file with mode: 0644]
includes/api/i18n/be-tarask.json
includes/api/i18n/ca.json
includes/api/i18n/ce.json
includes/api/i18n/cs.json
includes/api/i18n/da.json [new file with mode: 0644]
includes/api/i18n/de.json
includes/api/i18n/diq.json
includes/api/i18n/en.json
includes/api/i18n/es.json
includes/api/i18n/eu.json
includes/api/i18n/fa.json
includes/api/i18n/fr.json
includes/api/i18n/gl.json
includes/api/i18n/he.json
includes/api/i18n/ia.json
includes/api/i18n/it.json
includes/api/i18n/ja.json
includes/api/i18n/ko.json
includes/api/i18n/ksh.json
includes/api/i18n/ku-latn.json
includes/api/i18n/lb.json
includes/api/i18n/mr.json
includes/api/i18n/nl.json
includes/api/i18n/pl.json
includes/api/i18n/ps.json
includes/api/i18n/pt-br.json
includes/api/i18n/pt.json
includes/api/i18n/qqq.json
includes/api/i18n/sah.json [new file with mode: 0644]
includes/api/i18n/sd.json
includes/api/i18n/sv.json
includes/api/i18n/udm.json [new file with mode: 0644]
includes/api/i18n/uk.json
includes/api/i18n/zh-hans.json
includes/auth/AbstractPreAuthenticationProvider.php
includes/auth/AbstractPrimaryAuthenticationProvider.php
includes/auth/AbstractSecondaryAuthenticationProvider.php
includes/auth/AuthManager.php
includes/auth/AuthManagerAuthPlugin.php
includes/auth/CheckBlocksSecondaryAuthenticationProvider.php
includes/auth/ConfirmLinkSecondaryAuthenticationProvider.php
includes/auth/EmailNotificationSecondaryAuthenticationProvider.php
includes/auth/LegacyHookPreAuthenticationProvider.php
includes/auth/PreAuthenticationProvider.php
includes/auth/PrimaryAuthenticationProvider.php
includes/auth/SecondaryAuthenticationProvider.php
includes/auth/Throttler.php
includes/cache/localisation/LocalisationCache.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/collation/Collation.php
includes/collation/IcuCollation.php
includes/content/AbstractContent.php
includes/content/CodeContentHandler.php
includes/content/ContentHandler.php
includes/content/TextContentHandler.php
includes/content/WikitextContentHandler.php
includes/db/DBConnRef.php
includes/db/Database.php
includes/db/DatabaseMysqlBase.php
includes/db/DatabaseOracle.php
includes/db/DatabasePostgres.php
includes/db/IDatabase.php
includes/db/loadbalancer/LBFactory.php
includes/db/loadbalancer/LoadBalancer.php
includes/debug/logger/monolog/KafkaHandler.php
includes/deferred/AtomicSectionUpdate.php
includes/deferred/AutoCommitUpdate.php [new file with mode: 0644]
includes/deferred/CallableUpdate.php [deleted file]
includes/deferred/DeferrableCallback.php [new file with mode: 0644]
includes/deferred/DeferredUpdates.php
includes/deferred/LinksDeletionUpdate.php
includes/deferred/LinksUpdate.php
includes/deferred/MWCallableUpdate.php [new file with mode: 0644]
includes/deferred/SiteStatsUpdate.php
includes/diff/DifferenceEngine.php
includes/exception/MWExceptionHandler.php
includes/export/DumpStringOutput.php [new file with mode: 0644]
includes/export/WikiExporter.php
includes/filebackend/FileBackend.php
includes/filebackend/FileBackendStore.php
includes/filebackend/MemoryFileBackend.php
includes/filebackend/SwiftFileBackend.php
includes/filebackend/lockmanager/DBLockManager.php
includes/filerepo/FileRepo.php
includes/filerepo/file/LocalFile.php
includes/gallery/ImageGalleryBase.php
includes/gallery/SlideshowImageGallery.php [new file with mode: 0644]
includes/gallery/TraditionalImageGallery.php
includes/htmlform/HTMLCheckField.php
includes/htmlform/HTMLCheckMatrix.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/HTMLMultiSelectField.php
includes/htmlform/HTMLSelectNamespaceWithButton.php
includes/htmlform/HTMLTextFieldWithButton.php
includes/import/WikiImporter.php
includes/import/WikiRevision.php
includes/installer/DatabaseUpdater.php
includes/installer/Installer.php
includes/installer/InstallerOverrides.php [new file with mode: 0644]
includes/installer/LocalSettingsGenerator.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerComplete.php
includes/installer/WebInstallerName.php
includes/installer/WebInstallerOutput.php
includes/installer/i18n/ar.json
includes/installer/i18n/ast.json
includes/installer/i18n/ba.json
includes/installer/i18n/bcl.json
includes/installer/i18n/be-tarask.json
includes/installer/i18n/bg.json
includes/installer/i18n/bn.json
includes/installer/i18n/br.json
includes/installer/i18n/cs.json
includes/installer/i18n/de.json
includes/installer/i18n/diq.json
includes/installer/i18n/el.json
includes/installer/i18n/en.json
includes/installer/i18n/es.json
includes/installer/i18n/et.json
includes/installer/i18n/fa.json
includes/installer/i18n/fi.json
includes/installer/i18n/fr.json
includes/installer/i18n/gl.json
includes/installer/i18n/gsw.json
includes/installer/i18n/he.json
includes/installer/i18n/hrx.json
includes/installer/i18n/hsb.json
includes/installer/i18n/hu.json
includes/installer/i18n/ia.json
includes/installer/i18n/id.json
includes/installer/i18n/inh.json
includes/installer/i18n/it.json
includes/installer/i18n/ja.json
includes/installer/i18n/ko.json
includes/installer/i18n/ksh.json
includes/installer/i18n/ku-latn.json
includes/installer/i18n/lb.json
includes/installer/i18n/lki.json
includes/installer/i18n/mai.json
includes/installer/i18n/mk.json
includes/installer/i18n/mr.json
includes/installer/i18n/ms.json
includes/installer/i18n/nap.json
includes/installer/i18n/nb.json
includes/installer/i18n/nl-informal.json
includes/installer/i18n/nl.json
includes/installer/i18n/oc.json
includes/installer/i18n/pl.json
includes/installer/i18n/pms.json
includes/installer/i18n/pt-br.json
includes/installer/i18n/pt.json
includes/installer/i18n/qqq.json
includes/installer/i18n/ru.json
includes/installer/i18n/sco.json
includes/installer/i18n/sk.json
includes/installer/i18n/sv.json
includes/installer/i18n/tcy.json
includes/installer/i18n/tl.json
includes/installer/i18n/tr.json
includes/installer/i18n/uk.json
includes/installer/i18n/vi.json
includes/installer/i18n/wuu.json
includes/installer/i18n/zh-hans.json
includes/installer/i18n/zh-hant.json
includes/jobqueue/jobs/DeleteLinksJob.php
includes/jobqueue/jobs/DoubleRedirectJob.php
includes/jobqueue/jobs/HTMLCacheUpdateJob.php
includes/jobqueue/jobs/RefreshLinksJob.php
includes/libs/MultiHttpClient.php
includes/libs/ReverseArrayIterator.php [new file with mode: 0644]
includes/libs/objectcache/RESTBagOStuff.php [new file with mode: 0644]
includes/libs/objectcache/WANObjectCache.php
includes/linker/LinkRenderer.php
includes/linker/LinkRendererFactory.php
includes/media/FormatMetadata.php
includes/media/MediaHandler.php
includes/media/MediaTransformOutput.php
includes/page/Article.php
includes/page/ImagePage.php
includes/page/WikiPage.php
includes/parser/CacheTime.php
includes/parser/LinkHolderArray.php
includes/parser/MWTidy.php
includes/parser/Parser.php
includes/parser/ParserOptions.php
includes/parser/ParserOutput.php
includes/parser/Preprocessor_Hash.php
includes/profiler/ProfilerStub.php
includes/profiler/SectionProfiler.php
includes/registration/ExtensionProcessor.php
includes/registration/ExtensionRegistry.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderSiteStylesModule.php [new file with mode: 0644]
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevDelArchiveList.php
includes/revisiondelete/RevDelArchivedFileItem.php
includes/revisiondelete/RevDelFileItem.php
includes/revisiondelete/RevDelFileList.php
includes/revisiondelete/RevDelItem.php
includes/revisiondelete/RevDelList.php
includes/revisiondelete/RevDelRevisionList.php
includes/search/NullIndexField.php [new file with mode: 0644]
includes/search/SearchEngine.php
includes/search/SearchIndexField.php [new file with mode: 0644]
includes/search/SearchIndexFieldDefinition.php [new file with mode: 0644]
includes/session/CookieSessionProvider.php
includes/session/Session.php
includes/session/SessionProvider.php
includes/site/DBSiteStore.php
includes/site/FileBasedSiteLookup.php
includes/site/MediaWikiPageNameNormalizer.php
includes/skins/BaseTemplate.php
includes/skins/QuickTemplate.php
includes/skins/Skin.php
includes/skins/SkinTemplate.php
includes/specialpage/AuthManagerSpecialPage.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specialpage/SpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialBlock.php
includes/specials/SpecialBotPasswords.php
includes/specials/SpecialCategories.php
includes/specials/SpecialChangeContentModel.php
includes/specials/SpecialContributions.php
includes/specials/SpecialCreateAccount.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialListredirects.php
includes/specials/SpecialLog.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialRandomInCategory.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialSearch.php
includes/specials/SpecialTrackingCategories.php
includes/specials/SpecialUnusedtemplates.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUserLogin.php
includes/specials/pagers/AllMessagesTablePager.php
includes/specials/pagers/CategoryPager.php
includes/specials/pagers/ContribsPager.php
includes/specials/pre-authmanager/SpecialUserlogin.php
includes/tidy/Balancer.php [new file with mode: 0644]
includes/tidy/Html5Internal.php [new file with mode: 0644]
includes/tidy/RaggettInternalHHVM.php
includes/tidy/RaggettWrapper.php
includes/tidy/TidyDriverBase.php
includes/title/MediaWikiPageLinkRenderer.php [deleted file]
includes/title/PageLinkRenderer.php [deleted file]
includes/upload/UploadBase.php
includes/user/PasswordReset.php
includes/user/User.php
includes/utils/BatchRowIterator.php
includes/utils/IP.php
includes/utils/MWCryptHKDF.php
includes/widget/ComplexTitleInputWidget.php
includes/widget/SearchInputWidget.php [changed mode: 0755->0644]
includes/widget/TitleInputWidget.php
includes/widget/UserInputWidget.php
languages/Language.php
languages/classes/LanguageEo.php [deleted file]
languages/data/Names.php
languages/data/ZhConversion.php
languages/i18n/ace.json
languages/i18n/aeb-arab.json
languages/i18n/af.json
languages/i18n/ar.json
languages/i18n/arn.json
languages/i18n/ase.json
languages/i18n/ast.json
languages/i18n/av.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/ban.json [new file with mode: 0644]
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/bo.json
languages/i18n/bs.json
languages/i18n/bto.json
languages/i18n/ca.json
languages/i18n/cdo.json
languages/i18n/ce.json
languages/i18n/ch.json
languages/i18n/co.json
languages/i18n/cps.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dty.json
languages/i18n/dv.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/frp.json
languages/i18n/gag.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/got.json
languages/i18n/hak.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/hsb.json
languages/i18n/hu.json
languages/i18n/ia.json
languages/i18n/ie.json
languages/i18n/inh.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jam.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/khw.json
languages/i18n/kk-cyrl.json
languages/i18n/ko.json
languages/i18n/koi.json
languages/i18n/kri.json
languages/i18n/krl.json
languages/i18n/ksh.json
languages/i18n/ku-latn.json
languages/i18n/lad.json
languages/i18n/lb.json
languages/i18n/lez.json
languages/i18n/lfn.json
languages/i18n/lij.json
languages/i18n/liv.json
languages/i18n/lki.json
languages/i18n/lo.json
languages/i18n/lt.json
languages/i18n/ltg.json
languages/i18n/lv.json
languages/i18n/lzh.json
languages/i18n/lzz.json
languages/i18n/mai.json
languages/i18n/mk.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/my.json
languages/i18n/nah.json
languages/i18n/nan.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/oc.json
languages/i18n/olo.json
languages/i18n/or.json
languages/i18n/pa.json
languages/i18n/pcd.json
languages/i18n/pl.json
languages/i18n/pnb.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qug.json
languages/i18n/ru.json
languages/i18n/sah.json
languages/i18n/sat.json
languages/i18n/sco.json
languages/i18n/sd.json
languages/i18n/sdh.json
languages/i18n/shn.json
languages/i18n/sl.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/srn.json
languages/i18n/sv.json
languages/i18n/ta.json
languages/i18n/tcy.json
languages/i18n/tet.json
languages/i18n/tpi.json
languages/i18n/tr.json
languages/i18n/tru.json
languages/i18n/tt-cyrl.json
languages/i18n/tyv.json
languages/i18n/tzm.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/vi.json
languages/i18n/vmf.json
languages/i18n/vot.json
languages/i18n/wuu.json
languages/i18n/yi.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesBan.php [new file with mode: 0644]
languages/messages/MessagesGom_deva.php
languages/messages/MessagesLt.php
languages/messages/MessagesPs.php
maintenance/Maintenance.php
maintenance/backup.inc
maintenance/cleanupEmptyCategories.php [new file with mode: 0644]
maintenance/convertExtensionToRegistration.php
maintenance/copyFileBackend.php
maintenance/deleteArchivedFiles.php
maintenance/dumpBackup.php
maintenance/dumpTextPass.php
maintenance/dumpUploads.php
maintenance/fileOpPerfTest.php
maintenance/findHooks.php
maintenance/generateLocalAutoload.php
maintenance/importTextFiles.php
maintenance/install.php
maintenance/interwiki.list
maintenance/invalidateUserSessions.php [new file with mode: 0644]
maintenance/jsduck/categories.json
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_noconvert.manual
maintenance/language/zhtable/tradphrases.manual
maintenance/language/zhtable/tradphrases_exclude.manual
maintenance/mssql/tables.sql
maintenance/preprocessorFuzzTest.php
maintenance/rebuildFileCache.php
maintenance/resetUserTokens.php
maintenance/syncFileBackend.php
maintenance/tables.sql
maintenance/update.php
maintenance/updateExtensionJsonSchema.php [new file with mode: 0644]
mw-config/overrides.php [deleted file]
mw-config/overrides/README [new file with mode: 0644]
package.json
resources/Resources.php
resources/lib/oojs-ui/i18n/id.json
resources/lib/oojs-ui/i18n/inh.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/jv.json
resources/lib/oojs-ui/i18n/ku-latn.json
resources/lib/oojs-ui/i18n/pnb.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/sw.json
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-core-apex.css
resources/lib/oojs-ui/oojs-ui-core-mediawiki.css
resources/lib/oojs-ui/oojs-ui-core.js
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui-toolbars-apex.css
resources/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css
resources/lib/oojs-ui/oojs-ui-toolbars.js
resources/lib/oojs-ui/oojs-ui-widgets-apex.css
resources/lib/oojs-ui/oojs-ui-widgets-mediawiki.css
resources/lib/oojs-ui/oojs-ui-widgets.js
resources/lib/oojs-ui/oojs-ui-windows-apex.css
resources/lib/oojs-ui/oojs-ui-windows-mediawiki.css
resources/lib/oojs-ui/oojs-ui-windows.js
resources/lib/oojs-ui/themes/apex/images/icons/flag-rtl.png
resources/lib/oojs-ui/themes/apex/images/icons/flag-rtl.svg
resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-ltr.png
resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-ltr.svg
resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-rtl.png
resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/flag-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/flag-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/flag-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/flag-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stop-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/stop-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stop.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/stop.svg
resources/lib/phpjs-sha1/sha1.js [deleted file]
resources/src/jquery/jquery.accessKeyLabel.js
resources/src/jquery/jquery.makeCollapsible.js
resources/src/jquery/jquery.suggestions.js
resources/src/mediawiki.action/mediawiki.action.edit.stash.js
resources/src/mediawiki.action/mediawiki.action.history.css
resources/src/mediawiki.action/mediawiki.action.history.diff.css
resources/src/mediawiki.action/mediawiki.action.history.styles.css [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.view.filepage.css
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.less/mediawiki.ui/mixins.less
resources/src/mediawiki.skinning/content.css
resources/src/mediawiki.skinning/images/external link icons.svg [deleted file]
resources/src/mediawiki.skinning/images/external-link-icons.svg [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.changeslist.css
resources/src/mediawiki.special/mediawiki.special.search.styles.css
resources/src/mediawiki.toolbar/toolbar.less
resources/src/mediawiki.ui/components/inputs.less
resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js
resources/src/mediawiki.widgets/mw.widgets.SearchInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleOptionWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js
resources/src/mediawiki/api.js
resources/src/mediawiki/api/edit.js
resources/src/mediawiki/api/messages.js
resources/src/mediawiki/mediawiki.ForeignUpload.js
resources/src/mediawiki/mediawiki.Upload.BookletLayout.js
resources/src/mediawiki/mediawiki.checkboxtoggle.js
resources/src/mediawiki/mediawiki.content.json.css [deleted file]
resources/src/mediawiki/mediawiki.content.json.less [new file with mode: 0644]
resources/src/mediawiki/mediawiki.htmlform.js
resources/src/mediawiki/mediawiki.jqueryMsg.js
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.raggett.css
resources/src/mediawiki/mediawiki.searchSuggest.js
resources/src/mediawiki/page/gallery-slideshow.js [new file with mode: 0644]
resources/src/mediawiki/page/gallery.css
resources/src/mediawiki/page/startup.js
resources/src/startup.js
tests/TestsAutoLoader.php
tests/browser/features/step_definitions/create_account_steps.rb
tests/browser/features/step_definitions/login_steps.rb
tests/browser/features/support/pages/create_account_page.rb
tests/browser/features/support/pages/login_error_page.rb [deleted file]
tests/browser/features/support/pages/login_page.rb
tests/parser/parserTest.inc
tests/parser/parserTests.txt
tests/parserTests.php
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/includes/ExportTest.php
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php
tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/HttpTest.php
tests/phpunit/includes/LinkerTest.php
tests/phpunit/includes/MWNamespaceTest.php
tests/phpunit/includes/MWTimestampTest.php
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/MessageTest.php
tests/phpunit/includes/SanitizerTest.php
tests/phpunit/includes/StatusTest.php
tests/phpunit/includes/TestUser.php
tests/phpunit/includes/WatchedItemIntegrationTest.php
tests/phpunit/includes/WatchedItemQueryServiceUnitTest.php [new file with mode: 0644]
tests/phpunit/includes/WatchedItemStoreUnitTest.php
tests/phpunit/includes/WatchedItemUnitTest.php
tests/phpunit/includes/WikiMapTest.php
tests/phpunit/includes/api/ApiLoginTest.php
tests/phpunit/includes/api/ApiOpenSearchTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiQueryWatchlistIntegrationTest.php
tests/phpunit/includes/api/ApiQueryWatchlistRawIntegrationTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiStashEditTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiTestCase.php
tests/phpunit/includes/api/ApiTokensTest.php
tests/phpunit/includes/api/ApiUploadTest.php
tests/phpunit/includes/auth/ConfirmLinkSecondaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/LegacyHookPreAuthenticationProviderTest.php
tests/phpunit/includes/changes/RCCacheEntryFactoryTest.php
tests/phpunit/includes/changes/TestRecentChangesHelper.php
tests/phpunit/includes/content/CssContentTest.php
tests/phpunit/includes/content/TextContentHandlerTest.php
tests/phpunit/includes/db/DatabaseMysqlBaseTest.php
tests/phpunit/includes/db/DatabaseTest.php
tests/phpunit/includes/debug/logger/monolog/KafkaHandlerTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/installer/DatabaseUpdaterTest.php
tests/phpunit/includes/libs/XmlTypeCheckTest.php
tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
tests/phpunit/includes/linker/LinkRendererFactoryTest.php
tests/phpunit/includes/linker/LinkRendererTest.php
tests/phpunit/includes/objectcache/RESTBagOStuffTest.php [new file with mode: 0644]
tests/phpunit/includes/objectcache/RedisBagOStuffTest.php
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/includes/phpunit/ConsecutiveParametersMatcher.php [deleted file]
tests/phpunit/includes/phpunit/LICENSE [deleted file]
tests/phpunit/includes/phpunit/README [deleted file]
tests/phpunit/includes/registration/CoreVersionCheckerTest.php
tests/phpunit/includes/registration/ExtensionProcessorTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderStartUpModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php
tests/phpunit/includes/search/SearchEngineTest.php
tests/phpunit/includes/search/SearchIndexFieldTest.php [new file with mode: 0644]
tests/phpunit/includes/session/CookieSessionProviderTest.php
tests/phpunit/includes/site/DBSiteStoreTest.php
tests/phpunit/includes/site/FileBasedSiteLookupTest.php
tests/phpunit/includes/site/MediaWikiPageNameNormalizerTest.php
tests/phpunit/includes/specials/SpecialSearchTest.php
tests/phpunit/includes/tidy/BalancerTest.php [new file with mode: 0644]
tests/phpunit/includes/tidy/html5lib-tests.json [new file with mode: 0644]
tests/phpunit/includes/title/MediaWikiPageLinkRendererTest.php [deleted file]
tests/phpunit/includes/title/MediaWikiTitleCodecTest.php
tests/phpunit/includes/upload/UploadStashTest.php
tests/phpunit/includes/user/BotPasswordTest.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/mocks/media/MockOggHandler.php
tests/phpunit/structure/ResourcesTest.php
tests/qunit/QUnitTestResources.php
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.edit.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/testHelpers.inc

index 6b94db6..62dbeb6 100644 (file)
@@ -10,7 +10,7 @@
                "declaration-colon-space-after": [ "always" ],
                "declaration-colon-space-before": [ "never" ],
 
-               "font-family-name-quotes": [ "single-unless-keyword" ],
+               "font-family-name-quotes": [ "always-unless-keyword" ],
                "font-weight-notation": [ "named-where-possible" ],
 
                "function-calc-no-unspaced-operator": true,
@@ -20,7 +20,7 @@
                "function-comma-space-before": [ "never" ],
                "function-parentheses-newline-inside": [ "never-multi-line" ],
                "function-parentheses-space-inside": [ "always" ],
-               "function-url-quotes": [ "none" ],
+               "function-url-quotes": [ "never" ],
                "function-whitespace-after": [ "always" ],
        }
 }
diff --git a/Gemfile b/Gemfile
index fa3a025..19d2f52 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -1,5 +1,5 @@
 source 'https://rubygems.org'
 
-gem 'mediawiki_selenium', '~> 1.7'
+gem 'mediawiki_selenium', '~> 1.7', '>= 1.7.1'
 gem 'rake', '~> 11.1', '>= 11.1.1'
 gem 'rubocop', '~> 0.32.1', require: false
index 2bbabd1..2d6e655 100644 (file)
@@ -34,22 +34,22 @@ GEM
       domain_name (~> 0.5)
     i18n (0.7.0)
     json (1.8.3)
-    mediawiki_api (0.5.0)
+    mediawiki_api (0.6.0)
       faraday (~> 0.9, >= 0.9.0)
       faraday-cookie_jar (~> 0.0, >= 0.0.6)
-    mediawiki_selenium (1.7.0)
+    mediawiki_selenium (1.7.1)
       cucumber (~> 1.3, >= 1.3.20)
       headless (~> 2.0, >= 2.1.0)
       json (~> 1.8, >= 1.8.1)
-      mediawiki_api (~> 0.5, >= 0.5.0)
+      mediawiki_api (~> 0.6, >= 0.6.0)
       page-object (~> 1.0)
       rest-client (~> 1.6, >= 1.6.7)
       rspec-core (~> 2.14, >= 2.14.4)
       rspec-expectations (~> 2.14, >= 2.14.4)
       syntax (~> 1.2, >= 1.2.0)
       thor (~> 0.19, >= 0.19.1)
-    mime-types (2.99.1)
-    multi_json (1.11.3)
+    mime-types (2.99.2)
+    multi_json (1.12.1)
     multi_test (0.1.2)
     multipart-post (2.0.0)
     netrc (0.11.0)
@@ -79,11 +79,11 @@ GEM
       ruby-progressbar (~> 1.4)
     ruby-progressbar (1.7.5)
     rubyzip (1.2.0)
-    selenium-webdriver (2.53.0)
+    selenium-webdriver (2.53.1)
       childprocess (~> 0.5)
       rubyzip (~> 1.0)
       websocket (~> 1.0)
-    syntax (1.2.0)
+    syntax (1.2.1)
     thor (0.19.1)
     unf (0.1.4)
       unf_ext
@@ -97,7 +97,7 @@ PLATFORMS
   ruby
 
 DEPENDENCIES
-  mediawiki_selenium (~> 1.7)
+  mediawiki_selenium (~> 1.7, >= 1.7.1)
   rake (~> 11.1, >= 11.1.1)
   rubocop (~> 0.32.1)
 
diff --git a/HISTORY b/HISTORY
index e833154..868b21a 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -1,5 +1,588 @@
 Change notes from older releases. For current info see RELEASE-NOTES-1.28.
 
+= MediaWiki 1.27 =
+
+== MediaWiki 1.27.0 ==
+
+=== PHP version requirement in 1.27 ===
+As of 1.27, MediaWiki now requires PHP 5.5.9 or higher (see Compatibility
+section). Additionally, the following PHP extensions are required:
+* ctype
+* iconv
+* json
+* mbstring (new requirement in 1.27)
+* xml
+The following PHP extensions are strongly recommended:
+* openssl
+
+=== Configuration changes in 1.27 ===
+* $wgAllowMicrodataAttributes and $wgAllowRdfaAttributes were removed,
+  now always enabled. If you use RDFa on your wiki, you now have to explicitly
+  set $wgHtml5Version to 'HTML+RDFa 1.0' or 'XHTML+RDFa 1.0'.
+* $wgUseLinkNamespaceDBFields was removed.
+* Deprecated $wgResourceLoaderMinifierStatementsOnOwnLine and
+  $wgResourceLoaderMinifierMaxLineLength, because there was little value in
+  making the behavior configurable. The default values (`false` for the former,
+  1000 for the latter) are now hard-coded.
+* $wgDebugDumpSqlLength was removed (deprecated in 1.24).
+* $wgDebugDBTransactions was removed (deprecated in 1.20).
+* $wgUseXVO has been removed, as it provides functionality only used by
+  custom Wikimedia patches against Squid 2.x that probably noone uses in
+  production anymore. There is now $wgUseKeyHeader that provides similar
+  functionality but instead of the MediaWiki-specific X-Vary-Options header,
+  uses the draft Key header standard.
+* $wgScriptExtension (and support for '.php5' entry points) was removed. See the
+  deprecation notice in the release notes for version 1.25 for advice on how to
+  preserve support for '.php5' entry points via URL rewriting.
+* Password handling via the User object has been deprecated and partially
+  removed, pending the future introduction of AuthManager. In particular:
+** expirePassword(), getPasswordExpireDate(), resetPasswordExpiration(), and
+   getPasswordExpired() have been removed. They were unused outside of core.
+** The mPassword, mNewpassword, mNewpassTime, and mPasswordExpires fields are
+   now private and will be removed in the future.
+** The getPassword() and getTemporaryPassword() methods now throw
+   BadMethodCallException and will be removed in the future.
+** The ability to pass 'password' and 'newpassword' to createNew() has been
+   removed. The only users of it seem to have been using it to set invalid
+   passwords, and so shouldn't be greatly affected.
+** setPassword(), setInternalPassword(), and setNewpassword() have been
+   deprecated, pending the introduction of AuthManager.
+** User::randomPassword() is deprecated in favor of a new method
+   PasswordFactory::generateRandomPasswordString()
+** User::getPasswordFactory() is deprecated, callers should just create a
+   PasswordFactory themselves.
+** A new constructor, User::newSystemUser(), has been added to simplify the
+   creation of passwordless "system" users for logged actions.
+* $wgMaxSquidPurgeTitles was removed.
+* $wgAjaxWatch was removed. This is now enabled by default.
+* $wgUseInstantCommons now hotlinks Commons images by default instead of
+  downloading originals and thumbnailing them locally. This allows wikis to save
+  on CPU and bandwidth while reducing time to first byte for pages, even without
+  a thumbnail handler. See $wgForeignFileRepos documentation for tweaks.
+* (T27397) WebP is enabled by default as an uploadable filetype.
+* (T48998) $wgArticlePath must now be either a full url, or start with a "/".
+* $wgRateLimitLog was removed; use $wgDebugLogGroups['ratelimit'] instead.
+* Deprecated API formats dbg, txt, and yaml have been removed.
+* CLDRPluralRule* classes have been replaced with
+  wikimedia/cldr-plural-rule-parser.
+* Removed $wgProfilePerHost, $wgUDPProfilerHost, $wgUDPProfilerPort,
+  $wgUDPProfilerFormatString, $wgStatsMethod, $wgAggregateStatsID,
+  $wgStatsFormatString, and $wgProfileCallTree (deprecated since 1.20).
+* For proper operation of LocalIdLookup with shared user tables, ensure that
+  $wgSharedDB and $wgSharedTables are properly set even on the "central" wiki
+  that all others are sharing from and that $wgLocalDatabases is set to the
+  full list of sharing wikis on all those wikis.
+* Massive overhaul to session handling:
+** $wgSessionsInObjectCache is no longer supported and must be true, due to
+   MediaWiki\Session\SessionManager. $wgSessionHandler is similarly no longer
+   used.
+** ObjectCacheSessionHandler is removed, replaced with
+   MediaWiki\Session\PhpSessionHandler.
+** PHP session handling in general ($_SESSION, session_id(), and so on) is
+   deprecated. Use MediaWiki\Session\SessionManager instead. A new config
+   variable, $wgPHPSessionHandling, is available to cause use of $_SESSION to
+   issue a deprecation warning or to cause most PHP session handling to throw
+   exceptions.
+** Deprecated UserSetCookies hook. Session-handling extensions should generally
+   be creating a custom subclass of CookieSessionProvider. Other extensions
+   messing with cookies can no longer count on user data being saved in cookies
+   versus other methods.
+** Deprecated UserLoadFromSession hook, extensions should create a
+   MediaWiki\Session\SessionProvider.
+** The User cannot be loaded from session until after Setup.php completes.
+   Attempts to do so will be ignored and the User will remain unloaded.
+** CSRF tokens may be fetched from the MediaWiki\Session\Session, which uses
+   the MediaWiki\Session\Token class.
+* MediaWiki will now auto-create users as necessary, removing the need for
+  extensions to do so. An 'autocreateaccount' right is added to allow
+  auto-creation when 'createaccount' is not granted to all users.
+* Deprecated AuthPluginAutoCreate hook in favor of LocalUserCreated.
+* Most cookie-handling methods in User are deprecated.
+* $wgAllowAsyncCopyUploads and $CopyUploadAsyncTimeout were removed. This was an
+  experimental feature that has never worked.
+* Login and createaccount tokens now vary by timestamp.
+* LoginForm::getLoginToken() and LoginForm::getCreateaccountToken()
+  return a MediaWiki\Session\Token, and tokens must be checked using that
+  class's methods.
+* $wgEnotifUseJobQ was removed and the job queue is always used.
+* The functionality of the ApiSandbox extension has been merged into core. The
+  extension should no longer be used.
+* $wgPreloadJavaScriptMwUtil was removed (deprecated in 1.26).
+  Extensions, skins, gadgets and scripts that use the mediawiki.util module must
+  express a dependency on it.
+* $wgIncludeLegacyJavaScript, deprecated in MediaWiki 1.26, now defaults false.
+  Extensions, skins, gadgets and scripts that need the mediawiki.legacy.wikibits
+  module should express a dependency on it.
+* Removed configuration option $wgCopyrightIcon (deprecated since 1.18). Use
+  $wgFooterIcons['copyright']['copyright'] instead.
+* If the openssl and mcrypt PHP extensions are both unavailable, secure
+  session storage (used for login) will raise an exception. This exception may
+  be bypassed by setting $wgSessionInsecureSecrets = true.
+* Massive overhaul to authentication:
+** AuthPlugin and AuthPluginUser are deprecated.
+** LoginForm and associated templates are deprecated. Extensions which called
+   static LoginForm methods should be converted into authentication providers.
+** The following hooks are deprecated:
+*** AbortAutoAccount (create a MediaWiki\Auth\PreAuthenticationProvider instead)
+*** AbortLogin (create a MediaWiki\Auth\PreAuthenticationProvider instead)
+*** AbortNewAccount (create a MediaWiki\Auth\PreAuthenticationProvider instead)
+*** AddNewAccount (use LocalUserCreated instead)
+*** AuthPluginSetup (create a MediaWiki\Auth\PrimaryAuthenticationProvider instead)
+*** ChangePasswordForm (use AuthChangeFormFields instead, or security levels)
+*** LoginUserMigrated (create a MediaWiki\Auth\PreAuthenticationProvider instead)
+*** UserCreateForm (create a MediaWiki\Auth\AuthenticationProvider of some type instead)
+*** UserLoginForm (create a MediaWiki\Auth\AuthenticationProvider of some type instead)
+** The following hooks are removed:
+*** AbortChangePassword
+*** LoginPasswordResetMessage
+*** PrefsPasswordAudit
+** The UserLoginComplete hook will no longer be called for all logins, only for
+   those via the web UI. Use UserLoggedIn if you need to do something on all
+   logins.
+** $wgRequirePasswordforEmailChange is removed.
+
+=== New features in 1.27 ===
+* $wgDataCenterUpdateStickTTL was also added. This decides how long a user
+  sticks to the primary DC (via cookies) after they make changes to the site.
+* Added a new hook, 'UserMailerTransformContent', to transform the contents
+  of an email. This is similar to the EmailUser hook but applies to all mail
+  sent via UserMailer.
+* Added a new hook, 'UserMailerTransformMessage', to transform the contents
+  of an emai after MIME encoding.
+* Added a new hook, 'UserMailerSplitTo', to control which users have to be
+  emailed separately (ie. there is a single address in the To: field) so
+  user-specific changes to the email can be applied safely.
+* $wgCdnMaxageLagged was added, which limits the CDN cache TTL
+  when any load balancer uses a DB that is lagged beyond the 'max lag'
+  setting in the relevant section of $wgLBFactoryConf.
+* User::newSystemUser() may be used to simplify the creation of passwordless
+  "system" users for logged actions from scripts and extensions.
+* Extensions can now return detailed error information via the API when
+  preventing user actions using 'getUserPermissionsErrors' and similar hooks
+  by using ApiMessage instances instead of strings for the $result value.
+* $wgAPIMaxLagThreshold was added to limit bot changes when databases lag
+  becomes too high.
+* Skins and extensions can now use FlexBox mixins (.flex-display(@display: flex)
+  and .flex(@grow: 1, @shrink: 1, @width: auto, @order: 1)) in Less to create
+  cross-browser-compatible FlexBox rules. Users will still need to add fallback
+  float rules or the like for compatibility with IE9- separately.
+* Added MWTimestamp::getTimezoneString() which returns the localized timezone
+  string, if available. To localize this string, see the comments of
+  $wgLocaltimezone in includes/DefaultSettings.php.
+* Added CentralIdLookup, a service that allows extensions needing a concept of
+  "central" users to get that without having to know about specific central
+  authentication extensions.
+* $wgMaxUserDBWriteDuration added to limit huge user-generated transactions.
+  Regular web request transactions that takes longer than this are aborted.
+* Added a new hook, 'TitleMoveCompleting', which runs before a page move is
+  committed.
+* $wgCdnReboundPurgeDelay was added to provide secondary delayed purges of URLs
+  from CDN to mitigate DB replication lag and WAN cache purge lag.
+* (T49162) Installer will default to setting CACHE_ACCEL as the main cache type
+  if it is available.
+* It is now possible to patrol file uploads (both for new files and new versions
+  of existing files). Special:NewFiles has gained an option to filter by patrol
+  status. This functionality can be disabled using $wgUseFilePatrol.
+* MediaWiki\Session infrastructure allows for easier use of session mechanisms
+  other than the usual cookies.
+** SessionMetadata and SessionCheckInfo hooks allow for setting and checking
+   custom session metadata.
+* Added MWGrants and associated configuration settings $wgGrantPermissions and
+  $wgGrantPermissionGroups to hold configuration for authentication features
+  such as OAuth that want to allow restricting the user rights a user may make
+  use of.
+** If you're already using the OAuth extension, these new variables are
+   identical to (and will replace) $wgMWOAuthGrantPermissions and
+   $wgMWOAuthGrantPermissionGroups.
+* Added MWRestrictions as a class to check restrictions on a WebRequest, e.g.
+  to assert that the request comes from a particular IP range.
+* Added bot passwords, a rights-restricted login mechanism for API-using bots.
+* Whitelisted the following HTML attributes for all elements in wikitext:
+  aria-describedby, aria-flowto, aria-label, aria-labelledby, aria-owns.
+* Removed "presentation" restriction on the HTML role attribute in wikitext.
+  All values are now allowed for the role attribute.
+* $wgContentHandlers now also supports callbacks to create an instance of the
+  appropriate ContentHandler subclass.
+* Added $wgAuthenticationTokenVersion, which if non-null prevents the
+  user_token database field from being exposed in cookies. Setting this would
+  be a good idea, but will log out all current sessions.
+* $wgEventRelayerConfig was added, for managing PubSub event relay configuration,
+  specifically for reliable CDN url purges.
+* Requests have unique IDs, equal to the UNIQUE_ID environment variable (when
+  MediaWiki is behind Apache+mod_unique_id or something similar) or a randomly-
+  generated 24-character string. This request ID is used to annotate log records
+  and error messages. It is available client-side via mw.config.get( 'wgRequestId' ).
+  The request ID supplants exception IDs. Accordingly, MWExceptionHandler::getLogId()
+  is deprecated.
+* (T33313) Add a preference for watching uploads by default, also applies
+  to API-based upload tools.
+* $wgJpegPixelFormat was added to override chroma subsampling for JPEG image
+  thumbnails created via ImageMagick. Defaults to 'yuv420', providing bandwidth
+  savings versus the previous behavior on many files.
+* MediaWiki\Auth infrastructure (called "AuthManager") allows for more flexible
+  configuration of multiple authentication pieces that was possible with
+  AuthPlugin. For example, it's now easy to plug in second-factor
+  authentication, or add additional checks to the login process, or to support
+  multiple login methods at once, or to support non-password-based login methods.
+** Providers are configured via the global setting $wgAuthManagerConfig.
+** A global, $wgDisableAuthManager, is temporarily available to disable
+   AuthManager until extensions are ready to support it.
+** New hook, AuthChangeFormFields, to adjust the form fields on
+   AuthManager-related special pages.
+** New hook, AuthManagerLoginAuthenticateAudit, for additional logging of
+   AuthManager-related authentication requests.
+** New hook, ChangeAuthenticationDataAudit, for additional logging of
+   AuthManager-related authentication data changes.
+** New hook, SecuritySensitiveOperationStatus, to work with the new mechanism
+   for requiring a recent login before taking security-sensitive operations
+   like changing a password.
+** Two new globals, $wgChangeCredentialsBlacklist and $wgRemoveCredentialsBlacklist
+   can be used to prevent the web UI and the API changing certain authentication data.
+* The file upload dialog (available if you install WikiEditor or VisualEditor)
+  can now be configured using $wgUploadDialog.
+
+=== External library changes in 1.27 ===
+
+==== Upgraded external libraries ====
+* Updated oojs/oojs-ui from v0.12.12 to v0.13.3.
+* Updated composer/semver from v1.0.0 to v1.2.0.
+* Updated liuggio/statsd-php-client to 1.0.18.
+* Updated QUnit from v1.18.0 to v1.22.0.
+
+==== New external libraries ====
+* Added wikimedia/base-convert v1.0.1.
+* Added wikimedia/cldr-plural-rule-parser v1.0.0.
+* Added wikimedia/relpath v1.0.3.
+* Added wikimedia/running-stat v1.1.0.
+* Added wikimedia/php-session-serializer v1.0.3.
+
+==== Removed and replaced external libraries ====
+
+=== Bug fixes in 1.27 ===
+* Special:Upload will now display correct maximum allowed file size when running
+  under HHVM (T116347).
+* (T54077) The APIEditBeforeSave hook will once again give only the content of
+  the section being edited, rather than the whole revision. This reverts the
+  change made in MediaWiki 1.22.
+
+=== Action API changes in 1.27 ===
+* Added list=allrevisions.
+* generator=recentchanges now has the option to generate revids.
+* ApiPageSet::setRedirectMergePolicy() was added. This allows generator
+  modules to define how generator data for a redirect source gets merged
+  into the redirect destination.
+* prop=imageinfo&iiprop=uploadwarning will no longer include the possibility of
+  "was-deleted" warning.
+* Added difftotextpst to query=revisions which preforms a pre-save transform on
+  the text before diffing it.
+* Deprecated formats dbg, txt, and yaml have been removed.
+* (T47988) The protect log event details now use new-style formatting.
+* The following response properties from action=login are deprecated, and may
+  be removed in the future: lgtoken, cookieprefix, sessionid. Clients should
+  handle cookies to properly manage session state.
+* action=login transparently allows login using bot passwords. Clients should
+  merely need to change the username and password used after setting up a bot
+  password.
+* action=upload no longer understands statuskey, asyncdownload or leavemessage.
+* Several changes when $wgDisableAuthManager is false:
+** action=login is deprecated for uses other than bot passwords.
+** list=users can now indicate if a missing username is creatable.
+** action=createaccount is changed in a non-backwards-compatible manner.
+** Added action=query&meta=authmanagerinfo.
+** Added action=clientlogin to be used to log into the main account instead of
+   action=login.
+** Added action=linkaccount.
+** Added action=unlinkaccount.
+** Added action=changeauthenticationdata.
+** Added action=removeauthenticationdata.
+** Added action=resetpassword.
+
+=== Action API internal changes in 1.27 ===
+* ApiQueryORM removed.
+* The following classes have been removed:
+** ApiFormatDbg
+** ApiFormatTxt
+** ApiFormatYaml
+* ApiBase::addTokenProperties() was removed (deprecated since 1.24).
+* ApiBase::getFinalPossibleErrors() was removed (deprecated since 1.24).
+* ApiBase::getFinalResultProperties() was removed (deprecated since 1.24).
+* ApiBase::getRequireAtLeastOneParameterErrorMessages() was removed (deprecated since 1.24).
+* ApiBase::getPossibleErrors() was removed (deprecated since 1.24).
+* ApiBase::getRequireMaxOneParameterErrorMessages() was removed (deprecated since 1.24).
+* ApiBase::getRequireOnlyOneParameterErrorMessages() was removed (deprecated since 1.24).
+* ApiBase::getResultProperties() was removed (deprecated since 1.24).
+* ApiBase::getTitleOrPageIdErrorMessage() was removed (deprecated since 1.24).
+* ApiBase::parseErrors() was removed (deprecated since 1.24).
+* ApiQueryBase::titleToKey(), ApiQueryBase::keyToTitle() and
+  ApiQueryBase::keyPartToTitle() all removed (deprecated since 1.24).
+* ApiQueryBase::checkRowCount() was removed (deprecated since 1.24).
+* ApiQueryBase::getDirectionDescription() was removed (deprecated since 1.25).
+* ApiQuery::getGenerators() was removed (deprecated since 1.21).
+* ApiQuery::getModules() was removed (deprecated since 1.21).
+* ApiQuery::getModuleType() was removed (deprecated since 1.21).
+* ApiQuery::setGeneratorContinue() was removed (deprecated since 1.24).
+* ApiMain::getModules() was removed (deprecated since 1.21).
+* ApiBase::getVersion() was removed (deprecated since 1.21).
+* ApiMain::getShowVersions() was removed (deprecated in 1.21).
+* ApiMain::addModule() was removed (deprecated in 1.21).
+* ApiMain::addFormat() was removed (deprecated in 1.21).
+* ApiMain::getFormats() was removed (deprecated in 1.21).
+* ApiPageSet::finishPageSetGeneration() was removed (deprecated in 1.21).
+* ApiCreateAccount is deprecated, and will be removed soon.
+
+=== Languages updated in 1.27 ===
+
+MediaWiki supports over 350 languages. Many localisations are updated
+regularly. Below only new and removed languages are listed, as well as
+changes to languages because of Phabricator reports.
+
+* (T113688) Change default numerals from Gurmukhi to Arabic for Punjabi locale.
+* (T116020) Aliases of magic words in MessagesXx.php are sorted by usage.
+
+=== Other changes in 1.27 ===
+* Added dependency injection (DI) infrastructure, see docs/injection.txt for details.
+  It is planned to incrementally move MediaWiki code towards using DI, using the
+  service locator (SL) pattern as a stepping stone.
+* ProfilerOutputUdp was removed. Note that there is a ProfilerOutputStats class.
+* WikiPage::doDeleteArticleReal() and WikiPage::doDeleteArticle() now
+  ignore the 2nd and 3rd arguments (formerly $id and $commit).
+* Removed "loaderScripts" option from ResourceLoaderFileModule class.
+* Removed ORM-like wrapper added in 1.20.
+* LinkCache::getGoodLinks and LinkCache::getBadLinks were removed
+  (deprecated in 1.26).
+* WikiPage::doQuickEdit() was removed (deprecated since 1.21).
+* Removed SiteObject and SiteArray classes (deprecated in 1.21).
+* MessageBlobStore::getInstance() was removed (deprecated since 1.25).
+* (T84937) Free external links ("autolinked" urls) will now be terminated
+  by &nbsp; and HTML entity encodings of &nbsp, <, and >.
+* (T36948) The default file revert message's timestamp is now in
+  $wgLocaltimezone, instead of UTC.
+* The default name of the 'suppress' group page has been changed from
+  'Project:Oversight' to 'Project:Suppress'.
+* DatabaseBase::resultObject() is now protected (use outside Database classes
+  not necessary since 1.11).
+* Calling ResourceLoaderFileModule::readStyleFiles() without a
+  ResourceLoaderContext instance is deprecated.
+* ResourceLoader::getLessCompiler() now takes an optional parameter of
+  additional LESS variables to set for the compiler.
+* wfBaseConvert() marked as deprecated, use Wikimedia\base_convert() directly
+  instead.
+* Obsolete maintenance scripts clearCacheStats.php and showCacheStats.php
+  were removed. The underlying data is sent to StatsD (see $wgStatsdServer).
+* Removed msg_resource_links database table and associated code.
+* Removed msg_resource database table and associated code.
+* Skin::getNamespaceNotice() was removed.
+* wfIsConfiguredProxy() was removed (deprecated since 1.24).
+* wfDebugTimer() was removed (deprecated since 1.25).
+* wfIsTrustedProxy() was removed (deprecated since 1.24).
+* wfGetIP() was removed (deprecated since 1.19).
+* MWHookException was removed.
+* OutputPage::appendSubtitle() was removed (deprecated since 1.19).
+* OutputPage::loginToUse() was removed (deprecated since 1.19).
+* Article::loadContent() was removed (deprecated since 1.19).
+* User::editToken() was removed (deprecated since 1.19).
+* Removed --force-normal option of dumpBackup.php, as it no longer served
+  any useful purpose since 1.22.
+* The functions processOption() and processArgs() on the BackupDumper and
+  TextPassDumper classes have been removed.
+* The maintenance/backupTextPass.inc file was deleted. You should include
+  maintenance/dumpTextPass.php instead.
+* WikiPage::getUsedTemplates() was removed (deprecated since 1.19).
+* wfEmptyMsg() was removed (deprecated since 1.18).
+* OutputPage::permissionRequired() was removed (deprecated since 1.18).
+* OutputPage::blockedPage() was removed (deprecated since 1.18).
+* User::getSkin() was removed (deprecated since 1.18).
+* OutputPage::includeJQuery() was removed (deprecated since 1.17).
+* WikiPage::updateRestrictions() was removed (deprecated since 1.19).
+* WikiPage::testPreSaveTransform() was removed (deprecated since 1.19).
+* LogPage::logName() was removed (deprecated since 1.19).
+* LogPage::logHeader() was removed (deprecated since 1.19).
+* wfCheckLimits() was removed (deprecated since 1.24).
+* Linker::makeKnownLinkObj() was removed (deprecated since 1.16).
+* Linker::makeLinkObj() was removed (deprecated since 1.16).
+* wfMsgForContentNoTrans() was removed (deprecated since 1.18).
+* ChangesList::usePatrol was removed (deprecated since 1.22).
+* wfMsgNoTrans() was removed (deprecated since 1.18).
+* Linker::makeImageLink2 was removed (deprecated since 1.20).
+* Title::userIsWatching() was removed (deprecated since 1.20).
+* Removed WaitForSlave maintenance script; use SELECT MASTER_POS_WAIT()
+  database function directly instead.
+* wfMsg() was removed (deprecated since 1.18).
+* wfMsgForContent() was removed (deprecated since 1.18).
+* wfMsgReal() was removed (deprecated since 1.18).
+* wfMsgGetKey() was removed (deprecated since 1.18).
+* wfMsgHtml() was removed (deprecated since 1.18).
+* wfMsgWikiHtml() was removed (deprecated since 1.18).
+* wfMsgExt() was removed (deprecated since 1.18).
+* Language::armourMath() was removed (deprecated since 1.22).
+* LanguageConverter::armourMath() was removed (deprecated since 1.22).
+* FakeConverter::armourMath() was removed (deprecated since 1.22).
+* The unused jquery.validate ResourceLoader module was removed.
+* FileRepo::getRootUrl() was removed (deprecated since 1.20).
+* User::generateToken() was removed (deprecated since 1.20).
+* WikiPage::getRawText() was removed (deprecated since 1.21).
+* ParserOutput::hasCustomDataUpdates() was removed (deprecated since 1.25).
+* ParserOutput::addSecondaryDataUpdate() was removed (deprecated since 1.25).
+* ParserOutput::getSecondaryDataUpdates() was removed (deprecated since 1.25).
+* Gallery images with multiple caption pipes no longer concatenate them all
+  together but instead pick the final one, similar to image syntax.
+* XML-like parser tags (such as <gallery>), when unclosed, will be left unparsed
+  rather than consume everything until the end of the page.
+* New maintenance script resetUserEmail.php allows sysadmins to reset user emails in case
+  a user forgot password/account was stolen.
+* wfCheckEntropy() was removed (deprecated in 1.27).
+* Browser support for Internet Explorer 8 lowered from Grade A to Grade C.
+* ContentHandler::supportsCategories method added. Default is true.
+  CategoryMembershipChangeJob updates are skipped for content that
+  does not support categories.
+* wikidiff difference engine is no longer supported, anyone still using it are encouraged
+  to upgrade to wikidiff2 which is actively maintained and has better package availability.
+* Database logic was removed from WatchedItem and a WatchedItemStore was created:
+** WatchedItem::IGNORE_USER_RIGHTS and WatchedItem::CHECK_USER_RIGHTS were deprecated.
+   User::IGNORE_USER_RIGHTS and User::CHECK_USER_RIGHTS were introduced.
+** WatchedItem::fromUserTitle was deprecated in favour of the constructor.
+** WatchedItem::resetNotificationTimestamp was deprecated.
+** WatchedItem::batchAddWatch was deprecated.
+** WatchedItem::addWatch was deprecated.
+** WatchedItem::removeWatch was deprecated.
+** WatchedItem::isWatched was deprecated.
+** WatchedItem::duplicateEntries was deprecated.
+** EmailNotification::updateWatchlistTimestamp was deprecated.
+** User::getWatchedItem was removed.
+* Unit tests don't work with external PHPUnit anymore, Composer is now the only supported
+  way. Run `composer install` to install it and other dev dependencies to run unit tests.
+* wl_id field added to the watchlist table.
+* Revision::getRawText() was removed (deprecated since 1.21).
+* WikiPage::replaceSection() was removed (deprecated since 1.21).
+* Article::replaceSection() was removed (deprecated since 1.21).
+* Language::getLangObj() was removed (deprecated since 1.24).
+* Language::getLanguageName() was removed (deprecated since 1.20).
+* Language::getLanguageNames() was removed (deprecated since 1.20).
+* Language::getTranslatedLanguageNames() was removed (deprecated since 1.20).
+* Language::specialPage() was removed (deprecated since 1.24).
+* MediaWikiTestCase::assertException() was removed (deprecated since 1.22).
+* OutputPage::getHeadItems() was removed (deprecated since 1.24).
+* OutputPage::getScript() was removed (deprecated since 1.24).
+* OutputPage::out() was removed (deprecated since 1.22).
+* OutputPage::setAllowedModules() was removed (deprecated since 1.24).
+* UserrightsPage::makeGroupNameListForLog() was removed (deprecated since 1.21).
+* MediaWikiSite::newFromGlobalId() was removed (deprecated since 1.21).
+* Title::newFromRedirect() was removed (deprecated since 1.21).
+* Skin::commonPrintStylesheet() was removed (deprecated since 1.22).
+* Skin::getCommonStylePath() was removed (deprecated since 1.24).
+* Skin::newFromKey() was removed (deprecated since 1.24).
+* Skin::getUsableSkins() was removed (deprecated since 1.23).
+* LoadBalancer::pickRandom() was removed (deprecated in 1.21).
+* Article::getUndoText() and WikiPage::getUndoText were removed (deprecated since
+  1.21).
+* DifferenceEngine::setText() was removed (deprecated in 1.21).
+* Title::newFromRedirectArray() was removed (deprecated in 1.21).
+* UserMailer::send() no longer accepts $replyto as the 5th argument and $contentType
+  as the 6th. These must be passed in the options array now.
+* Title::newFromRedirectRecurse() was removed (deprecated in 1.21).
+* Skin::accesskey was removed (deprecated since 1.21).
+* Skin::blockLink was removed (deprecated since 1.21).
+* Skin::buildRollbackLink was removed (deprecated since 1.21).
+* Skin::emailLink was removed (deprecated since 1.21).
+* Skin::formatComment was removed (deprecated since 1.21).
+* Skin::formatHiddenCategories was removed (deprecated since 1.21).
+* Skin::formatLinksInComment was removed (deprecated since 1.21).
+* Skin::formatRevisionSize was removed (deprecated since 1.21).
+* Skin::formatSize was removed (deprecated since 1.21).
+* Skin::formatTemplates was removed (deprecated since 1.21).
+* Skin::generateTOC was removed (deprecated since 1.21).
+* Skin::getInternalLinkAttributes was removed (deprecated since 1.21).
+* Skin::getInternalLinkAttributesObj was removed (deprecated since 1.21).
+* Skin::getInterwikiLinkAttributes was removed (deprecated since 1.21).
+* Skin::getInvalidTitleDescription was removed (deprecated since 1.21).
+* Skin::getLinkColour was removed (deprecated since 1.21).
+* Skin::getRevDeleteLink was removed (deprecated since 1.21).
+* Skin::getRollbackEditCount was removed (deprecated since 1.21).
+* Skin::makeBrokenImageLinkObj was removed (deprecated since 1.21).
+* Skin::makeCommentLink was removed (deprecated since 1.21).
+* Skin::makeExternalImage was removed (deprecated since 1.21).
+* Skin::makeExternalLink was removed (deprecated since 1.21).
+* Skin::makeHeadline was removed (deprecated since 1.21).
+* Skin::makeImageLink was removed (deprecated since 1.21).
+* Skin::makeMediaLinkFile was removed (deprecated since 1.21).
+* Skin::makeMediaLinkObj was removed (deprecated since 1.21).
+* Skin::makeSelfLinkObj was removed (deprecated since 1.21).
+* Skin::makeThumbLink2 was removed (deprecated since 1.21).
+* Skin::makeThumbLinkObj was removed (deprecated since 1.21).
+* Skin::normaliseSpecialPage was removed (deprecated since 1.21).
+* Skin::normalizeSubpageLink was removed (deprecated since 1.21).
+* Skin::processResponsiveImages was removed (deprecated since 1.21).
+* Skin::revComment was removed (deprecated since 1.21).
+* Skin::revDeleteLink was removed (deprecated since 1.21).
+* Skin::revDeleteLinkDisabled was removed (deprecated since 1.21).
+* Skin::revUserLink was removed (deprecated since 1.21).
+* Skin::revUserTools was removed (deprecated since 1.21).
+* Skin::specialLink was removed (deprecated since 1.21).
+* Skin::splitTrail was removed (deprecated since 1.21).
+* Skin::titleAttrib was removed (deprecated since 1.21).
+* Skin::tocIndent was removed (deprecated since 1.21).
+* Skin::tocLine was removed (deprecated since 1.21).
+* Skin::tocLineEnd was removed (deprecated since 1.21).
+* Skin::tocList was removed (deprecated since 1.21).
+* Skin::tocUnindent was removed (deprecated since 1.21).
+* Skin::tooltip was removed (deprecated since 1.21).
+* Skin::tooltipAndAccesskeyAttribs was removed (deprecated since 1.21).
+* Skin::userTalkLink was removed (deprecated since 1.21).
+* Skin::userToolLinksRedContribs was removed (deprecated since 1.21).
+* wikidiff3 is now the default and only PHP diff engine. It provides improved diff
+  performance on complex changes. $wgExternalDiffEngine = 'wikidiff3' therefore
+  makes no difference now. Users are still recommended to use wikidiff2 if possible,
+  though.
+* User::addNewUserLogEntry() was deprecated.
+* User::addNewUserLogEntryAutoCreate() was deprecated.
+* User::isPasswordReminderThrottled() was deprecated.
+* Bot-oriented parameters to Special:UserLogin (wpCookieCheck, wpSkipCookieCheck)
+  were removed.
+* Installer can now be customized without patching MediaWiki code, see
+  mw-config/overrides/README for details.
+
+=== Compatibility ===
+
+MediaWiki 1.27 requires PHP 5.5.9 or later. There is experimental support for
+HHVM 3.6.5 or later.
+
+MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
+support for them is somewhat less mature. There is experimental support for
+Oracle and Microsoft SQL Server.
+
+The supported versions are:
+
+* MySQL 5.0.3 or later
+* PostgreSQL 8.3 or later
+* SQLite 3.3.7 or later
+* Oracle 9.0.1 or later
+* Microsoft SQL Server 2005 (9.00.1399)
+
+=== Upgrading ===
+
+1.27 has several database changes since 1.26, and will not work without schema
+updates. Note that due to changes to some very large tables like the revision
+table, the schema update may take quite long (minutes on a medium sized site,
+many hours on a large site).
+
+If upgrading from before 1.11, and you are using a wiki as a commons
+repository, make sure that it is updated as well. Otherwise, errors may arise
+due to database schema changes.
+
+If upgrading from before 1.7, you may want to run refreshLinks.php to ensure
+new database fields are filled with data.
+
+If you are upgrading from MediaWiki 1.4.x or earlier, you should upgrade to
+1.5 first. The upgrade script maintenance/upgrade1_5.php has been removed
+with MediaWiki 1.21.
+
+Don't forget to always back up your database before upgrading!
+
+See the file UPGRADE for more detailed upgrade instructions.
+
+For notes on 1.26.x and older releases, see HISTORY.
+
+
 = MediaWiki 1.26 =
 
 == MediaWiki 1.26.2 ==
diff --git a/RELEASE-NOTES-1.27 b/RELEASE-NOTES-1.27
deleted file mode 100644 (file)
index e644ae4..0000000
+++ /dev/null
@@ -1,604 +0,0 @@
-== MediaWiki 1.27 ==
-
-THIS IS NOT A RELEASE YET
-
-MediaWiki 1.27 is an alpha-quality branch and is not recommended for use in
-production.
-
-=== PHP version requirement ===
-As of 1.27, MediaWiki now requires PHP 5.5.9 or higher. This corresponds with
-HHVM 3.1. Additionally, the following PHP extensions are required:
-* ctype
-* iconv
-* json
-* mbstring (new requirement in 1.27)
-* xml
-The following PHP extensions are strongly recommended:
-* openssl
-
-=== Configuration changes in 1.27 ===
-* $wgAllowMicrodataAttributes and $wgAllowRdfaAttributes were removed,
-  now always enabled. If you use RDFa on your wiki, you now have to explicitly
-  set $wgHtml5Version to 'HTML+RDFa 1.0' or 'XHTML+RDFa 1.0'.
-* $wgUseLinkNamespaceDBFields was removed.
-* Deprecated $wgResourceLoaderMinifierStatementsOnOwnLine and
-  $wgResourceLoaderMinifierMaxLineLength, because there was little value in
-  making the behavior configurable. The default values (`false` for the former,
-  1000 for the latter) are now hard-coded.
-* $wgDebugDumpSqlLength was removed (deprecated in 1.24).
-* $wgDebugDBTransactions was removed (deprecated in 1.20).
-* $wgUseXVO has been removed, as it provides functionality only used by
-  custom Wikimedia patches against Squid 2.x that probably noone uses in
-  production anymore. There is now $wgUseKeyHeader that provides similar
-  functionality but instead of the MediaWiki-specific X-Vary-Options header,
-  uses the draft Key header standard.
-* $wgScriptExtension (and support for '.php5' entry points) was removed. See the
-  deprecation notice in the release notes for version 1.25 for advice on how to
-  preserve support for '.php5' entry points via URL rewriting.
-* Password handling via the User object has been deprecated and partially
-  removed, pending the future introduction of AuthManager. In particular:
-** expirePassword(), getPasswordExpireDate(), resetPasswordExpiration(), and
-   getPasswordExpired() have been removed. They were unused outside of core.
-** The mPassword, mNewpassword, mNewpassTime, and mPasswordExpires fields are
-   now private and will be removed in the future.
-** The getPassword() and getTemporaryPassword() methods now throw
-   BadMethodCallException and will be removed in the future.
-** The ability to pass 'password' and 'newpassword' to createNew() has been
-   removed. The only users of it seem to have been using it to set invalid
-   passwords, and so shouldn't be greatly affected.
-** setPassword(), setInternalPassword(), and setNewpassword() have been
-   deprecated, pending the introduction of AuthManager.
-** User::randomPassword() is deprecated in favor of a new method
-   PasswordFactory::generateRandomPasswordString()
-** User::getPasswordFactory() is deprecated, callers should just create a
-   PasswordFactory themselves.
-** A new constructor, User::newSystemUser(), has been added to simplify the
-   creation of passwordless "system" users for logged actions.
-* $wgMaxSquidPurgeTitles was removed.
-* $wgAjaxWatch was removed. This is now enabled by default.
-* $wgUseInstantCommons now hotlinks Commons images by default instead of
-  downloading originals and thumbnailing them locally. This allows wikis to save
-  on CPU and bandwidth while reducing time to first byte for pages, even without
-  a thumbnail handler. See $wgForeignFileRepos documentation for tweaks.
-* (T27397) WebP is enabled by default as an uploadable filetype.
-* (T48998) $wgArticlePath must now be either a full url, or start with a "/".
-* $wgRateLimitLog was removed; use $wgDebugLogGroups['ratelimit'] instead.
-* Deprecated API formats dbg, txt, and yaml have been removed.
-* CLDRPluralRule* classes have been replaced with
-  wikimedia/cldr-plural-rule-parser.
-* Removed $wgProfilePerHost, $wgUDPProfilerHost, $wgUDPProfilerPort,
-  $wgUDPProfilerFormatString, $wgStatsMethod, $wgAggregateStatsID,
-  $wgStatsFormatString, and $wgProfileCallTree (deprecated since 1.20).
-* For proper operation of LocalIdLookup with shared user tables, ensure that
-  $wgSharedDB and $wgSharedTables are properly set even on the "central" wiki
-  that all others are sharing from and that $wgLocalDatabases is set to the
-  full list of sharing wikis on all those wikis.
-* Massive overhaul to session handling:
-** $wgSessionsInObjectCache is no longer supported and must be true, due to
-   MediaWiki\Session\SessionManager. $wgSessionHandler is similarly no longer
-   used.
-** ObjectCacheSessionHandler is removed, replaced with
-   MediaWiki\Session\PhpSessionHandler.
-** PHP session handling in general ($_SESSION, session_id(), and so on) is
-   deprecated. Use MediaWiki\Session\SessionManager instead. A new config
-   variable, $wgPHPSessionHandling, is available to cause use of $_SESSION to
-   issue a deprecation warning or to cause most PHP session handling to throw
-   exceptions.
-** Deprecated UserSetCookies hook. Session-handling extensions should generally
-   be creating a custom subclass of CookieSessionProvider. Other extensions
-   messing with cookies can no longer count on user data being saved in cookies
-   versus other methods.
-** Deprecated UserLoadFromSession hook, extensions should create a
-   MediaWiki\Session\SessionProvider.
-** The User cannot be loaded from session until after Setup.php completes.
-   Attempts to do so will be ignored and the User will remain unloaded.
-** CSRF tokens may be fetched from the MediaWiki\Session\Session, which uses
-   the MediaWiki\Session\Token class.
-* MediaWiki will now auto-create users as necessary, removing the need for
-  extensions to do so. An 'autocreateaccount' right is added to allow
-  auto-creation when 'createaccount' is not granted to all users.
-* Deprecated AuthPluginAutoCreate hook in favor of LocalUserCreated.
-* Most cookie-handling methods in User are deprecated.
-* $wgAllowAsyncCopyUploads and $CopyUploadAsyncTimeout were removed. This was an
-  experimental feature that has never worked.
-* Login and createaccount tokens now vary by timestamp.
-* LoginForm::getLoginToken() and LoginForm::getCreateaccountToken()
-  return a MediaWiki\Session\Token, and tokens must be checked using that
-  class's methods.
-* $wgEnotifUseJobQ was removed and the job queue is always used.
-* The functionality of the ApiSandbox extension has been merged into core. The
-  extension should no longer be used.
-* $wgPreloadJavaScriptMwUtil was removed (deprecated in 1.26).
-  Extensions, skins, gadgets and scripts that use the mediawiki.util module must
-  express a dependency on it.
-* $wgIncludeLegacyJavaScript, deprecated in MediaWiki 1.26, now defaults false.
-  Extensions, skins, gadgets and scripts that need the mediawiki.legacy.wikibits
-  module should express a dependency on it.
-* Removed configuration option $wgCopyrightIcon (deprecated since 1.18). Use
-  $wgFooterIcons['copyright']['copyright'] instead.
-* If the openssl and mcrypt PHP extensions are both unavailable, secure
-  session storage (used for login) will raise an exception. This exception may
-  be bypassed by setting $wgSessionInsecureSecrets = true.
-* Massive overhaul to authentication:
-** AuthPlugin and AuthPluginUser are deprecated.
-** LoginForm and associated templates are deprecated. Extensions which called
-   static LoginForm methods should be converted into authentication providers.
-** The following hooks are deprecated:
-*** AbortAutoAccount (create a MediaWiki\Auth\PreAuthenticationProvider instead)
-*** AbortLogin (create a MediaWiki\Auth\PreAuthenticationProvider instead)
-*** AbortNewAccount (create a MediaWiki\Auth\PreAuthenticationProvider instead)
-*** AddNewAccount (use LocalUserCreated instead)
-*** AuthPluginSetup (create a MediaWiki\Auth\PrimaryAuthenticationProvider instead)
-*** ChangePasswordForm (use AuthChangeFormFields instead, or security levels)
-*** LoginUserMigrated (create a MediaWiki\Auth\PreAuthenticationProvider instead)
-*** UserCreateForm (create a MediaWiki\Auth\AuthenticationProvider of some type instead)
-*** UserLoginForm (create a MediaWiki\Auth\AuthenticationProvider of some type instead)
-** The following hooks are removed:
-*** AbortChangePassword
-*** LoginPasswordResetMessage
-*** PrefsPasswordAudit
-** The UserLoginComplete hook will no longer be called for all logins, only for
-   those via the web UI. Use UserLoggedIn if you need to do something on all
-   logins.
-** $wgRequirePasswordforEmailChange is removed.
-
-=== New features in 1.27 ===
-* $wgDataCenterUpdateStickTTL was also added. This decides how long a user
-  sticks to the primary DC (via cookies) after they make changes to the site.
-* Added a new hook, 'UserMailerTransformContent', to transform the contents
-  of an email. This is similar to the EmailUser hook but applies to all mail
-  sent via UserMailer.
-* Added a new hook, 'UserMailerTransformMessage', to transform the contents
-  of an emai after MIME encoding.
-* Added a new hook, 'UserMailerSplitTo', to control which users have to be
-  emailed separately (ie. there is a single address in the To: field) so
-  user-specific changes to the email can be applied safely.
-* $wgCdnMaxageLagged was added, which limits the CDN cache TTL
-  when any load balancer uses a DB that is lagged beyond the 'max lag'
-  setting in the relevant section of $wgLBFactoryConf.
-* User::newSystemUser() may be used to simplify the creation of passwordless
-  "system" users for logged actions from scripts and extensions.
-* Extensions can now return detailed error information via the API when
-  preventing user actions using 'getUserPermissionsErrors' and similar hooks
-  by using ApiMessage instances instead of strings for the $result value.
-* $wgAPIMaxLagThreshold was added to limit bot changes when databases lag
-  becomes too high.
-* Skins and extensions can now use FlexBox mixins (.flex-display(@display: flex)
-  and .flex(@grow: 1, @shrink: 1, @width: auto, @order: 1)) in Less to create
-  cross-browser-compatible FlexBox rules. Users will still need to add fallback
-  float rules or the like for compatibility with IE9- separately.
-* Added MWTimestamp::getTimezoneString() which returns the localized timezone
-  string, if available. To localize this string, see the comments of
-  $wgLocaltimezone in includes/DefaultSettings.php.
-* Added CentralIdLookup, a service that allows extensions needing a concept of
-  "central" users to get that without having to know about specific central
-  authentication extensions.
-* $wgMaxUserDBWriteDuration added to limit huge user-generated transactions.
-  Regular web request transactions that takes longer than this are aborted.
-* Added a new hook, 'TitleMoveCompleting', which runs before a page move is
-  committed.
-* $wgCdnReboundPurgeDelay was added to provide secondary delayed purges of URLs
-  from CDN to mitigate DB replication lag and WAN cache purge lag.
-* (T49162) Installer will default to setting CACHE_ACCEL as the main cache type
-  if it is available.
-* It is now possible to patrol file uploads (both for new files and new versions
-  of existing files). Special:NewFiles has gained an option to filter by patrol
-  status. This functionality can be disabled using $wgUseFilePatrol.
-* MediaWiki\Session infrastructure allows for easier use of session mechanisms
-  other than the usual cookies.
-** SessionMetadata and SessionCheckInfo hooks allow for setting and checking
-   custom session metadata.
-* Added MWGrants and associated configuration settings $wgGrantPermissions and
-  $wgGrantPermissionGroups to hold configuration for authentication features
-  such as OAuth that want to allow restricting the user rights a user may make
-  use of.
-** If you're already using the OAuth extension, these new variables are
-   identical to (and will replace) $wgMWOAuthGrantPermissions and
-   $wgMWOAuthGrantPermissionGroups.
-* Added MWRestrictions as a class to check restrictions on a WebRequest, e.g.
-  to assert that the request comes from a particular IP range.
-* Added bot passwords, a rights-restricted login mechanism for API-using bots.
-* Whitelisted the following HTML attributes for all elements in wikitext:
-  aria-describedby, aria-flowto, aria-label, aria-labelledby, aria-owns.
-* Removed "presentation" restriction on the HTML role attribute in wikitext.
-  All values are now allowed for the role attribute.
-* $wgContentHandlers now also supports callbacks to create an instance of the
-  appropriate ContentHandler subclass.
-* Added $wgAuthenticationTokenVersion, which if non-null prevents the
-  user_token database field from being exposed in cookies. Setting this would
-  be a good idea, but will log out all current sessions.
-* $wgEventRelayerConfig was added, for managing PubSub event relay configuration,
-  specifically for reliable CDN url purges.
-* Requests have unique IDs, equal to the UNIQUE_ID environment variable (when
-  MediaWiki is behind Apache+mod_unique_id or something similar) or a randomly-
-  generated 24-character string. This request ID is used to annotate log records
-  and error messages. It is available client-side via mw.config.get( 'wgRequestId' ).
-  The request ID supplants exception IDs. Accordingly, MWExceptionHandler::getLogId()
-  is deprecated.
-* (T33313) Add a preference for watching uploads by default, also applies
-  to API-based upload tools.
-* $wgJpegPixelFormat was added to override chroma subsampling for JPEG image
-  thumbnails created via ImageMagick. Defaults to 'yuv420', providing bandwidth
-  savings versus the previous behavior on many files.
-* MediaWiki\Auth infrastructure (called "AuthManager") allows for more flexible
-  configuration of multiple authentication pieces that was possible with
-  AuthPlugin. For example, it's now easy to plug in second-factor
-  authentication, or add additional checks to the login process, or to support
-  multiple login methods at once, or to support non-password-based login methods.
-** Providers are configured via the global setting $wgAuthManagerConfig.
-** A global, $wgDisableAuthManager, is temporarily available to disable
-   AuthManager until extensions are ready to support it.
-** New hook, AuthChangeFormFields, to adjust the form fields on
-   AuthManager-related special pages.
-** New hook, AuthManagerLoginAuthenticateAudit, for additional logging of
-   AuthManager-related authentication requests.
-** New hook, ChangeAuthenticationDataAudit, for additional logging of
-   AuthManager-related authentication data changes.
-** New hook, SecuritySensitiveOperationStatus, to work with the new mechanism
-   for requiring a recent login before taking security-sensitive operations
-   like changing a password.
-** Two new globals, $wgChangeCredentialsBlacklist and $wgRemoveCredentialsBlacklist
-   can be used to prevent the web UI and the API changing certain authentication data.
-* The file upload dialog (available if you install WikiEditor or VisualEditor)
-  can now be configured using $wgUploadDialog.
-
-=== External library changes in 1.27 ===
-
-==== Upgraded external libraries ====
-* Updated oojs/oojs-ui from v0.12.12 to v0.13.3.
-* Updated composer/semver from v1.0.0 to v1.2.0.
-* Updated liuggio/statsd-php-client to 1.0.18.
-* Updated QUnit from v1.18.0 to v1.22.0.
-
-==== New external libraries ====
-* Added wikimedia/base-convert v1.0.1.
-* Added wikimedia/cldr-plural-rule-parser v1.0.0.
-* Added wikimedia/relpath v1.0.3.
-* Added wikimedia/running-stat v1.1.0.
-* Added wikimedia/php-session-serializer v1.0.3.
-
-==== Removed and replaced external libraries ====
-
-=== Bug fixes in 1.27 ===
-* Special:Upload will now display correct maximum allowed file size when running
-  under HHVM (T116347).
-
-=== Action API changes in 1.27 ===
-* Added list=allrevisions.
-* generator=recentchanges now has the option to generate revids.
-* ApiPageSet::setRedirectMergePolicy() was added. This allows generator
-  modules to define how generator data for a redirect source gets merged
-  into the redirect destination.
-* prop=imageinfo&iiprop=uploadwarning will no longer include the possibility of
-  "was-deleted" warning.
-* Added difftotextpst to query=revisions which preforms a pre-save transform on
-  the text before diffing it.
-* Deprecated formats dbg, txt, and yaml have been removed.
-* (T47988) The protect log event details now use new-style formatting.
-* The following response properties from action=login are deprecated, and may
-  be removed in the future: lgtoken, cookieprefix, sessionid. Clients should
-  handle cookies to properly manage session state.
-* action=login transparently allows login using bot passwords. Clients should
-  merely need to change the username and password used after setting up a bot
-  password.
-* action=upload no longer understands statuskey, asyncdownload or leavemessage.
-* Several changes when $wgDisableAuthManager is false:
-** action=login is deprecated for uses other than bot passwords.
-** list=users can now indicate if a missing username is creatable.
-** action=createaccount is changed in a non-backwards-compatible manner.
-** Added action=query&meta=authmanagerinfo.
-** Added action=clientlogin to be used to log into the main account instead of
-   action=login.
-** Added action=linkaccount.
-** Added action=unlinkaccount.
-** Added action=changeauthenticationdata.
-** Added action=removeauthenticationdata.
-** Added action=resetpassword.
-
-=== Action API internal changes in 1.27 ===
-* ApiQueryORM removed.
-* The following classes have been removed:
-** ApiFormatDbg
-** ApiFormatTxt
-** ApiFormatYaml
-* ApiBase::addTokenProperties() was removed (deprecated since 1.24).
-* ApiBase::getFinalPossibleErrors() was removed (deprecated since 1.24).
-* ApiBase::getFinalResultProperties() was removed (deprecated since 1.24).
-* ApiBase::getRequireAtLeastOneParameterErrorMessages() was removed (deprecated since 1.24).
-* ApiBase::getPossibleErrors() was removed (deprecated since 1.24).
-* ApiBase::getRequireMaxOneParameterErrorMessages() was removed (deprecated since 1.24).
-* ApiBase::getRequireOnlyOneParameterErrorMessages() was removed (deprecated since 1.24).
-* ApiBase::getResultProperties() was removed (deprecated since 1.24).
-* ApiBase::getTitleOrPageIdErrorMessage() was removed (deprecated since 1.24).
-* ApiBase::parseErrors() was removed (deprecated since 1.24).
-* ApiQueryBase::titleToKey(), ApiQueryBase::keyToTitle() and
-  ApiQueryBase::keyPartToTitle() all removed (deprecated since 1.24).
-* ApiQueryBase::checkRowCount() was removed (deprecated since 1.24).
-* ApiQueryBase::getDirectionDescription() was removed (deprecated since 1.25).
-* ApiQuery::getGenerators() was removed (deprecated since 1.21).
-* ApiQuery::getModules() was removed (deprecated since 1.21).
-* ApiQuery::getModuleType() was removed (deprecated since 1.21).
-* ApiQuery::setGeneratorContinue() was removed (deprecated since 1.24).
-* ApiMain::getModules() was removed (deprecated since 1.21).
-* ApiBase::getVersion() was removed (deprecated since 1.21).
-* ApiMain::getShowVersions() was removed (deprecated in 1.21).
-* ApiMain::addModule() was removed (deprecated in 1.21).
-* ApiMain::addFormat() was removed (deprecated in 1.21).
-* ApiMain::getFormats() was removed (deprecated in 1.21).
-* ApiPageSet::finishPageSetGeneration() was removed (deprecated in 1.21).
-* ApiCreateAccount is deprecated, and will be removed soon.
-
-=== Languages updated in 1.27 ===
-
-MediaWiki supports over 350 languages. Many localisations are updated
-regularly. Below only new and removed languages are listed, as well as
-changes to languages because of Phabricator reports.
-
-* (T113688) Change default numerals from Gurmukhi to Arabic for Punjabi locale.
-* (T116020) Aliases of magic words in MessagesXx.php are sorted by usage.
-
-=== Other changes in 1.27 ===
-* Added dependency injection (DI) infrastructure, see docs/injection.txt for details.
-  It is planned to incrementally move MediaWiki code towards using DI, using the
-  service locator (SL) pattern as a stepping stone.
-* ProfilerOutputUdp was removed. Note that there is a ProfilerOutputStats class.
-* WikiPage::doDeleteArticleReal() and WikiPage::doDeleteArticle() now
-  ignore the 2nd and 3rd arguments (formerly $id and $commit).
-* Removed "loaderScripts" option from ResourceLoaderFileModule class.
-* Removed ORM-like wrapper added in 1.20.
-* LinkCache::getGoodLinks and LinkCache::getBadLinks were removed
-  (deprecated in 1.26).
-* WikiPage::doQuickEdit() was removed (deprecated since 1.21).
-* Removed SiteObject and SiteArray classes (deprecated in 1.21).
-* MessageBlobStore::getInstance() was removed (deprecated since 1.25).
-* (T84937) Free external links ("autolinked" urls) will now be terminated
-  by &nbsp; and HTML entity encodings of &nbsp, <, and >.
-* (T36948) The default file revert message's timestamp is now in
-  $wgLocaltimezone, instead of UTC.
-* The default name of the 'suppress' group page has been changed from
-  'Project:Oversight' to 'Project:Suppress'.
-* DatabaseBase::resultObject() is now protected (use outside Database classes
-  not necessary since 1.11).
-* Calling ResourceLoaderFileModule::readStyleFiles() without a
-  ResourceLoaderContext instance is deprecated.
-* ResourceLoader::getLessCompiler() now takes an optional parameter of
-  additional LESS variables to set for the compiler.
-* wfBaseConvert() marked as deprecated, use Wikimedia\base_convert() directly
-  instead.
-* Obsolete maintenance scripts clearCacheStats.php and showCacheStats.php
-  were removed. The underlying data is sent to StatsD (see $wgStatsdServer).
-* Removed msg_resource_links database table and associated code.
-* Removed msg_resource database table and associated code.
-* Skin::getNamespaceNotice() was removed.
-* wfIsConfiguredProxy() was removed (deprecated since 1.24).
-* wfDebugTimer() was removed (deprecated since 1.25).
-* wfIsTrustedProxy() was removed (deprecated since 1.24).
-* wfGetIP() was removed (deprecated since 1.19).
-* MWHookException was removed.
-* OutputPage::appendSubtitle() was removed (deprecated since 1.19).
-* OutputPage::loginToUse() was removed (deprecated since 1.19).
-* Article::loadContent() was removed (deprecated since 1.19).
-* User::editToken() was removed (deprecated since 1.19).
-* Removed --force-normal option of dumpBackup.php, as it no longer served
-  any useful purpose since 1.22.
-* The functions processOption() and processArgs() on the BackupDumper and
-  TextPassDumper classes have been removed.
-* The maintenance/backupTextPass.inc file was deleted. You should include
-  maintenance/dumpTextPass.php instead.
-* WikiPage::getUsedTemplates() was removed (deprecated since 1.19).
-* wfEmptyMsg() was removed (deprecated since 1.18).
-* OutputPage::permissionRequired() was removed (deprecated since 1.18).
-* OutputPage::blockedPage() was removed (deprecated since 1.18).
-* User::getSkin() was removed (deprecated since 1.18).
-* OutputPage::includeJQuery() was removed (deprecated since 1.17).
-* WikiPage::updateRestrictions() was removed (deprecated since 1.19).
-* WikiPage::testPreSaveTransform() was removed (deprecated since 1.19).
-* LogPage::logName() was removed (deprecated since 1.19).
-* LogPage::logHeader() was removed (deprecated since 1.19).
-* wfCheckLimits() was removed (deprecated since 1.24).
-* Linker::makeKnownLinkObj() was removed (deprecated since 1.16).
-* Linker::makeLinkObj() was removed (deprecated since 1.16).
-* wfMsgForContentNoTrans() was removed (deprecated since 1.18).
-* ChangesList::usePatrol was removed (deprecated since 1.22).
-* wfMsgNoTrans() was removed (deprecated since 1.18).
-* Linker::makeImageLink2 was removed (deprecated since 1.20).
-* Title::userIsWatching() was removed (deprecated since 1.20).
-* Removed WaitForSlave maintenance script; use SELECT MASTER_POS_WAIT()
-  database function directly instead.
-* wfMsg() was removed (deprecated since 1.18).
-* wfMsgForContent() was removed (deprecated since 1.18).
-* wfMsgReal() was removed (deprecated since 1.18).
-* wfMsgGetKey() was removed (deprecated since 1.18).
-* wfMsgHtml() was removed (deprecated since 1.18).
-* wfMsgWikiHtml() was removed (deprecated since 1.18).
-* wfMsgExt() was removed (deprecated since 1.18).
-* Language::armourMath() was removed (deprecated since 1.22).
-* LanguageConverter::armourMath() was removed (deprecated since 1.22).
-* FakeConverter::armourMath() was removed (deprecated since 1.22).
-* The unused jquery.validate ResourceLoader module was removed.
-* FileRepo::getRootUrl() was removed (deprecated since 1.20).
-* User::generateToken() was removed (deprecated since 1.20).
-* WikiPage::getRawText() was removed (deprecated since 1.21).
-* ParserOutput::hasCustomDataUpdates() was removed (deprecated since 1.25).
-* ParserOutput::addSecondaryDataUpdate() was removed (deprecated since 1.25).
-* ParserOutput::getSecondaryDataUpdates() was removed (deprecated since 1.25).
-* Gallery images with multiple caption pipes no longer concatenate them all
-  together but instead pick the final one, similar to image syntax.
-* XML-like parser tags (such as <gallery>), when unclosed, will be left unparsed
-  rather than consume everything until the end of the page.
-* New maintenance script resetUserEmail.php allows sysadmins to reset user emails in case
-  a user forgot password/account was stolen.
-* wfCheckEntropy() was removed (deprecated in 1.27).
-* Browser support for Internet Explorer 8 lowered from Grade A to Grade C.
-* ContentHandler::supportsCategories method added. Default is true.
-  CategoryMembershipChangeJob updates are skipped for content that
-  does not support categories.
-* wikidiff difference engine is no longer supported, anyone still using it are encouraged
-  to upgrade to wikidiff2 which is actively maintained and has better package availability.
-* Database logic was removed from WatchedItem and a WatchedItemStore was created:
-** WatchedItem::IGNORE_USER_RIGHTS and WatchedItem::CHECK_USER_RIGHTS were deprecated.
-   User::IGNORE_USER_RIGHTS and User::CHECK_USER_RIGHTS were introduced.
-** WatchedItem::fromUserTitle was deprecated in favour of the constructor.
-** WatchedItem::resetNotificationTimestamp was deprecated.
-** WatchedItem::batchAddWatch was deprecated.
-** WatchedItem::addWatch was deprecated.
-** WatchedItem::removeWatch was deprecated.
-** WatchedItem::isWatched was deprecated.
-** WatchedItem::duplicateEntries was deprecated.
-** EmailNotification::updateWatchlistTimestamp was deprecated.
-** User::getWatchedItem was removed.
-* Unit tests don't work with external PHPUnit anymore, Composer is now the only supported
-  way. Run `composer install` to install it and other dev dependencies to run unit tests.
-* wl_id field added to the watchlist table.
-* Revision::getRawText() was removed (deprecated since 1.21).
-* WikiPage::replaceSection() was removed (deprecated since 1.21).
-* Article::replaceSection() was removed (deprecated since 1.21).
-* Language::getLangObj() was removed (deprecated since 1.24).
-* Language::getLanguageName() was removed (deprecated since 1.20).
-* Language::getLanguageNames() was removed (deprecated since 1.20).
-* Language::getTranslatedLanguageNames() was removed (deprecated since 1.20).
-* Language::specialPage() was removed (deprecated since 1.24).
-* MediaWikiTestCase::assertException() was removed (deprecated since 1.22).
-* OutputPage::getHeadItems() was removed (deprecated since 1.24).
-* OutputPage::getScript() was removed (deprecated since 1.24).
-* OutputPage::out() was removed (deprecated since 1.22).
-* OutputPage::setAllowedModules() was removed (deprecated since 1.24).
-* UserrightsPage::makeGroupNameListForLog() was removed (deprecated since 1.21).
-* MediaWikiSite::newFromGlobalId() was removed (deprecated since 1.21).
-* Title::newFromRedirect() was removed (deprecated since 1.21).
-* Skin::commonPrintStylesheet() was removed (deprecated since 1.22).
-* Skin::getCommonStylePath() was removed (deprecated since 1.24).
-* Skin::newFromKey() was removed (deprecated since 1.24).
-* Skin::getUsableSkins() was removed (deprecated since 1.23).
-* LoadBalancer::pickRandom() was removed (deprecated in 1.21).
-* Article::getUndoText() and WikiPage::getUndoText were removed (deprecated since
-  1.21).
-* DifferenceEngine::setText() was removed (deprecated in 1.21).
-* Title::newFromRedirectArray() was removed (deprecated in 1.21).
-* UserMailer::send() no longer accepts $replyto as the 5th argument and $contentType
-  as the 6th. These must be passed in the options array now.
-* Title::newFromRedirectRecurse() was removed (deprecated in 1.21).
-* Skin::accesskey was removed (deprecated since 1.21).
-* Skin::blockLink was removed (deprecated since 1.21).
-* Skin::buildRollbackLink was removed (deprecated since 1.21).
-* Skin::emailLink was removed (deprecated since 1.21).
-* Skin::formatComment was removed (deprecated since 1.21).
-* Skin::formatHiddenCategories was removed (deprecated since 1.21).
-* Skin::formatLinksInComment was removed (deprecated since 1.21).
-* Skin::formatRevisionSize was removed (deprecated since 1.21).
-* Skin::formatSize was removed (deprecated since 1.21).
-* Skin::formatTemplates was removed (deprecated since 1.21).
-* Skin::generateTOC was removed (deprecated since 1.21).
-* Skin::getInternalLinkAttributes was removed (deprecated since 1.21).
-* Skin::getInternalLinkAttributesObj was removed (deprecated since 1.21).
-* Skin::getInterwikiLinkAttributes was removed (deprecated since 1.21).
-* Skin::getInvalidTitleDescription was removed (deprecated since 1.21).
-* Skin::getLinkColour was removed (deprecated since 1.21).
-* Skin::getRevDeleteLink was removed (deprecated since 1.21).
-* Skin::getRollbackEditCount was removed (deprecated since 1.21).
-* Skin::makeBrokenImageLinkObj was removed (deprecated since 1.21).
-* Skin::makeCommentLink was removed (deprecated since 1.21).
-* Skin::makeExternalImage was removed (deprecated since 1.21).
-* Skin::makeExternalLink was removed (deprecated since 1.21).
-* Skin::makeHeadline was removed (deprecated since 1.21).
-* Skin::makeImageLink was removed (deprecated since 1.21).
-* Skin::makeMediaLinkFile was removed (deprecated since 1.21).
-* Skin::makeMediaLinkObj was removed (deprecated since 1.21).
-* Skin::makeSelfLinkObj was removed (deprecated since 1.21).
-* Skin::makeThumbLink2 was removed (deprecated since 1.21).
-* Skin::makeThumbLinkObj was removed (deprecated since 1.21).
-* Skin::normaliseSpecialPage was removed (deprecated since 1.21).
-* Skin::normalizeSubpageLink was removed (deprecated since 1.21).
-* Skin::processResponsiveImages was removed (deprecated since 1.21).
-* Skin::revComment was removed (deprecated since 1.21).
-* Skin::revDeleteLink was removed (deprecated since 1.21).
-* Skin::revDeleteLinkDisabled was removed (deprecated since 1.21).
-* Skin::revUserLink was removed (deprecated since 1.21).
-* Skin::revUserTools was removed (deprecated since 1.21).
-* Skin::specialLink was removed (deprecated since 1.21).
-* Skin::splitTrail was removed (deprecated since 1.21).
-* Skin::titleAttrib was removed (deprecated since 1.21).
-* Skin::tocIndent was removed (deprecated since 1.21).
-* Skin::tocLine was removed (deprecated since 1.21).
-* Skin::tocLineEnd was removed (deprecated since 1.21).
-* Skin::tocList was removed (deprecated since 1.21).
-* Skin::tocUnindent was removed (deprecated since 1.21).
-* Skin::tooltip was removed (deprecated since 1.21).
-* Skin::tooltipAndAccesskeyAttribs was removed (deprecated since 1.21).
-* Skin::userTalkLink was removed (deprecated since 1.21).
-* Skin::userToolLinksRedContribs was removed (deprecated since 1.21).
-* wikidiff3 is now the default and only PHP diff engine. It provides improved diff
-  performance on complex changes. $wgExternalDiffEngine = 'wikidiff3' therefore
-  makes no difference now. Users are still recommended to use wikidiff2 if possible,
-  though.
-* User::addNewUserLogEntry() was deprecated.
-* User::addNewUserLogEntryAutoCreate() was deprecated.
-* User::isPasswordReminderThrottled() was deprecated.
-* Bot-oriented parameters to Special:UserLogin (wpCookieCheck, wpSkipCookieCheck)
-  were removed.
-
-== Compatibility ==
-
-MediaWiki 1.27 requires PHP 5.5.9 or later. There is experimental support for
-HHVM 3.6.5 or later.
-
-MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
-support for them is somewhat less mature. There is experimental support for
-Oracle and Microsoft SQL Server.
-
-The supported versions are:
-
-* MySQL 5.0.3 or later
-* PostgreSQL 8.3 or later
-* SQLite 3.3.7 or later
-* Oracle 9.0.1 or later
-* Microsoft SQL Server 2005 (9.00.1399)
-
-== Upgrading ==
-
-1.27 has several database changes since 1.26, and will not work without schema
-updates. Note that due to changes to some very large tables like the revision
-table, the schema update may take quite long (minutes on a medium sized site,
-many hours on a large site).
-
-If upgrading from before 1.11, and you are using a wiki as a commons
-repository, make sure that it is updated as well. Otherwise, errors may arise
-due to database schema changes.
-
-If upgrading from before 1.7, you may want to run refreshLinks.php to ensure
-new database fields are filled with data.
-
-If you are upgrading from MediaWiki 1.4.x or earlier, you should upgrade to
-1.5 first. The upgrade script maintenance/upgrade1_5.php has been removed
-with MediaWiki 1.21.
-
-Don't forget to always back up your database before upgrading!
-
-See the file UPGRADE for more detailed upgrade instructions.
-
-For notes on 1.26.x and older releases, see HISTORY.
-
-== Online documentation ==
-
-Documentation for both end-users and site administrators is available on
-MediaWiki.org, and is covered under the GNU Free Documentation License (except
-for pages that explicitly state that their contents are in the public domain):
-
-       https://www.mediawiki.org/wiki/Documentation
-
-== Mailing list ==
-
-A mailing list is available for MediaWiki user support and discussion:
-
-       https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
-
-A low-traffic announcements-only list is also available:
-
-       https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
-
-It's highly recommended that you sign up for one of these lists if you're
-going to run a public MediaWiki, so you can be notified of security fixes.
-
-== IRC help ==
-
-There's usually someone online in #mediawiki on irc.freenode.net.
index 0e423d2..5b77ac2 100644 (file)
@@ -6,6 +6,9 @@ MediaWiki 1.28 is an alpha-quality branch and is not recommended for use in
 production.
 
 === Configuration changes in 1.28 ===
+* BREAKING CHANGE: $wgHTTPProxy is now *required* for all external requests
+  made by MediaWiki via a proxy. Relying on the http_proxy environment
+  variable is no longer supported.
 * The load.php entry point now enforces the existing policy of not allowing
   access to session data, which includes the session user and the session
   user's language. If such access is attempted, an exception will be thrown.
@@ -13,10 +16,26 @@ production.
   is configurable via $wgSessionPbkdf2Iterations.
 * Upload dialog's file upload log comment can now be configured separately for
   local and foreign uploads.
+* $wgForeignUploadTargets now defaults to `[ 'local' ]`, where `'local'`
+  signifies local uploads. A value of `[]` (empty array) now means that
+  no upload targets are allowed, effectively disabling the upload dialog.
+* The deprecated $wgEditEncoding variable has been removed; it was only used
+  for Esperanto language character conversion. You are now recommended to use
+  input methods provided by the UniversalLanguageSelector extension.
+* When $wgPingback is true, MediaWiki will periodically ping
+  https://www.mediawiki.org/beacon with basic information about the local
+  MediaWiki installation.  This data includes, for example, the type of system,
+  PHP version, and chosen database backend. This behavior is off by default.
 
 === New features in 1.28 ===
 * User::isBot() method for checking if an account is a bot role account.
+* Added a new 'slideshow' mode for galleries.
 * Added a new hook, 'UserIsBot', to aid in determining if a user is a bot.
+* Added a new hook, 'ApiMakeParserOptions', to allow extensions to better
+  interact with API parsing.
+* Added a new hook, 'UploadVerifyUpload', which can be used to reject a file
+  upload. Unlike 'UploadVerifyFile' it provides information about upload comment
+  and the file description page, but does not run for uploads to stash.
 
 === External library changes in 1.28 ===
 
@@ -30,8 +49,14 @@ production.
 === Bug fixes in 1.28 ===
 
 === Action API changes in 1.28 ===
+* Added 'maxarticlesize' property to action=query&meta=siteinfo which contains
+  the value of $wgMaxArticleSize.
+* Property 'modulemessages' from action=parse&prop=modules was removed
+  (deprecated since 1.26).
 
 === Action API internal changes in 1.28 ===
+* Added a new hook, 'ApiMakeParserOptions', to allow extensions to better
+  interact with ApiParse and ApiExpandTemplates.
 
 === Languages updated in 1.28 ===
 
@@ -39,8 +64,29 @@ MediaWiki supports over 350 languages. Many localisations are updated
 regularly. Below only new and removed languages are listed, as well as
 changes to languages because of Phabricator reports.
 
+* (T137411) ban (Balinese), thanks to translators Adi Mayndra, Andru,
+  BASAbali, M. Adiputra, Naval Scene, Nemo bis, NoiX180, and 아라.
+* (T135867) shn (Shan), thanks to translators Khun Sar, Piangpha,
+  Saiddzone Saimawnkham, Saosukham, and Sengwan.
+
 === Other changes in 1.28 ===
 * (T128697) Improved handling of large diffs.
+* [BREAKING CHANGE] $wgExtendedLoginCookies has been removed.  You can
+  use or update a custom session provider if needed.
+* Deprecated APIEditBeforeSave hook in favor of EditFilterMergedContent.
+* The 'UploadVerification' hook is deprecated. Use 'UploadVerifyFile' instead.
+* SiteConfiguration::isLocalVHost() was removed (deprecated since 1.25).
+* The 'UserLoginComplete' hook has a new parameter to differentiate between actual
+  login and visiting the login page while already logged in.
+* ResourceLoader::makeLoaderURL() was removed (deprecated since 1.24).
+* $.fn.liveAndTestAtStart was removed (deprecated since 1.24).
+* Linker::link() and Linker::linkKnown() were deprecated; please instead use
+  MediaWiki\Linker\LinkRenderer. In addition, the LinkBegin and LinkEnd hooks
+  were replaced by HtmlPageLinkRendererBegin and HtmlPageLinkRendererEnd
+  respectively. See docs/hooks.txt for the specific changes needed for those hooks.
+* The 'ParserLimitReportFormat' hook was removed.
+* Disabled "bug 2702" HTML tidying of parsed UI messages on wikis where Tidy is
+  disabled.
 
 == Compatibility ==
 
index 27da2ca..5808040 100644 (file)
@@ -21,6 +21,7 @@ $wgAutoloadLocalClasses = [
        'ApiAuthManagerHelper' => __DIR__ . '/includes/api/ApiAuthManagerHelper.php',
        'ApiBase' => __DIR__ . '/includes/api/ApiBase.php',
        'ApiBlock' => __DIR__ . '/includes/api/ApiBlock.php',
+       'ApiCSPReport' => __DIR__ . '/includes/api/ApiCSPReport.php',
        'ApiChangeAuthenticationData' => __DIR__ . '/includes/api/ApiChangeAuthenticationData.php',
        'ApiCheckToken' => __DIR__ . '/includes/api/ApiCheckToken.php',
        'ApiClearHasMsg' => __DIR__ . '/includes/api/ApiClearHasMsg.php',
@@ -156,6 +157,7 @@ $wgAutoloadLocalClasses = [
        'AuthManagerSpecialPage' => __DIR__ . '/includes/specialpage/AuthManagerSpecialPage.php',
        'AuthPlugin' => __DIR__ . '/includes/AuthPlugin.php',
        'AuthPluginUser' => __DIR__ . '/includes/AuthPlugin.php',
+       'AutoCommitUpdate' => __DIR__ . '/includes/deferred/AutoCommitUpdate.php',
        'AutoLoader' => __DIR__ . '/includes/AutoLoader.php',
        'AutoloadGenerator' => __DIR__ . '/includes/utils/AutoloadGenerator.php',
        'Autopromote' => __DIR__ . '/includes/Autopromote.php',
@@ -244,6 +246,7 @@ $wgAutoloadLocalClasses = [
        'ClassCollector' => __DIR__ . '/includes/utils/AutoloadGenerator.php',
        'CleanupAncientTables' => __DIR__ . '/maintenance/cleanupAncientTables.php',
        'CleanupBlocks' => __DIR__ . '/maintenance/cleanupBlocks.php',
+       'CleanupEmptyCategories' => __DIR__ . '/maintenance/cleanupEmptyCategories.php',
        'CleanupPreferences' => __DIR__ . '/maintenance/cleanupPreferences.php',
        'CleanupRemovedModules' => __DIR__ . '/maintenance/cleanupRemovedModules.php',
        'CleanupSpam' => __DIR__ . '/maintenance/cleanupSpam.php',
@@ -327,6 +330,7 @@ $wgAutoloadLocalClasses = [
        'DateFormats' => __DIR__ . '/maintenance/language/date-formats.php',
        'DateFormatter' => __DIR__ . '/includes/parser/DateFormatter.php',
        'DeadendPagesPage' => __DIR__ . '/includes/specials/SpecialDeadendpages.php',
+       'DeferrableCallback' => __DIR__ . '/includes/deferred/DeferrableCallback.php',
        'DeferrableUpdate' => __DIR__ . '/includes/deferred/DeferrableUpdate.php',
        'DeferredStringifier' => __DIR__ . '/includes/libs/DeferredStringifier.php',
        'DeferredUpdates' => __DIR__ . '/includes/deferred/DeferredUpdates.php',
@@ -388,6 +392,7 @@ $wgAutoloadLocalClasses = [
        'DumpPipeOutput' => __DIR__ . '/includes/export/DumpPipeOutput.php',
        'DumpRenderer' => __DIR__ . '/maintenance/renderDump.php',
        'DumpRev' => __DIR__ . '/maintenance/storage/dumpRev.php',
+       'DumpStringOutput' => __DIR__ . '/includes/export/DumpStringOutput.php',
        'DuplicateJob' => __DIR__ . '/includes/jobqueue/jobs/DuplicateJob.php',
        'EditAction' => __DIR__ . '/includes/actions/EditAction.php',
        'EditCLI' => __DIR__ . '/maintenance/edit.php',
@@ -603,10 +608,11 @@ $wgAutoloadLocalClasses = [
        'InitSiteStats' => __DIR__ . '/maintenance/initSiteStats.php',
        'InstallDocFormatter' => __DIR__ . '/includes/installer/InstallDocFormatter.php',
        'Installer' => __DIR__ . '/includes/installer/Installer.php',
-       'InstallerOverrides' => __DIR__ . '/mw-config/overrides.php',
+       'InstallerOverrides' => __DIR__ . '/includes/installer/InstallerOverrides.php',
        'InstallerSessionProvider' => __DIR__ . '/includes/installer/InstallerSessionProvider.php',
        'Interwiki' => __DIR__ . '/includes/interwiki/Interwiki.php',
        'InvalidPassword' => __DIR__ . '/includes/password/InvalidPassword.php',
+       'InvalidateUserSesssions' => __DIR__ . '/maintenance/invalidateUserSessions.php',
        'IteratorDecorator' => __DIR__ . '/includes/utils/iterators/IteratorDecorator.php',
        'IuConverter' => __DIR__ . '/languages/classes/LanguageIu.php',
        'JSCompilerContext' => __DIR__ . '/includes/libs/jsminplus.php',
@@ -661,7 +667,6 @@ $wgAutoloadLocalClasses = [
        'LanguageConverter' => __DIR__ . '/languages/LanguageConverter.php',
        'LanguageCu' => __DIR__ . '/languages/classes/LanguageCu.php',
        'LanguageDsb' => __DIR__ . '/languages/classes/LanguageDsb.php',
-       'LanguageEo' => __DIR__ . '/languages/classes/LanguageEo.php',
        'LanguageEs' => __DIR__ . '/languages/classes/LanguageEs.php',
        'LanguageEt' => __DIR__ . '/languages/classes/LanguageEt.php',
        'LanguageFi' => __DIR__ . '/languages/classes/LanguageFi.php',
@@ -750,7 +755,7 @@ $wgAutoloadLocalClasses = [
        'LonelyPagesPage' => __DIR__ . '/includes/specials/SpecialLonelypages.php',
        'LongPagesPage' => __DIR__ . '/includes/specials/SpecialLongpages.php',
        'MIMEsearchPage' => __DIR__ . '/includes/specials/SpecialMIMEsearch.php',
-       'MWCallableUpdate' => __DIR__ . '/includes/deferred/CallableUpdate.php',
+       'MWCallableUpdate' => __DIR__ . '/includes/deferred/MWCallableUpdate.php',
        'MWContentSerializationException' => __DIR__ . '/includes/content/ContentHandler.php',
        'MWCryptHKDF' => __DIR__ . '/includes/utils/MWCryptHKDF.php',
        'MWCryptHash' => __DIR__ . '/includes/utils/MWCryptHash.php',
@@ -791,7 +796,6 @@ $wgAutoloadLocalClasses = [
        'MediaTransformOutput' => __DIR__ . '/includes/media/MediaTransformOutput.php',
        'MediaWiki' => __DIR__ . '/includes/MediaWiki.php',
        'MediaWikiI18N' => __DIR__ . '/includes/skins/MediaWikiI18N.php',
-       'MediaWikiPageLinkRenderer' => __DIR__ . '/includes/title/MediaWikiPageLinkRenderer.php',
        'MediaWikiSite' => __DIR__ . '/includes/site/MediaWikiSite.php',
        'MediaWikiTitleCodec' => __DIR__ . '/includes/title/MediaWikiTitleCodec.php',
        'MediaWikiVersionFetcher' => __DIR__ . '/includes/MediaWikiVersionFetcher.php',
@@ -878,7 +882,14 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Session\\Token' => __DIR__ . '/includes/session/Token.php',
        'MediaWiki\\Session\\UserInfo' => __DIR__ . '/includes/session/UserInfo.php',
        'MediaWiki\\Site\\MediaWikiPageNameNormalizer' => __DIR__ . '/includes/site/MediaWikiPageNameNormalizer.php',
+       'MediaWiki\\Tidy\\BalanceActiveFormattingElements' => __DIR__ . '/includes/tidy/Balancer.php',
+       'MediaWiki\\Tidy\\BalanceElement' => __DIR__ . '/includes/tidy/Balancer.php',
+       'MediaWiki\\Tidy\\BalanceMarker' => __DIR__ . '/includes/tidy/Balancer.php',
+       'MediaWiki\\Tidy\\BalanceSets' => __DIR__ . '/includes/tidy/Balancer.php',
+       'MediaWiki\\Tidy\\BalanceStack' => __DIR__ . '/includes/tidy/Balancer.php',
+       'MediaWiki\\Tidy\\Balancer' => __DIR__ . '/includes/tidy/Balancer.php',
        'MediaWiki\\Tidy\\Html5Depurate' => __DIR__ . '/includes/tidy/Html5Depurate.php',
+       'MediaWiki\\Tidy\\Html5Internal' => __DIR__ . '/includes/tidy/Html5Internal.php',
        'MediaWiki\\Tidy\\RaggettBase' => __DIR__ . '/includes/tidy/RaggettBase.php',
        'MediaWiki\\Tidy\\RaggettExternal' => __DIR__ . '/includes/tidy/RaggettExternal.php',
        'MediaWiki\\Tidy\\RaggettInternalHHVM' => __DIR__ . '/includes/tidy/RaggettInternalHHVM.php',
@@ -936,7 +947,6 @@ $wgAutoloadLocalClasses = [
        'MutableConfig' => __DIR__ . '/includes/config/MutableConfig.php',
        'MutableContext' => __DIR__ . '/includes/context/MutableContext.php',
        'MwSql' => __DIR__ . '/maintenance/sql.php',
-       'MyLocalSettingsGenerator' => __DIR__ . '/mw-config/overrides.php',
        'MySQLField' => __DIR__ . '/includes/db/DatabaseMysqlBase.php',
        'MySQLMasterPos' => __DIR__ . '/includes/db/DatabaseMysqlBase.php',
        'MySqlLockManager' => __DIR__ . '/includes/filebackend/lockmanager/DBLockManager.php',
@@ -956,6 +966,7 @@ $wgAutoloadLocalClasses = [
        'NukePage' => __DIR__ . '/maintenance/nukePage.php',
        'NullFileJournal' => __DIR__ . '/includes/filebackend/filejournal/FileJournal.php',
        'NullFileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
+       'NullIndexField' => __DIR__ . '/includes/search/NullIndexField.php',
        'NullJob' => __DIR__ . '/includes/jobqueue/jobs/NullJob.php',
        'NullLockManager' => __DIR__ . '/includes/filebackend/lockmanager/LockManager.php',
        'NullRepo' => __DIR__ . '/includes/filerepo/NullRepo.php',
@@ -977,7 +988,6 @@ $wgAutoloadLocalClasses = [
        'PNGMetadataExtractor' => __DIR__ . '/includes/media/PNGMetadataExtractor.php',
        'PPCustomFrame_DOM' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
        'PPCustomFrame_Hash' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
-       'PPDAccum_Hash' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
        'PPDPart' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
        'PPDPart_Hash' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
        'PPDStack' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
@@ -1005,7 +1015,6 @@ $wgAutoloadLocalClasses = [
        'PageArchive' => __DIR__ . '/includes/specials/SpecialUndelete.php',
        'PageExists' => __DIR__ . '/maintenance/pageExists.php',
        'PageLangLogFormatter' => __DIR__ . '/includes/logging/PageLangLogFormatter.php',
-       'PageLinkRenderer' => __DIR__ . '/includes/title/PageLinkRenderer.php',
        'PageProps' => __DIR__ . '/includes/PageProps.php',
        'PageQueryPage' => __DIR__ . '/includes/specialpage/PageQueryPage.php',
        'Pager' => __DIR__ . '/includes/pager/Pager.php',
@@ -1030,6 +1039,7 @@ $wgAutoloadLocalClasses = [
        'PermissionsError' => __DIR__ . '/includes/exception/PermissionsError.php',
        'PhpHttpRequest' => __DIR__ . '/includes/HttpFunctions.php',
        'PhpXmlBugTester' => __DIR__ . '/includes/installer/PhpBugTests.php',
+       'Pingback' => __DIR__ . '/includes/Pingback.php',
        'PoolCounter' => __DIR__ . '/includes/poolcounter/PoolCounter.php',
        'PoolCounterRedis' => __DIR__ . '/includes/poolcounter/PoolCounterRedis.php',
        'PoolCounterWork' => __DIR__ . '/includes/poolcounter/PoolCounterWork.php',
@@ -1093,6 +1103,7 @@ $wgAutoloadLocalClasses = [
        'RCDatabaseLogEntry' => __DIR__ . '/includes/logging/LogEntry.php',
        'RCFeedEngine' => __DIR__ . '/includes/rcfeed/RCFeedEngine.php',
        'RCFeedFormatter' => __DIR__ . '/includes/rcfeed/RCFeedFormatter.php',
+       'RESTBagOStuff' => __DIR__ . '/includes/libs/objectcache/RESTBagOStuff.php',
        'RSSFeed' => __DIR__ . '/includes/Feed.php',
        'RandomPage' => __DIR__ . '/includes/specials/SpecialRandompage.php',
        'RangeDifference' => __DIR__ . '/includes/diff/DiffEngine.php',
@@ -1149,6 +1160,7 @@ $wgAutoloadLocalClasses = [
        'ResourceLoaderOOUIImageModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderOOUIImageModule.php',
        'ResourceLoaderRawFileModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderRawFileModule.php',
        'ResourceLoaderSiteModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderSiteModule.php',
+       'ResourceLoaderSiteStylesModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderSiteStylesModule.php',
        'ResourceLoaderSkinModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderSkinModule.php',
        'ResourceLoaderSpecialCharacterDataModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderSpecialCharacterDataModule.php',
        'ResourceLoaderStartUpModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderStartUpModule.php',
@@ -1174,6 +1186,7 @@ $wgAutoloadLocalClasses = [
        'RevDelLogList' => __DIR__ . '/includes/revisiondelete/RevDelLogList.php',
        'RevDelRevisionItem' => __DIR__ . '/includes/revisiondelete/RevDelRevisionItem.php',
        'RevDelRevisionList' => __DIR__ . '/includes/revisiondelete/RevDelRevisionList.php',
+       'ReverseArrayIterator' => __DIR__ . '/includes/libs/ReverseArrayIterator.php',
        'ReverseChronologicalPager' => __DIR__ . '/includes/pager/ReverseChronologicalPager.php',
        'RevertAction' => __DIR__ . '/includes/actions/RevertAction.php',
        'Revision' => __DIR__ . '/includes/Revision.php',
@@ -1208,6 +1221,8 @@ $wgAutoloadLocalClasses = [
        'SearchEngineFactory' => __DIR__ . '/includes/search/SearchEngineFactory.php',
        'SearchExactMatchRescorer' => __DIR__ . '/includes/search/SearchExactMatchRescorer.php',
        'SearchHighlighter' => __DIR__ . '/includes/search/SearchHighlighter.php',
+       'SearchIndexField' => __DIR__ . '/includes/search/SearchIndexField.php',
+       'SearchIndexFieldDefinition' => __DIR__ . '/includes/search/SearchIndexFieldDefinition.php',
        'SearchMssql' => __DIR__ . '/includes/search/SearchMssql.php',
        'SearchMySQL' => __DIR__ . '/includes/search/SearchMySQL.php',
        'SearchNearMatchResultSet' => __DIR__ . '/includes/search/SearchNearMatchResultSet.php',
@@ -1247,6 +1262,7 @@ $wgAutoloadLocalClasses = [
        'SkinFallback' => __DIR__ . '/includes/skins/SkinFallback.php',
        'SkinFallbackTemplate' => __DIR__ . '/includes/skins/SkinFallbackTemplate.php',
        'SkinTemplate' => __DIR__ . '/includes/skins/SkinTemplate.php',
+       'SlideshowImageGallery' => __DIR__ . '/includes/gallery/SlideshowImageGallery.php',
        'SpecialActiveUsers' => __DIR__ . '/includes/specials/SpecialActiveusers.php',
        'SpecialAllMessages' => __DIR__ . '/includes/specials/SpecialAllMessages.php',
        'SpecialAllMyUploads' => __DIR__ . '/includes/specials/SpecialMyRedirectPages.php',
@@ -1425,6 +1441,7 @@ $wgAutoloadLocalClasses = [
        'UpdateArticleCount' => __DIR__ . '/maintenance/updateArticleCount.php',
        'UpdateCollation' => __DIR__ . '/maintenance/updateCollation.php',
        'UpdateDoubleWidthSearch' => __DIR__ . '/maintenance/updateDoubleWidthSearch.php',
+       'UpdateExtensionJsonSchema' => __DIR__ . '/maintenance/updateExtensionJsonSchema.php',
        'UpdateLogging' => __DIR__ . '/maintenance/archives/upgradeLogging.php',
        'UpdateMediaWiki' => __DIR__ . '/maintenance/update.php',
        'UpdateRestrictions' => __DIR__ . '/maintenance/updateRestrictions.php',
@@ -1487,6 +1504,7 @@ $wgAutoloadLocalClasses = [
        'WantedTemplatesPage' => __DIR__ . '/includes/specials/SpecialWantedtemplates.php',
        'WatchAction' => __DIR__ . '/includes/actions/WatchAction.php',
        'WatchedItem' => __DIR__ . '/includes/WatchedItem.php',
+       'WatchedItemQueryService' => __DIR__ . '/includes/WatchedItemQueryService.php',
        'WatchedItemStore' => __DIR__ . '/includes/WatchedItemStore.php',
        'WatchlistCleanup' => __DIR__ . '/maintenance/cleanupWatchlist.php',
        'WebInstaller' => __DIR__ . '/includes/installer/WebInstaller.php',
index a261449..1bd3d4c 100644 (file)
@@ -16,7 +16,7 @@
                "wiki": "https://www.mediawiki.org/"
        },
        "require": {
-               "composer/semver": "1.4.0",
+               "composer/semver": "1.4.1",
                "cssjanus/cssjanus": "1.1.2",
                "ext-ctype": "*",
                "ext-iconv": "*",
@@ -25,7 +25,7 @@
                "ext-xml": "*",
                "liuggio/statsd-php-client": "1.0.18",
                "mediawiki/at-ease": "1.1.0",
-               "oojs/oojs-ui": "0.17.4",
+               "oojs/oojs-ui": "0.17.6",
                "oyejorge/less.php": "1.7.0.10",
                "php": ">=5.5.9",
                "psr/log": "1.0.0",
                "wikimedia/relpath": "1.0.3",
                "wikimedia/running-stat": "1.1.0",
                "wikimedia/utfnormal": "1.0.3",
-               "wikimedia/wrappedstring": "2.0.0",
+               "wikimedia/wrappedstring": "2.2.0",
                "zordius/lightncandy": "0.23"
        },
        "require-dev": {
                "jakub-onderka/php-parallel-lint": "0.9.2",
-               "justinrainbow/json-schema": "~1.3",
+               "justinrainbow/json-schema": "~1.6",
                "mediawiki/mediawiki-codesniffer": "0.7.2",
                "monolog/monolog": "~1.18.2",
                "nikic/php-parser": "1.4.1",
index efa573d..f19574c 100644 (file)
@@ -1,23 +1,23 @@
 This document is intended to provide useful advice for parties seeking to
-redistribute MediaWiki to end users.  It's targeted particularly at maintainers
+redistribute MediaWiki to end users. It's targeted particularly at maintainers
 for Linux distributions, since it's been observed that distribution packages of
-MediaWiki often break.  We've consistently had to recommend that users seeking
+MediaWiki often break. We've consistently had to recommend that users seeking
 support use official tarballs instead of their distribution's packages, and
-this often solves whatever problem the user is having.  It would be nice if
+this often solves whatever problem the user is having. It would be nice if
 this could change.
 
 == Background: why web applications are different ==
 
 MediaWiki is intended to be usable on any web host that provides support for
-PHP and a database.  Many users of low-end shared hosting have very limited
+PHP and a database. Many users of low-end shared hosting have very limited
 access to their machine: often only FTP access to some subdirectory of the web
-root.  Support for these users entails several restrictions, such as:
+root. Support for these users entails several restrictions, such as:
 
-  1) We cannot require installation of any files outside the web root.  Few of
+  1) We cannot require installation of any files outside the web root. Few of
   our users have access to directories like /usr or /etc.
   2) We cannot require the ability to run any utility on the command line.
   Many shared hosts have exec() and similar PHP functions disabled.
-  3) We cannot assume that the software has write access anywhere useful.  The
+  3) We cannot assume that the software has write access anywhere useful. The
   user account that MediaWiki (including its installer) runs under is often
   different from the account the user used to upload the files, and we might be
   restricted by PHP settings such as safe mode or open_basedir.
@@ -30,28 +30,28 @@ root.  Support for these users entails several restrictions, such as:
 
 Since anything that works on cheap shared hosting will work if you have shell
 or root access too, MediaWiki's design is based around catering to the lowest
-common denominator.  Although we support higher-end setups as well (like
+common denominator. Although we support higher-end setups as well (like
 Wikipedia!), the way many things work by default is tailored toward shared
-hosting.  These defaults are unconventional from the point of view of normal
+hosting. These defaults are unconventional from the point of view of normal
 (non-web) applications -- they might conflict with distributors' policies, and
 they certainly aren't ideal for someone who's installing MediaWiki as root.
 
 == Directory structure ==
 
 Because of constraint (1) above, MediaWiki does not conform to normal
-Unix filesystem layout.  Hopefully we'll offer direct support for standard
+Unix filesystem layout. Hopefully we'll offer direct support for standard
 layouts in the future, but for now *any change to the location of files is
-unsupported*.  Moving things and leaving symlinks will *probably* not break
+unsupported*. Moving things and leaving symlinks will *probably* not break
 anything, but it is *strongly* advised not to try any more intrusive changes to
-get MediaWiki to conform more closely to your filesystem hierarchy.  Any such
+get MediaWiki to conform more closely to your filesystem hierarchy. Any such
 attempt will almost certainly result in unnecessary bugs.
 
 The standard recommended location to install MediaWiki, relative to the web
-root, is /w (so, e.g., /var/www/w).  Rewrite rules can then be used to enable
-"pretty URLs" like /wiki/Article instead of /w/index.php?title=Article.  (This
+root, is /w (so, e.g., /var/www/w). Rewrite rules can then be used to enable
+"pretty URLs" like /wiki/Article instead of /w/index.php?title=Article. (This
 is the convention Wikipedia uses.)  In theory, it should be possible to enable
 the appropriate rewrite rules by default, if you can reconfigure the web
-server, but you'd need to alter LocalSettings.php too.  See
+server, but you'd need to alter LocalSettings.php too. See
 <https://www.mediawiki.org/wiki/Manual:Short_URL> for details on short URLs.
 
 If you really must mess around with the directory structure, note that the
@@ -59,37 +59,38 @@ following files *must* all be web-accessible for MediaWiki to function
 correctly:
 
   * api.php, img_auth.php, index.php, load.php, opensearch_desc.php, thumb.php,
-  profileinfo.php, redirect.php, trackback.php.  These are the entry points for
-  normal usage.  This list may be incomplete and is subject to change.
+  profileinfo.php. These are the entry points for normal usage. This list may be
+  incomplete and is subject to change.
   * mw-config/index.php: Used for web-based installation (sets up the database,
   prompts for the name of the wiki, etc.).
-  * images/: Used for uploaded files.  This could be somewhere else if
+  * images/: Used for uploaded files. This could be somewhere else if
   $wgUploadDirectory and $wgUploadPath are changed appropriately.
   * skins/*/: Subdirectories of skins/ contain CSS and JavaScript files that
-  must be accessible to web browsers.  The PHP files and Skin.sample in skins/
-  don't need to be accessible.  This could be somewhere else if
+  must be accessible to web browsers. The PHP files and Skin.sample in skins/
+  don't need to be accessible. This could be somewhere else if
   $wgStyleDirectory and $wgStylePath are changed appropriately.
   * extensions/: Many extensions include CSS and JavaScript files in their
-  extensions directory, and will break if they aren't web-accessible.  Some
+  extensions directory, and will break if they aren't web-accessible. Some
   extensions might theoretically provide additional entry points as well, at
   least in principle.
 
 But all files should keep their position relative to the web-visible
-installation directory no matter what.  If you must move includes/ somewhere in
-/usr/share, provide a symlink from /var/www/w.  If you don't, you *will* break
-something.  You have been warned.
+installation directory no matter what. If you must move includes/ somewhere in
+/usr/share, provide a symlink from /var/www/w. If you don't, you *will* break
+something. You have been warned.
 
 == Configuration ==
 
-MediaWiki is configured using LocalSettings.php.  This is a PHP file that's
+MediaWiki is configured using LocalSettings.php. This is a PHP file that's
 generated when the user visits mw-config/index.php to install the software, and
-which the user can edit by hand thereafter.  It's just a plain old PHP file,
-and can contain any PHP statements.  It usually sets global variables that are
+which the user can edit by hand thereafter. It's just a plain old PHP file,
+and can contain any PHP statements. It usually sets global variables that are
 used for configuration, and includes files used by any extensions.
 
-Distributors can easily add extra statements to the autogenerated
-LocalSettings.php by changing mw-config/overrides.php (see that file for details
-and examples).
+Distributors can easily change the installer behavior, including LocalSettings
+generated, by placing their overrides into mw-config/overrides directory. Doing
+that is highly preferred to modifying MediaWiki code directly. See
+mw-config/overrides/README for more details and examples.
 
 There's a new maintenance/install.php script which could be used for performing
 an install through the command line.
@@ -98,7 +99,7 @@ Some configuration options that distributors might be in a position to set
 intelligently:
 
   * $wgEmergencyContact: An e-mail address that can be used to contact the wiki
-  administrator.  By default, "wikiadmin@ServerName".
+  administrator. By default, "wikiadmin@ServerName".
   * $wgPasswordSender: The e-mail address to use when sending password e-mails.
   By default, "MediaWiki Mail <apache@ServerName>".
        (with ServerName guessed from the http request)
@@ -115,16 +116,16 @@ Any package manager which replaces the files but doesn't update the db is leavin
 an inconsistent wiki that may produce blank pages (php errors) when new features 
 using the changed schema would be used.
 
-Since MediaWiki 1.17 it is possible to upgrade using the installer by providing 
+Since MediaWiki 1.17 it is possible to upgrade using the web installer by providing
 an arbitrary secret value stored as $wgUpgradeKey in LocalSettings (older versions 
 needed to rename LocalSettings.php in order to upgrade using the installer).
 
 == Documentation ==
 
 MediaWiki's official documentation is split between two places: the source
-code, and <https://www.mediawiki.org/>.  The source code documentation is written
+code, and <https://www.mediawiki.org/>. The source code documentation is written
 exclusively by developers, and so is likely to be reliable (at worst,
-outdated).  However, it can be pretty sparse.  mediawiki.org documentation is
+outdated). However, it can be pretty sparse. mediawiki.org documentation is
 often much more thorough, but it's maintained by a wiki that's open to
 anonymous edits, so its quality is sometimes sketchy -- don't assume that
 anything there is officially endorsed!
@@ -132,31 +133,27 @@ anything there is officially endorsed!
 == Upstream ==
 
 MediaWiki is a project hosted and led by the Wikimedia Foundation, the
-not-for-profit charity that operates Wikipedia.  Wikimedia employs the lead
+not-for-profit charity that operates Wikipedia. Wikimedia employs the lead
 developer and several other paid developers, but commit access is given out
-liberally and there are multiple very active volunteer developers as well.  A
+liberally and there are multiple very active volunteer developers as well. A
 list of developers can be found at <https://www.mediawiki.org/wiki/Developers>.
 
-MediaWiki's bug tracker is at <https://bugzilla.wikimedia.org>.  However, most
-developers follow the bug tracker little or not at all.  The best place to
-post if you want to get developers' attention is the wikitech-l mailing list
-<https://lists.wikimedia.org/mailman/listinfo/wikitech-l>.  Posts to wikitech-l
-will inevitably be read by multiple experienced MediaWiki developers.  There's
+MediaWiki's bug tracker is at <https://phabricator.wikimedia.org>. However, you
+might find that the best place to post if you want to get developers' attention
+is the wikitech-l mailing list
+<https://lists.wikimedia.org/mailman/listinfo/wikitech-l>. Posts to wikitech-l
+will inevitably be read by multiple experienced MediaWiki developers. There's
 also an active IRC chat at <irc://irc.freenode.net/mediawiki>, where there are
 usually several developers at reasonably busy times of day.
 
-Unfortunately, we don't have a very good system for patch review.  Patches
-should be submitted on Bugzilla (as unified diffs produced with "svn diff"
-against the latest trunk revision), but many patches languish without review
-until they bitrot into uselessness.  You might want to get a developer to
-commit to reviewing your patch before you put too much effort into it.
-Reasonably straightforward patches shouldn't be too hard to get accepted if
-there's an interested developer, however -- posting to Bugzilla and then
-dropping a note on wikitech-l if nobody responds is a good tactic.
+Our Git repositories are hosted at <https://gerrit.wikimedia.org>, see
+<https://www.mediawiki.org/wiki/Gerrit> for more information. Patches should
+be submitted there. If you know which developers are best suited to review your
+patch, add them to it, otherwise ask on IRC to get better review time.
 
 All redistributors of MediaWiki should be subscribed to mediawiki-announce
-<https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce>.  It's
-extremely low-traffic, with an average of less than one post per month.  All
+<https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce>. It's
+extremely low-traffic, with an average of less than one post per month. All
 new releases are announced here, including critical security updates.
 
 == Useful software to install ==
@@ -167,41 +164,40 @@ perhaps configure it to use them (see Configuration section of this document):
 
   * APC (Alternative PHP Cache), XCache, or similar: Will greatly speed up the
   execution of MediaWiki, and all other PHP applications, at some cost in
-  memory usage.  Will be used automatically for the most part.
-  * clamav: Can be used for virus scanning of uploaded files.  Enable with
+  memory usage. Will be used automatically for the most part.
+  * clamav: Can be used for virus scanning of uploaded files. Enable with
   "$wgAntivirus = 'clamav';".
-  * DjVuLibre: Allows processing of DjVu files.  To enable this, set
+  * DjVuLibre: Allows processing of DjVu files. To enable this, set
   "$wgDjvuDump = 'djvudump'; $wgDjvuRenderer = 'ddjvu'; $wgDjvuTxt = 'djvutxt';".
-  * HTML Tidy: Fixes errors in HTML at runtime.  Can be enabled with 
+  * HTML Tidy: Fixes errors in HTML at runtime. Can be enabled with 
        "$wgUseTidy = true;".
-  * ImageMagick: For resizing images.  "$wgUseImageMagick = true;" will enable
-  it.  PHP's GD can also be used, but ImageMagick is preferable.
-  * Squid: Can provide a drastic speedup and a major cut in resource
-  consumption, but enabling it may interfere with other applications.  It might
-  be suitable for a separate mediawiki-squid package.  For setup details, see:
-  <https://www.mediawiki.org/wiki/Manual:Squid_caching>
+  * ImageMagick: For resizing images. "$wgUseImageMagick = true;" will enable
+  it. PHP's GD can also be used, but ImageMagick is preferable.
+  * HTTP cache such as Varnish or Squid: can provide a drastic speedup and a
+  major cut in resource consumption, but enabling it may interfere with other
+  applications. It might be suitable for a separate package. For setup details, see:
+  - <https://www.mediawiki.org/wiki/Manual:Varnish_caching>
+  - <https://www.mediawiki.org/wiki/Manual:Squid_caching>
   * rsvg or other SVG rasterizer: ImageMagick can be used for SVG support, but
-  is not ideal.  Wikipedia (as of the time of this writing) uses rsvg.  To
+  is not ideal. Wikipedia (as of the time of this writing) uses rsvg. To
   enable, set "$wgSVGConverter = 'rsvg';" (or other as appropriate).
-  * texvc: Included with MediaWiki.  Instructions for compiling and
-  installing it are in the math/ directory.
 
-MediaWiki uses some standard GNU utilities as well, such as diff and diff3.  If
+MediaWiki uses some standard GNU utilities as well, such as diff and diff3. If
 these are present in /usr/bin or some other reasonable location, they will be
 configured automatically on install.
 
-MediaWiki also has a "job queue" that handles background processing.  Because
+MediaWiki also has a "job queue" that handles background processing. Because
 shared hosts often don't provide access to cron, the job queue is run on every
-page view by default.  This means the background tasks aren't really done in
-the background.  Busy wikis can set $wgJobRunRate to 0 and run
-maintenance/runJobs.php periodically out of cron.  Distributors probably
+page view by default. This means the background tasks aren't really done in
+the background. Busy wikis can set $wgJobRunRate to 0 and run
+maintenance/runJobs.php periodically out of cron. Distributors probably
 shouldn't set this up as a default, however, since the extra cron job is
 unnecessary overhead for a little-used wiki.
 
 == Web server configuration ==
 
 MediaWiki includes several .htaccess files to restrict access to some
-directories.  If the web server is not configured to support these files, and
+directories. If the web server is not configured to support these files, and
 the relevant directories haven't been moved someplace inaccessible anyway (e.g.
 symlinked in /usr/share with the web server configured to not follow symlinks),
 then it might be useful to deny web access to those directories in the web
index 1d2b2f0..f2406c8 100644 (file)
                                                                },
                                                                "group": {
                                                                        "type": "string",
-                                                                       "description": "Group which this module should be loaded together with"
+                                                                       "description": "Group with which this module should be loaded"
                                                                },
                                                                "position": {
                                                                        "type": "string",
                                                                }
                                                        }
                                                },
+                                               {
+                                                       "description": "A ResourceLoaderWikiModule definition",
+                                                       "additionalProperties": false,
+                                                       "properties": {
+                                                               "class": {
+                                                                       "enum": ["ResourceLoaderWikiModule"]
+                                                               },
+                                                               "group": {
+                                                                       "type": "string",
+                                                                       "description": "Group with which this module should be loaded"
+                                                               },
+                                                               "position": {
+                                                                       "type": "string",
+                                                                       "description": "Position on the page to load this module at",
+                                                                       "enum": [
+                                                                               "bottom",
+                                                                               "top"
+                                                                       ]
+                                                               },
+                                                               "targets": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "ResourceLoader target the module can run on",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "scripts": {
+                                                                       "type": "array",
+                                                                       "description": "A list of on-wiki pages containing JavaScript that should be loaded",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "styles": {
+                                                                       "type": "array",
+                                                                       "description": "A list of on-wiki pages containing CSS that should be loaded",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               }
+                                                       }
+                                               },
                                                {
                                                        "description": "A ResourceLoaderImageModule definition",
                                                        "additionalProperties": false,
                        "type": "object",
                        "description": "ResourceLoader LESS variables"
                },
-               "ResourceLoaderLESSImportPaths": {
-                       "type": "object",
-                       "description": "ResourceLoader import paths"
-               },
                "ConfigRegistry": {
                        "type": "object",
                        "description": "Registry of factory functions to create Config objects"
                        "type": "object",
                        "description": "Central ID lookup providers"
                },
+               "ChangeCredentialsBlacklist": {
+                       "type": "object",
+                       "description": "AuthenticationRequest classes which can only be used internally for credentials change"
+               },
+               "RemoveCredentialsBlacklist": {
+                       "type": "object",
+                       "description": "AuthenticationRequest classes which can only be used internally for credentials removal"
+               },
                "namespaces": {
                        "type": "array",
                        "description": "Method to add extra namespaces",
                                }
                        }
                },
+               "GrantPermissions": {
+                       "type": "object",
+                       "description": "Map of permissions granted to authorized consumers to their bundles, called 'grants'",
+                       "patternProperties": {
+                               "^[a-z]+$": {
+                                       "type": "object",
+                                       "patternProperties": {
+                                               "^[a-z]+$": {
+                                                       "type": "boolean"
+                                               }
+                                       }
+                               }
+                       }
+               },
+               "GrantPermissionGroups": {
+                       "type": "object",
+                       "description": "Map of grants to their UI grouping",
+                       "patternProperties": {
+                               "^[a-z]+$": {
+                                       "type": "string"
+                               }
+                       }
+               },
                "ImplicitGroups": {
                        "type": "array",
                        "description": "Implicit groups"
                        ],
                        "description": "A function to be called right after MediaWiki processes this file"
                },
+               "config_prefix": {
+                       "type": "string",
+                       "default": "wg",
+                       "description": "Prefix to put in front of configuration settings when exporting them to $GLOBALS"
+               },
                "config": {
                        "type": "object",
                        "description": "Configuration options for this extension",
-                       "properties": {
-                               "_prefix": {
-                                       "type": "string",
-                                       "default": "wg",
-                                       "description": "Prefix to put in front of configuration settings when exporting them to $GLOBALS"
-                               }
-                       },
                        "patternProperties": {
                                "^[a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*$": {
+                                       "type": "object",
                                        "properties": {
-                                               "_merge_strategy": {
+                                               "value": {
+                                                       "required": true
+                                               },
+                                               "merge_strategy": {
                                                        "type": "string",
                                                        "enum": [
                                                                "array_merge_recursive",
                                                                "array_merge"
                                                        ],
                                                        "default": "array_merge"
+                                               },
+                                               "path": {
+                                                       "description": "Whether this should be interpreted as a filesystem path, relative to extension directory root",
+                                                       "type": "boolean",
+                                                       "default": false
+                                               },
+                                               "description": {
+                                                       "type": ["string", "array"],
+                                                       "description": "A description of the config setting, mostly for documentation/developers"
                                                }
                                        }
                                }
diff --git a/docs/extension.schema.v1.json b/docs/extension.schema.v1.json
new file mode 100644 (file)
index 0000000..893facf
--- /dev/null
@@ -0,0 +1,886 @@
+{
+       "$schema": "http://json-schema.org/schema#",
+       "description": "MediaWiki extension.json schema",
+       "type": "object",
+       "properties": {
+               "manifest_version": {
+                       "type": "integer",
+                       "description": "Version of the extension.json schema the extension.json file is in.",
+                       "required": true
+               },
+               "name": {
+                       "type": "string",
+                       "description": "The extension's canonical name.",
+                       "required": true
+               },
+               "namemsg": {
+                       "type": "string",
+                       "description": "i18n message key of the extension's name."
+               },
+               "type": {
+                       "type": "string",
+                       "description": "The extension's type, as an index to $wgExtensionCredits.",
+                       "default": "other"
+               },
+               "author": {
+                       "type": [
+                               "string",
+                               "array"
+                       ],
+                       "description": "Extension's authors.",
+                       "items": {
+                               "type": "string"
+                       }
+               },
+               "version": {
+                       "type": "string",
+                       "description": "The version of this release of the extension."
+               },
+               "url": {
+                       "type": "string",
+                       "description": "URL to the homepage for the extension.",
+                       "format": "uri"
+               },
+               "description": {
+                       "type": "string",
+                       "description": "Raw description of the extension."
+               },
+               "descriptionmsg": {
+                       "type": "string",
+                       "description": "Message key for a i18n message describing the extension."
+               },
+               "license-name": {
+                       "type": "string",
+                       "description": "Short identifier for the license under which the extension is released.",
+                       "enum": [
+                               "AFL-1.1",
+                               "AFL-1.2",
+                               "AFL-2.0",
+                               "AFL-2.1",
+                               "AFL-3.0",
+                               "APL-1.0",
+                               "Aladdin",
+                               "ANTLR-PD",
+                               "Apache-1.0",
+                               "Apache-1.1",
+                               "Apache-2.0",
+                               "APSL-1.0",
+                               "APSL-1.1",
+                               "APSL-1.2",
+                               "APSL-2.0",
+                               "Artistic-1.0",
+                               "Artistic-1.0-cl8",
+                               "Artistic-1.0-Perl",
+                               "Artistic-2.0",
+                               "AAL",
+                               "BitTorrent-1.0",
+                               "BitTorrent-1.1",
+                               "BSL-1.0",
+                               "BSD-2-Clause",
+                               "BSD-2-Clause-FreeBSD",
+                               "BSD-2-Clause-NetBSD",
+                               "BSD-3-Clause",
+                               "BSD-3-Clause-Clear",
+                               "BSD-4-Clause",
+                               "BSD-4-Clause-UC",
+                               "CECILL-1.0",
+                               "CECILL-1.1",
+                               "CECILL-2.0",
+                               "CECILL-B",
+                               "CECILL-C",
+                               "ClArtistic",
+                               "CNRI-Python",
+                               "CNRI-Python-GPL-Compatible",
+                               "CPOL-1.02",
+                               "CDDL-1.0",
+                               "CDDL-1.1",
+                               "CPAL-1.0",
+                               "CPL-1.0",
+                               "CATOSL-1.1",
+                               "Condor-1.1",
+                               "CC-BY-1.0",
+                               "CC-BY-2.0",
+                               "CC-BY-2.5",
+                               "CC-BY-3.0",
+                               "CC-BY-ND-1.0",
+                               "CC-BY-ND-2.0",
+                               "CC-BY-ND-2.5",
+                               "CC-BY-ND-3.0",
+                               "CC-BY-NC-1.0",
+                               "CC-BY-NC-2.0",
+                               "CC-BY-NC-2.5",
+                               "CC-BY-NC-3.0",
+                               "CC-BY-NC-ND-1.0",
+                               "CC-BY-NC-ND-2.0",
+                               "CC-BY-NC-ND-2.5",
+                               "CC-BY-NC-ND-3.0",
+                               "CC-BY-NC-SA-1.0",
+                               "CC-BY-NC-SA-2.0",
+                               "CC-BY-NC-SA-2.5",
+                               "CC-BY-NC-SA-3.0",
+                               "CC-BY-SA-1.0",
+                               "CC-BY-SA-2.0",
+                               "CC-BY-SA-2.5",
+                               "CC-BY-SA-3.0",
+                               "CC0-1.0",
+                               "CUA-OPL-1.0",
+                               "D-FSL-1.0",
+                               "WTFPL",
+                               "EPL-1.0",
+                               "eCos-2.0",
+                               "ECL-1.0",
+                               "ECL-2.0",
+                               "EFL-1.0",
+                               "EFL-2.0",
+                               "Entessa",
+                               "ErlPL-1.1",
+                               "EUDatagrid",
+                               "EUPL-1.0",
+                               "EUPL-1.1",
+                               "Fair",
+                               "Frameworx-1.0",
+                               "FTL",
+                               "AGPL-1.0",
+                               "AGPL-3.0",
+                               "GFDL-1.1",
+                               "GFDL-1.2",
+                               "GFDL-1.3",
+                               "GPL-1.0",
+                               "GPL-1.0+",
+                               "GPL-2.0",
+                               "GPL-2.0+",
+                               "GPL-2.0-with-autoconf-exception",
+                               "GPL-2.0-with-bison-exception",
+                               "GPL-2.0-with-classpath-exception",
+                               "GPL-2.0-with-font-exception",
+                               "GPL-2.0-with-GCC-exception",
+                               "GPL-3.0",
+                               "GPL-3.0+",
+                               "GPL-3.0-with-autoconf-exception",
+                               "GPL-3.0-with-GCC-exception",
+                               "LGPL-2.1",
+                               "LGPL-2.1+",
+                               "LGPL-3.0",
+                               "LGPL-3.0+",
+                               "LGPL-2.0",
+                               "LGPL-2.0+",
+                               "gSOAP-1.3b",
+                               "HPND",
+                               "IBM-pibs",
+                               "IPL-1.0",
+                               "Imlib2",
+                               "IJG",
+                               "Intel",
+                               "IPA",
+                               "ISC",
+                               "JSON",
+                               "LPPL-1.3a",
+                               "LPPL-1.0",
+                               "LPPL-1.1",
+                               "LPPL-1.2",
+                               "LPPL-1.3c",
+                               "Libpng",
+                               "LPL-1.02",
+                               "LPL-1.0",
+                               "MS-PL",
+                               "MS-RL",
+                               "MirOS",
+                               "MIT",
+                               "Motosoto",
+                               "MPL-1.0",
+                               "MPL-1.1",
+                               "MPL-2.0",
+                               "MPL-2.0-no-copyleft-exception",
+                               "Multics",
+                               "NASA-1.3",
+                               "Naumen",
+                               "NBPL-1.0",
+                               "NGPL",
+                               "NOSL",
+                               "NPL-1.0",
+                               "NPL-1.1",
+                               "Nokia",
+                               "NPOSL-3.0",
+                               "NTP",
+                               "OCLC-2.0",
+                               "ODbL-1.0",
+                               "PDDL-1.0",
+                               "OGTSL",
+                               "OLDAP-2.2.2",
+                               "OLDAP-1.1",
+                               "OLDAP-1.2",
+                               "OLDAP-1.3",
+                               "OLDAP-1.4",
+                               "OLDAP-2.0",
+                               "OLDAP-2.0.1",
+                               "OLDAP-2.1",
+                               "OLDAP-2.2",
+                               "OLDAP-2.2.1",
+                               "OLDAP-2.3",
+                               "OLDAP-2.4",
+                               "OLDAP-2.5",
+                               "OLDAP-2.6",
+                               "OLDAP-2.7",
+                               "OPL-1.0",
+                               "OSL-1.0",
+                               "OSL-2.0",
+                               "OSL-2.1",
+                               "OSL-3.0",
+                               "OLDAP-2.8",
+                               "OpenSSL",
+                               "PHP-3.0",
+                               "PHP-3.01",
+                               "PostgreSQL",
+                               "Python-2.0",
+                               "QPL-1.0",
+                               "RPSL-1.0",
+                               "RPL-1.1",
+                               "RPL-1.5",
+                               "RHeCos-1.1",
+                               "RSCPL",
+                               "Ruby",
+                               "SAX-PD",
+                               "SGI-B-1.0",
+                               "SGI-B-1.1",
+                               "SGI-B-2.0",
+                               "OFL-1.0",
+                               "OFL-1.1",
+                               "SimPL-2.0",
+                               "Sleepycat",
+                               "SMLNJ",
+                               "SugarCRM-1.1.3",
+                               "SISSL",
+                               "SISSL-1.2",
+                               "SPL-1.0",
+                               "Watcom-1.0",
+                               "NCSA",
+                               "VSL-1.0",
+                               "W3C",
+                               "WXwindows",
+                               "Xnet",
+                               "X11",
+                               "XFree86-1.1",
+                               "YPL-1.0",
+                               "YPL-1.1",
+                               "Zimbra-1.3",
+                               "Zlib",
+                               "ZPL-1.1",
+                               "ZPL-2.0",
+                               "ZPL-2.1",
+                               "Unlicense"
+                       ]
+               },
+               "requires": {
+                       "type": "object",
+                       "description": "Indicates what versions of MediaWiki core are required. This syntax may be extended in the future, for example to check dependencies between other extensions.",
+                       "properties": {
+                               "MediaWiki": {
+                                       "type": "string",
+                                       "description": "Version constraint string against MediaWiki core."
+                               }
+                       }
+               },
+               "ResourceFileModulePaths": {
+                       "type": "object",
+                       "description": "Default paths to use for all ResourceLoader file modules",
+                       "additionalProperties": false,
+                       "properties": {
+                               "localBasePath": {
+                                       "type": "string",
+                                       "description": "Base path to prepend to all local paths, relative to current directory"
+                               },
+                               "remoteExtPath": {
+                                       "type": "string",
+                                       "description": "Base path to prepend to all remote paths, relative to $wgExtensionAssetsPath"
+                               },
+                               "remoteSkinPath": {
+                                       "type": "string",
+                                       "description": "Base path to prepend to all remote paths, relative to $wgStylePath"
+                               }
+                       }
+               },
+               "ResourceModules": {
+                       "type": "object",
+                       "description": "ResourceLoader modules to register",
+                       "patternProperties": {
+                               "^[a-zA-Z0-9-\\.]+$": {
+                                       "type": "object",
+                                       "anyOf": [
+                                               {
+                                                       "description": "A ResourceLoaderFileModule definition",
+                                                       "additionalProperties": false,
+                                                       "properties": {
+                                                               "localBasePath": {
+                                                                       "type": "string",
+                                                                       "description": "Base path to prepend to all local paths in $options. Defaults to $IP"
+                                                               },
+                                                               "remoteBasePath": {
+                                                                       "type": "string",
+                                                                       "description": "Base path to prepend to all remote paths in $options. Defaults to $wgScriptPath"
+                                                               },
+                                                               "remoteExtPath": {
+                                                                       "type": "string",
+                                                                       "description": "Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath"
+                                                               },
+                                                               "skipFunction": {
+                                                                       "type": "string",
+                                                                       "description": "Path to a file containing a JavaScript \"skip function\", if desired."
+                                                               },
+                                                               "scripts": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Scripts to always include (array of file paths)",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "languageScripts": {
+                                                                       "type": "object",
+                                                                       "description": "Scripts to include in specific language contexts (mapping of language code to file path(s))",
+                                                                       "patternProperties": {
+                                                                               "^[a-zA-Z0-9-]{2,}$": {
+                                                                                       "type": [
+                                                                                               "string",
+                                                                                               "array"
+                                                                                       ],
+                                                                                       "items": {
+                                                                                               "type": "string"
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               },
+                                                               "skinScripts": {
+                                                                       "type": "object",
+                                                                       "description": "Scripts to include in specific skin contexts (mapping of skin name to script(s)",
+                                                                       "patternProperties": {
+                                                                               ".+": {
+                                                                                       "type": [
+                                                                                               "string",
+                                                                                               "array"
+                                                                                       ],
+                                                                                       "items": {
+                                                                                               "type": "string"
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               },
+                                                               "debugScripts": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Scripts to include in debug contexts",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "loaderScripts": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Scripts to include in the startup module",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "dependencies": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Modules which must be loaded before this module",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "styles": {
+                                                                       "type": ["string", "array", "object"],
+                                                                       "description": "Styles to always load",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "skinStyles": {
+                                                                       "type": "object",
+                                                                       "description": "Styles to include in specific skin contexts (mapping of skin name to style(s))",
+                                                                       "patternProperties": {
+                                                                               ".+": {
+                                                                                       "type": [
+                                                                                               "string",
+                                                                                               "array"
+                                                                                       ],
+                                                                                       "items": {
+                                                                                               "type": "string"
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               },
+                                                               "messages": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Messages to always load",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "group": {
+                                                                       "type": "string",
+                                                                       "description": "Group which this module should be loaded together with"
+                                                               },
+                                                               "position": {
+                                                                       "type": "string",
+                                                                       "description": "Position on the page to load this module at",
+                                                                       "enum": [
+                                                                               "bottom",
+                                                                               "top"
+                                                                       ]
+                                                               },
+                                                               "templates": {
+                                                                       "type": ["object", "array"],
+                                                                       "description": "Templates to be loaded for client-side usage"
+                                                               },
+                                                               "targets": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "ResourceLoader target the module can run on",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               }
+                                                       }
+                                               },
+                                               {
+                                                       "description": "A ResourceLoaderWikiModule definition",
+                                                       "additionalProperties": false,
+                                                       "properties": {
+                                                               "class": {
+                                                                       "enum": ["ResourceLoaderWikiModule"]
+                                                               },
+                                                               "group": {
+                                                                       "type": "string",
+                                                                       "description": "Group which this module should be loaded together with"
+                                                               },
+                                                               "position": {
+                                                                       "type": "string",
+                                                                       "description": "Position on the page to load this module at",
+                                                                       "enum": [
+                                                                               "bottom",
+                                                                               "top"
+                                                                       ]
+                                                               },
+                                                               "targets": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "ResourceLoader target the module can run on",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "scripts": {
+                                                                       "type": "array",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "styles": {
+                                                                       "type": "array",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               }
+                                                       }
+                                               },
+                                               {
+                                                       "description": "A ResourceLoaderImageModule definition",
+                                                       "additionalProperties": false,
+                                                       "properties": {
+                                                               "class": {
+                                                                       "enum": ["ResourceLoaderImageModule"]
+                                                               },
+                                                               "data": {
+                                                                       "type": "string"
+                                                               },
+                                                               "prefix": {
+                                                                       "type": "string"
+                                                               },
+                                                               "selector": {
+                                                                       "type": "string"
+                                                               },
+                                                               "selectorWithoutVariant": {
+                                                                       "type": "string"
+                                                               },
+                                                               "selectorWithVariant": {
+                                                                       "type": "string"
+                                                               },
+                                                               "variants": {
+                                                                       "type": "object"
+                                                               },
+                                                               "images": {
+                                                                       "type": "object"
+                                                               },
+                                                               "position": {
+                                                                       "enum": [
+                                                                               "top",
+                                                                               "bottom"
+                                                                       ]
+                                                               }
+                                                       }
+                                               },
+                                               {
+                                                       "description": "An arbitrary ResourceLoaderModule definition",
+                                                       "properties": {
+                                                               "class": {
+                                                                       "type": "string",
+                                                                       "pattern": "^((?!ResourceLoader(File|Image)Module).)*$"
+                                                               }
+                                                       },
+                                                       "required": ["class"]
+                                               }
+                                       ]
+                               }
+                       }
+               },
+               "ResourceModuleSkinStyles": {
+                       "type": "object",
+                       "description": "ResourceLoader modules for custom skin styles"
+               },
+               "ResourceLoaderSources": {
+                       "type": "object",
+                       "description": "ResourceLoader sources to register"
+               },
+               "ResourceLoaderLESSVars": {
+                       "type": "object",
+                       "description": "ResourceLoader LESS variables"
+               },
+               "ConfigRegistry": {
+                       "type": "object",
+                       "description": "Registry of factory functions to create Config objects"
+               },
+               "SessionProviders": {
+                       "type": "object",
+                       "description": "Session providers"
+               },
+               "AuthManagerAutoConfig": {
+                       "type": "object",
+                       "description": "AuthManager auto-configuration",
+                       "additionalProperties": false,
+                       "properties": {
+                               "preauth": {
+                                       "type": "object",
+                                       "description": "Pre-authentication providers"
+                               },
+                               "primaryauth": {
+                                       "type": "object",
+                                       "description": "Primary authentication providers"
+                               },
+                               "secondaryauth": {
+                                       "type": "object",
+                                       "description": "Secondary authentication providers"
+                               }
+                       }
+               },
+               "CentralIdLookupProviders": {
+                       "type": "object",
+                       "description": "Central ID lookup providers"
+               },
+               "namespaces": {
+                       "type": "array",
+                       "description": "Method to add extra namespaces",
+                       "items": {
+                               "type": "object",
+                               "properties": {
+                                       "id": {
+                                               "type": "integer"
+                                       },
+                                       "constant": {
+                                               "type": "string"
+                                       },
+                                       "name": {
+                                               "type": "string"
+                                       },
+                                       "gender": {
+                                               "type": "object",
+                                               "properties": {
+                                                       "male": {
+                                                               "type": "string"
+                                                       },
+                                                       "female": {
+                                                               "type": "string"
+                                                       }
+                                               }
+                                       },
+                                       "subpages": {
+                                               "type": "boolean",
+                                               "default": false
+                                       },
+                                       "content": {
+                                               "type": "boolean",
+                                               "default": false
+                                       },
+                                       "defaultcontentmodel": {
+                                               "type": "string"
+                                       },
+                                       "protection": {
+                                               "type": ["string", "array"],
+                                               "description": "Userright(s) required to edit in this namespace"
+                                       },
+                                       "capitallinkoverride": {
+                                               "type": "boolean",
+                                               "description": "Set $wgCapitalLinks on a per-namespace basis"
+                                       }
+                               },
+                               "required": ["id", "constant", "name"]
+                       }
+               },
+               "TrackingCategories": {
+                       "type": "array",
+                       "description": "Tracking category message keys",
+                       "items": {
+                               "type": "string"
+                       }
+               },
+               "DefaultUserOptions": {
+                       "type": "object",
+                       "description": "Default values of user options"
+               },
+               "HiddenPrefs": {
+                       "type": "array",
+                       "description": "Preferences users cannot set",
+                       "items": {
+                               "type": "string"
+                       }
+               },
+               "GroupPermissions": {
+                       "type": "object",
+                       "description": "Default permissions to give to user groups",
+                       "patternProperties": {
+                               "^[a-z]+$": {
+                                       "type": "object",
+                                       "patternProperties": {
+                                               "^[a-z]+$": {
+                                                       "type": "boolean"
+                                               }
+                                       }
+                               }
+                       }
+               },
+               "RevokePermissions": {
+                       "type": "object",
+                       "description": "Default permissions to revoke from user groups",
+                       "patternProperties": {
+                               "^[a-z]+$": {
+                                       "type": "object",
+                                       "patternProperties": {
+                                               "^[a-z]+$": {
+                                                       "type": "boolean"
+                                               }
+                                       }
+                               }
+                       }
+               },
+               "GrantPermissions": {
+                       "type": "object",
+                       "description": "Map of permissions granted to authorized consumers to their bundles, called 'grants'",
+                       "patternProperties": {
+                               "^[a-z]+$": {
+                                       "type": "object",
+                                       "patternProperties": {
+                                               "^[a-z]+$": {
+                                                       "type": "boolean"
+                                               }
+                                       }
+                               }
+                       }
+               },
+               "GrantPermissionGroups": {
+                       "type": "object",
+                       "description": "Map of grants to their UI grouping",
+                       "patternProperties": {
+                               "^[a-z]+$": {
+                                       "type": "string"
+                               }
+                       }
+               },
+               "ImplicitGroups": {
+                       "type": "array",
+                       "description": "Implicit groups"
+               },
+               "GroupsAddToSelf": {
+                       "type": "object",
+                       "description": "Groups a user can add to themselves"
+               },
+               "GroupsRemoveFromSelf": {
+                       "type": "object",
+                       "description": "Groups a user can remove from themselves"
+               },
+               "AddGroups": {
+                       "type": "object",
+                       "description": "Groups a user can add to users"
+               },
+               "RemoveGroups": {
+                       "type": "object",
+                       "description": "Groups a user can remove from users"
+               },
+               "AvailableRights": {
+                       "type": "array",
+                       "description": "User rights added by the extension",
+                       "items": {
+                               "type": "string"
+                       }
+               },
+               "ContentHandlers": {
+                       "type": "object",
+                       "description": "Mapping of model ID to class name",
+                       "patternProperties": {
+                               "^[A-Za-z]+$": {
+                                       "type": "string"
+                               }
+                       }
+               },
+               "RateLimits": {
+                       "type": "object",
+                       "description": "Rate limits"
+               },
+               "RecentChangesFlags": {
+                       "type": "object",
+                       "description": "Flags (letter symbols) shown on RecentChanges pages"
+               },
+               "MediaHandlers": {
+                       "type": "object",
+                       "description": "Plugins for media file type handling. Each entry in the array maps a MIME type to a PHP class name."
+               },
+               "ExtensionFunctions": {
+                       "type": [
+                               "array",
+                               "string"
+                       ],
+                       "description": "Function to call after setup has finished",
+                       "items": {
+                               "type": "string"
+                       }
+               },
+               "ExtensionMessagesFiles": {
+                       "type": "object",
+                       "description": "File paths containing PHP internationalization data"
+               },
+               "MessagesDirs": {
+                       "type": "object",
+                       "description": "Directory paths containing JSON internationalization data"
+               },
+               "ExtensionEntryPointListFiles": {
+                       "type": "object"
+               },
+               "SpecialPages": {
+                       "type": "object",
+                       "description": "SpecialPages implemented in this extension (mapping of page name to class name)"
+               },
+               "AutoloadClasses": {
+                       "type": "object"
+               },
+               "Hooks": {
+                       "type": [ "string", "object" ],
+                       "description": "Hooks this extension uses (mapping of hook name to callback)"
+               },
+               "JobClasses": {
+                       "type": "object",
+                       "description": "Job types this extension implements (mapping of job type to class name)"
+               },
+               "LogTypes": {
+                       "type": "array",
+                       "description": "List of new log types this extension uses"
+               },
+               "LogRestrictions": {
+                       "type": "object"
+               },
+               "FilterLogTypes": {
+                       "type": "object"
+               },
+               "ActionFilteredLogs": {
+                       "type": "object",
+                       "description": "List of log types which can be filtered by log actions",
+                       "patternProperties": {
+                               "^[a-z-]+$": {
+                                       "type": "object",
+                                       "patternProperties": {
+                                               "^[a-z-]+$": {
+                                                       "type": "array",
+                                                       "items": {
+                                                               "type": "string"
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               },
+               "LogNames": {
+                       "type": "object"
+               },
+               "LogHeaders": {
+                       "type": "object"
+               },
+               "LogActions": {
+                       "type": "object"
+               },
+               "LogActionsHandlers": {
+                       "type": "object"
+               },
+               "Actions": {
+                       "type": "object"
+               },
+               "APIModules": {
+                       "type": "object"
+               },
+               "APIFormatModules": {
+                       "type": "object"
+               },
+               "APIMetaModules": {
+                       "type": "object"
+               },
+               "APIPropModules": {
+                       "type": "object"
+               },
+               "APIListModules": {
+                       "type": "object"
+               },
+               "ValidSkinNames": {
+                       "type": "object"
+               },
+               "FeedClasses": {
+                       "type": "object",
+                       "description": "Available feeds objects"
+               },
+               "SkinOOUIThemes": {
+                       "type": "object"
+               },
+               "callback": {
+                       "type": [
+                               "array",
+                               "string"
+                       ],
+                       "description": "A function to be called right after MediaWiki processes this file"
+               },
+               "config": {
+                       "type": "object",
+                       "description": "Configuration options for this extension",
+                       "properties": {
+                               "_prefix": {
+                                       "type": "string",
+                                       "default": "wg",
+                                       "description": "Prefix to put in front of configuration settings when exporting them to $GLOBALS"
+                               }
+                       },
+                       "patternProperties": {
+                               "^[a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*$": {
+                                       "properties": {
+                                               "_merge_strategy": {
+                                                       "type": "string",
+                                                       "enum": [
+                                                               "array_merge_recursive",
+                                                               "array_plus_2d",
+                                                               "array_plus",
+                                                               "array_merge"
+                                                       ],
+                                                       "default": "array_merge"
+                                               }
+                                       }
+                               }
+                       }
+               },
+               "ParserTestFiles": {
+                       "type": "array",
+                       "description": "Parser test suite files to be run by parserTests.php when no specific filename is passed to it"
+               },
+               "load_composer_autoloader": {
+                       "type": "boolean",
+                       "description": "Load the composer autoloader for this extension, if one is present"
+               }
+       }
+}
index c91354d..57240c9 100644 (file)
@@ -371,12 +371,17 @@ $user: Current user
 &$message: API usage message to die with, as a message key or array
   as accepted by ApiBase::dieUsageMsg.
 
-'APIEditBeforeSave': Before saving a page with api.php?action=edit, after
+'APIEditBeforeSave': DEPRECATED! Use EditFilterMergedContent instead.
+Before saving a page with api.php?action=edit, after
 processing request parameters. Return false to let the request fail, returning
 an error message or an <edit result="Failure"> tag if $resultArr was filled.
 Unlike for example 'EditFilterMergedContent' this also being run on undo.
+Since MediaWiki 1.25, 'EditFilterMergedContent' can also return error details
+for the API and it's recommended to use it instead of this hook.
 $editPage: the EditPage object
-$text: the new text of the article (has yet to be saved)
+$text: the text passed to the API. Note that this includes only the single
+  section for section edit, and is not necessarily the final text in case of
+  automatically resolved edit conflicts.
 &$resultArr: data in this array will be added to the API result
 
 'ApiFeedContributions::feedItem': Called to convert the result of ContribsPager
@@ -439,6 +444,15 @@ an exception is thrown during API action execution.
 $apiMain: Calling ApiMain instance.
 $e: Exception object.
 
+'ApiMakeParserOptions': Called from ApiParse and ApiExpandTemplates to allow
+extensions to adjust the ParserOptions before parsing.
+$options: ParserOptions object
+$title: Title to be parsed
+$params: Parameter array for the API module
+$module: API module (which is also a ContextSource)
+&$reset: Set to a ScopedCallback used to reset any hooks after the parse is done.
+&$suppressCache: Set true if cache should be suppressed.
+
 'ApiOpenSearchSuggest': Called when constructing the OpenSearch results. Hooks
 can alter or append to the array.
 &$results: array with integer keys to associative arrays. Keys in associative
@@ -669,6 +683,10 @@ $oldPageID: the page ID of the revision when archived (may be null)
 revisions of an article.
 $title: Title object of the article
 $ids: Ids to set the visibility for
+$visibilityChangeMap: Map of revision id to oldBits and newBits.  This array can be
+  examined to determine exactly what visibility bits have changed for each
+  revision.  This array is of the form
+  [id => ['oldBits' => $oldBits, 'newBits' => $newBits], ... ]
 
 'ArticleRollbackComplete': After an article rollback is completed.
 $wikiPage: the WikiPage that was edited
@@ -885,6 +903,7 @@ $image: File
 'BlockIpComplete': After an IP address or user is blocked.
 $block: the Block object that was saved
 $user: the user who did the block (not the one being blocked)
+$priorBlock: the Block object for the prior block or null if there was none
 
 'BookInformation': Before information output on Special:Booksources.
 $isbn: ISBN to show information for
@@ -915,6 +934,7 @@ $wikiPage: WikiPage that was added
 'CategoryAfterPageRemoved': After a page is removed from a category.
 $category: Category that page was removed from
 $wikiPage: WikiPage that was removed
+$id: the page ID (original ID in case of page deletions)
 
 'CategoryPageView': Before viewing a categorypage in CategoryPage::view.
 &$catpage: CategoryPage instance
@@ -1346,6 +1366,7 @@ $changesList: EnhancedChangesList object
 &$data: An array with all the components that will be joined in order to create the line
 $block: An array of RecentChange objects in that block
 $rc: The RecentChange object for this line
+&$classes: An array of classes to change
 
 'EnhancedChangesListModifyBlockLineData': to alter data used to build
 a non-grouped recent change line in EnhancedChangesList.
@@ -1837,7 +1858,7 @@ $file: the File object or false if broken link
 &$attribs: the attributes to be applied
 &$ret: the value to return if your hook returns false
 
-'LinkRendererBegin':
+'HtmlPageLinkRendererBegin':
 Used when generating internal and interwiki links in
 LinkRenderer, before processing starts.  Return false to skip default
 processing and return $ret.
@@ -1853,7 +1874,7 @@ $target: the LinkTarget that the link is pointing to
   in associative array form, with keys and values unescaped.
 &$ret: the value to return if your hook returns false.
 
-'LinkRendererEnd':
+'HtmlPageLinkRendererEnd':
 Used when generating internal and interwiki links in LinkRenderer,
 just before the function returns a value.  If you return true, an <a> element
 with HTML attributes $attribs and contents $html will be returned.  If you
@@ -2339,24 +2360,12 @@ cache or return false to not use it.
 &$parser: Parser object
 &$varCache: variable cache (array)
 
-'ParserLimitReport': DEPRECATED! Use ParserLimitReportPrepare and
-ParserLimitReportFormat instead.
+'ParserLimitReport': DEPRECATED! Use ParserLimitReportPrepare instead.
 Called at the end of Parser:parse() when the parser will
 include comments about size of the text parsed.
 $parser: Parser object
 &$limitReport: text that will be included (without comment tags)
 
-'ParserLimitReportFormat': Called for each row in the parser limit report that
-needs formatting. If nothing handles this hook, the default is to use "$key" to
-get the label, and "$key-value" or "$key-value-text"/"$key-value-html" to
-format the value.
-$key: Key for the limit report item (string)
-&$value: Value of the limit report item
-&$report: String onto which to append the data
-$isHTML: If true, $report is an HTML table with two columns; if false, it's
-  text intended for display in a monospaced font.
-$localize: If false, $report should be output in English.
-
 'ParserLimitReportPrepare': Called at the end of Parser:parse() when the parser
 will include comments about size of the text parsed. Hooks should use
 $output->setLimitReportData() to populate data. Functions for this hook should
@@ -2398,6 +2407,8 @@ that tests continue to run properly.
 $page: the WikiPage of the candidate edit
 $content: the Content object of the candidate edit
 $output: the ParserOutput result of the candidate edit
+$summary: the change summary of the candidate edit
+$user: the User considering the edit
 
 'PasswordPoliciesForUser': Alter the effective password policy for a user.
 $user: User object whose policy you are modifying
@@ -2529,7 +2540,7 @@ $context: (IContextSource) The RequestContext the skin is being created for.
 flagged to lack same-origin security. Return false to indicate the lack. Note
 if the "somehow" involves HTTP headers, you'll probably need to make sure
 the header is varied on.
-WebRequest $request: The request.
+$request: The WebRequest object.
 
 'ResetPasswordExpiration': Allow extensions to set a default password expiration
 $user: The user having their password expiration reset
@@ -2859,6 +2870,12 @@ $id: User id number, only provided for backwards-compatibility
 $user: User object representing user contributions are being fetched for
 $sp: SpecialPage instance, providing context
 
+'SpecialContributions::formatRow::flags': Called before rendering a
+Special:Contributions row.
+$context: IContextSource object
+$row: Revision information from the database
+&$flags: List of flags on this row
+
 'SpecialContributions::getForm::filters': Called with a list of filters to render
 on Special:Contributions.
 $sp: SpecialContributions object, for context
@@ -2989,9 +3006,9 @@ $t: title object searched for
 canceled and a normal search will be performed. Returning true without setting
 $url does a standard redirect to $title. Setting $url redirects to the
 specified URL.
-$term - The string the user searched for
-$title - The title the 'go' feature has decided to forward the user to
-&$url - Initially null, hook subscribers can set this to specify the final url to redirect to
+$term: The string the user searched for
+$title: The title the 'go' feature has decided to forward the user to
+&$url: Initially null, hook subscribers can set this to specify the final url to redirect to
 
 'SpecialSearchNogomatch': Called when user clicked the "Go" button but the
 target doesn't exist.
@@ -3261,8 +3278,8 @@ added to the descriptor
 &$radio: Boolean, if source type should be shown as radio button
 $selectedSourceType: The selected source type
 
-'UploadVerification': Additional chances to reject an uploaded file. Consider
-using UploadVerifyFile instead.
+'UploadVerification': DEPRECATED! Use UploadVerifyFile instead.
+Additional chances to reject an uploaded file.
 $saveName: (string) destination file name
 $tempName: (string) filesystem path to the temporary file for checks
 &$error: (string) output: message key for message to show if upload canceled by
@@ -3274,9 +3291,23 @@ in most cases over UploadVerification.
 $upload: (object) an instance of UploadBase, with all info about the upload
 $mime: (string) The uploaded file's MIME type, as detected by MediaWiki.
   Handlers will typically only apply for specific MIME types.
-&$error: (object) output: true if the file is valid. Otherwise, an indexed array
-  representing the problem with the file, where the first element is the message
-  key and the remaining elements are used as parameters to the message.
+&$error: (object) output: true if the file is valid. Otherwise, set this to the reason
+  in the form of array( messagename, param1, param2, ... ) or a MessageSpecifier
+  instance (you might want to use ApiMessage to provide machine-readable details
+  for the API).
+
+'UploadVerifyUpload': Upload verification, based on both file properties like
+MIME type (same as UploadVerifyFile) and the information entered by the user
+(upload comment, file page contents etc.).
+$upload: (object) An instance of UploadBase, with all info about the upload
+$user: (object) An instance of User, the user uploading this file
+$props: (array) File properties, as returned by FSFile::getPropsFromPath()
+$comment: (string) Upload log comment (also used as edit summary)
+$pageText: (string) File description page text (only used for new uploads)
+&$error: output: If the file upload should be prevented, set this to the reason
+  in the form of array( messagename, param1, param2, ... ) or a MessageSpecifier
+  instance (you might want to use ApiMessage to provide machine-readable details
+  for the API).
 
 'UserIsBot': when determining whether a user is a bot account
 $user: the user
@@ -3379,6 +3410,7 @@ $title: Title of the page in question
 &$user: User object
 $ip: User's IP address
 &$blocked: Whether the user is blocked, to be modified by the hook
+&$block: The Block object, to be modified by the hook
 
 'UserIsEveryoneAllowed': Check if all users are allowed some user right; return
 false if a UserGetRights hook might remove the named right.
@@ -3423,6 +3455,9 @@ $user: User object for the logged-in user
 For functionality that needs to run after any login (API or web) use UserLoggedIn.
 &$user: the user object that was created on login
 &$inject_html: Any HTML to inject after the "logged in" message.
+$direct: (bool) The hook is called directly after a successful login. This will only happen once
+  per login. A UserLoginComplete call with direct=false can happen when the user visits the login
+  page while already logged in.
 
 'UserLoginForm': DEPRECATED! Create an AuthenticationProvider instead.
 Manipulate the login form.
index d636188..fa1609f 100644 (file)
@@ -162,13 +162,21 @@ function wfImageAuthMain() {
                }
        }
 
+       $options = []; // HTTP header options
+       if ( isset( $_SERVER['HTTP_RANGE'] ) ) {
+               $options['range'] = $_SERVER['HTTP_RANGE'];
+       }
+       if ( isset( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) ) {
+               $options['if-modified-since'] = $_SERVER['HTTP_IF_MODIFIED_SINCE'];
+       }
+
        if ( $request->getCheck( 'download' ) ) {
                $headers[] = 'Content-Disposition: attachment';
        }
 
        // Stream the requested file
        wfDebugLog( 'img_auth', "Streaming `" . $filename . "`." );
-       $repo->streamFile( $filename, $headers );
+       $repo->streamFile( $filename, $headers, $options );
 }
 
 /**
index 883b8a3..8dc7d40 100644 (file)
@@ -81,18 +81,6 @@ class AutoLoader {
                require $filename;
        }
 
-       /**
-        * Force a class to be run through the autoloader, helpful for things like
-        * Sanitizer that have define()s outside of their class definition. Of course
-        * this wouldn't be necessary if everything in MediaWiki was class-based. Sigh.
-        *
-        * @param string $class
-        * @return bool Return the results of class_exists() so we know if we were successful
-        */
-       static function loadClass( $class ) {
-               return class_exists( $class );
-       }
-
        /**
         * Method to clear the protected class property $autoloadLocalClassesLower.
         * Used in tests.
index 28b566a..531e0be 100644 (file)
@@ -79,6 +79,11 @@ class Category {
                                $this->mSubcats = 0;
                                $this->mFiles = 0;
 
+                               # If the title exists, call refreshCounts to add a row for it.
+                               if ( $this->mTitle->exists() ) {
+                                       DeferredUpdates::addCallableUpdate( [ $this, 'refreshCounts' ] );
+                               }
+
                                return true;
                        } else {
                                return false; # Fail
@@ -331,21 +336,35 @@ class Category {
                        [ 'LOCK IN SHARE MODE' ]
                );
 
+               $shouldExist = $result->pages > 0 || $this->getTitle()->exists();
+
                if ( $this->mID ) {
-                       # The category row already exists, so do a plain UPDATE instead
-                       # of INSERT...ON DUPLICATE KEY UPDATE to avoid creating a gap
-                       # in the cat_id sequence. The row may or may not be "affected".
-                       $dbw->update(
-                               'category',
-                               [
-                                       'cat_pages' => $result->pages,
-                                       'cat_subcats' => $result->subcats,
-                                       'cat_files' => $result->files
-                               ],
-                               [ 'cat_title' => $this->mName ],
-                               __METHOD__
-                       );
-               } else {
+                       if ( $shouldExist ) {
+                               # The category row already exists, so do a plain UPDATE instead
+                               # of INSERT...ON DUPLICATE KEY UPDATE to avoid creating a gap
+                               # in the cat_id sequence. The row may or may not be "affected".
+                               $dbw->update(
+                                       'category',
+                                       [
+                                               'cat_pages' => $result->pages,
+                                               'cat_subcats' => $result->subcats,
+                                               'cat_files' => $result->files
+                                       ],
+                                       [ 'cat_title' => $this->mName ],
+                                       __METHOD__
+                               );
+                       } else {
+                               # The category is empty and has no description page, delete it
+                               $dbw->delete(
+                                       'category',
+                                       [ 'cat_title' => $this->mName ],
+                                       __METHOD__
+                               );
+                               $this->mID = false;
+                       }
+               } elseif ( $shouldExist ) {
+                       # The category row doesn't exist but should, so create it. Use
+                       # upsert in case of races.
                        $dbw->upsert(
                                'category',
                                [
@@ -362,6 +381,8 @@ class Category {
                                ],
                                __METHOD__
                        );
+                       // @todo: Should we update $this->mID here? Or not since Category
+                       // objects tend to be short lived enough to not matter?
                }
 
                $dbw->endAtomic( __METHOD__ );
index cf471d9..490f548 100644 (file)
@@ -545,17 +545,17 @@ class CategoryViewer extends ContextSource {
        }
 
        /**
-        * Format a list of articles chunked by letter in a three-column
-        * list, ordered vertically.
+        * Format a list of articles chunked by letter in a three-column list, ordered
+        * vertically. This is used for categories with a significant number of pages.
         *
         * TODO: Take the headers into account when creating columns, so they're
         * more visually equal.
         *
         * TODO: shortList and columnList are similar, need merging
         *
-        * @param array $articles
-        * @param string[] $articles_start_char
-        * @return string
+        * @param string[] $articles HTML links to each article
+        * @param string[] $articles_start_char The header characters for each article
+        * @return string HTML to output
         * @private
         */
        static function columnList( $articles, $articles_start_char ) {
@@ -592,10 +592,11 @@ class CategoryViewer extends ContextSource {
        }
 
        /**
-        * Format a list of articles chunked by letter in a bullet list.
-        * @param array $articles
-        * @param string[] $articles_start_char
-        * @return string
+        * Format a list of articles chunked by letter in a bullet list. This is used
+        * for categories with a small number of pages (when columns aren't needed).
+        * @param string[] $articles HTML links to each article
+        * @param string[] $articles_start_char The header characters for each article
+        * @return string HTML to output
         * @private
         */
        static function shortList( $articles, $articles_start_char ) {
index dc0b60c..1e60302 100644 (file)
@@ -284,10 +284,10 @@ $wgLogo = false;
  *
  * @par Example:
  * @code
- * $wgLogoHD = array(
+ * $wgLogoHD = [
  *     "1.5x" => "path/to/1.5x_version.png",
  *     "2x" => "path/to/2x_version.png"
- * );
+ * ];
  * @endcode
  *
  * @since 1.25
@@ -529,11 +529,12 @@ $wgUseInstantCommons = false;
  * Array of foreign file repo names (set in $wgForeignFileRepos above) that
  * are allowable upload targets. These wikis must have some method of
  * authentication (i.e. CentralAuth), and be CORS-enabled for this wiki.
+ * The string 'local' signifies the default local file repository.
  *
  * Example:
- * $wgForeignUploadTargets = array( 'shared' );
+ * $wgForeignUploadTargets = [ 'shared' ];
  */
-$wgForeignUploadTargets = [];
+$wgForeignUploadTargets = [ 'local' ];
 
 /**
  * Configuration for file uploads using the embeddable upload dialog
@@ -754,10 +755,10 @@ $wgCopyUploadTimeout = false;
  *
  * @par Example:
  * @code
- * $wgMaxUploadSize = array(
+ * $wgMaxUploadSize = [
  *     '*' => 250 * 1024,
  *     'url' => 500 * 1024,
- * );
+ * ];
  * @endcode
  * Sets the maximum for all uploads to 250 kB except for upload-by-url, which
  * will have a maximum of 500 kB.
@@ -1162,9 +1163,9 @@ $wgMaxAnimatedGifArea = 1.25e7;
  * @par Example:
  * @code
  *  // PNG is lossless, but inefficient for photos
- *  $wgTiffThumbnailType = array( 'png', 'image/png' );
+ *  $wgTiffThumbnailType = [ 'png', 'image/png' ];
  *  // JPEG is good for photos, but has no transparency support. Bad for diagrams.
- *  $wgTiffThumbnailType = array( 'jpg', 'image/jpeg' );
+ *  $wgTiffThumbnailType = [ 'jpg', 'image/jpeg' ];
  * @endcode
  */
 $wgTiffThumbnailType = false;
@@ -1320,7 +1321,7 @@ $wgTrivialMimeDetection = false;
 
 /**
  * Additional XML types we can allow via MIME-detection.
- * array = ( 'rootElement' => 'associatedMimeType' )
+ * array = [ 'rootElement' => 'associatedMimeType' ]
  */
 $wgXMLMimeTypes = [
        'http://www.w3.org/2000/svg:svg' => 'image/svg+xml',
@@ -1377,7 +1378,7 @@ $wgThumbnailBuckets = null;
  * needs in order to be used as the reference for a given thumbnail. For example, with the
  * following buckets:
  *
- * $wgThumbnailBuckets = array ( 128, 256, 512 );
+ * $wgThumbnailBuckets = [ 128, 256, 512 ];
  *
  * and a distance of 50:
  *
@@ -1443,7 +1444,10 @@ $wgGalleryOptions = [
        'imagesPerRow' => 0, // Default number of images per-row in the gallery. 0 -> Adapt to screensize
        'imageWidth' => 120, // Width of the cells containing images in galleries (in "px")
        'imageHeight' => 120, // Height of the cells containing images in galleries (in "px")
-       'captionLength' => 25, // Length of caption to truncate (in characters)
+       'captionLength' => true, // Deprecated @since 1.28
+                                // Length to truncate filename to in caption when using "showfilename".
+                                // A value of 'true' will truncate the filename to one line using CSS
+                                // and will be the behaviour after deprecation.
        'showBytes' => true, // Show the filesize in bytes in categories
        'mode' => 'traditional',
 ];
@@ -1623,14 +1627,14 @@ $wgPasswordExpireGrace = 3600 * 24 * 7; // 7 days
  * Default to false or fill an array :
  *
  * @code
- * $wgSMTP = array(
+ * $wgSMTP = [
  *     'host'     => 'SMTP domain',
  *     'IDHost'   => 'domain for MessageID',
  *     'port'     => '25',
  *     'auth'     => [true|false],
  *     'username' => [SMTP username],
  *     'password' => [SMTP password],
- * );
+ * ];
  * @endcode
  */
 $wgSMTP = false;
@@ -2067,7 +2071,7 @@ $wgCompressRevisions = false;
  *
  * Short names of ExternalStore classes may be specified in an array here:
  * @code
- * $wgExternalStores = array("http","file","custom")...
+ * $wgExternalStores = [ "http","file","custom" ]...
  * @endcode
  *
  * CAUTION: Access to database might lead to code execution
@@ -2080,9 +2084,9 @@ $wgExternalStores = [];
  * @par Example:
  * Create a cluster named 'cluster1' containing three servers:
  * @code
- * $wgExternalServers = array(
- *     'cluster1' => array( 'srv28', 'srv29', 'srv30' )
- * );
+ * $wgExternalServers = [
+ *     'cluster1' => [ 'srv28', 'srv29', 'srv30' ]
+ * ];
  * @endcode
  *
  * Used by LBFactorySimple, may be ignored if $wgLBFactoryConf is set to
@@ -2099,7 +2103,7 @@ $wgExternalServers = [];
  *
  * @par Example:
  * @code
- * $wgDefaultExternalStore = array( 'DB://cluster1', 'DB://cluster2' );
+ * $wgDefaultExternalStore = [ 'DB://cluster1', 'DB://cluster2' ];
  * @endcode
  *
  * @var array
@@ -2550,12 +2554,6 @@ $wgSidebarCacheExpiry = 86400;
  */
 $wgUseGzip = false;
 
-/**
- * Whether MediaWiki should send an ETag header. Seems to cause
- * broken behavior with Squid 2.6, see bug 7098.
- */
-$wgUseETag = false;
-
 /**
  * Clock skew or the one-second resolution of time() can occasionally cause cache
  * problems when the user requests two pages within a short period of time. This
@@ -2743,16 +2741,16 @@ $wgSquidPurgeUseHostHeader = true;
  * @par Example configuration to send purges for upload.wikimedia.org to one
  * multicast group and all other purges to another:
  * @code
- * $wgHTCPRouting = array(
- *         '|^https?://upload\.wikimedia\.org|' => array(
+ * $wgHTCPRouting = [
+ *         '|^https?://upload\.wikimedia\.org|' => [
  *                 'host' => '239.128.0.113',
  *                 'port' => 4827,
- *         ),
- *         '' => array(
+ *         ],
+ *         '' => [
  *                 'host' => '239.128.0.112',
  *                 'port' => 4827,
- *         ),
- * );
+ *         ],
+ * ];
  * @endcode
  *
  * You can also pass an array of hosts to send purges too. This is useful when
@@ -2761,16 +2759,16 @@ $wgSquidPurgeUseHostHeader = true;
  *
  * @par Example of sending purges to multiple hosts:
  * @code
- * $wgHTCPRouting = array(
- *     '' => array(
+ * $wgHTCPRouting = [
+ *     '' => [
  *         // Purges to text caches using multicast
- *         array( 'host' => '239.128.0.114', 'port' => '4827' ),
+ *         [ 'host' => '239.128.0.114', 'port' => '4827' ],
  *         // Purges to a hardcoded list of caches
- *         array( 'host' => '10.88.66.1', 'port' => '4827' ),
- *         array( 'host' => '10.88.66.2', 'port' => '4827' ),
- *         array( 'host' => '10.88.66.3', 'port' => '4827' ),
- *     ),
- * );
+ *         [ 'host' => '10.88.66.1', 'port' => '4827' ],
+ *         [ 'host' => '10.88.66.2', 'port' => '4827' ],
+ *         [ 'host' => '10.88.66.3', 'port' => '4827' ],
+ *     ],
+ * ];
  * @endcode
  *
  * @since 1.22
@@ -2887,15 +2885,6 @@ $wgDummyLanguageCodes = [
        'zh-yue' => 'yue',
 ];
 
-/**
- * Character set for use in the article edit box. Language-specific encodings
- * may be defined.
- *
- * This historic feature is one of the first that was added by former MediaWiki
- * team leader Brion Vibber, and is used to support the Esperanto x-system.
- */
-$wgEditEncoding = '';
-
 /**
  * Set this to true to replace Arabic presentation forms with their standard
  * forms in the U+0600-U+06FF block. This only works if $wgLanguageCode is
@@ -3093,7 +3082,7 @@ $wgLoginLanguageSelector = false;
  * To allow language-specific main page and community
  * portal:
  * @code
- *     $wgForceUIMsgAsContentMsg = array( 'mainpage', 'portal-url' );
+ *     $wgForceUIMsgAsContentMsg = [ 'mainpage', 'portal-url' ];
  * @endcode
  */
 $wgForceUIMsgAsContentMsg = [];
@@ -3463,13 +3452,13 @@ $wgMangleFlashPolicy = true;
  *
  * @par Example:
  * @code
- *   $wgResourceModules['ext.myExtension'] = array(
+ *   $wgResourceModules['ext.myExtension'] = [
  *      'scripts' => 'myExtension.js',
  *      'styles' => 'myExtension.css',
- *      'dependencies' => array( 'jquery.cookie', 'jquery.tabIndex' ),
+ *      'dependencies' => [ 'jquery.cookie', 'jquery.tabIndex' ],
  *      'localBasePath' => __DIR__,
  *      'remoteExtPath' => 'MyExtension',
- *   );
+ *   ];
  * @endcode
  */
 $wgResourceModules = [];
@@ -3484,27 +3473,27 @@ $wgResourceModules = [];
  *
  * @par Example:
  * @code
- *   $wgResourceModules['bar'] = array(
+ *   $wgResourceModules['bar'] = [
  *     'scripts' => 'resources/bar/bar.js',
  *     'styles' => 'resources/bar/main.css',
- *   );
+ *   ];
  *
- *   $wgResourceModuleSkinStyles['foo'] = array(
+ *   $wgResourceModuleSkinStyles['foo'] = [
  *     'bar' => 'skins/Foo/bar.css',
- *   );
+ *   ];
  * @endcode
  *
  * This is mostly equivalent to:
  *
  * @par Equivalent:
  * @code
- *   $wgResourceModules['bar'] = array(
+ *   $wgResourceModules['bar'] = [
  *     'scripts' => 'resources/bar/bar.js',
  *     'styles' => 'resources/bar/main.css',
- *     'skinStyles' => array(
+ *     'skinStyles' => [
  *       'foo' => skins/Foo/bar.css',
- *     ),
- *   );
+ *     ],
+ *   ];
  * @endcode
  *
  * If the module already defines its own entry in `skinStyles` for a given skin, then
@@ -3515,34 +3504,34 @@ $wgResourceModules = [];
  *
  * @par Example:
  * @code
- *   $wgResourceModules['bar'] = array(
+ *   $wgResourceModules['bar'] = [
  *     'scripts' => 'resources/bar/bar.js',
  *     'styles' => 'resources/bar/basic.css',
- *     'skinStyles' => array(
- *       'default' => 'resources/bar/additional.css',
- *     ),
- *   );
+ *     'skinStyles' => [
+ *      'default' => 'resources/bar/additional.css',
+ *     ],
+ *   ];
  *   // Note the '+' character:
- *   $wgResourceModuleSkinStyles['foo'] = array(
+ *   $wgResourceModuleSkinStyles['foo'] = [
  *     '+bar' => 'skins/Foo/bar.css',
- *   );
+ *   ];
  * @endcode
  *
  * This is mostly equivalent to:
  *
  * @par Equivalent:
  * @code
- *   $wgResourceModules['bar'] = array(
+ *   $wgResourceModules['bar'] = [
  *     'scripts' => 'resources/bar/bar.js',
  *     'styles' => 'resources/bar/basic.css',
- *     'skinStyles' => array(
+ *     'skinStyles' => [
  *       'default' => 'resources/bar/additional.css',
- *       'foo' => array(
+ *       'foo' => [
  *         'resources/bar/additional.css',
  *         'skins/Foo/bar.css',
- *       ),
- *     ),
- *   );
+ *       ],
+ *     ],
+ *   ];
  * @endcode
  *
  * In other words, as a module author, use the `styles` list for stylesheets that may not be
@@ -3554,12 +3543,12 @@ $wgResourceModules = [];
  *
  * @par Example:
  * @code
- *   $wgResourceModuleSkinStyles['foo'] = array(
+ *   $wgResourceModuleSkinStyles['foo'] = [
  *     'bar' => 'bar.css',
  *     'quux' => 'quux.css',
  *     'remoteSkinPath' => 'Foo',
  *     'localBasePath' => __DIR__,
- *   );
+ *   ];
  * @endcode
  */
 $wgResourceModuleSkinStyles = [];
@@ -3716,11 +3705,11 @@ $wgResourceLoaderValidateStaticJS = false;
  *
  * @par Example:
  * @code
- *   $wgResourceLoaderLESSVars = array(
+ *   $wgResourceLoaderLESSVars = [
  *     'baseFontSize'  => '1em',
  *     'smallFontSize' => '0.75em',
  *     'WikimediaBlue' => '#006699',
- *   );
+ *   ];
  * @endcode
  * @since 1.22
  */
@@ -3818,12 +3807,12 @@ $wgMetaNamespaceTalk = false;
  *
  * @par Example:
  * @code
- * $wgExtraNamespaces = array(
+ * $wgExtraNamespaces = [
  *    100 => "Hilfe",
  *    101 => "Hilfe_Diskussion",
  *    102 => "Aide",
  *    103 => "Discussion_Aide"
- * );
+ * ];
  * @endcode
  *
  * @todo Add a note about maintenance/namespaceDupes.php
@@ -3850,10 +3839,10 @@ $wgExtraGenderNamespaces = [];
  *
  * @par Example:
  * @code
- *    $wgNamespaceAliases = array(
+ *    $wgNamespaceAliases = [
  *        'Wikipedian' => NS_USER,
  *        'Help' => 100,
- *    );
+ *    ];
  * @endcode
  */
 $wgNamespaceAliases = [];
@@ -4180,7 +4169,7 @@ $wgAllowExternalImages = false;
  * @par Examples:
  * @code
  * $wgAllowExternalImagesFrom = 'http://127.0.0.1/';
- * $wgAllowExternalImagesFrom = array( 'http://127.0.0.1/', 'http://example.com' );
+ * $wgAllowExternalImagesFrom = [ 'http://127.0.0.1/', 'http://example.com' ];
  * @endcode
  */
 $wgAllowExternalImagesFrom = '';
@@ -4221,6 +4210,8 @@ $wgAllowImageTag = false;
  *    - RaggettInternalHHVM: Use the limited-functionality HHVM extension
  *    - RaggettInternalPHP: Use the PECL extension
  *    - RaggettExternal: Shell out to an external binary (tidyBin)
+ *    - Html5Depurate: Use external Depurate service
+ *    - Html5Internal: Use the built-in HTML5 balancer
  *
  *  - tidyConfigFile: Path to configuration file for any of the Raggett drivers
  *  - debugComment: True to add a comment to the output with warning messages
@@ -4302,8 +4293,7 @@ $wgNoFollowNsExceptions = [];
  * (or any subdomains) will not be set to rel="nofollow" regardless of the
  * value of $wgNoFollowLinks.  For instance:
  *
- * $wgNoFollowDomainExceptions = array( 'en.wikipedia.org', 'wiktionary.org',
- * 'mediawiki.org' );
+ * $wgNoFollowDomainExceptions = [ 'en.wikipedia.org', 'wiktionary.org', 'mediawiki.org' ];
  *
  * This would add rel="nofollow" to links to de.wikipedia.org, but not
  * en.wikipedia.org, wiktionary.org, en.wiktionary.org, us.en.wikipedia.org,
@@ -4690,14 +4680,14 @@ $wgPasswordDefault = 'pbkdf2';
  *
  * An advanced example:
  * @code
- * $wgPasswordConfig['bcrypt-peppered'] = array(
+ * $wgPasswordConfig['bcrypt-peppered'] = [
  *     'class' => 'EncryptedPassword',
  *     'underlying' => 'bcrypt',
- *     'secrets' => array(),
+ *     'secrets' => [],
  *     'cipher' => MCRYPT_RIJNDAEL_256,
  *     'mode' => MCRYPT_MODE_CBC,
  *     'cost' => 5,
- * );
+ * ];
  * @endcode
  *
  * @since 1.24
@@ -4986,7 +4976,7 @@ $wgWhitelistRead = false;
  * @par Example:
  * To whitelist [[Main Page]]:
  * @code
- * $wgWhitelistReadRegexp = array( "/Main Page/" );
+ * $wgWhitelistReadRegexp = [ "/Main Page/" ];
  * @endcode
  *
  * @note Unless ^ and/or $ is specified, a regular expression might match
@@ -4996,7 +4986,7 @@ $wgWhitelistRead = false;
  * @par Example:
  * To allow reading any page starting with 'User' regardless of the case:
  * @code
- * $wgWhitelistReadRegexp = array( "@^UsEr.*@i" );
+ * $wgWhitelistReadRegexp = [ "@^UsEr.*@i" ];
  * @endcode
  * Will allow both [[User is banned]] and [[User:JohnDoe]]
  *
@@ -5031,7 +5021,7 @@ $wgHideIdentifiableRedirects = true;
  * combined with the permissions of all groups that a given user is listed
  * in in the user_groups table.
  *
- * Note: Don't set $wgGroupPermissions = array(); unless you know what you're
+ * Note: Don't set $wgGroupPermissions = []; unless you know what you're
  * doing! This will wipe all permissions, and may mean that your users are
  * unable to perform certain essential tasks or access new functionality
  * when new permissions are introduced and default grants established.
@@ -5197,13 +5187,13 @@ $wgImplicitGroups = [ '*', 'user', 'autoconfirmed' ];
  * @par Example:
  * To allow sysops to add themselves to the "bot" group:
  * @code
- *    $wgGroupsAddToSelf = array( 'sysop' => array( 'bot' ) );
+ *    $wgGroupsAddToSelf = [ 'sysop' => [ 'bot' ] ];
  * @endcode
  *
  * @par Example:
  * Implicit groups may be used for the source group, for instance:
  * @code
- *    $wgGroupsRemoveFromSelf = array( '*' => true );
+ *    $wgGroupsRemoveFromSelf = [ '*' => true ];
  * @endcode
  * This allows users in the '*' group (i.e. any user) to remove themselves from
  * any group that they happen to be in.
@@ -5321,18 +5311,18 @@ $wgAutoConfirmCount = 0;
  * @todo Redocument $wgAutopromote
  *
  * The format is
- *   array( '&' or '|' or '^' or '!', cond1, cond2, ... )
+ *   [ '&' or '|' or '^' or '!', cond1, cond2, ... ]
  * where cond1, cond2, ... are themselves conditions; *OR*
  *   APCOND_EMAILCONFIRMED, *OR*
- *   array( APCOND_EMAILCONFIRMED ), *OR*
- *   array( APCOND_EDITCOUNT, number of edits ), *OR*
- *   array( APCOND_AGE, seconds since registration ), *OR*
- *   array( APCOND_INGROUPS, group1, group2, ... ), *OR*
- *   array( APCOND_ISIP, ip ), *OR*
- *   array( APCOND_IPINRANGE, range ), *OR*
- *   array( APCOND_AGE_FROM_EDIT, seconds since first edit ), *OR*
- *   array( APCOND_BLOCKED ), *OR*
- *   array( APCOND_ISBOT ), *OR*
+ *   [ APCOND_EMAILCONFIRMED ], *OR*
+ *   [ APCOND_EDITCOUNT, number of edits ], *OR*
+ *   [ APCOND_AGE, seconds since registration ], *OR*
+ *   [ APCOND_INGROUPS, group1, group2, ... ], *OR*
+ *   [ APCOND_ISIP, ip ], *OR*
+ *   [ APCOND_IPINRANGE, range ], *OR*
+ *   [ APCOND_AGE_FROM_EDIT, seconds since first edit ], *OR*
+ *   [ APCOND_BLOCKED ], *OR*
+ *   [ APCOND_ISBOT ], *OR*
  *   similar constructs defined by extensions.
  *
  * If $wgEmailAuthentication is off, APCOND_EMAILCONFIRMED will be true for any
@@ -5353,7 +5343,7 @@ $wgAutopromote = [
  *
  * The format is:
  * @code
- *    array( event => criteria, ... )
+ *    [ event => criteria, ... ]
  * @endcode
  * Where event is either:
  *    - 'onEdit' (when user edits)
@@ -5384,15 +5374,15 @@ $wgAutopromoteOnceLogInRC = true;
  * @endcode
  * Bureaucrats can only remove bots and sysops:
  * @code
- * $wgRemoveGroups['bureaucrat'] = array( 'bot', 'sysop' );
+ * $wgRemoveGroups['bureaucrat'] = [ 'bot', 'sysop' ];
  * @endcode
  * Sysops can make bots:
  * @code
- * $wgAddGroups['sysop'] = array( 'bot' );
+ * $wgAddGroups['sysop'] = [ 'bot' ];
  * @endcode
  * Sysops can disable other sysops in an emergency, and disable bots:
  * @code
- * $wgRemoveGroups['sysop'] = array( 'sysop', 'bot' );
+ * $wgRemoveGroups['sysop'] = [ 'sysop', 'bot' ];
  * @endcode
  */
 $wgAddGroups = [];
@@ -5463,15 +5453,15 @@ $wgEnableDnsBlacklist = false;
  *
  * @par Example:
  * @code
- * $wgDnsBlacklistUrls = array(
+ * $wgDnsBlacklistUrls = [
  *   // String containing URL
  *   'http.dnsbl.sorbs.net.',
  *   // Array with URL and key, for services that require a key
- *   array( 'dnsbl.httpbl.net.', 'mykey' ),
+ *   [ 'dnsbl.httpbl.net.', 'mykey' ],
  *   // Array with just the URL. While this works, it is recommended that you
  *   // just use a string as shown above
- *   array( 'opm.tornevall.org.' )
- * );
+ *   [ 'opm.tornevall.org.' ]
+ * ];
  * @endcode
  *
  * @note You should end the domain name with a . to avoid searching your
@@ -5503,21 +5493,21 @@ $wgApplyIpBlocksToXff = false;
  * @par Example:
  * To set a generic maximum of 4 hits in 60 seconds:
  * @code
- *     $wgRateLimits = array( 4, 60 );
+ *     $wgRateLimits = [ 4, 60 ];
  * @endcode
  *
  * @par Example:
  * You could also limit per action and then type of users.
  * @code
- *     $wgRateLimits = array(
- *         'edit' => array(
- *             'anon' => array( x, y ), // any and all anonymous edits (aggregate)
- *             'user' => array( x, y ), // each logged-in user
- *             'newbie' => array( x, y ), // each new autoconfirmed accounts; overrides 'user'
- *             'ip' => array( x, y ), // each anon and recent account
- *             'subnet' => array( x, y ), // ... within a /24 subnet in IPv4 or /64 in IPv6
- *         )
- *     )
+ *     $wgRateLimits = [
+ *         'edit' => [
+ *             'anon' => [ x, y ], // any and all anonymous edits (aggregate)
+ *             'user' => [ x, y ], // each logged-in user
+ *             'newbie' => [ x, y ], // each new autoconfirmed accounts; overrides 'user'
+ *             'ip' => [ x, y ], // each anon and recent account
+ *             'subnet' => [ x, y ], // ... within a /24 subnet in IPv4 or /64 in IPv6
+ *         ]
+ *     ]
  * @endcode
  *
  * @warning Requires that $wgMainCacheType is set to something persistent
@@ -5642,7 +5632,6 @@ $wgGrantPermissions = [];
 
 $wgGrantPermissions['basic']['autoconfirmed'] = true;
 $wgGrantPermissions['basic']['autopatrol'] = true;
-$wgGrantPermissions['basic']['autoreview'] = true;
 $wgGrantPermissions['basic']['editsemiprotected'] = true;
 $wgGrantPermissions['basic']['ipblock-exempt'] = true;
 $wgGrantPermissions['basic']['nominornewtalk'] = true;
@@ -5650,7 +5639,6 @@ $wgGrantPermissions['basic']['patrolmarks'] = true;
 $wgGrantPermissions['basic']['purge'] = true;
 $wgGrantPermissions['basic']['read'] = true;
 $wgGrantPermissions['basic']['skipcaptcha'] = true;
-$wgGrantPermissions['basic']['torunblocked'] = true;
 $wgGrantPermissions['basic']['writeapi'] = true;
 
 $wgGrantPermissions['highvolume']['bot'] = true;
@@ -5818,14 +5806,6 @@ $wgProxyList = [];
  */
 $wgCookieExpiration = 180 * 86400;
 
-/**
- * The identifiers of the login cookies that can have their lifetimes
- * extended independently of all other login cookies.
- *
- * @var string[]
- */
-$wgExtendedLoginCookies = [ 'UserID', 'Token' ];
-
 /**
  * Default login cookie lifetime, in seconds. Setting
  * $wgExtendLoginCookieExpiration to null will use $wgCookieExpiration to
@@ -5982,6 +5962,12 @@ $wgTrxProfilerLimits = [
                'writes' => 0,
                'readQueryTime' => 5
        ],
+       // Deferred updates that run after HTTP response is sent
+       'PostSend' => [
+               'readQueryTime' => 5,
+               'writeQueryTime' => 1,
+               'maxAffected' => 500
+       ],
        // Background job runner
        'JobRunner' => [
                'readQueryTime' => 30,
@@ -6018,11 +6004,11 @@ $wgTrxProfilerLimits = [
  *
  * @par Advanced example:
  * @code
- * $wgDebugLogGroups['memcached'] = array(
+ * $wgDebugLogGroups['memcached'] = [
  *     'destination' => '/var/log/mediawiki/memcached.log',
  *     'sample' => 1000,  // log 1 message out of every 1,000.
  *     'level' => \Psr\Log\LogLevel::WARNING
- * );
+ * ];
  * @endcode
  */
 $wgDebugLogGroups = [];
@@ -6041,7 +6027,7 @@ $wgDebugLogGroups = [];
  *
  * @par To completely disable logging:
  * @code
- * $wgMWLoggerDefaultSpi = array( 'class' => '\\MediaWiki\\Logger\\NullSpi' );
+ * $wgMWLoggerDefaultSpi = [ 'class' => '\\MediaWiki\\Logger\\NullSpi' ];
  * @endcode
  *
  * @since 1.25
@@ -6351,10 +6337,10 @@ $wgSitemapNamespaces = false;
  * This should be a map of namespace IDs to priority
  * @par Example:
  * @code
- *  $wgSitemapNamespacesPriorities = array(
+ *  $wgSitemapNamespacesPriorities = [
  *      NS_USER => '0.9',
  *      NS_HELP => '0.0',
- *  );
+ *  ];
  * @endcode
  */
 $wgSitemapNamespacesPriorities = false;
@@ -6561,18 +6547,18 @@ $wgRCLinkDays = [ 1, 3, 7, 14, 30 ];
  *  The JSON-specific options are:
  *   * 'channel' -- if set, the 'channel' parameter is also set in JSON values.
  *
- * @example $wgRCFeeds['example'] = array(
+ * @example $wgRCFeeds['example'] = [
  *             'formatter' => 'JSONRCFeedFormatter',
  *             'uri' => "udp://localhost:1336",
  *             'add_interwiki_prefix' => false,
  *             'omit_bots' => true,
- *     );
- * @example $wgRCFeeds['exampleirc'] = array(
+ *     ];
+ * @example $wgRCFeeds['exampleirc'] = [
  *             'formatter' => 'IRCColourfulRCFeedFormatter',
  *             'uri' => "udp://localhost:1338",
  *             'add_interwiki_prefix' => false,
  *             'omit_bots' => true,
- *     );
+ *     ];
  * @since 1.22
  */
 $wgRCFeeds = [];
@@ -6734,7 +6720,7 @@ $wgUnwatchedPageThreshold = false;
  *
  * To register a new one:
  * @code
- * $wgRecentChangesFlags['flag'] => array(
+ * $wgRecentChangesFlags['flag'] => [
  *   // message for the letter displayed next to rows on changes lists
  *   'letter' => 'letter-msg',
  *   // message for the tooltip of the letter
@@ -6747,7 +6733,7 @@ $wgUnwatchedPageThreshold = false;
  *   // will set the top-level flag if any line contains the flag, 'all' will
  *   // only be set if all lines contain the flag.
  *   'grouping' => 'any',
- * );
+ * ];
  * @endcode
  *
  * @since 1.22
@@ -6853,11 +6839,11 @@ $wgShowCreditsIfMax = true;
  * subprojects on the interwiki map of the target wiki, or a mix of the two,
  * e.g.
  * @code
- *     $wgImportSources = array(
- *         'wikipedia' => array( 'cs', 'en', 'fr', 'zh' ),
+ *     $wgImportSources = [
+ *         'wikipedia' => [ 'cs', 'en', 'fr', 'zh' ],
  *         'wikispecies',
- *         'wikia' => array( 'animanga', 'brickipedia', 'desserts' ),
- *     );
+ *         'wikia' => [ 'animanga', 'brickipedia', 'desserts' ],
+ *     ];
  * @endcode
  *
  * If you have a very complex import sources setup, you can lazy-load it using
@@ -6985,11 +6971,11 @@ $wgExtensionMessagesFiles = [];
  *
  * @par Complex example:
  * @code
- *    $wgMessagesDirs['Example'] = array(
+ *    $wgMessagesDirs['Example'] = [
  *        __DIR__ . '/lib/ve/i18n',
  *        __DIR__ . '/lib/oojs-ui/i18n',
  *        __DIR__ . '/i18n',
- *    )
+ *    ]
  * @endcode
  * @since 1.23
  */
@@ -7059,18 +7045,18 @@ $wgAutoloadAttemptLowercase = true;
  * All but 'name', 'path' and 'author' can be omitted.
  *
  * @code
- * $wgExtensionCredits[$type][] = array(
+ * $wgExtensionCredits[$type][] = [
  *     'path' => __FILE__,
  *     'name' => 'Example extension',
  *     'namemsg' => 'exampleextension-name',
- *     'author' => array(
+ *     'author' => [
  *         'Foo Barstein',
- *     ),
+ *     ],
  *     'version' => '1.9.0',
  *     'url' => 'http://example.org/example-extension/',
  *     'descriptionmsg' => 'exampleextension-desc',
  *     'license-name' => 'GPL-2.0+',
- * );
+ * ];
  * @endcode
  *
  * The extensions are listed on Special:Version. This page also looks for a file
@@ -7129,11 +7115,11 @@ $wgAuth = null;
  * @endcode
  * - A function with some data:
  * @code
- *     $wgHooks['event_name'][] = array( $function, $data );
+ *     $wgHooks['event_name'][] = [ $function, $data ];
  * @endcode
  * - A an object method:
  * @code
- *     $wgHooks['event_name'][] = array( $object, 'method' );
+ *     $wgHooks['event_name'][] = [ $object, 'method' ];
  * @endcode
  * - A closure:
  * @code
@@ -7258,7 +7244,7 @@ $wgSpecialPageCacheUpdates = [
  * Hooks that are used for outputting exceptions.  Format is:
  *   $wgExceptionHooks[] = $funcname
  * or:
- *   $wgExceptionHooks[] = array( $class, $funcname )
+ *   $wgExceptionHooks[] = [ $class, $funcname ]
  * Hooks should return strings or false
  */
 $wgExceptionHooks = [];
@@ -7374,10 +7360,7 @@ $wgLogRestrictions = [
  *
  * @par Example:
  * @code
- *   $wgFilterLogTypes = array(
- *      'move' => true,
- *      'import' => false,
- *   );
+ *   $wgFilterLogTypes = [ 'move' => true, 'import' => false ];
  * @endcode
  *
  * Will display show/hide links for the move and import logs. Move logs will be
@@ -7661,7 +7644,7 @@ $wgDefaultRobotPolicy = 'index,follow';
  *
  * @par Example:
  * @code
- *   $wgNamespaceRobotPolicies = array( NS_TALK => 'noindex' );
+ *   $wgNamespaceRobotPolicies = [ NS_TALK => 'noindex' ];
  * @endcode
  */
 $wgNamespaceRobotPolicies = [];
@@ -7673,23 +7656,23 @@ $wgNamespaceRobotPolicies = [];
  *
  * @par Example:
  * @code
- * $wgArticleRobotPolicies = array(
+ * $wgArticleRobotPolicies = [
  *         'Main Page' => 'noindex,follow',
  *         'User:Bob' => 'index,follow',
- * );
+ * ];
  * @endcode
  *
  * @par Example that DOES NOT WORK because the names are not canonical text
  * forms:
  * @code
- *   $wgArticleRobotPolicies = array(
+ *   $wgArticleRobotPolicies = [
  *     # Underscore, not space!
  *     'Main_Page' => 'noindex,follow',
  *     # "Project", not the actual project name!
  *     'Project:X' => 'index,follow',
  *     # Needs to be "Abc", not "abc" (unless $wgCapitalLinks is false for that namespace)!
  *     'abc' => 'noindex,nofollow'
- *   );
+ *   ];
  * @endcode
  */
 $wgArticleRobotPolicies = [];
@@ -7701,7 +7684,7 @@ $wgArticleRobotPolicies = [];
  *
  * @par Example:
  * @code
- *   $wgExemptFromUserRobotsControl = array( NS_MAIN, NS_TALK, NS_PROJECT );
+ *   $wgExemptFromUserRobotsControl = [ NS_MAIN, NS_TALK, NS_PROJECT ];
  * @endcode
  */
 $wgExemptFromUserRobotsControl = null;
@@ -7770,14 +7753,14 @@ $wgDebugAPI = false;
  *
  * @code
  *  $wgAPIModules['foo'] = 'ApiFoo';
- *  $wgAPIModules['bar'] = array(
+ *  $wgAPIModules['bar'] = [
  *    'class' => 'ApiBar',
  *    'factory' => function( $main, $name ) { ... }
- *  );
- *  $wgAPIModules['xyzzy'] = array(
+ *  ];
+ *  $wgAPIModules['xyzzy'] = [
  *    'class' => 'ApiXyzzy',
- *    'factory' => array( 'XyzzyFactory', 'newApiModule' )
- *  );
+ *    'factory' => [ 'XyzzyFactory', 'newApiModule' ]
+ *  ];
  * @endcode
  *
  * Extension modules may override the core modules.
@@ -7907,12 +7890,12 @@ $wgAjaxEditStash = true;
  *
  * @par Example:
  * @code
- * $wgCrossSiteAJAXdomains = array(
+ * $wgCrossSiteAJAXdomains = [
  *     'www.mediawiki.org',
  *     '*.wikipedia.org',
  *     '*.wikimedia.org',
  *     '*.wiktionary.org',
- * );
+ * ];
  * @endcode
  */
 $wgCrossSiteAJAXdomains = [];
@@ -8072,10 +8055,9 @@ $wgUpdateRowsPerQuery = 100;
 
 /**
  * Name of the external diff engine to use. Supported values:
- * * false: default PHP implementation
- * * 'wikidiff2': Wikimedia's fast difference engine implemented as a PHP/HHVM module
- * * 'wikidiff' and 'wikidiff3' are treated as false for backwards compatibility
- * * any other string is treated as a path to external diff executable
+ * * string: path to an external diff executable
+ * * false: wikidiff2 PHP/HHVM module if installed, otherwise the default PHP implementation
+ * * 'wikidiff', 'wikidiff2', and 'wikidiff3' are treated as false for backwards compatibility
  */
 $wgExternalDiffEngine = false;
 
@@ -8129,13 +8111,13 @@ $wgRedirectOnLogin = null;
  *
  * @par Example:
  * @code
- *   $wgPoolCounterConf = array( 'ArticleView' => array(
+ *   $wgPoolCounterConf = [ 'ArticleView' => [
  *     'class' => 'PoolCounter_Client',
  *     'timeout' => 15, // wait timeout in seconds
  *     'workers' => 5, // maximum number of active threads in each pool
  *     'maxqueue' => 50, // maximum number of total threads in each pool
  *     ... any extension-specific options...
- *   );
+ *   ];
  * @endcode
  */
 $wgPoolCounterConf = null;
@@ -8282,11 +8264,11 @@ $wgPageLanguageUseDB = false;
  *
  * Example config for Parsoid:
  *
- *   $wgVirtualRestConfig['modules']['parsoid'] = array(
+ *   $wgVirtualRestConfig['modules']['parsoid'] = [
  *     'url' => 'http://localhost:8000',
  *     'prefix' => 'enwiki',
  *     'domain' => 'en.wikipedia.org',
- *   );
+ *   ];
  *
  * @var array
  * @since 1.25
@@ -8358,6 +8340,21 @@ $wgEventRelayerConfig = [
        ]
 ];
 
+/**
+ * Share data about this installation with MediaWiki developers
+ *
+ * When set to true, MediaWiki will periodically ping https://www.mediawiki.org/ with basic
+ * data about this MediaWiki instance. This data includes, for example, the type of system,
+ * PHP version, and chosen database backend. The Wikimedia Foundation shares this data with
+ * MediaWiki developers to help guide future development efforts.
+ *
+ * For details about what data is sent, see: https://www.mediawiki.org/wiki/Pingback
+ *
+ * @var bool
+ * @since 1.28
+ */
+$wgPingback = false;
+
 /**
  * For really cool vim folding this needs to be at the end:
  * vim: foldmarker=@{,@} foldmethod=marker
index d2b3443..fe5083e 100644 (file)
@@ -183,6 +183,7 @@ define( 'EDIT_SUPPRESS_RC', 8 );
 define( 'EDIT_FORCE_BOT', 16 );
 define( 'EDIT_DEFER_UPDATES', 32 ); // Unused since 1.27
 define( 'EDIT_AUTOSUMMARY', 64 );
+define( 'EDIT_INTERNAL', 128 );
 /**@}*/
 
 /**@{
index d9330ee..ba24799 100644 (file)
@@ -47,7 +47,11 @@ class DummyLinker {
                );
        }
 
+       /**
+        * @deprecated since 1.28, use LinkRenderer::getLinkClasses() instead
+        */
        public function getLinkColour( $t, $threshold ) {
+               wfDeprecated( __METHOD__, '1.28' );
                return Linker::getLinkColour( $t, $threshold );
        }
 
index f2403fe..674cf28 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use MediaWiki\Logger\LoggerFactory;
+
 /**
  * The edit page/HTML interface (split from Article)
  * The actual database and text munging is still in Article,
@@ -258,9 +260,6 @@ class EditPage {
        /** @var bool */
        public $tooBig = false;
 
-       /** @var bool */
-       public $kblength = false;
-
        /** @var bool */
        public $missingComment = false;
 
@@ -335,6 +334,9 @@ class EditPage {
        /** @var string */
        public $edittime = '';
 
+       /** @var integer */
+       private $editRevId = null;
+
        /** @var string */
        public $section = '';
 
@@ -391,6 +393,9 @@ class EditPage {
        /** @var bool */
        protected $edit;
 
+       /** @var bool|int */
+       protected $contentLength = false;
+
        /**
         * @var bool Set in ApiEditPage, based on ContentHandler::allowsDirectApiEditing
         */
@@ -839,6 +844,7 @@ class EditPage {
                        $this->sectiontitle = preg_replace( '/^\s*=+\s*(.*?)\s*=+\s*$/', '$1', $this->sectiontitle );
 
                        $this->edittime = $request->getVal( 'wpEdittime' );
+                       $this->editRevId = $request->getIntOrNull( 'editRevId' );
                        $this->starttime = $request->getVal( 'wpStarttime' );
 
                        $undidRev = $request->getInt( 'wpUndidRevision' );
@@ -935,6 +941,7 @@ class EditPage {
                        $this->summary = '';
                        $this->sectiontitle = '';
                        $this->edittime = '';
+                       $this->editRevId = null;
                        $this->starttime = wfTimestampNow();
                        $this->edit = false;
                        $this->preview = false;
@@ -1020,6 +1027,7 @@ class EditPage {
        function initialiseForm() {
                global $wgUser;
                $this->edittime = $this->page->getTimestamp();
+               $this->editRevId = $this->page->getLatest();
 
                $content = $this->getContentObject( false ); # TODO: track content object?!
                if ( $content === false ) {
@@ -1243,9 +1251,31 @@ class EditPage {
 
                        return $handler->makeEmptyContent();
                } else {
-                       # nasty side-effect, but needed for consistency
-                       $this->contentModel = $rev->getContentModel();
-                       $this->contentFormat = $rev->getContentFormat();
+                       // Content models should always be the same since we error
+                       // out if they are different before this point.
+                       $logger = LoggerFactory::getInstance( 'editpage' );
+                       if ( $this->contentModel !== $rev->getContentModel() ) {
+                               $logger->warning( "Overriding content model from current edit {prev} to {new}", [
+                                       'prev' => $this->contentModel,
+                                       'new' => $rev->getContentModel(),
+                                       'title' => $this->getTitle()->getPrefixedDBkey(),
+                                       'method' => __METHOD__
+                               ] );
+                               $this->contentModel = $rev->getContentModel();
+                       }
+
+                       // Given that the content models should match, the current selected
+                       // format should be supported.
+                       if ( !$content->isSupportedFormat( $this->contentFormat ) ) {
+                               $logger->warning( "Current revision content format unsupported. Overriding {prev} to {new}", [
+
+                                       'prev' => $this->contentFormat,
+                                       'new' => $rev->getContentFormat(),
+                                       'title' => $this->getTitle()->getPrefixedDBkey(),
+                                       'method' => __METHOD__
+                               ] );
+                               $this->contentFormat = $rev->getContentFormat();
+                       }
 
                        return $content;
                }
@@ -1280,7 +1310,7 @@ class EditPage {
                        return $this->mPreloadContent;
                }
 
-               $handler = ContentHandler::getForTitle( $this->getTitle() );
+               $handler = ContentHandler::getForModelID( $this->contentModel );
 
                if ( $preload === '' ) {
                        return $handler->makeEmptyContent();
@@ -1744,8 +1774,8 @@ class EditPage {
                        return $status;
                }
 
-               $this->kblength = (int)( strlen( $this->textbox1 ) / 1024 );
-               if ( $this->kblength > $wgMaxArticleSize ) {
+               $this->contentLength = strlen( $this->textbox1 );
+               if ( $this->contentLength > $wgMaxArticleSize * 1024 ) {
                        // Error will be displayed by showEditForm()
                        $this->tooBig = true;
                        $status->setResult( false, self::AS_CONTENT_TOO_BIG );
@@ -1862,10 +1892,14 @@ class EditPage {
 
                        $this->page->clear(); # Force reload of dates, etc.
                        $timestamp = $this->page->getTimestamp();
+                       $latest = $this->page->getLatest();
 
                        wfDebug( "timestamp: {$timestamp}, edittime: {$this->edittime}\n" );
 
-                       if ( $timestamp != $this->edittime ) {
+                       // Check editRevId if set, which handles same-second timestamp collisions
+                       if ( $timestamp != $this->edittime
+                               || ( $this->editRevId !== null && $this->editRevId != $latest )
+                       ) {
                                $this->isConflict = true;
                                if ( $this->section == 'new' ) {
                                        if ( $this->page->getUserText() == $wgUser->getName() &&
@@ -1905,14 +1939,24 @@ class EditPage {
                        if ( $this->isConflict ) {
                                wfDebug( __METHOD__
                                        . ": conflict! getting section '{$this->section}' for time '{$this->edittime}'"
-                                       . " (article time '{$timestamp}')\n" );
-
-                               $content = $this->page->replaceSectionContent(
-                                       $this->section,
-                                       $textbox_content,
-                                       $sectionTitle,
-                                       $this->edittime
-                               );
+                                       . " (id '{$this->editRevId}') (article time '{$timestamp}')\n" );
+                               // @TODO: replaceSectionAtRev() with base ID (not prior current) for ?oldid=X case
+                               // ...or disable section editing for non-current revisions (not exposed anyway).
+                               if ( $this->editRevId !== null ) {
+                                       $content = $this->page->replaceSectionAtRev(
+                                               $this->section,
+                                               $textbox_content,
+                                               $sectionTitle,
+                                               $this->editRevId
+                                       );
+                               } else {
+                                       $content = $this->page->replaceSectionContent(
+                                               $this->section,
+                                               $textbox_content,
+                                               $sectionTitle,
+                                               $this->edittime
+                                       );
+                               }
                        } else {
                                wfDebug( __METHOD__ . ": getting section '{$this->section}'\n" );
                                $content = $this->page->replaceSectionContent(
@@ -2018,8 +2062,8 @@ class EditPage {
                }
 
                // Check for length errors again now that the section is merged in
-               $this->kblength = (int)( strlen( $this->toEditText( $content ) ) / 1024 );
-               if ( $this->kblength > $wgMaxArticleSize ) {
+               $this->contentLength = strlen( $this->toEditText( $content ) );
+               if ( $this->contentLength > $wgMaxArticleSize * 1024 ) {
                        $this->tooBig = true;
                        $status->setResult( false, self::AS_MAX_ARTICLE_SIZE_EXCEEDED );
                        return $status;
@@ -2172,8 +2216,9 @@ class EditPage {
        function getBaseRevision() {
                if ( !$this->mBaseRevision ) {
                        $db = wfGetDB( DB_MASTER );
-                       $this->mBaseRevision = Revision::loadFromTimestamp(
-                               $db, $this->mTitle, $this->edittime );
+                       $this->mBaseRevision = $this->editRevId
+                               ? Revision::newFromId( $this->editRevId, Revision::READ_LATEST )
+                               : Revision::loadFromTimestamp( $db, $this->mTitle, $this->edittime );
                }
                return $this->mBaseRevision;
        }
@@ -2242,10 +2287,6 @@ class EditPage {
                        $wgOut->addModules( 'mediawiki.action.edit.editWarning' );
                }
 
-               if ( $wgAjaxEditStash ) {
-                       $wgOut->addModules( 'mediawiki.action.edit.stash' );
-               }
-
                # Enabled article-related sidebar, toplinks, etc.
                $wgOut->setArticleRelated( true );
 
@@ -2273,7 +2314,10 @@ class EditPage {
                $wgOut->setPageTitle( wfMessage( $msg, $displayTitle ) );
                # Transmit the name of the message to JavaScript for live preview
                # Keep Resources.php/mediawiki.action.edit.preview in sync with the possible keys
-               $wgOut->addJsConfigVars( 'wgEditMessage', $msg );
+               $wgOut->addJsConfigVars( [
+                       'wgEditMessage' => $msg,
+                       'wgAjaxEditStash' => $wgAjaxEditStash,
+               ] );
        }
 
        /**
@@ -2690,6 +2734,18 @@ class EditPage {
                        }
                }
 
+               // Set a hidden field so JS knows what edit form mode we are in
+               if ( $this->isConflict ) {
+                       $mode = 'conflict';
+               } elseif ( $this->preview ) {
+                       $mode = 'preview';
+               } elseif ( $this->diff ) {
+                       $mode = 'diff';
+               } else {
+                       $mode = 'text';
+               }
+               $wgOut->addHTML( Html::hidden( 'mode', $mode, [ 'id' => 'mw-edit-mode' ] ) );
+
                // Marker for detecting truncated form data.  This must be the last
                // parameter sent in order to be of use, so do not move me.
                $wgOut->addHTML( Html::hidden( 'wpUltimateParam', true ) );
@@ -2745,7 +2801,7 @@ class EditPage {
 
                if ( $this->isConflict ) {
                        $wgOut->wrapWikiMsg( "<div class='mw-explainconflict'>\n$1\n</div>", 'explainconflict' );
-                       $this->edittime = $this->page->getTimestamp();
+                       $this->editRevId = $this->page->getLatest();
                } else {
                        if ( $this->section != '' && !$this->isSectionEditSupported() ) {
                                // We use $this->section to much before this and getVal('wgSection') directly in other places
@@ -2912,15 +2968,15 @@ class EditPage {
                                        'wrap' => "<div class=\"mw-titleprotectedwarning\">\n$1</div>" ] );
                }
 
-               if ( $this->kblength === false ) {
-                       $this->kblength = (int)( strlen( $this->textbox1 ) / 1024 );
+               if ( $this->contentLength === false ) {
+                       $this->contentLength = strlen( $this->textbox1 );
                }
 
-               if ( $this->tooBig || $this->kblength > $wgMaxArticleSize ) {
+               if ( $this->tooBig || $this->contentLength > $wgMaxArticleSize * 1024 ) {
                        $wgOut->wrapWikiMsg( "<div class='error' id='mw-edit-longpageerror'>\n$1\n</div>",
                                [
                                        'longpageerror',
-                                       $wgLang->formatNum( $this->kblength ),
+                                       $wgLang->formatNum( round( $this->contentLength / 1024, 3 ) ),
                                        $wgLang->formatNum( $wgMaxArticleSize )
                                ]
                        );
@@ -2994,7 +3050,7 @@ class EditPage {
         * @param string $summary The text of the summary to display
         */
        protected function showSummaryInput( $isSubjectPreview, $summary = "" ) {
-               global $wgOut, $wgContLang;
+               global $wgOut;
                # Add a class if 'missingsummary' is triggered to allow styling of the summary line
                $summaryClass = $this->missingSummary ? 'mw-summarymissed' : 'mw-summary';
                if ( $isSubjectPreview ) {
@@ -3006,7 +3062,6 @@ class EditPage {
                                return;
                        }
                }
-               $summary = $wgContLang->recodeForEdit( $summary );
                $labelText = wfMessage( $isSubjectPreview ? 'subject' : 'summary' )->parse();
                list( $label, $input ) = $this->getSummaryInput(
                        $summary,
@@ -3052,6 +3107,7 @@ class EditPage {
 <input type='hidden' value="{$section}" name="wpSection"/>
 <input type='hidden' value="{$this->starttime}" name="wpStarttime" />
 <input type='hidden' value="{$this->edittime}" name="wpEdittime" />
+<input type='hidden' value="{$this->editRevId}" name="editRevId" />
 <input type='hidden' value="{$this->scrolltop}" name="wpScrolltop" id="wpScrolltop" />
 
 HTML
@@ -3260,10 +3316,15 @@ HTML
                }
 
                $textboxContent = $this->toEditContent( $this->textbox1 );
-
-               $newContent = $this->page->replaceSectionContent(
-                                                       $this->section, $textboxContent,
-                                                       $this->summary, $this->edittime );
+               if ( $this->editRevId !== null ) {
+                       $newContent = $this->page->replaceSectionAtRev(
+                               $this->section, $textboxContent, $this->summary, $this->editRevId
+                       );
+               } else {
+                       $newContent = $this->page->replaceSectionContent(
+                               $this->section, $textboxContent, $this->summary, $this->edittime
+                       );
+               }
 
                if ( $newContent ) {
                        ContentHandler::runLegacyHooks( 'EditPageGetDiffText', [ $this, &$newContent ] );
@@ -3475,6 +3536,13 @@ HTML
                if ( Hooks::run( 'EditPageBeforeConflictDiff', [ &$this, &$wgOut ] ) ) {
                        $stats = $wgOut->getContext()->getStats();
                        $stats->increment( 'edit.failures.conflict' );
+                       // Only include 'standard' namespaces to avoid creating unknown numbers of statsd metrics
+                       if (
+                               $this->mTitle->getNamespace() >= NS_MAIN &&
+                               $this->mTitle->getNamespace() <= NS_CATEGORY_TALK
+                       ) {
+                               $stats->increment( 'edit.failures.conflict.byNamespaceId.' . $this->mTitle->getNamespace() );
+                       }
 
                        $wgOut->wrapWikiMsg( '<h2>$1</h2>', "yourdiff" );
 
@@ -3602,8 +3670,8 @@ HTML
         * @return string
         */
        function getPreviewText() {
-               global $wgOut, $wgUser, $wgRawHtml, $wgLang;
-               global $wgAllowUserCss, $wgAllowUserJs, $wgAjaxEditStash;
+               global $wgOut, $wgRawHtml, $wgLang;
+               global $wgAllowUserCss, $wgAllowUserJs;
 
                $stats = $wgOut->getContext()->getStats();
 
@@ -3656,10 +3724,6 @@ HTML
                                $note = wfMessage( 'previewnote' )->plain() . ' ' . $continueEditing;
                        }
 
-                       $parserOptions = $this->page->makeParserOptions( $this->mArticle->getContext() );
-                       $parserOptions->setIsPreview( true );
-                       $parserOptions->setIsSectionPreview( !is_null( $this->section ) && $this->section !== '' );
-
                        # don't parse non-wikitext pages, show message about preview
                        if ( $this->mTitle->isCssJsSubpage() || $this->mTitle->isCssOrJsPage() ) {
                                if ( $this->mTitle->isCssJsSubpage() ) {
@@ -3703,27 +3767,9 @@ HTML
                        ContentHandler::runLegacyHooks( 'EditPageGetPreviewText', $hook_args );
                        Hooks::run( 'EditPageGetPreviewContent', $hook_args );
 
-                       $parserOptions->enableLimitReport();
-
-                       # For CSS/JS pages, we should have called the ShowRawCssJs hook here.
-                       # But it's now deprecated, so never mind
-
-                       $pstContent = $content->preSaveTransform( $this->mTitle, $wgUser, $parserOptions );
-                       $scopedCallback = $parserOptions->setupFakeRevision(
-                               $this->mTitle, $pstContent, $wgUser );
-                       $parserOutput = $pstContent->getParserOutput( $this->mTitle, null, $parserOptions );
-
-                       # Try to stash the edit for the final submission step
-                       # @todo: different date format preferences cause cache misses
-                       if ( $wgAjaxEditStash ) {
-                               ApiStashEdit::stashEditFromPreview(
-                                       $this->getArticle(), $content, $pstContent,
-                                       $parserOutput, $parserOptions, $parserOptions, wfTimestampNow()
-                               );
-                       }
-
-                       $parserOutput->setEditSectionTokens( false ); // no section edit links
-                       $previewHTML = $parserOutput->getText();
+                       $parserResult = $this->doPreviewParse( $content );
+                       $parserOutput = $parserResult['parserOutput'];
+                       $previewHTML = $parserResult['html'];
                        $this->mParserOutput = $parserOutput;
                        $wgOut->addParserOutputMetadata( $parserOutput );
 
@@ -3731,7 +3777,6 @@ HTML
                                $note .= "\n\n" . implode( "\n\n", $parserOutput->getWarnings() );
                        }
 
-                       ScopedCallback::consume( $scopedCallback );
                } catch ( MWContentSerializationException $ex ) {
                        $m = wfMessage(
                                'content-failed-to-parse',
@@ -3762,6 +3807,41 @@ HTML
                return $previewhead . $previewHTML . $this->previewTextAfterContent;
        }
 
+       /**
+        * Get parser options for a preview
+        * @return ParserOptions
+        */
+       protected function getPreviewParserOptions() {
+               $parserOptions = $this->page->makeParserOptions( $this->mArticle->getContext() );
+               $parserOptions->setIsPreview( true );
+               $parserOptions->setIsSectionPreview( !is_null( $this->section ) && $this->section !== '' );
+               $parserOptions->enableLimitReport();
+               return $parserOptions;
+       }
+
+       /**
+        * Parse the page for a preview. Subclasses may override this class, in order
+        * to parse with different options, or to otherwise modify the preview HTML.
+        *
+        * @param Content @content The page content
+        * @return Associative array with keys:
+        *   - parserOutput: The ParserOutput object
+        *   - html: The HTML to be displayed
+        */
+       protected function doPreviewParse( Content $content ) {
+               global $wgUser;
+               $parserOptions = $this->getPreviewParserOptions();
+               $pstContent = $content->preSaveTransform( $this->mTitle, $wgUser, $parserOptions );
+               $scopedCallback = $parserOptions->setupFakeRevision(
+                       $this->mTitle, $pstContent, $wgUser );
+               $parserOutput = $pstContent->getParserOutput( $this->mTitle, null, $parserOptions );
+               ScopedCallback::consume( $scopedCallback );
+               $parserOutput->setEditSectionTokens( false ); // no section edit links
+               return [
+                       'parserOutput' => $parserOutput,
+                       'html' => $parserOutput->getText() ];
+       }
+
        /**
         * @return array
         */
@@ -4117,11 +4197,9 @@ HTML
         * @return string
         */
        protected function safeUnicodeOutput( $text ) {
-               global $wgContLang;
-               $codedText = $wgContLang->recodeForEdit( $text );
                return $this->checkUnicodeCompliantBrowser()
-                       ? $codedText
-                       : $this->makeSafe( $codedText );
+                       ? $text
+                       : $this->makesafe( $text );
        }
 
        /**
index 98f8283..361058b 100644 (file)
@@ -203,7 +203,7 @@ class FileDeleteForm {
                                                $dbw->endAtomic( __METHOD__ );
                                        } else {
                                                // Page deleted but file still there? rollback page delete
-                                               $dbw->rollback( __METHOD__ );
+                                               wfGetLBFactory()->rollbackMasterChanges( __METHOD__ );
                                        }
                                } else {
                                        // Done; nothing changed
index d5c6553..66e2440 100644 (file)
@@ -2499,14 +2499,6 @@ function wfShellExec( $cmd, &$retval = null, $environ = [],
        $eintr = defined( 'SOCKET_EINTR' ) ? SOCKET_EINTR : 4;
        $eintrMessage = "stream_select(): unable to select [$eintr]";
 
-       // Build a table mapping resource IDs to pipe FDs to work around a
-       // PHP 5.3 issue in which stream_select() does not preserve array keys
-       // <https://bugs.php.net/bug.php?id=53427>.
-       $fds = [];
-       foreach ( $pipes as $fd => $pipe ) {
-               $fds[(int)$pipe] = $fd;
-       }
-
        $running = true;
        $timeout = null;
        $numReadyPipes = 0;
@@ -2539,9 +2531,8 @@ function wfShellExec( $cmd, &$retval = null, $environ = [],
                                break;
                        }
                }
-               foreach ( $readyPipes as $pipe ) {
+               foreach ( $readyPipes as $fd => $pipe ) {
                        $block = fread( $pipe, 65536 );
-                       $fd = $fds[(int)$pipe];
                        if ( $block === '' ) {
                                // End of file
                                fclose( $pipes[$fd] );
index e5128d1..7cb75bb 100644 (file)
@@ -935,13 +935,7 @@ class Html {
                        $attribs['version'] = $wgHtml5Version;
                }
 
-               $html = self::openElement( 'html', $attribs );
-
-               if ( $html ) {
-                       $html .= "\n";
-               }
-
-               $ret .= $html;
+               $ret .= self::openElement( 'html', $attribs );
 
                return $ret;
        }
@@ -1020,9 +1014,21 @@ class Html {
        static function srcSet( array $urls ) {
                $candidates = [];
                foreach ( $urls as $density => $url ) {
-                       // Cast density to float to strip 'x'.
-                       $candidates[] = $url . ' ' . (float)$density . 'x';
+                       // Cast density to float to strip 'x', then back to string to serve
+                       // as array index.
+                       $density = (string)(float)$density;
+                       $candidates[$density] = $url;
                }
+
+               // Remove duplicates that are the same as a smaller value
+               ksort( $candidates, SORT_NUMERIC );
+               $candidates = array_unique( $candidates );
+
+               // Append density info to the url
+               foreach ( $candidates as $density => $url ) {
+                       $candidates[$density] = $url . ' ' . $density . 'x';
+               }
+
                return implode( ", ", $candidates );
        }
 }
index b12f49f..54b057a 100644 (file)
@@ -124,47 +124,6 @@ class Http {
                return Http::request( 'POST', $url, $options, $caller );
        }
 
-       /**
-        * Check if the URL can be served by localhost
-        *
-        * @param string $url Full url to check
-        * @return bool
-        */
-       public static function isLocalURL( $url ) {
-               global $wgCommandLineMode, $wgLocalVirtualHosts;
-
-               if ( $wgCommandLineMode ) {
-                       return false;
-               }
-
-               // Extract host part
-               $matches = [];
-               if ( preg_match( '!^http://([\w.-]+)[/:].*$!', $url, $matches ) ) {
-                       $host = $matches[1];
-                       // Split up dotwise
-                       $domainParts = explode( '.', $host );
-                       // Check if this domain or any superdomain is listed as a local virtual host
-                       $domainParts = array_reverse( $domainParts );
-
-                       $domain = '';
-                       $countParts = count( $domainParts );
-                       for ( $i = 0; $i < $countParts; $i++ ) {
-                               $domainPart = $domainParts[$i];
-                               if ( $i == 0 ) {
-                                       $domain = $domainPart;
-                               } else {
-                                       $domain = $domainPart . '.' . $domain;
-                               }
-
-                               if ( in_array( $domain, $wgLocalVirtualHosts ) ) {
-                                       return true;
-                               }
-                       }
-               }
-
-               return false;
-       }
-
        /**
         * A standard user-agent we can use for external requests.
         * @return string
@@ -194,7 +153,7 @@ class Http {
        }
 
        /**
-        * Gets the relevant proxy from $wgHTTPProxy/http_proxy (when set).
+        * Gets the relevant proxy from $wgHTTPProxy
         *
         * @return mixed The proxy address or an empty string if not set.
         */
@@ -205,11 +164,6 @@ class Http {
                        return $wgHTTPProxy;
                }
 
-               $envHttpProxy = getenv( "http_proxy" );
-               if ( $envHttpProxy ) {
-                       return $envHttpProxy;
-               }
-
                return "";
        }
 }
@@ -393,15 +347,56 @@ class MWHttpRequest {
                        return;
                }
 
-               // Otherwise, fallback to $wgHTTPProxy/http_proxy (when set) if this is not a machine
+               // Otherwise, fallback to $wgHTTPProxy if this is not a machine
                // local URL and proxies are not disabled
-               if ( Http::isLocalURL( $this->url ) || $this->noProxy ) {
+               if ( self::isLocalURL( $this->url ) || $this->noProxy ) {
                        $this->proxy = '';
                } else {
                        $this->proxy = Http::getProxy();
                }
        }
 
+       /**
+        * Check if the URL can be served by localhost
+        *
+        * @param string $url Full url to check
+        * @return bool
+        */
+       private static function isLocalURL( $url ) {
+               global $wgCommandLineMode, $wgLocalVirtualHosts;
+
+               if ( $wgCommandLineMode ) {
+                       return false;
+               }
+
+               // Extract host part
+               $matches = [];
+               if ( preg_match( '!^https?://([\w.-]+)[/:].*$!', $url, $matches ) ) {
+                       $host = $matches[1];
+                       // Split up dotwise
+                       $domainParts = explode( '.', $host );
+                       // Check if this domain or any superdomain is listed as a local virtual host
+                       $domainParts = array_reverse( $domainParts );
+
+                       $domain = '';
+                       $countParts = count( $domainParts );
+                       for ( $i = 0; $i < $countParts; $i++ ) {
+                               $domainPart = $domainParts[$i];
+                               if ( $i == 0 ) {
+                                       $domain = $domainPart;
+                               } else {
+                                       $domain = $domainPart . '.' . $domain;
+                               }
+
+                               if ( in_array( $domain, $wgLocalVirtualHosts ) ) {
+                                       return true;
+                               }
+                       }
+               }
+
+               return false;
+       }
+
        /**
         * Set the user agent
         * @param string $UA
index 0b2d3a7..5e540b9 100644 (file)
@@ -137,31 +137,24 @@ class Linker {
        /**
         * Return the CSS colour of a known link
         *
+        * @deprecated since 1.28, use LinkRenderer::getLinkClasses() instead
+        *
         * @since 1.16.3
         * @param LinkTarget $t
         * @param int $threshold User defined threshold
         * @return string CSS class
         */
        public static function getLinkColour( LinkTarget $t, $threshold ) {
-               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
-               // Make sure the target is in the cache
-               $id = $linkCache->addLinkObj( $t );
-               if ( $id == 0 ) {
-                       // Doesn't exist
-                       return '';
-               }
-
-               if ( $linkCache->getGoodLinkFieldObj( $t, 'redirect' ) ) {
-                       # Page is a redirect
-                       return 'mw-redirect';
-               } elseif ( $threshold > 0 && MWNamespace::isContent( $t->getNamespace() )
-                       && $linkCache->getGoodLinkFieldObj( $t, 'length' ) < $threshold
-               ) {
-                       # Page is a stub
-                       return 'stub';
+               wfDeprecated( __METHOD__, '1.28' );
+               $services = MediaWikiServices::getInstance();
+               $linkRenderer = $services->getLinkRenderer();
+               if ( $threshold !== $linkRenderer->getStubThreshold() ) {
+                       // Need to create a new instance with the right stub threshold...
+                       $linkRenderer = $services->getLinkRendererFactory()->create();
+                       $linkRenderer->setStubThreshold( $threshold );
                }
 
-               return '';
+               return $linkRenderer->getLinkClasses( $t );
        }
 
        /**
@@ -177,6 +170,7 @@ class Linker {
         * link() replaces the old functions in the makeLink() family.
         *
         * @since 1.18 Method exists since 1.16 as non-static, made static in 1.18.
+        * @deprecated since 1.28, use MediaWiki\Linker\LinkRenderer instead
         *
         * @param Title $target Can currently only be a Title, but this may
         *   change to support Images, literal URLs, etc.
@@ -252,7 +246,9 @@ class Linker {
 
        /**
         * Identical to link(), except $options defaults to 'known'.
+        *
         * @since 1.16.3
+        * @deprecated since 1.28, use MediaWiki\Linker\LinkRenderer instead
         * @see Linker::link
         * @return string
         */
index 4733dfb..2c87b8b 100644 (file)
@@ -41,6 +41,7 @@ class ListToggle {
 
        private function checkboxLink( $checkboxType ) {
                return Html::element(
+                       // CSS classes: mw-checkbox-all, mw-checkbox-none, mw-checkbox-invert
                        'a', [ 'href' => '#', 'class' => 'mw-checkbox-' . $checkboxType ],
                        $this->output->msg( 'checkbox-' . $checkboxType )->text()
                );
index ee03f02..21857b9 100644 (file)
@@ -764,9 +764,13 @@ class MediaWiki {
                // Assure deferred updates are not in the main transaction
                wfGetLBFactory()->commitMasterChanges( __METHOD__ );
 
-               // Ignore things like master queries/connections on GET requests
-               // as long as they are in deferred updates (which catch errors).
-               Profiler::instance()->getTransactionProfiler()->resetExpectations();
+               // Loosen DB query expectations since the HTTP client is unblocked
+               $trxProfiler = Profiler::instance()->getTransactionProfiler();
+               $trxProfiler->resetExpectations();
+               $trxProfiler->setExpectations(
+                       $this->config->get( 'TrxProfilerLimits' )['PostSend'],
+                       __METHOD__
+               );
 
                // Do any deferred jobs
                DeferredUpdates::doUpdates( 'enqueue' );
index 6613db1..ff292cf 100644 (file)
@@ -23,6 +23,7 @@ use SearchEngineFactory;
 use SiteLookup;
 use SiteStore;
 use WatchedItemStore;
+use WatchedItemQueryService;
 use SkinFactory;
 use TitleFormatter;
 use TitleParser;
@@ -502,6 +503,14 @@ class MediaWikiServices extends ServiceContainer {
                return $this->getService( 'WatchedItemStore' );
        }
 
+       /**
+        * @since 1.28
+        * @return WatchedItemQueryService
+        */
+       public function getWatchedItemQueryService() {
+               return $this->getService( 'WatchedItemQueryService' );
+       }
+
        /**
         * @since 1.28
         * @return GenderCache
index 712d3f1..2c979de 100644 (file)
@@ -402,8 +402,8 @@ class Message implements MessageSpecifier, Serializable {
                        $value = array_shift( $params );
                }
 
-               if ( $value instanceof RawMessage ) {
-                       $message = new RawMessage( $value->getKey(), $value->getParams() );
+               if ( $value instanceof Message ) { // Message, RawMessage, ApiMessage, etc
+                       $message = clone( $value );
                } elseif ( $value instanceof MessageSpecifier ) {
                        $message = new Message( $value );
                } elseif ( is_string( $value ) ) {
@@ -802,10 +802,13 @@ class Message implements MessageSpecifier, Serializable {
                $string = $this->fetchMessage();
 
                if ( $string === false ) {
-                       if ( $this->format === 'plain' || $this->format === 'text' ) {
-                               return '<' . $this->key . '>';
-                       }
-                       return '&lt;' . htmlspecialchars( $this->key ) . '&gt;';
+                       // Err on the side of safety, ensure that the output
+                       // is always html safe in the event the message key is
+                       // missing, since in that case its highly likely the
+                       // message key is user-controlled.
+                       // '⧼' is used instead of '<' to side-step any
+                       // double-escaping issues.
+                       return '⧼' . htmlspecialchars( $this->key ) . '⧽';
                }
 
                # Replace $* with a list of parameters for &uselang=qqx.
index 708dea1..70b6738 100644 (file)
@@ -392,11 +392,16 @@ class MovePage {
                        $reason,
                        $nullRevision
                ];
-               $dbw->onTransactionIdle( function () use ( $params, $dbw ) {
-                       // Keep each single hook handler atomic
-                       $dbw->setFlag( DBO_TRX ); // flag is automatically reset by DB layer
-                       Hooks::run( 'TitleMoveComplete', $params );
-               } );
+               // Keep each single hook handler atomic
+               DeferredUpdates::addUpdate(
+                       new AtomicSectionUpdate(
+                               $dbw,
+                               __METHOD__,
+                               function () use ( $params ) {
+                                       Hooks::run( 'TitleMoveComplete', $params );
+                               }
+                       )
+               );
 
                return Status::newGood();
        }
index ad7c976..d34ace8 100644 (file)
@@ -23,6 +23,7 @@
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\Session\SessionManager;
 use WrappedString\WrappedString;
+use WrappedString\WrappedStringList;
 
 /**
  * This class should be covered by a general architecture document which does
@@ -104,22 +105,11 @@ class OutputPage extends ContextSource {
        protected $mStatusCode;
 
        /**
-        * @var string Variable mLastModified and mEtag are used for sending cache control.
+        * @var string Used for sending cache control.
         *   The whole caching system should probably be moved into its own class.
         */
        protected $mLastModified = '';
 
-       /**
-        * Contains an HTTP Entity Tags (see RFC 2616 section 3.13) which is used
-        * as a unique identifier for the content. It is later used by the client
-        * to compare its cached version with the server version. Client sends
-        * headers If-Match and If-None-Match containing its locally cached ETAG value.
-        *
-        * To get more information, you will have to look at HTTP/1.1 protocol which
-        * is properly described in RFC 2616 : http://tools.ietf.org/html/rfc2616
-        */
-       private $mETag = false;
-
        /** @var array */
        protected $mCategoryLinks = [];
 
@@ -261,11 +251,6 @@ class OutputPage extends ContextSource {
         */
        protected $styles = [];
 
-       /**
-        * Whether jQuery is already handled.
-        */
-       protected $mJQueryDone = false;
-
        private $mIndexPolicy = 'index';
        private $mFollowPolicy = 'follow';
        private $mVaryHeader = [
@@ -305,6 +290,9 @@ class OutputPage extends ContextSource {
         */
        private $copyrightUrl;
 
+       /** @var array Profiling data */
+       private $limitReportData = [];
+
        /**
         * Constructor for OutputPage. This should not be called directly.
         * Instead a new RequestContext should be created and it will implicitly create
@@ -619,29 +607,6 @@ class OutputPage extends ContextSource {
                $this->mModuleStyles = array_merge( $this->mModuleStyles, (array)$modules );
        }
 
-       /**
-        * Get the list of module messages to include on this page
-        *
-        * @deprecated since 1.26 Obsolete
-        * @param bool $filter
-        * @param string|null $position
-        * @return array Array of module names
-        */
-       public function getModuleMessages( $filter = false, $position = null ) {
-               wfDeprecated( __METHOD__, '1.26' );
-               return [];
-       }
-
-       /**
-        * Load messages of one or more ResourceLoader modules.
-        *
-        * @deprecated since 1.26 Use addModules() instead
-        * @param string|array $modules Module name (string) or array of module names
-        */
-       public function addModuleMessages( $modules ) {
-               wfDeprecated( __METHOD__, '1.26' );
-       }
-
        /**
         * @return null|string ResourceLoader target
         */
@@ -694,12 +659,10 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Set the value of the ETag HTTP header, only used if $wgUseETag is true
-        *
-        * @param string $tag Value of "ETag" header
+        * @deprecated since 1.28 Obsolete - wgUseETag experiment was removed.
+        * @param string $tag
         */
-       function setETag( $tag ) {
-               $this->mETag = $tag;
+       public function setETag( $tag ) {
        }
 
        /**
@@ -1794,11 +1757,14 @@ class OutputPage extends ContextSource {
                        }
                }
 
-               // enable OOUI if requested via ParserOutput
+               // Enable OOUI if requested via ParserOutput
                if ( $parserOutput->getEnableOOUI() ) {
                        $this->enableOOUI();
                }
 
+               // Include profiling data
+               $this->limitReportData = $parserOutput->getLimitReportData();
+
                // Link flags are ignored for now, but may in the future be
                // used to mark individual language links.
                $linkFlags = [];
@@ -2156,9 +2122,6 @@ class OutputPage extends ContextSource {
        public function sendCacheControl() {
                $response = $this->getRequest()->response();
                $config = $this->getConfig();
-               if ( $config->get( 'UseETag' ) && $this->mETag ) {
-                       $response->header( "ETag: $this->mETag" );
-               }
 
                $this->addVaryHeader( 'Cookie' );
                $this->addAcceptLanguage();
@@ -2649,7 +2612,8 @@ class OutputPage extends ContextSource {
                $userdir = $this->getLanguage()->getDir();
                $sitedir = $wgContLang->getDir();
 
-               $ret = Html::htmlHeader( $sk->getHtmlElementAttributes() );
+               $pieces = [];
+               $pieces[] = Html::htmlHeader( $sk->getHtmlElementAttributes() );
 
                if ( $this->getHTMLTitle() == '' ) {
                        $this->setHTMLTitle( $this->msg( 'pagetitle', $this->getPageTitle() )->inContentLanguage() );
@@ -2657,8 +2621,7 @@ class OutputPage extends ContextSource {
 
                $openHead = Html::openElement( 'head' );
                if ( $openHead ) {
-                       # Don't bother with the newline if $head == ''
-                       $ret .= "$openHead\n";
+                       $pieces[] = $openHead;
                }
 
                if ( !Html::isXmlMimeType( $this->getConfig()->get( 'MimeType' ) ) ) {
@@ -2670,25 +2633,25 @@ class OutputPage extends ContextSource {
                        // Our XML declaration is output by Html::htmlHeader.
                        // http://www.whatwg.org/html/semantics.html#attr-meta-http-equiv-content-type
                        // http://www.whatwg.org/html/semantics.html#charset
-                       $ret .= Html::element( 'meta', [ 'charset' => 'UTF-8' ] ) . "\n";
+                       $pieces[] = Html::element( 'meta', [ 'charset' => 'UTF-8' ] );
                }
 
-               $ret .= Html::element( 'title', null, $this->getHTMLTitle() ) . "\n";
-               $ret .= $this->getInlineHeadScripts() . "\n";
-               $ret .= $this->buildCssLinks() . "\n";
-               $ret .= $this->getExternalHeadScripts() . "\n";
+               $pieces[] = Html::element( 'title', null, $this->getHTMLTitle() );
+               $pieces[] = $this->getInlineHeadScripts();
+               $pieces[] = $this->buildCssLinks();
+               $pieces[] = $this->getExternalHeadScripts();
 
                foreach ( $this->getHeadLinksArray() as $item ) {
-                       $ret .= $item . "\n";
+                       $pieces[] = $item;
                }
 
                foreach ( $this->mHeadItems as $item ) {
-                       $ret .= $item . "\n";
+                       $pieces[] = $item;
                }
 
                $closeHead = Html::closeElement( 'head' );
                if ( $closeHead ) {
-                       $ret .= "$closeHead\n";
+                       $pieces[] = $closeHead;
                }
 
                $bodyClasses = [];
@@ -2703,6 +2666,11 @@ class OutputPage extends ContextSource {
                        $bodyClasses[] = 'capitalize-all-nouns';
                }
 
+               // Parser feature migration class
+               // The idea is that this will eventually be removed, after the wikitext
+               // which requires it is cleaned up.
+               $bodyClasses[] = 'mw-hide-empty-elt';
+
                $bodyClasses[] = $sk->getPageClasses( $this->getTitle() );
                $bodyClasses[] = 'skin-' . Sanitizer::escapeClass( $sk->getSkinName() );
                $bodyClasses[] =
@@ -2717,9 +2685,9 @@ class OutputPage extends ContextSource {
                $sk->addToBodyAttributes( $this, $bodyAttrs );
                Hooks::run( 'OutputPageBodyAttributes', [ $this, $sk, &$bodyAttrs ] );
 
-               $ret .= Html::openElement( 'body', $bodyAttrs ) . "\n";
+               $pieces[] = Html::openElement( 'body', $bodyAttrs );
 
-               return $ret;
+               return WrappedStringList::join( "\n", $pieces );
        }
 
        /**
@@ -2800,6 +2768,17 @@ class OutputPage extends ContextSource {
                                continue;
                        }
 
+                       if ( $only === ResourceLoaderModule::TYPE_STYLES ) {
+                               if ( $module->getType() !== ResourceLoaderModule::LOAD_STYLES ) {
+                                       $logger = $resourceLoader->getLogger();
+                                       $logger->debug( 'Unexpected general module "{module}" in styles queue.', [
+                                               'module' => $name,
+                                       ] );
+                               } else {
+                                       $links['states'][$name] = 'ready';
+                               }
+                       }
+
                        $sortedModules[$module->getSource()][$module->getGroup()][$name] = $module;
                }
 
@@ -2920,7 +2899,7 @@ class OutputPage extends ContextSource {
        /**
         * Build html output from an array of links from makeResourceLoaderLink.
         * @param array $links
-        * @return string HTML
+        * @return string|WrappedStringList HTML
         */
        protected static function getHtmlFromLoaderLinks( array $links ) {
                $html = [];
@@ -2936,7 +2915,7 @@ class OutputPage extends ContextSource {
                // Filter out empty values
                $html = array_filter( $html, 'strlen' );
 
-               if ( count( $states ) ) {
+               if ( $states ) {
                        array_unshift( $html, ResourceLoader::makeInlineScript(
                                ResourceLoader::makeLoaderStateScript( $states )
                        ) );
@@ -2956,25 +2935,23 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * <script src="..."> tags for "<head>". This is the startup module
+        * <script src="..."> tags for "<head>".This is the startup module
         * and other modules marked with position 'top'.
         *
-        * @return string HTML fragment
+        * @return string|WrappedStringList HTML
         */
        function getExternalHeadScripts() {
-               $links = [];
-
                // Startup - this provides the client with the module
                // manifest and loads jquery and mediawiki base modules
+               $links = [];
                $links[] = $this->makeResourceLoaderLink( 'startup', ResourceLoaderModule::TYPE_SCRIPTS );
-
                return self::getHtmlFromLoaderLinks( $links );
        }
 
        /**
-        * <script>...</script> tags to put in "<head>".
+        * Inline "<script>" tags to put in "<head>".
         *
-        * @return string HTML fragment
+        * @return string|WrappedStringList HTML
         */
        function getInlineHeadScripts() {
                $links = [];
@@ -3034,7 +3011,7 @@ class OutputPage extends ContextSource {
         *
         * @param bool $unused Previously used to let this method change its output based
         *  on whether it was called by getExternalHeadScripts() or getBottomScripts().
-        * @return string
+        * @return string|WrappedStringList HTML
         */
        function getScriptsForBottomQueue( $unused = null ) {
                // Scripts "only" requests marked for bottom inclusion
@@ -3104,7 +3081,13 @@ class OutputPage extends ContextSource {
         * @return string
         */
        function getBottomScripts() {
-               return $this->getScriptsForBottomQueue();
+               return $this->getScriptsForBottomQueue() .
+                       ResourceLoader::makeInlineScript(
+                               ResourceLoader::makeConfigSetScript(
+                                       [ 'wgPageParseReport' => $this->limitReportData ],
+                                       true
+                               )
+                       );
        }
 
        /**
@@ -3633,10 +3616,9 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Build a set of "<link>" elements for the stylesheets specified in the $this->styles array.
-        * These will be applied to various media & IE conditionals.
+        * Build a set of "<link>" elements for stylesheets specified in the $this->styles array.
         *
-        * @return string
+        * @return string|WrappedStringList HTML
         */
        public function buildCssLinks() {
                global $wgContLang;
@@ -3659,7 +3641,7 @@ class OutputPage extends ContextSource {
                $moduleStyles = $this->getModuleStyles();
 
                // Per-site custom styles
-               $moduleStyles[] = 'site';
+               $moduleStyles[] = 'site.styles';
                $moduleStyles[] = 'noscript';
 
                // Per-user custom styles
@@ -3694,7 +3676,7 @@ class OutputPage extends ContextSource {
                        if ( !$module ) {
                                continue;
                        }
-                       if ( $name === 'site' ) {
+                       if ( $name === 'site.styles' ) {
                                // HACK: The site module shouldn't be fragmented with a cache group and
                                // http request. But in order to ensure its styles are separated and after the
                                // ResourceLoaderDynamicStyles marker, pretend it is in a group called 'site'.
@@ -3738,7 +3720,9 @@ class OutputPage extends ContextSource {
                }
 
                // Add stuff in $otherTags (previewed user CSS if applicable)
-               return self::getHtmlFromLoaderLinks( $links ) . implode( '', $otherTags );
+               $links[] = implode( '', $otherTags );
+
+               return self::getHtmlFromLoaderLinks( $links );
        }
 
        /**
index ab8aada..018c6f8 100644 (file)
@@ -45,6 +45,29 @@ function wfEntryPointCheck( $entryPoint ) {
                // @codingStandardsIgnoreEnd
                wfMissingVendorError( $entryPoint, $mwVersion );
        }
+
+       // List of functions and their associated PHP extension to check for
+       // @codingStandardsIgnoreStart Generic.Arrays.DisallowLongArraySyntax
+       $extensions = array(
+               'mb_substr'   => 'mbstring',
+               'utf8_encode' => 'xml',
+               'ctype_digit' => 'ctype',
+               'json_decode' => 'json',
+               'iconv'       => 'iconv',
+       );
+       // List of extensions we're missing
+       $missingExtensions = array();
+       // @codingStandardsIgnoreEnd
+
+       foreach ( $extensions as $function => $extension ) {
+               if ( !function_exists( $function ) ) {
+                       $missingExtensions[] = $extension;
+               }
+       }
+
+       if ( $missingExtensions ) {
+               wfMissingExtensions( $entryPoint, $mwVersion, $missingExtensions );
+       }
 }
 
 /**
@@ -107,7 +130,7 @@ function wfGenericError( $type, $mwVersion, $title, $shortText, $longText, $long
                                padding: 2em;
                                text-align: center;
                        }
-                       p, img, h1, h2 {
+                       p, img, h1, h2, ul  {
                                text-align: left;
                                margin: 0.5em 0 1em;
                        }
@@ -201,3 +224,38 @@ HTML;
 
        wfGenericError( $type, $mwVersion, 'External dependencies', $shortText, $longText, $longHtml );
 }
+
+/**
+ * Display an error for a PHP extension not existing.
+ *
+ * @param string $type See wfGenericError
+ * @param string $mwVersion See wfGenericError
+ * @param array $missingExts The extensions we're missing
+ */
+function wfMissingExtensions( $type, $mwVersion, $missingExts ) {
+       $shortText = "Installing some PHP extensions is required.";
+
+       $missingExtText = '';
+       $missingExtHtml = '';
+       $baseUrl = 'https://secure.php.net';
+       foreach ( $missingExts as $ext ) {
+               $missingExtText .= " * $ext <$baseUrl/$ext>\n";
+               $missingExtHtml .= "<li><b>$ext</b> "
+                       . "(<a href=\"$baseUrl/$ext\">more information</a>)</li>";
+       }
+
+       $cliText = "Error: Missing one or more required components of PHP.\n"
+               . "You are missing a required extension to PHP that MediaWiki needs.\n"
+               . "Please install:\n" . $missingExtText;
+
+       $longHtml = <<<HTML
+               You are missing a required extension to PHP that MediaWiki
+               requires to run. Please install:
+               <ul>
+               $missingExtHtml
+               </ul>
+HTML;
+
+       wfGenericError( $type, $mwVersion, 'Required components', $shortText,
+               $cliText, $longHtml );
+}
diff --git a/includes/PHPVersionError.php b/includes/PHPVersionError.php
deleted file mode 100644 (file)
index 9fbcf89..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * Backwards compatibility. The PHP version error function is now
- * included in PHPVersionCheck.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
- *
- * @deprecated 1.25
- * @file
- */
-// @codingStandardsIgnoreStart MediaWiki.Usage.DirUsage.FunctionFound
-require_once dirname( __FILE__ ) . '/PHPVersionCheck.php';
-// @codingStandardsIgnoreEnd
diff --git a/includes/Pingback.php b/includes/Pingback.php
new file mode 100644 (file)
index 0000000..10d2904
--- /dev/null
@@ -0,0 +1,258 @@
+<?php
+/**
+ * Send information about this MediaWiki instance to MediaWiki.org.
+ *
+ * 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 Psr\Log\LoggerInterface;
+use MediaWiki\Logger\LoggerFactory;
+
+/**
+ * Send information about this MediaWiki instance to MediaWiki.org.
+ *
+ * @since 1.28
+ */
+class Pingback {
+
+       /**
+        * @var int Revision ID of the JSON schema that describes the pingback
+        *   payload. The schema lives on MetaWiki, at
+        *   <https://meta.wikimedia.org/wiki/Schema:MediaWikiPingback>.
+        */
+       const SCHEMA_REV = 15781718;
+
+       /** @var LoggerInterface */
+       protected $logger;
+
+       /** @var Config */
+       protected $config;
+
+       /** @var string updatelog key (also used as cache/db lock key) */
+       protected $key;
+
+       /** @var string Randomly-generated identifier for this wiki */
+       protected $id;
+
+       /**
+        * @param Config $config
+        * @param LoggerInterface $logger
+        */
+       public function __construct( Config $config = null, LoggerInterface $logger = null ) {
+               $this->config = $config ?: RequestContext::getMain()->getConfig();
+               $this->logger = $logger ?: LoggerFactory::getInstance( __CLASS__ );
+               $this->key = 'Pingback-' . $this->config->get( 'Version' );
+       }
+
+       /**
+        * Should a pingback be sent?
+        * @return bool
+        */
+       private function shouldSend() {
+               return $this->config->get( 'Pingback' ) && !$this->checkIfSent();
+       }
+
+       /**
+        * Has a pingback already been sent for this MediaWiki version?
+        * @return bool
+        */
+       private function checkIfSent() {
+               $dbr = wfGetDB( DB_SLAVE );
+               $sent = $dbr->selectField(
+                       'updatelog', '1', [ 'ul_key' => $this->key ], __METHOD__ );
+               return $sent !== false;
+       }
+
+       /**
+        * Record the fact that we have sent a pingback for this MediaWiki version,
+        * to ensure we don't submit data multiple times.
+        */
+       private function markSent() {
+               $dbw = wfGetDB( DB_MASTER );
+               return $dbw->insert(
+                       'updatelog', [ 'ul_key' => $this->key ], __METHOD__, 'IGNORE' );
+       }
+
+       /**
+        * Acquire lock for sending a pingback
+        *
+        * This ensures only one thread can attempt to send a pingback at any given
+        * time and that we wait an hour before retrying failed attempts.
+        *
+        * @return bool Whether lock was acquired
+        */
+       private function acquireLock() {
+               $cache = ObjectCache::getLocalClusterInstance();
+               if ( !$cache->add( $this->key, 1, 60 * 60 ) ) {
+                       return false;  // throttled
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+               if ( !$dbw->lock( $this->key, __METHOD__, 0 ) ) {
+                       return false;  // already in progress
+               }
+
+               return true;
+       }
+
+       /**
+        * Collect basic data about this MediaWiki installation and return it
+        * as an associative array conforming to the Pingback schema on MetaWiki
+        * (<https://meta.wikimedia.org/wiki/Schema:MediaWikiPingback>).
+        *
+        * This is public so we can display it in the installer
+        *
+        * @return array
+        */
+       public function getSystemInfo() {
+               $event = [
+                       'database'   => $this->config->get( 'DBtype' ),
+                       'MediaWiki'  => $this->config->get( 'Version' ),
+                       'PHP'        => PHP_VERSION,
+                       'OS'         => PHP_OS . ' ' . php_uname( 'r' ),
+                       'arch'       => PHP_INT_SIZE === 8 ? 64 : 32,
+                       'machine'    => php_uname( 'm' ),
+               ];
+
+               if ( isset( $_SERVER['SERVER_SOFTWARE'] ) ) {
+                       $event['serverSoftware'] = $_SERVER['SERVER_SOFTWARE'];
+               }
+
+               $limit = ini_get( 'memory_limit' );
+               if ( $limit && $limit != -1 ) {
+                       $event['memoryLimit'] = $limit;
+               }
+
+               return $event;
+       }
+
+       /**
+        * Get the EventLogging packet to be sent to the server
+        *
+        * @return array
+        */
+       private function getData() {
+               return [
+                       'schema'           => 'MediaWikiPingback',
+                       'revision'         => self::SCHEMA_REV,
+                       'wiki'             => $this->getOrCreatePingbackId(),
+                       'event'            => $this->getSystemInfo(),
+               ];
+       }
+
+       /**
+        * Get a unique, stable identifier for this wiki
+        *
+        * If the identifier does not already exist, create it and save it in the
+        * database. The identifier is randomly-generated.
+        *
+        * @return string 32-character hex string
+        */
+       private function getOrCreatePingbackId() {
+               if ( !$this->id ) {
+                       $id = wfGetDB( DB_SLAVE )->selectField(
+                               'updatelog', 'ul_value', [ 'ul_key' => 'PingBack' ] );
+
+                       if ( $id == false ) {
+                               $id = MWCryptRand::generateHex( 32 );
+                               $dbw = wfGetDB( DB_MASTER );
+                               $dbw->insert(
+                                       'updatelog',
+                                       [ 'ul_key' => 'PingBack', 'ul_value' => $id ],
+                                       __METHOD__,
+                                       'IGNORE'
+                               );
+
+                               if ( !$dbw->affectedRows() ) {
+                                       $id = $dbw->selectField(
+                                               'updatelog', 'ul_value', [ 'ul_key' => 'PingBack' ] );
+                               }
+                       }
+
+                       $this->id = $id;
+               }
+
+               return $this->id;
+       }
+
+       /**
+        * Serialize pingback data and send it to MediaWiki.org via a POST
+        * to its event beacon endpoint.
+        *
+        * The data encoding conforms to the expectations of EventLogging,
+        * a software suite used by the Wikimedia Foundation for logging and
+        * processing analytic data.
+        *
+        * Compare:
+        * <https://github.com/wikimedia/mediawiki-extensions-EventLogging/
+        *   blob/7e5fe4f1ef/includes/EventLogging.php#L32-L74>
+        *
+        * @param data Pingback data as an associative array
+        * @return bool true on success, false on failure
+        */
+       private function postPingback( array $data ) {
+               $json = FormatJson::encode( $data );
+               $queryString = rawurlencode( str_replace( ' ', '\u0020', $json ) ) . ';';
+               $url = 'https://www.mediawiki.org/beacon/event?' . $queryString;
+               return Http::post( $url ) !== false;
+       }
+
+       /**
+        * Send information about this MediaWiki instance to MediaWiki.org.
+        *
+        * The data is structured and serialized to match the expectations of
+        * EventLogging, a software suite used by the Wikimedia Foundation for
+        * logging and processing analytic data.
+        *
+        * Compare:
+        * <https://github.com/wikimedia/mediawiki-extensions-EventLogging/
+        *   blob/7e5fe4f1ef/includes/EventLogging.php#L32-L74>
+        *
+        * The schema for the data is located at:
+        * <https://meta.wikimedia.org/wiki/Schema:MediaWikiPingback>
+        */
+       public function sendPingback() {
+               if ( !$this->acquireLock() ) {
+                       $this->logger->debug( __METHOD__ . ": couldn't acquire lock" );
+                       return false;
+               }
+
+               $data = $this->getData();
+               if ( !$this->postPingback( $data ) ) {
+                       $this->logger->warning( __METHOD__ . ": failed to send pingback; check 'http' log" );
+                       return false;
+               }
+
+               $this->markSent();
+               $this->logger->debug( __METHOD__ . ": pingback sent OK ({$this->key})" );
+               return true;
+       }
+
+       /**
+        * Schedule a deferred callable that will check if a pingback should be
+        * sent and (if so) proceed to send it.
+        */
+       public static function schedulePingback() {
+               DeferredUpdates::addCallableUpdate( function () {
+                       $instance = new Pingback;
+                       if ( $instance->shouldSend() ) {
+                               $instance->sendPingback();
+                       }
+               } );
+       }
+}
index 0e45b25..eda8989 100644 (file)
@@ -720,11 +720,28 @@ class Revision implements IDBAccessObject {
        /**
         * Set the revision ID
         *
+        * This should only be used for proposed revisions that turn out to be null edits
+        *
         * @since 1.19
         * @param int $id
         */
        public function setId( $id ) {
-               $this->mId = $id;
+               $this->mId = (int)$id;
+       }
+
+       /**
+        * Set the user ID/name
+        *
+        * This should only be used for proposed revisions that turn out to be null edits
+        *
+        * @since 1.28
+        * @param integer $id User ID
+        * @param string $name User name
+        */
+       public function setUserIdAndName( $id, $name ) {
+               $this->mUser = (int)$id;
+               $this->mUserText = $name;
+               $this->mOrigUserText = $name;
        }
 
        /**
index 731d1b3..811870c 100644 (file)
@@ -23,7 +23,7 @@
 /**
  * List for revision table items for a single page
  */
-abstract class RevisionListBase extends ContextSource {
+abstract class RevisionListBase extends ContextSource implements Iterator {
        /** @var Title */
        public $title;
 
@@ -89,6 +89,10 @@ abstract class RevisionListBase extends ContextSource {
                return $this->current;
        }
 
+       public function rewind() {
+               $this->reset();
+       }
+
        /**
         * Get the current list item, or false if we are at the end
         * @return Revision
@@ -107,6 +111,14 @@ abstract class RevisionListBase extends ContextSource {
                return $this->current;
        }
 
+       public function key() {
+               return $this->res ? $this->res->key(): 0;
+       }
+
+       public function valid() {
+               return $this->res ? $this->res->valid() : false;
+       }
+
        /**
         * Get the number of items in the list.
         * @return int
index d321e9f..8f1fc99 100644 (file)
@@ -381,14 +381,17 @@ class Sanitizer {
                                'kbd', 'samp', 'data', 'time', 'mark'
                        ];
                        $htmlsingle = [
-                               'br', 'wbr', 'hr', 'li', 'dt', 'dd'
-                       ];
-                       $htmlsingleonly = [ # Elements that cannot have close tags
-                               'br', 'wbr', 'hr'
+                               'br', 'wbr', 'hr', 'li', 'dt', 'dd', 'meta', 'link'
                        ];
 
-                       $htmlsingle[] = $htmlsingleonly[] = 'meta';
-                       $htmlsingle[] = $htmlsingleonly[] = 'link';
+                       # Elements that cannot have close tags. This is (not coincidentally)
+                       # also the list of tags for which the HTML 5 parsing algorithm
+                       # requires you to "acknowledge the token's self-closing flag", i.e.
+                       # a self-closing tag like <br/> is not an HTML 5 parse error only
+                       # for this list.
+                       $htmlsingleonly = [
+                               'br', 'wbr', 'hr', 'meta', 'link'
+                       ];
 
                        $htmlnest = [ # Tags that can be nested--??
                                'table', 'tr', 'td', 'th', 'div', 'blockquote', 'ol', 'ul',
@@ -450,10 +453,14 @@ class Sanitizer {
         * @param array|bool $args Arguments for the processing callback
         * @param array $extratags For any extra tags to include
         * @param array $removetags For any tags (default or extra) to exclude
+        * @param callable $warnCallback (Deprecated) Callback allowing the
+        *   addition of a tracking category when bad input is encountered.
+        *   DO NOT ADD NEW PARAMETERS AFTER $warnCallback, since it will be
+        *   removed shortly.
         * @return string
         */
        public static function removeHTMLtags( $text, $processCallback = null,
-               $args = [], $extratags = [], $removetags = []
+               $args = [], $extratags = [], $removetags = [], $warnCallback = null
        ) {
                extract( self::getRecognizedTagData( $extratags, $removetags ) );
 
@@ -540,6 +547,14 @@ class Sanitizer {
                                                        $badtag = true;
                                                #  Is it a self closed htmlpair ? (bug 5487)
                                                } elseif ( $brace == '/>' && isset( $htmlpairs[$t] ) ) {
+                                                       // Eventually we'll just remove the self-closing
+                                                       // slash, in order to be consistent with HTML5
+                                                       // semantics.
+                                                       // $brace = '>';
+                                                       // For now, let's just warn authors to clean up.
+                                                       if ( is_callable( $warnCallback ) ) {
+                                                               call_user_func_array( $warnCallback, [ 'deprecated-self-close-category' ] );
+                                                       }
                                                        $badtag = true;
                                                } elseif ( isset( $htmlsingleonly[$t] ) ) {
                                                        # Hack to force empty tag for unclosable elements
@@ -604,12 +619,29 @@ class Sanitizer {
                                                        call_user_func_array( $processCallback, [ &$params, $args ] );
                                                }
 
+                                               if ( $brace == '/>' && !( isset( $htmlsingle[$t] ) || isset( $htmlsingleonly[$t] ) ) ) {
+                                                       // Eventually we'll just remove the self-closing
+                                                       // slash, in order to be consistent with HTML5
+                                                       // semantics.
+                                                       // $brace = '>';
+                                                       // For now, let's just warn authors to clean up.
+                                                       if ( is_callable( $warnCallback ) ) {
+                                                               call_user_func_array( $warnCallback, [ 'deprecated-self-close-category' ] );
+                                                       }
+                                               }
                                                if ( !Sanitizer::validateTag( $params, $t ) ) {
                                                        $badtag = true;
                                                }
 
                                                $newparams = Sanitizer::fixTagAttributes( $params, $t );
                                                if ( !$badtag ) {
+                                                       if ( $brace === '/>' && !isset( $htmlsingleonly[$t] ) ) {
+                                                               # Interpret self-closing tags as empty tags even when
+                                                               # HTML 5 would interpret them as start tags. Such input
+                                                               # is commonly seen on Wikimedia wikis with this intention.
+                                                               $brace = "></$t>";
+                                                       }
+
                                                        $rest = str_replace( '>', '&gt;', $rest );
                                                        $text .= "<$slash$t$newparams$brace$rest";
                                                        continue;
@@ -1028,12 +1060,14 @@ class Sanitizer {
         * - Double attributes are discarded
         * - Unsafe style attributes are discarded
         * - Prepends space if there are attributes.
+        * - (Optionally) Sorts attributes by name.
         *
         * @param string $text
         * @param string $element
+        * @param bool $sorted Whether to sort the attributes (default: false)
         * @return string
         */
-       static function fixTagAttributes( $text, $element ) {
+       static function fixTagAttributes( $text, $element, $sorted = false ) {
                if ( trim( $text ) == '' ) {
                        return '';
                }
@@ -1041,6 +1075,10 @@ class Sanitizer {
                $decoded = Sanitizer::decodeTagAttributes( $text );
                $stripped = Sanitizer::validateTagAttributes( $decoded, $element );
 
+               if ( $sorted ) {
+                       ksort( $stripped );
+               }
+
                return Sanitizer::safeEncodeTagAttributes( $stripped );
        }
 
index 338f306..d4f16ee 100644 (file)
@@ -61,9 +61,6 @@ return [
 
        'SiteStore' => function( MediaWikiServices $services ) {
                $rawSiteStore = new DBSiteStore( $services->getDBLoadBalancer() );
-               $rawSiteStore->setLanguageCodeMapping(
-                       $services->getMainConfig()->get( 'DummyLanguageCodes' ) ?: []
-               );
 
                // TODO: replace wfGetCache with a CacheFactory service.
                // TODO: replace wfIsHHVM with a capabilities service.
@@ -157,6 +154,10 @@ return [
                return $store;
        },
 
+       'WatchedItemQueryService' => function( MediaWikiServices $services ) {
+               return new WatchedItemQueryService( $services->getDBLoadBalancer() );
+       },
+
        'LinkCache' => function( MediaWikiServices $services ) {
                return new LinkCache(
                        $services->getTitleFormatter()
@@ -165,7 +166,8 @@ return [
 
        'LinkRendererFactory' => function( MediaWikiServices $services ) {
                return new LinkRendererFactory(
-                       $services->getTitleFormatter()
+                       $services->getTitleFormatter(),
+                       $services->getLinkCache()
                );
        },
 
index 2c78061..6c5de90 100644 (file)
@@ -45,6 +45,8 @@ if ( !isset( $wgVersion ) ) {
        die( 1 );
 }
 
+mb_internal_encoding( 'UTF-8' );
+
 // Set various default paths sensibly...
 $ps_default = Profiler::instance()->scopedProfileIn( $fname . '-defaults' );
 
@@ -688,7 +690,9 @@ wfDebugLog( 'caches',
        ', WAN: ' . $wgMainWANCache .
        ', stash: ' . $wgMainStash .
        ', message: ' . get_class( $messageMemc ) .
-       ', parser: ' . get_class( $parserMemc ) );
+       ', parser: ' . get_class( $parserMemc ) .
+       ', session: ' . get_class( ObjectCache::getInstance( $wgSessionCacheType ) )
+);
 
 Profiler::instance()->scopedProfileOut( $ps_memcached );
 
@@ -701,7 +705,6 @@ $ps_globals = Profiler::instance()->scopedProfileIn( $fname . '-globals' );
  * @var Language $wgContLang
  */
 $wgContLang = Language::factory( $wgLanguageCode );
-$wgContLang->initEncoding();
 $wgContLang->initContLang();
 
 // Now that variant lists may be available...
@@ -868,6 +871,10 @@ if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
        unset( $sessionUser );
 }
 
+if ( !$wgCommandLineMode ) {
+       Pingback::schedulePingback();
+}
+
 wfDebug( "Fully initialised\n" );
 $wgFullyInitialised = true;
 
index 1a92fb2..9fd5983 100644 (file)
  * extract( $globals );
  * @endcode
  *
+ * @note For WikiMap to function, the configuration must define string values for
+ *  $wgServer (or $wgCanonicalServer) and $wgArticlePath, even if these are the
+ *  same for all wikis or can be correctly determined by the logic in
+ *  Setup.php.
+ *
  * @todo Give examples for,
  * suffixes:
  * $conf->suffixes = array( 'wiki' );
@@ -565,17 +570,6 @@ class SiteConfiguration {
                return $multi ? $res : current( $res );
        }
 
-       /**
-        * Returns true if the given vhost is handled locally.
-        *
-        * @deprecated since 1.25; check if the host is in $wgLocalVirtualHosts instead.
-        * @param string $vhost
-        * @return bool
-        */
-       public function isLocalVHost( $vhost ) {
-               return in_array( $vhost, $this->localVHosts );
-       }
-
        /**
         * Merge multiple arrays together.
         * On encountering duplicate keys, merge the two, but ONLY if they're arrays.
index 8d0b8f1..0fc7980 100644 (file)
  * Functions related to the output of file content
  */
 class StreamFile {
-       const READY_STREAM = 1;
-       const NOT_MODIFIED = 2;
+       // Do not send any HTTP headers unless requested by caller (e.g. body only)
+       const STREAM_HEADLESS = 1;
+       // Do not try to tear down any PHP output buffers
+       const STREAM_ALLOW_OB = 2;
 
        /**
         * Stream a file to the browser, adding all the headings and fun stuff.
@@ -33,107 +35,183 @@ class StreamFile {
         * and Content-Disposition.
         *
         * @param string $fname Full name and path of the file to stream
-        * @param array $headers Any additional headers to send
+        * @param array $headers Any additional headers to send if the file exists
         * @param bool $sendErrors Send error messages if errors occur (like 404)
+        * @param array $optHeaders HTTP request header map (e.g. "range") (use lowercase keys)
+        * @param integer $flags Bitfield of STREAM_* constants
         * @throws MWException
         * @return bool Success
         */
-       public static function stream( $fname, $headers = [], $sendErrors = true ) {
+       public static function stream(
+               $fname, $headers = [], $sendErrors = true, $optHeaders = [], $flags = 0
+       ) {
+               $section = new ProfileSection( __METHOD__ );
 
                if ( FileBackend::isStoragePath( $fname ) ) { // sanity
                        throw new MWException( __FUNCTION__ . " given storage path '$fname'." );
                }
 
-               MediaWiki\suppressWarnings();
-               $stat = stat( $fname );
-               MediaWiki\restoreWarnings();
-
-               $res = self::prepareForStream( $fname, $stat, $headers, $sendErrors );
-               if ( $res == self::NOT_MODIFIED ) {
-                       $ok = true; // use client cache
-               } elseif ( $res == self::READY_STREAM ) {
-                       $ok = readfile( $fname );
-               } else {
-                       $ok = false; // failed
+               // Don't stream it out as text/html if there was a PHP error
+               if ( ( ( $flags & self::STREAM_HEADLESS ) == 0 || $headers ) && headers_sent() ) {
+                       echo "Headers already sent, terminating.\n";
+                       return false;
                }
 
-               return $ok;
-       }
+               $headerFunc = ( $flags & self::STREAM_HEADLESS )
+                       ? function ( $header ) {
+                                // no-op
+                       }
+                       : function ( $header ) {
+                               is_int( $header ) ? HttpStatus::header( $header ) : header( $header );
+                       };
+
+               MediaWiki\suppressWarnings();
+               $info = stat( $fname );
+               MediaWiki\restoreWarnings();
 
-       /**
-        * Call this function used in preparation before streaming a file.
-        * This function does the following:
-        * (a) sends Last-Modified, Content-type, and Content-Disposition headers
-        * (b) cancels any PHP output buffering and automatic gzipping of output
-        * (c) sends Content-Length header based on HTTP_IF_MODIFIED_SINCE check
-        *
-        * @param string $path Storage path or file system path
-        * @param array|bool $info File stat info with 'mtime' and 'size' fields
-        * @param array $headers Additional headers to send
-        * @param bool $sendErrors Send error messages if errors occur (like 404)
-        * @return int|bool READY_STREAM, NOT_MODIFIED, or false on failure
-        */
-       public static function prepareForStream(
-               $path, $info, $headers = [], $sendErrors = true
-       ) {
                if ( !is_array( $info ) ) {
                        if ( $sendErrors ) {
-                               HttpStatus::header( 404 );
-                               header( 'Cache-Control: no-cache' );
-                               header( 'Content-Type: text/html; charset=utf-8' );
-                               $encFile = htmlspecialchars( $path );
-                               $encScript = htmlspecialchars( $_SERVER['SCRIPT_NAME'] );
-                               echo "<html><body>
-                                       <h1>File not found</h1>
-                                       <p>Although this PHP script ($encScript) exists, the file requested for output
-                                       ($encFile) does not.</p>
-                                       </body></html>
-                                       ";
+                               self::send404Message( $fname, $flags );
                        }
                        return false;
                }
 
-               // Sent Last-Modified HTTP header for client-side caching
-               header( 'Last-Modified: ' . wfTimestamp( TS_RFC2822, $info['mtime'] ) );
+               // Send Last-Modified HTTP header for client-side caching
+               $headerFunc( 'Last-Modified: ' . wfTimestamp( TS_RFC2822, $info['mtime'] ) );
 
-               // Cancel output buffering and gzipping if set
-               wfResetOutputBuffers();
+               if ( ( $flags & self::STREAM_ALLOW_OB ) == 0 ) {
+                       // Cancel output buffering and gzipping if set
+                       wfResetOutputBuffers();
+               }
 
-               $type = self::contentTypeFromPath( $path );
+               $type = self::contentTypeFromPath( $fname );
                if ( $type && $type != 'unknown/unknown' ) {
-                       header( "Content-type: $type" );
+                       $headerFunc( "Content-type: $type" );
                } else {
                        // Send a content type which is not known to Internet Explorer, to
                        // avoid triggering IE's content type detection. Sending a standard
                        // unknown content type here essentially gives IE license to apply
                        // whatever content type it likes.
-                       header( 'Content-type: application/x-wiki' );
+                       $headerFunc( 'Content-type: application/x-wiki' );
                }
 
-               // Don't stream it out as text/html if there was a PHP error
-               if ( headers_sent() ) {
-                       echo "Headers already sent, terminating.\n";
-                       return false;
+               // Don't send if client has up to date cache
+               if ( isset( $optHeaders['if-modified-since'] ) ) {
+                       $modsince = preg_replace( '/;.*$/', '', $optHeaders['if-modified-since'] );
+                       if ( wfTimestamp( TS_UNIX, $info['mtime'] ) <= strtotime( $modsince ) ) {
+                               ini_set( 'zlib.output_compression', 0 );
+                               $headerFunc( 304 );
+                               return true; // ok
+                       }
                }
 
                // Send additional headers
                foreach ( $headers as $header ) {
-                       header( $header );
+                       header( $header ); // always use header(); specifically requested
                }
 
-               // Don't send if client has up to date cache
-               if ( !empty( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) ) {
-                       $modsince = preg_replace( '/;.*$/', '', $_SERVER['HTTP_IF_MODIFIED_SINCE'] );
-                       if ( wfTimestamp( TS_UNIX, $info['mtime'] ) <= strtotime( $modsince ) ) {
-                               ini_set( 'zlib.output_compression', 0 );
-                               HttpStatus::header( 304 );
-                               return self::NOT_MODIFIED; // ok
+               if ( isset( $optHeaders['range'] ) ) {
+                       $range = self::parseRange( $optHeaders['range'], $info['size'] );
+                       if ( is_array( $range ) ) {
+                               $headerFunc( 206 );
+                               $headerFunc( 'Content-Length: ' . $range[2] );
+                               $headerFunc( "Content-Range: bytes {$range[0]}-{$range[1]}/{$info['size']}" );
+                       } elseif ( $range === 'invalid' ) {
+                               if ( $sendErrors ) {
+                                       $headerFunc( 416 );
+                                       $headerFunc( 'Cache-Control: no-cache' );
+                                       $headerFunc( 'Content-Type: text/html; charset=utf-8' );
+                                       $headerFunc( 'Content-Range: bytes */' . $info['size'] );
+                               }
+                               return false;
+                       } else { // unsupported Range request (e.g. multiple ranges)
+                               $range = null;
+                               $headerFunc( 'Content-Length: ' . $info['size'] );
+                       }
+               } else {
+                       $range = null;
+                       $headerFunc( 'Content-Length: ' . $info['size'] );
+               }
+
+               if ( is_array( $range ) ) {
+                       $handle = fopen( $fname, 'rb' );
+                       if ( $handle ) {
+                               $ok = true;
+                               fseek( $handle, $range[0] );
+                               $remaining = $range[2];
+                               while ( $remaining > 0 && $ok ) {
+                                       $bytes = min( $remaining, 8 * 1024 );
+                                       $data = fread( $handle, $bytes );
+                                       $remaining -= $bytes;
+                                       $ok = ( $data !== false );
+                                       print $data;
+                               }
+                       } else {
+                               return false;
                        }
+               } else {
+                       return readfile( $fname ) !== false; // faster
                }
 
-               header( 'Content-Length: ' . $info['size'] );
+               return true;
+       }
+
+       /**
+        * Send out a standard 404 message for a file
+        *
+        * @param string $fname Full name and path of the file to stream
+        * @param integer $flags Bitfield of STREAM_* constants
+        * @since 1.24
+        */
+       public static function send404Message( $fname, $flags = 0 ) {
+               if ( ( $flags & self::STREAM_HEADLESS ) == 0 ) {
+                       HttpStatus::header( 404 );
+                       header( 'Cache-Control: no-cache' );
+                       header( 'Content-Type: text/html; charset=utf-8' );
+               }
+               $encFile = htmlspecialchars( $fname );
+               $encScript = htmlspecialchars( $_SERVER['SCRIPT_NAME'] );
+               echo "<!DOCTYPE html><html><body>
+                       <h1>File not found</h1>
+                       <p>Although this PHP script ($encScript) exists, the file requested for output
+                       ($encFile) does not.</p>
+                       </body></html>
+                       ";
+       }
 
-               return self::READY_STREAM; // ok
+       /**
+        * Convert a Range header value to an absolute (start, end) range tuple
+        *
+        * @param string $range Range header value
+        * @param integer $size File size
+        * @return array|string Returns error string on failure (start, end, length)
+        * @since 1.24
+        */
+       public static function parseRange( $range, $size ) {
+               $m = [];
+               if ( preg_match( '#^bytes=(\d*)-(\d*)$#', $range, $m ) ) {
+                       list( , $start, $end ) = $m;
+                       if ( $start === '' && $end === '' ) {
+                               $absRange = [ 0, $size - 1 ];
+                       } elseif ( $start === '' ) {
+                               $absRange = [ $size - $end, $size - 1 ];
+                       } elseif ( $end === '' ) {
+                               $absRange = [ $start, $size - 1 ];
+                       } else {
+                               $absRange = [ $start, $end ];
+                       }
+                       if ( $absRange[0] >= 0 && $absRange[1] >= $absRange[0] ) {
+                               if ( $absRange[0] < $size ) {
+                                       $absRange[1] = min( $absRange[1], $size - 1 ); // stop at EOF
+                                       $absRange[2] = $absRange[1] - $absRange[0] + 1;
+                                       return $absRange;
+                               } elseif ( $absRange[0] == 0 && $size == 0 ) {
+                                       return 'unrecognized'; // the whole file should just be sent
+                               }
+                       }
+                       return 'invalid';
+               }
+               return 'unrecognized';
        }
 
        /**
index 4555f16..8aa8cb7 100644 (file)
@@ -1773,12 +1773,13 @@ class Title implements LinkTarget {
         *
         * @param array $query
         * @param bool $query2
-        * @param string $proto Protocol to use; setting this will cause a full URL to be used
+        * @param string|int|bool $proto A PROTO_* constant on how the URL should be expanded,
+        *                               or false (default) for no expansion
         * @see self::getLocalURL for the arguments.
         * @return string The URL
         */
-       public function getLinkURL( $query = '', $query2 = false, $proto = PROTO_RELATIVE ) {
-               if ( $this->isExternal() || $proto !== PROTO_RELATIVE ) {
+       public function getLinkURL( $query = '', $query2 = false, $proto = false ) {
+               if ( $this->isExternal() || $proto !== false ) {
                        $ret = $this->getFullURL( $query, $query2, $proto );
                } elseif ( $this->getPrefixedText() === '' && $this->hasFragment() ) {
                        $ret = $this->getFragmentForURL();
@@ -4366,19 +4367,23 @@ class Title implements LinkTarget {
                        return true; // avoid gap locking if we know it's not there
                }
 
-               $method = __METHOD__;
-               $dbw = wfGetDB( DB_MASTER );
                $conds = $this->pageCond();
-               $dbw->onTransactionIdle( function () use ( $dbw, $conds, $method, $purgeTime ) {
-                       $dbTimestamp = $dbw->timestamp( $purgeTime ?: time() );
-
-                       $dbw->update(
-                               'page',
-                               [ 'page_touched' => $dbTimestamp ],
-                               $conds + [ 'page_touched < ' . $dbw->addQuotes( $dbTimestamp ) ],
-                               $method
-                       );
-               } );
+               DeferredUpdates::addUpdate(
+                       new AutoCommitUpdate(
+                               wfGetDB( DB_MASTER ),
+                               __METHOD__,
+                               function ( IDatabase $dbw, $fname ) use ( $conds, $purgeTime ) {
+                                       $dbTimestamp = $dbw->timestamp( $purgeTime ?: time() );
+                                       $dbw->update(
+                                               'page',
+                                               [ 'page_touched' => $dbTimestamp ],
+                                               $conds + [ 'page_touched < ' . $dbw->addQuotes( $dbTimestamp ) ],
+                                               $fname
+                                       );
+                               }
+                       ),
+                       DeferredUpdates::PRESEND
+               );
 
                return true;
        }
@@ -4554,10 +4559,10 @@ class Title implements LinkTarget {
         * @return bool
         */
        public function canUseNoindex() {
-               global $wgContentNamespaces, $wgExemptFromUserRobotsControl;
+               global $wgExemptFromUserRobotsControl;
 
                $bannedNamespaces = is_null( $wgExemptFromUserRobotsControl )
-                       ? $wgContentNamespaces
+                       ? MWNamespace::getContentNamespaces()
                        : $wgExemptFromUserRobotsControl;
 
                return !in_array( $this->mNamespace, $bannedNamespaces );
index b070e1e..bfd1d61 100644 (file)
@@ -156,54 +156,6 @@ class WatchedItem {
                return new self( $user, $title, self::DEPRECATED_USAGE_TIMESTAMP, (bool)$checkRights );
        }
 
-       /**
-        * @deprecated since 1.27 Use WatchedItemStore::resetNotificationTimestamp()
-        */
-       public function resetNotificationTimestamp( $force = '', $oldid = 0 ) {
-               wfDeprecated( __METHOD__, '1.27' );
-               if ( $this->checkRights && !$this->user->isAllowed( 'editmywatchlist' ) ) {
-                       return;
-               }
-               MediaWikiServices::getInstance()->getWatchedItemStore()->resetNotificationTimestamp(
-                       $this->user,
-                       $this->getTitle(),
-                       $force,
-                       $oldid
-               );
-       }
-
-       /**
-        * @deprecated since 1.27 Use WatchedItemStore::addWatchBatch()
-        */
-       public static function batchAddWatch( array $items ) {
-               wfDeprecated( __METHOD__, '1.27' );
-               if ( !$items ) {
-                       return false;
-               }
-
-               $targets = [];
-               $users = [];
-               /** @var WatchedItem $watchedItem */
-               foreach ( $items as $watchedItem ) {
-                       $user = $watchedItem->getUser();
-                       if ( $watchedItem->checkRights && !$user->isAllowed( 'editmywatchlist' ) ) {
-                               continue;
-                       }
-                       $userId = $user->getId();
-                       $users[$userId] = $user;
-                       $targets[$userId][] = $watchedItem->getTitle()->getSubjectPage();
-                       $targets[$userId][] = $watchedItem->getTitle()->getTalkPage();
-               }
-
-               $store = MediaWikiServices::getInstance()->getWatchedItemStore();
-               $success = true;
-               foreach ( $users as $userId => $user ) {
-                       $success &= $store->addWatchBatchForUser( $user, $targets[$userId] );
-               }
-
-               return $success;
-       }
-
        /**
         * @deprecated since 1.27 Use User::addWatch()
         * @return bool
diff --git a/includes/WatchedItemQueryService.php b/includes/WatchedItemQueryService.php
new file mode 100644 (file)
index 0000000..3dcd30f
--- /dev/null
@@ -0,0 +1,634 @@
+<?php
+
+use MediaWiki\Linker\LinkTarget;
+use Wikimedia\Assert\Assert;
+
+/**
+ * Class performing complex database queries related to WatchedItems.
+ *
+ * @since 1.28
+ *
+ * @file
+ * @ingroup Watchlist
+ *
+ * @license GNU GPL v2+
+ */
+class WatchedItemQueryService {
+
+       const DIR_OLDER = 'older';
+       const DIR_NEWER = 'newer';
+
+       const INCLUDE_FLAGS = 'flags';
+       const INCLUDE_USER = 'user';
+       const INCLUDE_USER_ID = 'userid';
+       const INCLUDE_COMMENT = 'comment';
+       const INCLUDE_PATROL_INFO = 'patrol';
+       const INCLUDE_SIZES = 'sizes';
+       const INCLUDE_LOG_INFO = 'loginfo';
+
+       // FILTER_* constants are part of public API (are used in ApiQueryWatchlist and
+       // ApiQueryWatchlistRaw classes) and should not be changed.
+       // Changing values of those constants will result in a breaking change in the API
+       const FILTER_MINOR = 'minor';
+       const FILTER_NOT_MINOR = '!minor';
+       const FILTER_BOT = 'bot';
+       const FILTER_NOT_BOT = '!bot';
+       const FILTER_ANON = 'anon';
+       const FILTER_NOT_ANON = '!anon';
+       const FILTER_PATROLLED = 'patrolled';
+       const FILTER_NOT_PATROLLED = '!patrolled';
+       const FILTER_UNREAD = 'unread';
+       const FILTER_NOT_UNREAD = '!unread';
+       const FILTER_CHANGED = 'changed';
+       const FILTER_NOT_CHANGED = '!changed';
+
+       const SORT_ASC = 'ASC';
+       const SORT_DESC = 'DESC';
+
+       /**
+        * @var LoadBalancer
+        */
+       private $loadBalancer;
+
+       public function __construct( LoadBalancer $loadBalancer ) {
+               $this->loadBalancer = $loadBalancer;
+       }
+
+       /**
+        * @return DatabaseBase
+        * @throws MWException
+        */
+       private function getConnection() {
+               return $this->loadBalancer->getConnection( DB_SLAVE, [ 'watchlist' ] );
+       }
+
+       /**
+        * @param DatabaseBase $connection
+        * @throws MWException
+        */
+       private function reuseConnection( DatabaseBase $connection ) {
+               $this->loadBalancer->reuseConnection( $connection );
+       }
+
+       /**
+        * @param User $user
+        * @param array $options Allowed keys:
+        *        'includeFields'       => string[] RecentChange fields to be included in the result,
+        *                                 self::INCLUDE_* constants should be used
+        *        'filters'             => string[] optional filters to narrow down resulted items
+        *        'namespaceIds'        => int[] optional namespace IDs to filter by
+        *                                 (defaults to all namespaces)
+        *        'allRevisions'        => bool return multiple revisions of the same page if true,
+        *                                 only the most recent if false (default)
+        *        'rcTypes'             => int[] which types of RecentChanges to include
+        *                                 (defaults to all types), allowed values: RC_EDIT, RC_NEW,
+        *                                 RC_LOG, RC_EXTERNAL, RC_CATEGORIZE
+        *        'onlyByUser'          => string only list changes by a specified user
+        *        'notByUser'           => string do not incluide changes by a specified user
+        *        'dir'                 => string in which direction to enumerate, accepted values:
+        *                                 - DIR_OLDER list newest first
+        *                                 - DIR_NEWER list oldest first
+        *        'start'               => string (format accepted by wfTimestamp) requires 'dir' option,
+        *                                 timestamp to start enumerating from
+        *        'end'                 => string (format accepted by wfTimestamp) requires 'dir' option,
+        *                                 timestamp to end enumerating
+        *        'startFrom'           => [ string $rcTimestamp, int $rcId ] requires 'dir' option,
+        *                                 return items starting from the RecentChange specified by this,
+        *                                 $rcTimestamp should be in the format accepted by wfTimestamp
+        *        'watchlistOwner'      => User user whose watchlist items should be listed if different
+        *                                 than the one specified with $user param,
+        *                                 requires 'watchlistOwnerToken' option
+        *        'watchlistOwnerToken' => string a watchlist token used to access another user's
+        *                                 watchlist, used with 'watchlistOwnerToken' option
+        *        'limit'               => int maximum numbers of items to return
+        *        'usedInGenerator'     => bool include only RecentChange id field required by the
+        *                                 generator ('rc_cur_id' or 'rc_this_oldid') if true, or all
+        *                                 id fields ('rc_cur_id', 'rc_this_oldid', 'rc_last_oldid')
+        *                                 if false (default)
+        * @return array of pairs ( WatchedItem $watchedItem, string[] $recentChangeInfo ),
+        *         where $recentChangeInfo contains the following keys:
+        *         - 'rc_id',
+        *         - 'rc_namespace',
+        *         - 'rc_title',
+        *         - 'rc_timestamp',
+        *         - 'rc_type',
+        *         - 'rc_deleted',
+        *         Additional keys could be added by specifying the 'includeFields' option
+        */
+       public function getWatchedItemsWithRecentChangeInfo( User $user, array $options = [] ) {
+               $options += [
+                       'includeFields' => [],
+                       'namespaceIds' => [],
+                       'filters' => [],
+                       'allRevisions' => false,
+                       'usedInGenerator' => false
+               ];
+
+               Assert::parameter(
+                       !isset( $options['rcTypes'] )
+                               || !array_diff( $options['rcTypes'], [ RC_EDIT, RC_NEW, RC_LOG, RC_EXTERNAL, RC_CATEGORIZE ] ),
+                       '$options[\'rcTypes\']',
+                       'must be an array containing only: RC_EDIT, RC_NEW, RC_LOG, RC_EXTERNAL and/or RC_CATEGORIZE'
+               );
+               Assert::parameter(
+                       !isset( $options['dir'] ) || in_array( $options['dir'], [ self::DIR_OLDER, self::DIR_NEWER ] ),
+                       '$options[\'dir\']',
+                       'must be DIR_OLDER or DIR_NEWER'
+               );
+               Assert::parameter(
+                       !isset( $options['start'] ) && !isset( $options['end'] ) && !isset( $options['startFrom'] )
+                               || isset( $options['dir'] ),
+                       '$options[\'dir\']',
+                       'must be provided when providing any of options: start, end, startFrom'
+               );
+               Assert::parameter(
+                       !isset( $options['startFrom'] )
+                               || ( is_array( $options['startFrom'] ) && count( $options['startFrom'] ) === 2 ),
+                       '$options[\'startFrom\']',
+                       'must be a two-element array'
+               );
+               if ( array_key_exists( 'watchlistOwner', $options ) ) {
+                       Assert::parameterType(
+                               User::class,
+                               $options['watchlistOwner'],
+                               '$options[\'watchlistOwner\']'
+                       );
+                       Assert::parameter(
+                               isset( $options['watchlistOwnerToken'] ),
+                               '$options[\'watchlistOwnerToken\']',
+                               'must be provided when providing watchlistOwner option'
+                       );
+               }
+
+               $tables = [ 'recentchanges', 'watchlist' ];
+               if ( !$options['allRevisions'] ) {
+                       $tables[] = 'page';
+               }
+
+               $db = $this->getConnection();
+
+               $fields = $this->getWatchedItemsWithRCInfoQueryFields( $options );
+               $conds = $this->getWatchedItemsWithRCInfoQueryConds( $db, $user, $options );
+               $dbOptions = $this->getWatchedItemsWithRCInfoQueryDbOptions( $options );
+               $joinConds = $this->getWatchedItemsWithRCInfoQueryJoinConds( $options );
+
+               $res = $db->select(
+                       $tables,
+                       $fields,
+                       $conds,
+                       __METHOD__,
+                       $dbOptions,
+                       $joinConds
+               );
+
+               $this->reuseConnection( $db );
+
+               $items = [];
+               foreach ( $res as $row ) {
+                       $items[] = [
+                               new WatchedItem(
+                                       $user,
+                                       new TitleValue( (int)$row->rc_namespace, $row->rc_title ),
+                                       $row->wl_notificationtimestamp
+                               ),
+                               $this->getRecentChangeFieldsFromRow( $row )
+                       ];
+               }
+
+               return $items;
+       }
+
+       /**
+        * For simple listing of user's watchlist items, see WatchedItemStore::getWatchedItemsForUser
+        *
+        * @param User $user
+        * @param array $options Allowed keys:
+        *        'sort'         => string optional sorting by namespace ID and title
+        *                          one of the self::SORT_* constants
+        *        'namespaceIds' => int[] optional namespace IDs to filter by (defaults to all namespaces)
+        *        'limit'        => int maximum number of items to return
+        *        'filter'       => string optional filter, one of the self::FILTER_* contants
+        *        'from'         => LinkTarget requires 'sort' key, only return items starting from
+        *                          those related to the link target
+        *        'until'        => LinkTarget requires 'sort' key, only return items until
+        *                          those related to the link target
+        *        'startFrom'    => LinkTarget requires 'sort' key, only return items starting from
+        *                          those related to the link target, allows to skip some link targets
+        *                          specified using the form option
+        * @return WatchedItem[]
+        */
+       public function getWatchedItemsForUser( User $user, array $options = [] ) {
+               if ( $user->isAnon() ) {
+                       // TODO: should this just return an empty array or rather complain loud at this point
+                       // as e.g. ApiBase::getWatchlistUser does?
+                       return [];
+               }
+
+               $options += [ 'namespaceIds' => [] ];
+
+               Assert::parameter(
+                       !isset( $options['sort'] ) || in_array( $options['sort'], [ self::SORT_ASC, self::SORT_DESC ] ),
+                       '$options[\'sort\']',
+                       'must be SORT_ASC or SORT_DESC'
+               );
+               Assert::parameter(
+                       !isset( $options['filter'] ) || in_array(
+                               $options['filter'], [ self::FILTER_CHANGED, self::FILTER_NOT_CHANGED ]
+                       ),
+                       '$options[\'filter\']',
+                       'must be FILTER_CHANGED or FILTER_NOT_CHANGED'
+               );
+               Assert::parameter(
+                       !isset( $options['from'] ) && !isset( $options['until'] ) && !isset( $options['startFrom'] )
+                       || isset( $options['sort'] ),
+                       '$options[\'sort\']',
+                       'must be provided if any of "from", "until", "startFrom" options is provided'
+               );
+
+               $db = $this->getConnection();
+
+               $conds = $this->getWatchedItemsForUserQueryConds( $db, $user, $options );
+               $dbOptions = $this->getWatchedItemsForUserQueryDbOptions( $options );
+
+               $res = $db->select(
+                       'watchlist',
+                       [ 'wl_namespace', 'wl_title', 'wl_notificationtimestamp' ],
+                       $conds,
+                       __METHOD__,
+                       $dbOptions
+               );
+
+               $this->reuseConnection( $db );
+
+               $watchedItems = [];
+               foreach ( $res as $row ) {
+                       // todo these could all be cached at some point?
+                       $watchedItems[] = new WatchedItem(
+                               $user,
+                               new TitleValue( (int)$row->wl_namespace, $row->wl_title ),
+                               $row->wl_notificationtimestamp
+                       );
+               }
+
+               return $watchedItems;
+       }
+
+       private function getRecentChangeFieldsFromRow( stdClass $row ) {
+               // This can be simplified to single array_filter call filtering by key value,
+               // once we stop supporting PHP 5.5
+               $allFields = get_object_vars( $row );
+               $rcKeys = array_filter(
+                       array_keys( $allFields ),
+                       function( $key ) {
+                               return substr( $key, 0, 3 ) === 'rc_';
+                       }
+               );
+               return array_intersect_key( $allFields, array_flip( $rcKeys ) );
+       }
+
+       private function getWatchedItemsWithRCInfoQueryFields( array $options ) {
+               $fields = [
+                       'rc_id',
+                       'rc_namespace',
+                       'rc_title',
+                       'rc_timestamp',
+                       'rc_type',
+                       'rc_deleted',
+                       'wl_notificationtimestamp'
+               ];
+
+               $rcIdFields = [
+                       'rc_cur_id',
+                       'rc_this_oldid',
+                       'rc_last_oldid',
+               ];
+               if ( $options['usedInGenerator'] ) {
+                       if ( $options['allRevisions'] ) {
+                               $rcIdFields = [ 'rc_this_oldid' ];
+                       } else {
+                               $rcIdFields = [ 'rc_cur_id' ];
+                       }
+               }
+               $fields = array_merge( $fields, $rcIdFields );
+
+               if ( in_array( self::INCLUDE_FLAGS, $options['includeFields'] ) ) {
+                       $fields = array_merge( $fields, [ 'rc_type', 'rc_minor', 'rc_bot' ] );
+               }
+               if ( in_array( self::INCLUDE_USER, $options['includeFields'] ) ) {
+                       $fields[] = 'rc_user_text';
+               }
+               if ( in_array( self::INCLUDE_USER_ID, $options['includeFields'] ) ) {
+                       $fields[] = 'rc_user';
+               }
+               if ( in_array( self::INCLUDE_COMMENT, $options['includeFields'] ) ) {
+                       $fields[] = 'rc_comment';
+               }
+               if ( in_array( self::INCLUDE_PATROL_INFO, $options['includeFields'] ) ) {
+                       $fields = array_merge( $fields, [ 'rc_patrolled', 'rc_log_type' ] );
+               }
+               if ( in_array( self::INCLUDE_SIZES, $options['includeFields'] ) ) {
+                       $fields = array_merge( $fields, [ 'rc_old_len', 'rc_new_len' ] );
+               }
+               if ( in_array( self::INCLUDE_LOG_INFO, $options['includeFields'] ) ) {
+                       $fields = array_merge( $fields, [ 'rc_logid', 'rc_log_type', 'rc_log_action', 'rc_params' ] );
+               }
+
+               return $fields;
+       }
+
+       private function getWatchedItemsWithRCInfoQueryConds(
+               DatabaseBase $db,
+               User $user,
+               array $options
+       ) {
+               $watchlistOwnerId = $this->getWatchlistOwnerId( $user, $options );
+               $conds = [ 'wl_user' => $watchlistOwnerId ];
+
+               if ( !$options['allRevisions'] ) {
+                       $conds[] = $db->makeList(
+                               [ 'rc_this_oldid=page_latest', 'rc_type=' . RC_LOG ],
+                               LIST_OR
+                       );
+               }
+
+               if ( $options['namespaceIds'] ) {
+                       $conds['wl_namespace'] = array_map( 'intval', $options['namespaceIds'] );
+               }
+
+               if ( array_key_exists( 'rcTypes', $options ) ) {
+                       $conds['rc_type'] = array_map( 'intval',  $options['rcTypes'] );
+               }
+
+               $conds = array_merge(
+                       $conds,
+                       $this->getWatchedItemsWithRCInfoQueryFilterConds( $user, $options )
+               );
+
+               $conds = array_merge( $conds, $this->getStartEndConds( $db, $options ) );
+
+               if ( !isset( $options['start'] ) && !isset( $options['end'] ) ) {
+                       if ( $db->getType() === 'mysql' ) {
+                               // This is an index optimization for mysql
+                               $conds[] = "rc_timestamp > ''";
+                       }
+               }
+
+               $conds = array_merge( $conds, $this->getUserRelatedConds( $db, $user, $options ) );
+
+               $deletedPageLogCond = $this->getExtraDeletedPageLogEntryRelatedCond( $db, $user );
+               if ( $deletedPageLogCond ) {
+                       $conds[] = $deletedPageLogCond;
+               }
+
+               if ( array_key_exists( 'startFrom', $options ) ) {
+                       $conds[] = $this->getStartFromConds( $db, $options );
+               }
+
+               return $conds;
+       }
+
+       private function getWatchlistOwnerId( User $user, array $options ) {
+               if ( array_key_exists( 'watchlistOwner', $options ) ) {
+                       /** @var User $watchlistOwner */
+                       $watchlistOwner = $options['watchlistOwner'];
+                       $ownersToken = $watchlistOwner->getOption( 'watchlisttoken' );
+                       $token = $options['watchlistOwnerToken'];
+                       if ( $ownersToken == '' || !hash_equals( $ownersToken, $token ) ) {
+                               throw new UsageException(
+                                       'Incorrect watchlist token provided -- please set a correct token in Special:Preferences',
+                                       'bad_wltoken'
+                               );
+                       }
+                       return $watchlistOwner->getId();
+               }
+               return $user->getId();
+       }
+
+       private function getWatchedItemsWithRCInfoQueryFilterConds( User $user, array $options ) {
+               $conds = [];
+
+               if ( in_array( self::FILTER_MINOR, $options['filters'] ) ) {
+                       $conds[] = 'rc_minor != 0';
+               } elseif ( in_array( self::FILTER_NOT_MINOR, $options['filters'] ) ) {
+                       $conds[] = 'rc_minor = 0';
+               }
+
+               if ( in_array( self::FILTER_BOT, $options['filters'] ) ) {
+                       $conds[] = 'rc_bot != 0';
+               } elseif ( in_array( self::FILTER_NOT_BOT, $options['filters'] ) ) {
+                       $conds[] = 'rc_bot = 0';
+               }
+
+               if ( in_array( self::FILTER_ANON, $options['filters'] ) ) {
+                       $conds[] = 'rc_user = 0';
+               } elseif ( in_array( self::FILTER_NOT_ANON, $options['filters'] ) ) {
+                       $conds[] = 'rc_user != 0';
+               }
+
+               if ( $user->useRCPatrol() || $user->useNPPatrol() ) {
+                       // TODO: not sure if this should simply ignore patrolled filters if user does not have the patrol
+                       // right, or maybe rather fail loud at this point, same as e.g. ApiQueryWatchlist does?
+                       if ( in_array( self::FILTER_PATROLLED, $options['filters'] ) ) {
+                               $conds[] = 'rc_patrolled != 0';
+                       } elseif ( in_array( self::FILTER_NOT_PATROLLED, $options['filters'] ) ) {
+                               $conds[] = 'rc_patrolled = 0';
+                       }
+               }
+
+               if ( in_array( self::FILTER_UNREAD, $options['filters'] ) ) {
+                       $conds[] = 'rc_timestamp >= wl_notificationtimestamp';
+               } elseif ( in_array( self::FILTER_NOT_UNREAD, $options['filters'] ) ) {
+                       // TODO: should this be changed to use Database::makeList?
+                       $conds[] = 'wl_notificationtimestamp IS NULL OR rc_timestamp < wl_notificationtimestamp';
+               }
+
+               return $conds;
+       }
+
+       private function getStartEndConds( DatabaseBase $db, array $options ) {
+               if ( !isset( $options['start'] ) && ! isset( $options['end'] ) ) {
+                       return [];
+               }
+
+               $conds = [];
+
+               if ( isset( $options['start'] ) ) {
+                       $after = $options['dir'] === self::DIR_OLDER ? '<=' : '>=';
+                       $conds[] = 'rc_timestamp ' . $after . ' ' . $db->addQuotes( $options['start'] );
+               }
+               if ( isset( $options['end'] ) ) {
+                       $before = $options['dir'] === self::DIR_OLDER ? '>=' : '<=';
+                       $conds[] = 'rc_timestamp ' . $before . ' ' . $db->addQuotes( $options['end'] );
+               }
+
+               return $conds;
+       }
+
+       private function getUserRelatedConds( DatabaseBase $db, User $user, array $options ) {
+               if ( !array_key_exists( 'onlyByUser', $options ) && !array_key_exists( 'notByUser', $options ) ) {
+                       return [];
+               }
+
+               $conds = [];
+
+               if ( array_key_exists( 'onlyByUser', $options ) ) {
+                       $conds['rc_user_text'] = $options['onlyByUser'];
+               } elseif ( array_key_exists( 'notByUser', $options ) ) {
+                       $conds[] = 'rc_user_text != ' . $db->addQuotes( $options['notByUser'] );
+               }
+
+               // Avoid brute force searches (bug 17342)
+               $bitmask = 0;
+               if ( !$user->isAllowed( 'deletedhistory' ) ) {
+                       $bitmask = Revision::DELETED_USER;
+               } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
+                       $bitmask = Revision::DELETED_USER | Revision::DELETED_RESTRICTED;
+               }
+               if ( $bitmask ) {
+                       $conds[] = $db->bitAnd( 'rc_deleted', $bitmask ) . " != $bitmask";
+               }
+
+               return $conds;
+       }
+
+       private function getExtraDeletedPageLogEntryRelatedCond( DatabaseBase $db, User $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' ) ) {
+                       $bitmask = LogPage::DELETED_ACTION;
+               } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
+                       $bitmask = LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED;
+               }
+               if ( $bitmask ) {
+                       return $db->makeList( [
+                               'rc_type != ' . RC_LOG,
+                               $db->bitAnd( 'rc_deleted', $bitmask ) . " != $bitmask",
+                       ], LIST_OR );
+               }
+               return '';
+       }
+
+       private function getStartFromConds( DatabaseBase $db, array $options ) {
+               $op = $options['dir'] === self::DIR_OLDER ? '<' : '>';
+               list( $rcTimestamp, $rcId ) = $options['startFrom'];
+               $rcTimestamp = $db->addQuotes( $db->timestamp( $rcTimestamp ) );
+               $rcId = (int)$rcId;
+               return $db->makeList(
+                       [
+                               "rc_timestamp $op $rcTimestamp",
+                               $db->makeList(
+                                       [
+                                               "rc_timestamp = $rcTimestamp",
+                                               "rc_id $op= $rcId"
+                                       ],
+                                       LIST_AND
+                               )
+                       ],
+                       LIST_OR
+               );
+       }
+
+       private function getWatchedItemsForUserQueryConds( DatabaseBase $db, User $user, array $options ) {
+               $conds = [ 'wl_user' => $user->getId() ];
+               if ( $options['namespaceIds'] ) {
+                       $conds['wl_namespace'] = array_map( 'intval', $options['namespaceIds'] );
+               }
+               if ( isset( $options['filter'] ) ) {
+                       $filter = $options['filter'];
+                       if ( $filter ===  self::FILTER_CHANGED ) {
+                               $conds[] = 'wl_notificationtimestamp IS NOT NULL';
+                       } else {
+                               $conds[] = 'wl_notificationtimestamp IS NULL';
+                       }
+               }
+
+               if ( isset( $options['from'] ) ) {
+                       $op = $options['sort'] === self::SORT_ASC ? '>' : '<';
+                       $conds[] = $this->getFromUntilTargetConds( $db, $options['from'], $op );
+               }
+               if ( isset( $options['until'] ) ) {
+                       $op = $options['sort'] === self::SORT_ASC ? '<' : '>';
+                       $conds[] = $this->getFromUntilTargetConds( $db, $options['until'], $op );
+               }
+               if ( isset( $options['startFrom'] ) ) {
+                       $op = $options['sort'] === self::SORT_ASC ? '>' : '<';
+                       $conds[] = $this->getFromUntilTargetConds( $db, $options['startFrom'], $op );
+               }
+
+               return $conds;
+       }
+
+       /**
+        * Creates a query condition part for getting only items before or after the given link target
+        * (while ordering using $sort mode)
+        *
+        * @param DatabaseBase $db
+        * @param LinkTarget $target
+        * @param string $op comparison operator to use in the conditions
+        * @return string
+        */
+       private function getFromUntilTargetConds( DatabaseBase $db, LinkTarget $target, $op ) {
+               return $db->makeList(
+                       [
+                               "wl_namespace $op " . $target->getNamespace(),
+                               $db->makeList(
+                                       [
+                                               'wl_namespace = ' . $target->getNamespace(),
+                                               "wl_title $op= " . $db->addQuotes( $target->getDBkey() )
+                                       ],
+                                       LIST_AND
+                               )
+                       ],
+                       LIST_OR
+               );
+       }
+
+       private function getWatchedItemsWithRCInfoQueryDbOptions( array $options ) {
+               $dbOptions = [];
+
+               if ( array_key_exists( 'dir', $options ) ) {
+                       $sort = $options['dir'] === self::DIR_OLDER ? ' DESC' : '';
+                       $dbOptions['ORDER BY'] = [ 'rc_timestamp' . $sort, 'rc_id' . $sort ];
+               }
+
+               if ( array_key_exists( 'limit', $options ) ) {
+                       $dbOptions['LIMIT'] = (int)$options['limit'];
+               }
+
+               return $dbOptions;
+       }
+
+       private function getWatchedItemsForUserQueryDbOptions( array $options ) {
+               $dbOptions = [];
+               if ( array_key_exists( 'sort', $options ) ) {
+                       $dbOptions['ORDER BY'] = [
+                               "wl_namespace {$options['sort']}",
+                               "wl_title {$options['sort']}"
+                       ];
+                       if ( count( $options['namespaceIds'] ) === 1 ) {
+                               $dbOptions['ORDER BY'] = "wl_title {$options['sort']}";
+                       }
+               }
+               if ( array_key_exists( 'limit', $options ) ) {
+                       $dbOptions['LIMIT'] = (int)$options['limit'];
+               }
+               return $dbOptions;
+       }
+
+       private function getWatchedItemsWithRCInfoQueryJoinConds( array $options ) {
+               $joinConds = [
+                       'watchlist' => [ 'INNER JOIN',
+                               [
+                                       'wl_namespace=rc_namespace',
+                                       'wl_title=rc_title'
+                               ]
+                       ]
+               ];
+               if ( !$options['allRevisions'] ) {
+                       $joinConds['page'] = [ 'LEFT JOIN', 'rc_cur_id=page_id' ];
+               }
+               return $joinConds;
+       }
+
+}
index 515fbfc..89ca50c 100644 (file)
@@ -719,28 +719,29 @@ class WatchedItemStore implements StatsdAwareInterface {
         */
        public function updateNotificationTimestamp( User $editor, LinkTarget $target, $timestamp ) {
                $dbw = $this->getConnection( DB_MASTER );
-               $res = $dbw->select( [ 'watchlist' ],
-                       [ 'wl_user' ],
+               $uids = $dbw->selectFieldValues(
+                       'watchlist',
+                       'wl_user',
                        [
                                'wl_user != ' . intval( $editor->getId() ),
                                'wl_namespace' => $target->getNamespace(),
                                'wl_title' => $target->getDBkey(),
                                'wl_notificationtimestamp IS NULL',
-                       ], __METHOD__
+                       ],
+                       __METHOD__
                );
+               $this->reuseConnection( $dbw );
 
-               $watchers = [];
-               foreach ( $res as $row ) {
-                       $watchers[] = intval( $row->wl_user );
-               }
-
+               $watchers = array_map( 'intval', $uids );
                if ( $watchers ) {
                        // Update wl_notificationtimestamp for all watching users except the editor
                        $fname = __METHOD__;
-                       $dbw->onTransactionIdle(
-                               function () use ( $dbw, $timestamp, $watchers, $target, $fname ) {
+                       DeferredUpdates::addCallableUpdate(
+                               function () use ( $timestamp, $watchers, $target, $fname ) {
                                        global $wgUpdateRowsPerQuery;
 
+                                       $dbw = $this->getConnection( DB_MASTER );
+
                                        $watchersChunks = array_chunk( $watchers, $wgUpdateRowsPerQuery );
                                        foreach ( $watchersChunks as $watchersChunk ) {
                                                $dbw->update( 'watchlist',
@@ -758,12 +759,12 @@ class WatchedItemStore implements StatsdAwareInterface {
                                                }
                                        }
                                        $this->uncacheLinkTarget( $target );
+
+                                       $this->reuseConnection( $dbw );
                                }
                        );
                }
 
-               $this->reuseConnection( $dbw );
-
                return $watchers;
        }
 
index 152a3d2..b5c57ee 100644 (file)
@@ -565,21 +565,17 @@ class WebRequest {
 
        /**
         * Fetch a text string from the given array or return $default if it's not
-        * set. Carriage returns are stripped from the text, and with some language
-        * modules there is an input transliteration applied. This should generally
-        * be used for form "<textarea>" and "<input>" fields. Used for
-        * user-supplied freeform text input (for which input transformations may
-        * be required - e.g.  Esperanto x-coding).
+        * set. Carriage returns are stripped from the text. This should generally
+        * be used for form "<textarea>" and "<input>" fields, and for
+        * user-supplied freeform text input.
         *
         * @param string $name
         * @param string $default Optional
         * @return string
         */
        public function getText( $name, $default = '' ) {
-               global $wgContLang;
                $val = $this->getVal( $name, $default );
-               return str_replace( "\r\n", "\n",
-                       $wgContLang->recodeInput( $val ) );
+               return str_replace( "\r\n", "\n", $val );
        }
 
        /**
index 458c207..90b76e3 100644 (file)
@@ -89,26 +89,12 @@ class WebResponse {
         *     path: string, cookie path ($wgCookiePath)
         *     secure: bool, secure attribute ($wgCookieSecure)
         *     httpOnly: bool, httpOnly attribute ($wgCookieHttpOnly)
-        *     raw: bool, if true uses PHP's setrawcookie() instead of setcookie()
-        *   For backwards compatibility, if $options is not an array then it and
-        *   the following two parameters will be interpreted as values for
-        *   'prefix', 'domain', and 'secure'
         * @since 1.22 Replaced $prefix, $domain, and $forceSecure with $options
         */
        public function setCookie( $name, $value, $expire = 0, $options = [] ) {
                global $wgCookiePath, $wgCookiePrefix, $wgCookieDomain;
                global $wgCookieSecure, $wgCookieExpiration, $wgCookieHttpOnly;
 
-               if ( !is_array( $options ) ) {
-                       // Backwards compatibility
-                       $options = [ 'prefix' => $options ];
-                       if ( func_num_args() >= 5 ) {
-                               $options['domain'] = func_get_arg( 4 );
-                       }
-                       if ( func_num_args() >= 6 ) {
-                               $options['secure'] = func_get_arg( 5 );
-                       }
-               }
                $options = array_filter( $options, function ( $a ) {
                        return $a !== null;
                } ) + [
@@ -268,16 +254,6 @@ class FauxResponse extends WebResponse {
                global $wgCookiePath, $wgCookiePrefix, $wgCookieDomain;
                global $wgCookieSecure, $wgCookieExpiration, $wgCookieHttpOnly;
 
-               if ( !is_array( $options ) ) {
-                       // Backwards compatibility
-                       $options = [ 'prefix' => $options ];
-                       if ( func_num_args() >= 5 ) {
-                               $options['domain'] = func_get_arg( 4 );
-                       }
-                       if ( func_num_args() >= 6 ) {
-                               $options['secure'] = func_get_arg( 5 );
-                       }
-               }
                $options = array_filter( $options, function ( $a ) {
                        return $a !== null;
                } ) + [
index cf97984..37f85ea 100644 (file)
@@ -65,6 +65,14 @@ class WikiMap {
 
                $path = $wgConf->get( 'wgArticlePath', $wikiID, $major,
                        [ 'lang' => $minor, 'site' => $major ] );
+
+               // If we don't have a canonical server or a path containing $1, the
+               // WikiReference isn't going to function properly. Just return null in
+               // that case.
+               if ( !is_string( $canonicalServer ) || !is_string( $path ) || strpos( $path, '$1' ) === false ) {
+                       return null;
+               }
+
                return new WikiReference( $canonicalServer, $path, $server );
        }
 
index 84bf16e..f06f828 100644 (file)
@@ -88,7 +88,7 @@ abstract class Action {
         * @since 1.17
         * @param string $action
         * @param Page $page
-        * @param IContextSource $context
+        * @param IContextSource|null $context
         * @return Action|bool|null False if the action is disabled, null
         *     if it is not recognised
         */
@@ -264,7 +264,7 @@ abstract class Action {
         * Only public since 1.21
         *
         * @param Page $page
-        * @param IContextSource $context
+        * @param IContextSource|null $context
         */
        public function __construct( Page $page, IContextSource $context = null ) {
                if ( $context === null ) {
index 5ec10e6..0df372e 100644 (file)
@@ -116,6 +116,10 @@ class HistoryAction extends FormlessAction {
                // Setup page variables.
                $out->setFeedAppendQuery( 'action=history' );
                $out->addModules( 'mediawiki.action.history' );
+               $out->addModuleStyles( [
+                       'mediawiki.action.history.styles',
+                       'mediawiki.special.changeslist',
+               ] );
                if ( $config->get( 'UseMediaWikiUIEverywhere' ) ) {
                        $out = $this->getOutput();
                        $out->addModuleStyles( [
index 0a4b6dc..52a7951 100644 (file)
@@ -21,7 +21,6 @@
  */
 
 use MediaWiki\Auth\AuthManager;
-use MediaWiki\Auth\AuthenticationRequest;
 use MediaWiki\Auth\AuthenticationResponse;
 
 /**
index 639f6be..3e57e89 100644 (file)
@@ -2093,7 +2093,7 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Output the error message related to a certain array
-        * @param array|string $error Element of a getUserPermissionsErrors()-style array
+        * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
         * @throws UsageException always
         */
        public function dieUsageMsg( $error ) {
@@ -2110,7 +2110,7 @@ abstract class ApiBase extends ContextSource {
        /**
         * Will only set a warning instead of failing if the global $wgDebugAPI
         * is set to true. Otherwise behaves exactly as dieUsageMsg().
-        * @param array|string $error Element of a getUserPermissionsErrors()-style array
+        * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
         * @throws UsageException
         * @since 1.21
         */
@@ -2143,32 +2143,38 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Return the error message related to a certain array
-        * @param array $error Element of a getUserPermissionsErrors()-style array
+        * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
         * @return array('code' => code, 'info' => info)
         */
        public function parseMsg( $error ) {
-               $error = (array)$error; // It seems strings sometimes make their way in here
-               $key = array_shift( $error );
-
-               // Check whether the error array was nested
-               // array( array( <code>, <params> ), array( <another_code>, <params> ) )
-               if ( is_array( $key ) ) {
-                       $error = $key;
-                       $key = array_shift( $error );
+               // Check whether someone passed the whole array, instead of one element as
+               // documented. This breaks if it's actually an array of fallback keys, but
+               // that's long-standing misbehavior introduced in r87627 to incorrectly
+               // fix T30797.
+               if ( is_array( $error ) ) {
+                       $first = reset( $error );
+                       if ( is_array( $first ) ) {
+                               wfDebug( __METHOD__ . ' was passed an array of arrays. ' . wfGetAllCallers( 5 ) );
+                               $error = $first;
+                       }
                }
 
-               if ( $key instanceof IApiMessage ) {
+               $msg = Message::newFromSpecifier( $error );
+
+               if ( $msg instanceof IApiMessage ) {
                        return [
-                               'code' => $key->getApiCode(),
-                               'info' => $key->inLanguage( 'en' )->useDatabase( false )->text(),
-                               'data' => $key->getApiData()
+                               'code' => $msg->getApiCode(),
+                               'info' => $msg->inLanguage( 'en' )->useDatabase( false )->text(),
+                               'data' => $msg->getApiData()
                        ];
                }
 
+               $key = $msg->getKey();
                if ( isset( self::$messageMap[$key] ) ) {
+                       $params = $msg->getParams();
                        return [
-                               'code' => wfMsgReplaceArgs( self::$messageMap[$key]['code'], $error ),
-                               'info' => wfMsgReplaceArgs( self::$messageMap[$key]['info'], $error )
+                               'code' => wfMsgReplaceArgs( self::$messageMap[$key]['code'], $params ),
+                               'info' => wfMsgReplaceArgs( self::$messageMap[$key]['info'], $params )
                        ];
                }
 
diff --git a/includes/api/ApiCSPReport.php b/includes/api/ApiCSPReport.php
new file mode 100644 (file)
index 0000000..5271996
--- /dev/null
@@ -0,0 +1,224 @@
+<?php
+/**
+ * Copyright © 2015 Brian Wolff
+ *
+ * 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\Logger\LoggerFactory;
+
+/**
+ * Api module to receive and log CSP violation reports
+ *
+ * @ingroup API
+ */
+class ApiCSPReport extends ApiBase {
+
+       private $log;
+
+       /**
+        * These reports should be small. Ignore super big reports out of paranoia
+        */
+       const MAX_POST_SIZE = 8192;
+
+       /**
+        * Logs a content-security-policy violation report from web browser.
+        */
+       public function execute() {
+               $reportOnly = $this->getParameter( 'reportonly' );
+               $logname = $reportOnly ? 'csp-report-only' : 'csp';
+               $this->log = LoggerFactory::getInstance( $logname );
+               $userAgent = $this->getRequest()->getHeader( 'user-agent' );
+
+               $this->verifyPostBodyOk();
+               $report = $this->getReport();
+               $flags = $this->getFlags( $report );
+
+               $warningText = $this->generateLogLine( $flags, $report );
+               $this->logReport( $flags, $warningText, [
+                       // XXX Is it ok to put untrusted data into log??
+                       'csp-report' => $report,
+                       'method' => __METHOD__,
+                       'user' => $this->getUser()->getName(),
+                       'user-agent' => $userAgent,
+                       'source' => $this->getParameter( 'source' ),
+               ] );
+               $this->getResult()->addValue( null, $this->getModuleName(), 'success' );
+       }
+
+       /**
+        * Log CSP report, with a different severity depending on $flags
+        * @param $flags Array Flags for this report
+        * @param $logLine String text of log entry
+        * @param $context Array logging context
+        */
+       private function logReport( $flags, $logLine, $context ) {
+               if ( in_array( 'false-positive', $flags ) ) {
+                       // These reports probably don't matter much
+                       $this->log->debug( $logLine, $context );
+               } else {
+                       // Normal report.
+                       $this->log->warning( $logLine, $context );
+               }
+       }
+
+       /**
+        * Get extra notes about the report.
+        *
+        * @param $report Array The CSP report
+        * @return Array
+        */
+       private function getFlags( $report ) {
+               $reportOnly = $this->getParameter( 'reportonly' );
+               $userAgent = $this->getRequest()->getHeader( 'user-agent' );
+               $source = $this->getParameter( 'source' );
+
+               $flags = [];
+               if ( $source !== 'internal' ) {
+                       $flags[] = 'source=' . $source;
+               }
+               if ( $reportOnly ) {
+                       $flags[] = 'report-only';
+               }
+               return $flags;
+       }
+
+       /**
+        * Output an api error if post body is obviously not OK.
+        */
+       private function verifyPostBodyOk() {
+               $req = $this->getRequest();
+               $contentType = $req->getHeader( 'content-type' );
+               if ( $contentType !== 'application/json'
+                       && $contentType !=='application/csp-report'
+               ) {
+                       $this->error( 'wrongformat', __METHOD__ );
+               }
+               if ( $req->getHeader( 'content-length' ) > self::MAX_POST_SIZE ) {
+                       $this->error( 'toobig', __METHOD__ );
+               }
+       }
+
+       /**
+        * Get the report from post body and turn into associative array.
+        *
+        * @return Array
+        */
+       private function getReport() {
+               $postBody = $this->getRequest()->getRawInput();
+               if ( strlen( $postBody ) > self::MAX_POST_SIZE ) {
+                       // paranoia, already checked content-length earlier.
+                       $this->error( 'toobig', __METHOD__ );
+               }
+               $status = FormatJson::parse( $postBody, FormatJson::FORCE_ASSOC );
+               if ( !$status->isGood() ) {
+                       list( $code, ) = $this->getErrorFromStatus( $status );
+                       $this->error( $code, __METHOD__ );
+               }
+
+               $report = $status->getValue();
+
+               if ( !isset( $report['csp-report'] ) ) {
+                       $this->error( 'missingkey', __METHOD__ );
+               }
+               return $report['csp-report'];
+       }
+
+       /**
+        * Get text of log line.
+        *
+        * @param $flags Array of additional markers for this report
+        * @param $report Array the csp report
+        * @return String Text to put in log
+        */
+       private function generateLogLine( $flags, $report ) {
+               $flagText = '';
+               if ( $flags ) {
+                       $flagText = '[' . implode( $flags, ', ' ) . ']';
+               }
+
+               $blockedFile = isset( $report['blocked-uri'] ) ? $report['blocked-uri'] : 'n/a';
+               $page = isset( $report['document-uri'] ) ? $report['document-uri'] : 'n/a';
+               $line = isset( $report['line-number'] ) ? ':' . $report['line-number'] : '';
+               $warningText = $flagText .
+                       ' Received CSP report: <' . $blockedFile .
+                       '> blocked from being loaded on <' . $page . '>' . $line;
+               return $warningText;
+       }
+
+       /**
+        * Stop processing the request, and output/log an error
+        *
+        * @param $code String error code
+        * @param $method String method that made error
+        * @throws UsageException Always
+        */
+       private function error( $code, $method ) {
+               $this->log->info( 'Error reading CSP report: ' . $code, [
+                       'method' => $method,
+                       'user-agent' => $this->getRequest()->getHeader( 'user-agent' )
+               ] );
+               // 500 so it shows up in browser's developer console.
+               $this->dieUsage( "Error processing CSP report: $code", 'cspreport-' . $code, 500 );
+       }
+
+       public function getAllowedParams() {
+               return [
+                       'reportonly' => [
+                               ApiBase::PARAM_TYPE => 'boolean',
+                               ApiBase::PARAM_DFLT => false
+                       ],
+                       'source' => [
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_DFLT => 'internal',
+                               ApiBase::PARAM_REQUIRED => false
+                       ]
+               ];
+       }
+
+       public function mustBePosted() {
+               return true;
+       }
+
+       public function isWriteMode() {
+               return false;
+       }
+
+       /**
+        * Mark as internal. This isn't meant to be used by normal api users
+        */
+       public function isInternal() {
+               return true;
+       }
+
+       /**
+        * Even if you don't have read rights, we still want your report.
+        */
+       public function isReadMode() {
+               return false;
+       }
+
+       /**
+        * Doesn't touch db, so max lag should be rather irrelavent.
+        *
+        * Also, this makes sure that reports aren't lost during lag events.
+        */
+       public function shouldCheckMaxLag() {
+               return false;
+       }
+}
index cffccb1..8e5a3c7 100644 (file)
@@ -21,7 +21,6 @@
  */
 
 use MediaWiki\Auth\AuthManager;
-use MediaWiki\Auth\AuthenticationRequest;
 use MediaWiki\Auth\AuthenticationResponse;
 use MediaWiki\Auth\CreateFromLoginAuthenticationRequest;
 
index 08aba94..00daba9 100644 (file)
@@ -398,39 +398,11 @@ class ApiEditPage extends ApiBase {
                $ep->importFormData( $req );
                $content = $ep->textbox1;
 
-               // The following is needed to give the hook the full content of the
-               // new revision rather than just the current section. (Bug 52077)
-               if ( !is_null( $params['section'] ) &&
-                       $contentHandler->supportsSections() && $titleObj->exists()
-               ) {
-                       // If sectiontitle is set, use it, otherwise use the summary as the section title (for
-                       // backwards compatibility with old forms/bots).
-                       if ( $ep->sectiontitle !== '' ) {
-                               $sectionTitle = $ep->sectiontitle;
-                       } else {
-                               $sectionTitle = $ep->summary;
-                       }
-
-                       $contentObj = $contentHandler->unserializeContent( $content, $contentFormat );
-
-                       $fullContentObj = $articleObject->replaceSectionContent(
-                               $params['section'],
-                               $contentObj,
-                               $sectionTitle
-                       );
-                       if ( $fullContentObj ) {
-                               $content = $fullContentObj->serialize( $contentFormat );
-                       } else {
-                               // This most likely means we have an edit conflict which means that the edit
-                               // wont succeed anyway.
-                               $this->dieUsageMsg( 'editconflict' );
-                       }
-               }
-
                // Run hooks
                // Handle APIEditBeforeSave parameters
                $r = [];
-               if ( !Hooks::run( 'APIEditBeforeSave', [ $ep, $content, &$r ] ) ) {
+               // Deprecated in favour of EditFilterMergedContent
+               if ( !Hooks::run( 'APIEditBeforeSave', [ $ep, $content, &$r ], '1.28' ) ) {
                        if ( count( $r ) ) {
                                $r['result'] = 'Failure';
                                $apiResult->addValue( null, $this->getModuleName(), $r );
index 286fe88..48e7698 100644 (file)
@@ -77,6 +77,11 @@ class ApiExpandTemplates extends ApiBase {
                        $options->setRemoveComments( false );
                }
 
+               $reset = null;
+               $suppressCache = false;
+               Hooks::run( 'ApiMakeParserOptions',
+                       [ $options, $title_obj, $params, $this, &$reset, &$suppressCache ] );
+
                $retval = [];
 
                if ( isset( $prop['parsetree'] ) || $params['generatexml'] ) {
index e28b068..c7dc303 100644 (file)
@@ -79,6 +79,7 @@ class ApiFeedContributions extends ApiBase {
                        'deletedOnly' => $params['deletedonly'],
                        'topOnly' => $params['toponly'],
                        'newOnly' => $params['newonly'],
+                       'hideMinor' => $params['hideminor'],
                        'showSizeDiff' => $params['showsizediff'],
                ] );
 
@@ -208,6 +209,7 @@ class ApiFeedContributions extends ApiBase {
                        'deletedonly' => false,
                        'toponly' => false,
                        'newonly' => false,
+                       'hideminor' => false,
                        'showsizediff' => [
                                ApiBase::PARAM_DFLT => false,
                        ],
index 0f0fbdc..a3bb6a2 100644 (file)
@@ -100,8 +100,10 @@ class ApiHelp extends ApiBase {
                }
 
                $out = $context->getOutput();
-               $out->addModuleStyles( 'mediawiki.hlist' );
-               $out->addModuleStyles( 'mediawiki.apihelp' );
+               $out->addModuleStyles( [
+                       'mediawiki.hlist',
+                       'mediawiki.apihelp',
+               ] );
                if ( !empty( $options['toc'] ) ) {
                        $out->addModules( 'mediawiki.toc' );
                }
index 14347d8..1017607 100644 (file)
@@ -21,7 +21,6 @@
  */
 
 use MediaWiki\Auth\AuthManager;
-use MediaWiki\Auth\AuthenticationRequest;
 use MediaWiki\Auth\AuthenticationResponse;
 
 /**
index 3572229..0e4c6e0 100644 (file)
@@ -208,7 +208,7 @@ class ApiLogin extends ApiBase {
 
                                // Deprecated hook
                                $injected_html = '';
-                               Hooks::run( 'UserLoginComplete', [ &$user, &$injected_html ] );
+                               Hooks::run( 'UserLoginComplete', [ &$user, &$injected_html, true ] );
 
                                $result['lguserid'] = intval( $user->getId() );
                                $result['lgusername'] = $user->getName();
index ce9587f..592df53 100644 (file)
@@ -71,6 +71,7 @@ class ApiMain extends ApiBase {
                'compare' => 'ApiComparePages',
                'tokens' => 'ApiTokens',
                'checktoken' => 'ApiCheckToken',
+               'cspreport' => 'ApiCSPReport',
 
                // Write modules
                'purge' => 'ApiPurge',
@@ -137,7 +138,9 @@ class ApiMain extends ApiBase {
         */
        private $mPrinter;
 
-       private $mModuleMgr, $mResult, $mErrorFormatter, $mContinuationManager;
+       private $mModuleMgr, $mResult, $mErrorFormatter;
+       /** @var ApiContinuationManager|null */
+       private $mContinuationManager;
        private $mAction;
        private $mEnableWrite;
        private $mInternalMode, $mSquidMaxage;
@@ -171,22 +174,53 @@ class ApiMain extends ApiBase {
 
                if ( isset( $request ) ) {
                        $this->getContext()->setRequest( $request );
+               } else {
+                       $request = $this->getRequest();
                }
 
-               $this->mInternalMode = ( $this->getRequest() instanceof FauxRequest );
+               $this->mInternalMode = ( $request instanceof FauxRequest );
 
                // Special handling for the main module: $parent === $this
                parent::__construct( $this, $this->mInternalMode ? 'main_int' : 'main' );
 
+               $config = $this->getConfig();
+
                if ( !$this->mInternalMode ) {
-                       // Impose module restrictions.
-                       // If the current user cannot read,
-                       // Remove all modules other than login
-                       global $wgUser;
+                       // Log if a request with a non-whitelisted Origin header is seen
+                       // with session cookies.
+                       $originHeader = $request->getHeader( 'Origin' );
+                       if ( $originHeader === false ) {
+                               $origins = [];
+                       } else {
+                               $originHeader = trim( $originHeader );
+                               $origins = preg_split( '/\s+/', $originHeader );
+                       }
+                       $sessionCookies = array_intersect(
+                               array_keys( $_COOKIE ),
+                               MediaWiki\Session\SessionManager::singleton()->getVaryCookies()
+                       );
+                       if ( $origins && $sessionCookies && (
+                               count( $origins ) !== 1 || !self::matchOrigin(
+                                       $origins[0],
+                                       $config->get( 'CrossSiteAJAXdomains' ),
+                                       $config->get( 'CrossSiteAJAXdomainExceptions' )
+                               )
+                       ) ) {
+                               MediaWiki\Logger\LoggerFactory::getInstance( 'cors' )->warning(
+                                       'Non-whitelisted CORS request with session cookies', [
+                                               'origin' => $originHeader,
+                                               'cookies' => $sessionCookies,
+                                               'ip' => $request->getIP(),
+                                               'userAgent' => $this->getUserAgent(),
+                                               'wiki' => wfWikiID(),
+                                       ]
+                               );
+                       }
 
+                       // If we're in a mode that breaks the same-origin policy, strip
+                       // user credentials for security.
                        if ( $this->lacksSameOriginSecurity() ) {
-                               // If we're in a mode that breaks the same-origin policy, strip
-                               // user credentials for security.
+                               global $wgUser;
                                wfDebug( "API: stripping user credentials when the same-origin policy is not applied\n" );
                                $wgUser = new User();
                                $this->getContext()->setUser( $wgUser );
@@ -211,7 +245,6 @@ class ApiMain extends ApiBase {
                        }
                }
 
-               $config = $this->getConfig();
                $this->mModuleMgr = new ApiModuleManager( $this );
                $this->mModuleMgr->addModules( self::$Modules, 'action' );
                $this->mModuleMgr->addModules( $config->get( 'APIModules' ), 'action' );
@@ -265,6 +298,12 @@ class ApiMain extends ApiBase {
                        return true;
                }
 
+               // Anonymous CORS
+               if ( $request->getVal( 'origin' ) === '*' ) {
+                       $this->lacksSameOriginSecurity = true;
+                       return true;
+               }
+
                // Header to be used from XMLHTTPRequest when the request might
                // otherwise be used for XSS.
                if ( $request->getHeader( 'Treat-as-Untrusted' ) !== false ) {
@@ -611,31 +650,49 @@ class ApiMain extends ApiBase {
                $request = $this->getRequest();
                $response = $request->response();
 
-               // Origin: header is a space-separated list of origins, check all of them
-               $originHeader = $request->getHeader( 'Origin' );
-               if ( $originHeader === false ) {
-                       $origins = [];
+               $matchOrigin = false;
+               $allowTiming = false;
+               $varyOrigin = true;
+
+               if ( $originParam === '*' ) {
+                       // Request for anonymous CORS
+                       $matchOrigin = true;
+                       $allowOrigin = '*';
+                       $allowCredentials = 'false';
+                       $varyOrigin = false; // No need to vary
                } else {
-                       $originHeader = trim( $originHeader );
-                       $origins = preg_split( '/\s+/', $originHeader );
-               }
+                       // Non-anonymous CORS, check we allow the domain
 
-               if ( !in_array( $originParam, $origins ) ) {
-                       // origin parameter set but incorrect
-                       // Send a 403 response
-                       $response->statusHeader( 403 );
-                       $response->header( 'Cache-Control: no-cache' );
-                       echo "'origin' parameter does not match Origin header\n";
+                       // Origin: header is a space-separated list of origins, check all of them
+                       $originHeader = $request->getHeader( 'Origin' );
+                       if ( $originHeader === false ) {
+                               $origins = [];
+                       } else {
+                               $originHeader = trim( $originHeader );
+                               $origins = preg_split( '/\s+/', $originHeader );
+                       }
 
-                       return false;
-               }
+                       if ( !in_array( $originParam, $origins ) ) {
+                               // origin parameter set but incorrect
+                               // Send a 403 response
+                               $response->statusHeader( 403 );
+                               $response->header( 'Cache-Control: no-cache' );
+                               echo "'origin' parameter does not match Origin header\n";
 
-               $config = $this->getConfig();
-               $matchOrigin = count( $origins ) === 1 && self::matchOrigin(
-                       $originParam,
-                       $config->get( 'CrossSiteAJAXdomains' ),
-                       $config->get( 'CrossSiteAJAXdomainExceptions' )
-               );
+                               return false;
+                       }
+
+                       $config = $this->getConfig();
+                       $matchOrigin = count( $origins ) === 1 && self::matchOrigin(
+                               $originParam,
+                               $config->get( 'CrossSiteAJAXdomains' ),
+                               $config->get( 'CrossSiteAJAXdomainExceptions' )
+                       );
+
+                       $allowOrigin = $originHeader;
+                       $allowCredentials = 'true';
+                       $allowTiming = $originHeader;
+               }
 
                if ( $matchOrigin ) {
                        $requestedMethod = $request->getHeader( 'Access-Control-Request-Method' );
@@ -659,10 +716,12 @@ class ApiMain extends ApiBase {
                                $response->header( 'Access-Control-Allow-Methods: POST, GET' );
                        }
 
-                       $response->header( "Access-Control-Allow-Origin: $originHeader" );
-                       $response->header( 'Access-Control-Allow-Credentials: true' );
+                       $response->header( "Access-Control-Allow-Origin: $allowOrigin" );
+                       $response->header( "Access-Control-Allow-Credentials: $allowCredentials" );
                        // http://www.w3.org/TR/resource-timing/#timing-allow-origin
-                       $response->header( "Timing-Allow-Origin: $originHeader" );
+                       if ( $allowTiming !== false ) {
+                               $response->header( "Timing-Allow-Origin: $allowTiming" );
+                       }
 
                        if ( !$preflight ) {
                                $response->header(
@@ -671,7 +730,10 @@ class ApiMain extends ApiBase {
                        }
                }
 
-               $this->getOutput()->addVaryHeader( 'Origin' );
+               if ( $varyOrigin ) {
+                       $this->getOutput()->addVaryHeader( 'Origin' );
+               }
+
                return true;
        }
 
@@ -1901,6 +1963,14 @@ class UsageException extends MWException {
                parent::__construct( $message, $code );
                $this->mCodestr = $codestr;
                $this->mExtraData = $extradata;
+
+               // This should never happen, so throw an exception about it that will
+               // hopefully get logged with a backtrace (T138585)
+               if ( !is_string( $codestr ) || $codestr === '' ) {
+                       throw new InvalidArgumentException( 'Invalid $codestr, was ' .
+                               ( $codestr === '' ? 'empty string' : gettype( $codestr ) )
+                       );
+               }
        }
 
        /**
index 066aaa3..b13ba58 100644 (file)
@@ -272,20 +272,7 @@ class ApiOpenSearch extends ApiBase {
                if ( $this->allowedParams !== null ) {
                        return $this->allowedParams;
                }
-               $this->allowedParams = [
-                       'search' => null,
-                       'limit' => [
-                               ApiBase::PARAM_DFLT => $this->getConfig()->get( 'OpenSearchDefaultLimit' ),
-                               ApiBase::PARAM_TYPE => 'limit',
-                               ApiBase::PARAM_MIN => 1,
-                               ApiBase::PARAM_MAX => 100,
-                               ApiBase::PARAM_MAX2 => 100
-                       ],
-                       'namespace' => [
-                               ApiBase::PARAM_DFLT => NS_MAIN,
-                               ApiBase::PARAM_TYPE => 'namespace',
-                               ApiBase::PARAM_ISMULTI => true
-                       ],
+               $this->allowedParams = $this->buildCommonApiParams( false ) + [
                        'suggest' => false,
                        'redirects' => [
                                ApiBase::PARAM_TYPE => [ 'return', 'resolve' ],
@@ -297,19 +284,21 @@ class ApiOpenSearch extends ApiBase {
                        'warningsaserror' => false,
                ];
 
-               $profileParam = $this->buildProfileApiParam( SearchEngine::COMPLETION_PROFILE_TYPE,
-                       'apihelp-query+prefixsearch-param-profile' );
-               if ( $profileParam ) {
-                       $this->allowedParams['profile'] = $profileParam;
-               }
+               // Use open search specific default limit
+               $this->allowedParams['limit'][ApiBase::PARAM_DFLT] = $this->getConfig()->get(
+                       'OpenSearchDefaultLimit'
+               );
+
                return $this->allowedParams;
        }
 
        public function getSearchProfileParams() {
-               if ( isset( $this->getAllowedParams()['profile'] ) ) {
-                       return [ SearchEngine::COMPLETION_PROFILE_TYPE => 'profile' ];
-               }
-               return [];
+               return [
+                       'qiprofile' => [
+                               'profile-type' => SearchEngine::COMPLETION_PROFILE_TYPE,
+                               'help-message' => 'apihelp-query+prefixsearch-param-profile'
+                       ],
+               ];
        }
 
        protected function getExamplesMessages() {
index fe418e3..d53dbb4 100644 (file)
@@ -109,13 +109,13 @@ class ApiParse extends ApiBase {
                                $titleObj = $rev->getTitle();
                                $wgTitle = $titleObj;
                                $pageObj = WikiPage::factory( $titleObj );
-                               $popts = $this->makeParserOptions( $pageObj, $params );
+                               list( $popts, $reset, $suppressCache ) = $this->makeParserOptions( $pageObj, $params );
 
                                // If for some reason the "oldid" is actually the current revision, it may be cached
                                // Deliberately comparing $pageObj->getLatest() with $rev->getId(), rather than
                                // checking $rev->isCurrent(), because $pageObj is what actually ends up being used,
                                // and if its ->getLatest() is outdated, $rev->isCurrent() won't tell us that.
-                               if ( $rev->getId() == $pageObj->getLatest() ) {
+                               if ( !$suppressCache && $rev->getId() == $pageObj->getLatest() ) {
                                        // May get from/save to parser cache
                                        $p_result = $this->getParsedContent( $pageObj, $popts,
                                                $pageid, isset( $prop['wikitext'] ) );
@@ -167,12 +167,12 @@ class ApiParse extends ApiBase {
                                        $oldid = $pageObj->getLatest();
                                }
 
-                               $popts = $this->makeParserOptions( $pageObj, $params );
+                               list( $popts, $reset, $suppressCache ) = $this->makeParserOptions( $pageObj, $params );
 
                                // Don't pollute the parser cache when setting options that aren't
                                // in ParserOptions::optionsHash()
                                /// @todo: This should be handled closer to the actual cache instead of here, see T110269
-                               $suppressCache =
+                               $suppressCache = $suppressCache ||
                                        $params['disablepp'] ||
                                        $params['disablelimitreport'] ||
                                        $params['preview'] ||
@@ -202,7 +202,7 @@ class ApiParse extends ApiBase {
                                $pageObj = $article->getPage();
                        }
 
-                       $popts = $this->makeParserOptions( $pageObj, $params );
+                       list( $popts, $reset ) = $this->makeParserOptions( $pageObj, $params );
                        $textProvided = !is_null( $text );
 
                        if ( !$textProvided ) {
@@ -346,22 +346,27 @@ class ApiParse extends ApiBase {
                }
 
                if ( isset( $prop['headitems'] ) || isset( $prop['headhtml'] ) ) {
-                       $context = $this->getContext();
+                       $context = new DerivativeContext( $this->getContext() );
                        $context->setTitle( $titleObj );
-                       $context->getOutput()->addParserOutputMetadata( $p_result );
+                       $context->setWikiPage( $pageObj );
+
+                       // We need an OutputPage tied to $context, not to the
+                       // RequestContext at the root of the stack.
+                       $output = new OutputPage( $context );
+                       $output->addParserOutputMetadata( $p_result );
 
                        if ( isset( $prop['headitems'] ) ) {
                                $headItems = $this->formatHeadItems( $p_result->getHeadItems() );
 
-                               $css = $this->formatCss( $context->getOutput()->buildCssLinksArray() );
+                               $css = $this->formatCss( $output->buildCssLinksArray() );
 
-                               $scripts = [ $context->getOutput()->getHeadScripts() ];
+                               $scripts = [ $output->getHeadScripts() ];
 
                                $result_array['headitems'] = array_merge( $headItems, $css, $scripts );
                        }
 
                        if ( isset( $prop['headhtml'] ) ) {
-                               $result_array['headhtml'] = $context->getOutput()->headElement( $context->getSkin() );
+                               $result_array['headhtml'] = $output->headElement( $context->getSkin() );
                                $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'headhtml';
                        }
                }
@@ -370,9 +375,6 @@ class ApiParse extends ApiBase {
                        $result_array['modules'] = array_values( array_unique( $p_result->getModules() ) );
                        $result_array['modulescripts'] = array_values( array_unique( $p_result->getModuleScripts() ) );
                        $result_array['modulestyles'] = array_values( array_unique( $p_result->getModuleStyles() ) );
-                       // To be removed in 1.27
-                       $result_array['modulemessages'] = [];
-                       $this->setWarning( 'modulemessages is deprecated since MediaWiki 1.26' );
                }
 
                if ( isset( $prop['jsconfigvars'] ) ) {
@@ -456,7 +458,6 @@ class ApiParse extends ApiBase {
                        'indicators' => 'ind',
                        'modulescripts' => 'm',
                        'modulestyles' => 'm',
-                       'modulemessages' => 'm',
                        'properties' => 'pp',
                        'limitreportdata' => 'lr',
                ];
@@ -470,10 +471,9 @@ class ApiParse extends ApiBase {
         * @param WikiPage $pageObj
         * @param array $params
         *
-        * @return ParserOptions
+        * @return array [ ParserOptions, ScopedCallback, bool $suppressCache ]
         */
        protected function makeParserOptions( WikiPage $pageObj, array $params ) {
-
                $popts = $pageObj->makeParserOptions( $this->getContext() );
                $popts->enableLimitReport( !$params['disablepp'] && !$params['disablelimitreport'] );
                $popts->setIsPreview( $params['preview'] || $params['sectionpreview'] );
@@ -483,7 +483,12 @@ class ApiParse extends ApiBase {
                        $popts->setTidy( false );
                }
 
-               return $popts;
+               $reset = null;
+               $suppressCache = false;
+               Hooks::run( 'ApiMakeParserOptions',
+                       [ $popts, $pageObj->getTitle(), $params, $this, &$reset, &$suppressCache ] );
+
+               return [ $popts, $reset, $suppressCache ];
        }
 
        /**
index 64bb9ba..822369a 100644 (file)
@@ -68,35 +68,37 @@ class ApiPurge extends ApiBase {
 
                                        # Parse content; note that HTML generation is only needed if we want to cache the result.
                                        $content = $page->getContent( Revision::RAW );
-                                       $enableParserCache = $this->getConfig()->get( 'EnableParserCache' );
-                                       $p_result = $content->getParserOutput(
-                                               $title,
-                                               $page->getLatest(),
-                                               $popts,
-                                               $enableParserCache
-                                       );
-
-                                       # Logging to better see expensive usage patterns
-                                       if ( $forceRecursiveLinkUpdate ) {
-                                               LoggerFactory::getInstance( 'RecursiveLinkPurge' )->info(
-                                                       "Recursive link purge enqueued for {title}",
-                                                       [
-                                                               'user' => $this->getUser()->getName(),
-                                                               'title' => $title->getPrefixedText()
-                                                       ]
+                                       if ( $content ) {
+                                               $enableParserCache = $this->getConfig()->get( 'EnableParserCache' );
+                                               $p_result = $content->getParserOutput(
+                                                       $title,
+                                                       $page->getLatest(),
+                                                       $popts,
+                                                       $enableParserCache
                                                );
-                                       }
-
-                                       # Update the links tables
-                                       $updates = $content->getSecondaryDataUpdates(
-                                               $title, null, $forceRecursiveLinkUpdate, $p_result );
-                                       DataUpdate::runUpdates( $updates );
-
-                                       $r['linkupdate'] = true;
 
-                                       if ( $enableParserCache ) {
-                                               $pcache = ParserCache::singleton();
-                                               $pcache->save( $p_result, $page, $popts );
+                                               # Logging to better see expensive usage patterns
+                                               if ( $forceRecursiveLinkUpdate ) {
+                                                       LoggerFactory::getInstance( 'RecursiveLinkPurge' )->info(
+                                                               "Recursive link purge enqueued for {title}",
+                                                               [
+                                                                       'user' => $this->getUser()->getName(),
+                                                                       'title' => $title->getPrefixedText()
+                                                               ]
+                                                       );
+                                               }
+
+                                               # Update the links tables
+                                               $updates = $content->getSecondaryDataUpdates(
+                                                       $title, null, $forceRecursiveLinkUpdate, $p_result );
+                                               DataUpdate::runUpdates( $updates );
+
+                                               $r['linkupdate'] = true;
+
+                                               if ( $enableParserCache ) {
+                                                       $pcache = ParserCache::singleton();
+                                                       $pcache->save( $p_result, $page, $popts );
+                                               }
                                        }
                                } else {
                                        $error = $this->parseMsg( [ 'actionthrottledtext' ] );
index ed4d373..5eb86ab 100644 (file)
@@ -443,16 +443,13 @@ class ApiQuery extends ApiBase {
                }
 
                $exporter = new WikiExporter( $this->getDB() );
-               // WikiExporter writes to stdout, so catch its
-               // output with an ob
-               ob_start();
+               $sink = new DumpStringOutput;
+               $exporter->setOutputSink( $sink );
                $exporter->openStream();
                foreach ( $exportTitles as $title ) {
                        $exporter->pageByTitle( $title );
                }
                $exporter->closeStream();
-               $exportxml = ob_get_contents();
-               ob_end_clean();
 
                // Don't check the size of exported stuff
                // It's not continuable, so it would cause more
@@ -460,10 +457,10 @@ class ApiQuery extends ApiBase {
                if ( $this->mParams['exportnowrap'] ) {
                        $result->reset();
                        // Raw formatter will handle this
-                       $result->addValue( null, 'text', $exportxml, ApiResult::NO_SIZE_CHECK );
+                       $result->addValue( null, 'text', $sink, ApiResult::NO_SIZE_CHECK );
                        $result->addValue( null, 'mime', 'text/xml', ApiResult::NO_SIZE_CHECK );
                } else {
-                       $result->addValue( 'query', 'export', $exportxml, ApiResult::NO_SIZE_CHECK );
+                       $result->addValue( 'query', 'export', $sink, ApiResult::NO_SIZE_CHECK );
                        $result->addValue( 'query', ApiResult::META_BC_SUBELEMENTS, [ 'export' ] );
                }
        }
index 46538e0..3bf6d3f 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-use MediaWiki\MediaWikiServices;
 
 /**
  * This program is free software; you can redistribute it and/or modify
@@ -106,42 +105,18 @@ class ApiQueryPrefixSearch extends ApiQueryGeneratorBase {
                if ( $this->allowedParams !== null ) {
                        return $this->allowedParams;
                }
-               $this->allowedParams = [
-                       'search' => [
-                               ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true,
-                       ],
-                       'namespace' => [
-                               ApiBase::PARAM_DFLT => NS_MAIN,
-                               ApiBase::PARAM_TYPE => 'namespace',
-                               ApiBase::PARAM_ISMULTI => true,
-                       ],
-                       'limit' => [
-                               ApiBase::PARAM_DFLT => 10,
-                               ApiBase::PARAM_TYPE => 'limit',
-                               ApiBase::PARAM_MIN => 1,
-                               // Non-standard value for compatibility with action=opensearch
-                               ApiBase::PARAM_MAX => 100,
-                               ApiBase::PARAM_MAX2 => 200,
-                       ],
-                       'offset' => [
-                               ApiBase::PARAM_DFLT => 0,
-                               ApiBase::PARAM_TYPE => 'integer',
-                       ],
-               ];
-               $profileParam = $this->buildProfileApiParam( SearchEngine::COMPLETION_PROFILE_TYPE,
-                       'apihelp-query+prefixsearch-param-profile' );
-               if ( $profileParam ) {
-                       $this->allowedParams['profile'] = $profileParam;
-               }
+               $this->allowedParams = $this->buildCommonApiParams();
+
                return $this->allowedParams;
        }
 
        public function getSearchProfileParams() {
-               if ( isset( $this->getAllowedParams()['profile'] ) ) {
-                       return [ SearchEngine::COMPLETION_PROFILE_TYPE => 'profile' ];
-               }
-               return [];
+               return [
+                       'profile' => [
+                               'profile-type' => SearchEngine::COMPLETION_PROFILE_TYPE,
+                               'help-message' => 'apihelp-query+prefixsearch-param-profile',
+                       ],
+               ];
        }
 
        protected function getExamplesMessages() {
index f0fd2f4..63c95d3 100644 (file)
@@ -150,7 +150,6 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                 *              AND rc_timestamp < $end AND rc_namespace = $namespace
                 */
                $this->addTables( 'recentchanges' );
-               $index = [ 'recentchanges' => 'rc_timestamp' ]; // May change
                $this->addTimestampWhereRange( 'rc_timestamp', $params['dir'], $params['start'], $params['end'] );
 
                if ( !is_null( $params['continue'] ) ) {
@@ -246,7 +245,6 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 
                if ( !is_null( $params['user'] ) ) {
                        $this->addWhereFld( 'rc_user_text', $params['user'] );
-                       $index['recentchanges'] = 'rc_user_text';
                }
 
                if ( !is_null( $params['excludeuser'] ) ) {
@@ -362,7 +360,6 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 
                $this->token = $params['token'];
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
-               $this->addOption( 'USE INDEX', $index );
 
                $count = 0;
                /* Perform the actual query. */
index 80798a1..f46b5d2 100644 (file)
@@ -37,14 +37,6 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
        /** @var array list of api allowed params */
        private $allowedParams;
 
-       /**
-        * When $wgSearchType is null, $wgSearchAlternatives[0] is null. Null isn't
-        * a valid option for an array for PARAM_TYPE, so we'll use a fake name
-        * that can't possibly be a class name and describes what the null behavior
-        * does
-        */
-       const BACKEND_NULL_PARAM = 'database-backed';
-
        public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'sr' );
        }
@@ -65,10 +57,6 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                global $wgContLang;
                $params = $this->extractRequestParams();
 
-               if ( isset( $params['backend'] ) && $params['backend'] == self::BACKEND_NULL_PARAM ) {
-                       unset( $params['backend'] );
-               }
-
                // Extract parameters
                $query = $params['search'];
                $what = $params['what'];
@@ -231,16 +219,15 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                $hasInterwikiResults = false;
                $totalhits = null;
                if ( $interwiki && $resultPageSet === null && $matches->hasInterwikiResults() ) {
-                       foreach ( $matches->getInterwikiResults() as $matches ) {
-                               $matches = $matches->getInterwikiResults();
+                       foreach ( $matches->getInterwikiResults() as $interwikiMatches ) {
                                $hasInterwikiResults = true;
 
                                // Include number of results if requested
                                if ( $resultPageSet === null && isset( $searchInfo['totalhits'] ) ) {
-                                       $totalhits += $matches->getTotalHits();
+                                       $totalhits += $interwikiMatches->getTotalHits();
                                }
 
-                               $result = $matches->next();
+                               $result = $interwikiMatches->next();
                                while ( $result ) {
                                        $title = $result->getTitle();
 
@@ -267,7 +254,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                                                $titles[] = $title;
                                        }
 
-                                       $result = $matches->next();
+                                       $result = $interwikiMatches->next();
                                }
                        }
                        if ( $totalhits !== null ) {
@@ -309,16 +296,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                        return $this->allowedParams;
                }
 
-               $this->allowedParams = [
-                       'search' => [
-                               ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true
-                       ],
-                       'namespace' => [
-                               ApiBase::PARAM_DFLT => NS_MAIN,
-                               ApiBase::PARAM_TYPE => 'namespace',
-                               ApiBase::PARAM_ISMULTI => true,
-                       ],
+               $this->allowedParams = $this->buildCommonApiParams() + [
                        'what' => [
                                ApiBase::PARAM_TYPE => [
                                        'title',
@@ -355,52 +333,20 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_HELP_MSG_PER_VALUE => [],
                        ],
-                       'offset' => [
-                               ApiBase::PARAM_DFLT => 0,
-                               ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
-                       ],
-                       'limit' => [
-                               ApiBase::PARAM_DFLT => 10,
-                               ApiBase::PARAM_TYPE => 'limit',
-                               ApiBase::PARAM_MIN => 1,
-                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
-                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
-                       ],
                        'interwiki' => false,
                        'enablerewrites' => false,
                ];
 
-               $searchConfig = MediaWikiServices::getInstance()->getSearchEngineConfig();
-               $alternatives = $searchConfig->getSearchTypes();
-               if ( count( $alternatives ) > 1 ) {
-                       if ( $alternatives[0] === null ) {
-                               $alternatives[0] = self::BACKEND_NULL_PARAM;
-                       }
-                       $this->allowedParams['backend'] = [
-                               ApiBase::PARAM_DFLT => $searchConfig->getSearchType(),
-                               ApiBase::PARAM_TYPE => $alternatives,
-                       ];
-                       // @todo: support profile selection when multiple
-                       // backends are available. The solution could be to
-                       // merge all possible profiles and let ApiBase
-                       // subclasses do the check. Making ApiHelp and ApiSandbox
-                       // comprehensive might be more difficult.
-               } else {
-                       $profileParam = $this->buildProfileApiParam( SearchEngine::FT_QUERY_INDEP_PROFILE_TYPE,
-                               'apihelp-query+search-param-qiprofile' );
-                       if ( $profileParam ) {
-                               $this->allowedParams['qiprofile'] = $profileParam;
-                       }
-               }
-
                return $this->allowedParams;
        }
 
        public function getSearchProfileParams() {
-               if ( isset( $this->getAllowedParams()['qiprofile'] ) ) {
-                       return [ SearchEngine::FT_QUERY_INDEP_PROFILE_TYPE => 'qiprofile' ];
-               }
-               return [];
+               return [
+                       'qiprofile' => [
+                               'profile-type' => SearchEngine::FT_QUERY_INDEP_PROFILE_TYPE,
+                               'help-message' => 'apihelp-query+search-param-qiprofile',
+                       ],
+               ];
        }
 
        protected function getExamplesMessages() {
index 0774651..97042af 100644 (file)
@@ -181,6 +181,10 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $data['legaltitlechars'] = Title::legalChars();
                $data['invalidusernamechars'] = $config->get( 'InvalidUsernameCharacters' );
 
+               $data['allunicodefixes'] = (bool)$config->get( 'AllUnicodeFixes' );
+               $data['fixarabicunicode'] = (bool)$config->get( 'FixArabicUnicode' );
+               $data['fixmalayalamunicode'] = (bool)$config->get( 'FixMalayalamUnicode' );
+
                global $IP;
                $git = SpecialVersion::getGitHeadSha1( $IP );
                if ( $git ) {
@@ -221,6 +225,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                }
                $data['writeapi'] = (bool)$config->get( 'EnableWriteAPI' );
 
+               $data['maxarticlesize'] = $config->get( 'MaxArticleSize' ) * 1024;
+
                $tz = $config->get( 'Localtimezone' );
                $offset = $config->get( 'LocalTZoffset' );
                if ( is_null( $tz ) ) {
@@ -245,7 +251,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 
                $data['uploadsenabled'] = UploadBase::isEnabled();
                $data['maxuploadsize'] = UploadBase::getMaxUploadSize();
-               $data['minuploadchunksize'] = (int)$this->getConfig()->get( 'MinUploadChunkSize' );
+               $data['minuploadchunksize'] = (int)$config->get( 'MinUploadChunkSize' );
 
                $data['thumblimits'] = $config->get( 'ThumbLimits' );
                ApiResult::setArrayType( $data['thumblimits'], 'BCassoc' );
@@ -264,10 +270,12 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $data['favicon'] = wfExpandUrl( $favicon, PROTO_RELATIVE );
                }
 
-               $data['centralidlookupprovider'] = $this->getConfig()->get( 'CentralIdLookupProvider' );
-               $providerIds = array_keys( $this->getConfig()->get( 'CentralIdLookupProviders' ) );
+               $data['centralidlookupprovider'] = $config->get( 'CentralIdLookupProvider' );
+               $providerIds = array_keys( $config->get( 'CentralIdLookupProviders' ) );
                $data['allcentralidlookupproviders'] = $providerIds;
 
+               $data['interwikimagic'] = (bool)$config->get( 'InterwikiMagic' );
+
                Hooks::run( 'APIQuerySiteInfoGeneralInfo', [ $this, &$data ] );
 
                return $this->getResult()->addValue( 'query', $property, $data );
index 0688970..60e91e8 100644 (file)
@@ -35,7 +35,8 @@ class ApiQueryContributions extends ApiQueryBase {
                parent::__construct( $query, $moduleName, 'uc' );
        }
 
-       private $params, $prefixMode, $userprefix, $multiUserMode, $usernames, $parentLens;
+       private $params, $prefixMode, $userprefix, $multiUserMode, $idMode, $usernames, $userids,
+               $parentLens;
        private $fld_ids = false, $fld_title = false, $fld_timestamp = false,
                $fld_comment = false, $fld_parsedcomment = false, $fld_flags = false,
                $fld_patrolled = false, $fld_tags = false, $fld_size = false, $fld_sizediff = false;
@@ -64,11 +65,14 @@ class ApiQueryContributions extends ApiQueryBase {
                // TODO: if the query is going only against the revision table, should this be done?
                $this->selectNamedDB( 'contributions', DB_SLAVE, 'contributions' );
 
+               $this->idMode = false;
                if ( isset( $this->params['userprefix'] ) ) {
                        $this->prefixMode = true;
                        $this->multiUserMode = true;
                        $this->userprefix = $this->params['userprefix'];
                } else {
+                       $anyIPs = false;
+                       $this->userids = [];
                        $this->usernames = [];
                        if ( !is_array( $this->params['user'] ) ) {
                                $this->params['user'] = [ $this->params['user'] ];
@@ -77,10 +81,32 @@ class ApiQueryContributions extends ApiQueryBase {
                                $this->dieUsage( 'User parameter may not be empty.', 'param_user' );
                        }
                        foreach ( $this->params['user'] as $u ) {
-                               $this->prepareUsername( $u );
+                               if ( is_null( $u ) || $u === '' ) {
+                                       $this->dieUsage( 'User parameter may not be empty', 'param_user' );
+                               }
+
+                               if ( User::isIP( $u ) ) {
+                                       $anyIPs = true;
+                                       $this->usernames[] = $u;
+                               } else {
+                                       $name = User::getCanonicalName( $u, 'valid' );
+                                       if ( $name === false ) {
+                                               $this->dieUsage( "User name {$u} is not valid", 'param_user' );
+                                       }
+                                       $this->usernames[] = $name;
+                               }
                        }
                        $this->prefixMode = false;
                        $this->multiUserMode = ( count( $this->params['user'] ) > 1 );
+
+                       if ( !$anyIPs ) {
+                               $dbr = $this->getDB();
+                               $res = $dbr->select( 'user', 'user_id', [ 'user_name' => $this->usernames ], __METHOD__ );
+                               foreach ( $res as $row ) {
+                                       $this->userids[] = $row->user_id;
+                               }
+                               $this->idMode = count( $this->userids ) === count( $this->usernames );
+                       }
                }
 
                $this->prepareQuery();
@@ -126,27 +152,6 @@ class ApiQueryContributions extends ApiQueryBase {
                );
        }
 
-       /**
-        * Validate the 'user' parameter and set the value to compare
-        * against `revision`.`rev_user_text`
-        *
-        * @param string $user
-        */
-       private function prepareUsername( $user ) {
-               if ( !is_null( $user ) && $user !== '' ) {
-                       $name = User::isIP( $user )
-                               ? $user
-                               : User::getCanonicalName( $user, 'valid' );
-                       if ( $name === false ) {
-                               $this->dieUsage( "User name {$user} is not valid", 'param_user' );
-                       } else {
-                               $this->usernames[] = $name;
-                       }
-               } else {
-                       $this->dieUsage( 'User parameter may not be empty', 'param_user' );
-               }
-       }
-
        /**
         * Prepares the query and returns the limit of rows requested
         */
@@ -163,7 +168,17 @@ class ApiQueryContributions extends ApiQueryBase {
                        $continue = explode( '|', $this->params['continue'] );
                        $db = $this->getDB();
                        if ( $this->multiUserMode ) {
-                               $this->dieContinueUsageIf( count( $continue ) != 3 );
+                               $this->dieContinueUsageIf( count( $continue ) != 4 );
+                               $modeFlag = array_shift( $continue );
+                               $this->dieContinueUsageIf( !in_array( $modeFlag, [ 'id', 'name' ] ) );
+                               if ( $this->idMode && $modeFlag === 'name' ) {
+                                       // The users were created since this query started, but we
+                                       // can't go back and change modes now. So just keep on with
+                                       // name mode.
+                                       $this->idMode = false;
+                               }
+                               $this->dieContinueUsageIf( ( $modeFlag === 'id' ) !== $this->idMode );
+                               $userField = $this->idMode ? 'rev_user' : 'rev_user_text';
                                $encUser = $db->addQuotes( array_shift( $continue ) );
                        } else {
                                $this->dieContinueUsageIf( count( $continue ) != 2 );
@@ -174,8 +189,8 @@ class ApiQueryContributions extends ApiQueryBase {
                        $op = ( $this->params['dir'] == 'older' ? '<' : '>' );
                        if ( $this->multiUserMode ) {
                                $this->addWhere(
-                                       "rev_user_text $op $encUser OR " .
-                                       "(rev_user_text = $encUser AND " .
+                                       "$userField $op $encUser OR " .
+                                       "($userField = $encUser AND " .
                                        "(rev_timestamp $op $encTS OR " .
                                        "(rev_timestamp = $encTS AND " .
                                        "rev_id $op= $encId)))"
@@ -206,14 +221,17 @@ class ApiQueryContributions extends ApiQueryBase {
                if ( $this->prefixMode ) {
                        $this->addWhere( 'rev_user_text' .
                                $this->getDB()->buildLike( $this->userprefix, $this->getDB()->anyString() ) );
+               } elseif ( $this->idMode ) {
+                       $this->addWhereFld( 'rev_user', $this->userids );
                } else {
                        $this->addWhereFld( 'rev_user_text', $this->usernames );
                }
                // ... and in the specified timeframe.
-               // Ensure the same sort order for rev_user_text and rev_timestamp
+               // Ensure the same sort order for rev_user/rev_user_text and rev_timestamp
                // so our query is indexed
                if ( $this->multiUserMode ) {
-                       $this->addWhereRange( 'rev_user_text', $this->params['dir'], null, null );
+                       $this->addWhereRange( $this->idMode ? 'rev_user' : 'rev_user_text',
+                               $this->params['dir'], null, null );
                }
                $this->addTimestampWhereRange( 'rev_timestamp',
                        $this->params['dir'], $this->params['start'], $this->params['end'] );
@@ -247,7 +265,6 @@ class ApiQueryContributions extends ApiQueryBase {
                        $this->addWhereIf( 'rev_parent_id = 0', isset( $show['new'] ) );
                }
                $this->addOption( 'LIMIT', $this->params['limit'] + 1 );
-               $index = [ 'revision' => 'usertext_timestamp' ];
 
                // Mandatory fields: timestamp allows request continuation
                // ns+title checks if the user has access rights for this page
@@ -430,7 +447,11 @@ class ApiQueryContributions extends ApiQueryBase {
 
        private function continueStr( $row ) {
                if ( $this->multiUserMode ) {
-                       return "$row->rev_user_text|$row->rev_timestamp|$row->rev_id";
+                       if ( $this->idMode ) {
+                               return "id|$row->rev_user|$row->rev_timestamp|$row->rev_id";
+                       } else {
+                               return "name|$row->rev_user_text|$row->rev_timestamp|$row->rev_id";
+                       }
                } else {
                        return "$row->rev_timestamp|$row->rev_id";
                }
index db2cf86..e2599d1 100644 (file)
@@ -24,6 +24,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This query action allows clients to retrieve a list of recently modified pages
  * that are part of the logged-in user's watchlist.
@@ -85,96 +87,59 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        }
                }
 
-               $this->addFields( [
-                       'rc_id',
-                       'rc_namespace',
-                       'rc_title',
-                       'rc_timestamp',
-                       'rc_type',
-                       'rc_deleted',
-               ] );
+               $options = [
+                       'dir' => $params['dir'] === 'older'
+                               ? WatchedItemQueryService::DIR_OLDER
+                               : WatchedItemQueryService::DIR_NEWER,
+               ];
 
                if ( is_null( $resultPageSet ) ) {
-                       $this->addFields( [
-                               'rc_cur_id',
-                               'rc_this_oldid',
-                               'rc_last_oldid',
-                       ] );
-
-                       $this->addFieldsIf( [ 'rc_type', 'rc_minor', 'rc_bot' ], $this->fld_flags );
-                       $this->addFieldsIf( 'rc_user', $this->fld_user || $this->fld_userid );
-                       $this->addFieldsIf( 'rc_user_text', $this->fld_user );
-                       $this->addFieldsIf( 'rc_comment', $this->fld_comment || $this->fld_parsedcomment );
-                       $this->addFieldsIf( [ 'rc_patrolled', 'rc_log_type' ], $this->fld_patrol );
-                       $this->addFieldsIf( [ 'rc_old_len', 'rc_new_len' ], $this->fld_sizes );
-                       $this->addFieldsIf( 'wl_notificationtimestamp', $this->fld_notificationtimestamp );
-                       $this->addFieldsIf(
-                               [ 'rc_logid', 'rc_log_type', 'rc_log_action', 'rc_params' ],
-                               $this->fld_loginfo
-                       );
-               } elseif ( $params['allrev'] ) {
-                       $this->addFields( 'rc_this_oldid' );
+                       $options['includeFields'] = $this->getFieldsToInclude();
                } else {
-                       $this->addFields( 'rc_cur_id' );
+                       $options['usedInGenerator'] = true;
                }
 
-               $this->addTables( [
-                       'recentchanges',
-                       'watchlist',
-               ] );
-
-               $userId = $wlowner->getId();
-               $this->addJoinConds( [ 'watchlist' => [ 'INNER JOIN',
-                       [
-                               'wl_user' => $userId,
-                               'wl_namespace=rc_namespace',
-                               'wl_title=rc_title'
-                       ]
-               ] ] );
-
-               $db = $this->getDB();
-
-               $this->addTimestampWhereRange( 'rc_timestamp', $params['dir'],
-                       $params['start'], $params['end'] );
-               // Include in ORDER BY for uniqueness
-               $this->addWhereRange( 'rc_id', $params['dir'], null, null );
+               if ( $params['start'] ) {
+                       $options['start'] = $params['start'];
+               }
+               if ( $params['end'] ) {
+                       $options['end'] = $params['end'];
+               }
 
                if ( !is_null( $params['continue'] ) ) {
                        $cont = explode( '|', $params['continue'] );
                        $this->dieContinueUsageIf( count( $cont ) != 2 );
-                       $op = ( $params['dir'] === 'newer' ? '>' : '<' );
-                       $continueTimestamp = $db->addQuotes( $db->timestamp( $cont[0] ) );
+                       $continueTimestamp = $cont[0];
                        $continueId = (int)$cont[1];
                        $this->dieContinueUsageIf( $continueId != $cont[1] );
-                       $this->addWhere( "rc_timestamp $op $continueTimestamp OR " .
-                               "(rc_timestamp = $continueTimestamp AND " .
-                               "rc_id $op= $continueId)"
-                       );
+                       $options['startFrom'] = [ $continueTimestamp, $continueId ];
                }
 
-               $this->addWhereFld( 'wl_namespace', $params['namespace'] );
+               if ( $wlowner !== $user ) {
+                       $options['watchlistOwner'] = $wlowner;
+                       $options['watchlistOwnerToken'] = $params['token'];
+               }
 
-               if ( !$params['allrev'] ) {
-                       $this->addTables( 'page' );
-                       $this->addJoinConds( [ 'page' => [ 'LEFT JOIN', 'rc_cur_id=page_id' ] ] );
-                       $this->addWhere( 'rc_this_oldid=page_latest OR rc_type=' . RC_LOG );
+               if ( !is_null( $params['namespace'] ) ) {
+                       $options['namespaceIds'] = $params['namespace'];
+               }
+
+               if ( $params['allrev'] ) {
+                       $options['allRevisions'] = true;
                }
 
                if ( !is_null( $params['show'] ) ) {
                        $show = array_flip( $params['show'] );
 
                        /* Check for conflicting parameters. */
-                       if ( ( isset( $show['minor'] ) && isset( $show['!minor'] ) )
-                               || ( isset( $show['bot'] ) && isset( $show['!bot'] ) )
-                               || ( isset( $show['anon'] ) && isset( $show['!anon'] ) )
-                               || ( isset( $show['patrolled'] ) && isset( $show['!patrolled'] ) )
-                               || ( isset( $show['unread'] ) && isset( $show['!unread'] ) )
-                       ) {
+                       if ( $this->showParamsConflicting( $show ) ) {
                                $this->dieUsageMsg( 'show' );
                        }
 
                        // Check permissions.
-                       if ( isset( $show['patrolled'] ) || isset( $show['!patrolled'] ) ) {
+                       if ( isset( $show[WatchedItemQueryService::FILTER_PATROLLED] )
+                               || isset( $show[WatchedItemQueryService::FILTER_NOT_PATROLLED] )
+                       ) {
                                if ( !$user->useRCPatrol() && !$user->useNPPatrol() ) {
                                        $this->dieUsage(
                                                'You need the patrol right to request the patrolled flag',
@@ -183,25 +148,12 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                                }
                        }
 
-                       /* Add additional conditions to query depending upon parameters. */
-                       $this->addWhereIf( 'rc_minor = 0', isset( $show['!minor'] ) );
-                       $this->addWhereIf( 'rc_minor != 0', isset( $show['minor'] ) );
-                       $this->addWhereIf( 'rc_bot = 0', isset( $show['!bot'] ) );
-                       $this->addWhereIf( 'rc_bot != 0', isset( $show['bot'] ) );
-                       $this->addWhereIf( 'rc_user = 0', isset( $show['anon'] ) );
-                       $this->addWhereIf( 'rc_user != 0', isset( $show['!anon'] ) );
-                       $this->addWhereIf( 'rc_patrolled = 0', isset( $show['!patrolled'] ) );
-                       $this->addWhereIf( 'rc_patrolled != 0', isset( $show['patrolled'] ) );
-                       $this->addWhereIf( 'rc_timestamp >= wl_notificationtimestamp', isset( $show['unread'] ) );
-                       $this->addWhereIf(
-                               'wl_notificationtimestamp IS NULL OR rc_timestamp < wl_notificationtimestamp',
-                               isset( $show['!unread'] )
-                       );
+                       $options['filters'] = array_keys( $show );
                }
 
                if ( !is_null( $params['type'] ) ) {
                        try {
-                               $this->addWhereFld( 'rc_type', RecentChange::parseToRCType( $params['type'] ) );
+                               $options['rcTypes'] = RecentChange::parseToRCType( $params['type'] );
                        } catch ( Exception $e ) {
                                ApiBase::dieDebug( __METHOD__, $e->getMessage() );
                        }
@@ -211,74 +163,46 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        $this->dieUsage( 'user and excludeuser cannot be used together', 'user-excludeuser' );
                }
                if ( !is_null( $params['user'] ) ) {
-                       $this->addWhereFld( 'rc_user_text', $params['user'] );
+                       $options['onlyByUser'] = $params['user'];
                }
                if ( !is_null( $params['excludeuser'] ) ) {
-                       $this->addWhere( 'rc_user_text != ' . $db->addQuotes( $params['excludeuser'] ) );
+                       $options['notByUser'] = $params['excludeuser'];
                }
 
-               // This is an index optimization for mysql, as done in the Special:Watchlist page
-               $this->addWhereIf(
-                       "rc_timestamp > ''",
-                       !isset( $params['start'] ) && !isset( $params['end'] ) && $db->getType() == 'mysql'
-               );
-
-               // Paranoia: avoid brute force searches (bug 17342)
-               if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
-                       if ( !$user->isAllowed( 'deletedhistory' ) ) {
-                               $bitmask = Revision::DELETED_USER;
-                       } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
-                               $bitmask = Revision::DELETED_USER | Revision::DELETED_RESTRICTED;
-                       } else {
-                               $bitmask = 0;
-                       }
-                       if ( $bitmask ) {
-                               $this->addWhere( $this->getDB()->bitAnd( 'rc_deleted', $bitmask ) . " != $bitmask" );
-                       }
-               }
-
-               // LogPage::DELETED_ACTION hides the affected page, too. So hide those
-               // entirely from the watchlist, or someone could guess the title.
-               if ( !$user->isAllowed( 'deletedhistory' ) ) {
-                       $bitmask = LogPage::DELETED_ACTION;
-               } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
-                       $bitmask = LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED;
-               } else {
-                       $bitmask = 0;
-               }
-               if ( $bitmask ) {
-                       $this->addWhere( $this->getDB()->makeList( [
-                               'rc_type != ' . RC_LOG,
-                               $this->getDB()->bitAnd( 'rc_deleted', $bitmask ) . " != $bitmask",
-                       ], LIST_OR ) );
-               }
-
-               $this->addOption( 'LIMIT', $params['limit'] + 1 );
+               $options['limit'] = $params['limit'] + 1;
 
                $ids = [];
                $count = 0;
-               $res = $this->select( __METHOD__ );
+               $watchedItemQuery = MediaWikiServices::getInstance()->getWatchedItemQueryService();
+               $items = $watchedItemQuery->getWatchedItemsWithRecentChangeInfo( $wlowner, $options );
 
-               foreach ( $res as $row ) {
+               foreach ( $items as list ( $watchedItem, $recentChangeInfo ) ) {
+                       /** @var WatchedItem $watchedItem */
                        if ( ++$count > $params['limit'] ) {
                                // We've reached the one extra which shows that there are
                                // additional pages to be had. Stop here...
-                               $this->setContinueEnumParameter( 'continue', "$row->rc_timestamp|$row->rc_id" );
+                               $this->setContinueEnumParameter(
+                                       'continue',
+                                       $recentChangeInfo['rc_timestamp'] . '|' . $recentChangeInfo['rc_id']
+                               );
                                break;
                        }
 
                        if ( is_null( $resultPageSet ) ) {
-                               $vals = $this->extractRowInfo( $row );
+                               $vals = $this->extractOutputData( $watchedItem, $recentChangeInfo );
                                $fit = $this->getResult()->addValue( [ 'query', $this->getModuleName() ], null, $vals );
                                if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'continue', "$row->rc_timestamp|$row->rc_id" );
+                                       $this->setContinueEnumParameter(
+                                               'continue',
+                                               $recentChangeInfo['rc_timestamp'] . '|' . $recentChangeInfo['rc_id']
+                                       );
                                        break;
                                }
                        } else {
                                if ( $params['allrev'] ) {
-                                       $ids[] = intval( $row->rc_this_oldid );
+                                       $ids[] = intval( $recentChangeInfo['rc_this_oldid'] );
                                } else {
-                                       $ids[] = intval( $row->rc_cur_id );
+                                       $ids[] = intval( $recentChangeInfo['rc_cur_id'] );
                                }
                        }
                }
@@ -295,56 +219,106 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                }
        }
 
-       private function extractRowInfo( $row ) {
+       private function getFieldsToInclude() {
+               $includeFields = [];
+               if ( $this->fld_flags ) {
+                       $includeFields[] = WatchedItemQueryService::INCLUDE_FLAGS;
+               }
+               if ( $this->fld_user || $this->fld_userid ) {
+                       $includeFields[] = WatchedItemQueryService::INCLUDE_USER_ID;
+               }
+               if ( $this->fld_user ) {
+                       $includeFields[] = WatchedItemQueryService::INCLUDE_USER;
+               }
+               if ( $this->fld_comment || $this->fld_parsedcomment ) {
+                       $includeFields[] = WatchedItemQueryService::INCLUDE_COMMENT;
+               }
+               if ( $this->fld_patrol ) {
+                       $includeFields[] = WatchedItemQueryService::INCLUDE_PATROL_INFO;
+               }
+               if ( $this->fld_sizes ) {
+                       $includeFields[] = WatchedItemQueryService::INCLUDE_SIZES;
+               }
+               if ( $this->fld_loginfo ) {
+                       $includeFields[] = WatchedItemQueryService::INCLUDE_LOG_INFO;
+               }
+               return $includeFields;
+       }
+
+       private function showParamsConflicting( array $show ) {
+               return ( isset( $show[WatchedItemQueryService::FILTER_MINOR] )
+                       && isset( $show[WatchedItemQueryService::FILTER_NOT_MINOR] ) )
+               || ( isset( $show[WatchedItemQueryService::FILTER_BOT] )
+                       && isset( $show[WatchedItemQueryService::FILTER_NOT_BOT] ) )
+               || ( isset( $show[WatchedItemQueryService::FILTER_ANON] )
+                       && isset( $show[WatchedItemQueryService::FILTER_NOT_ANON] ) )
+               || ( isset( $show[WatchedItemQueryService::FILTER_PATROLLED] )
+                       && isset( $show[WatchedItemQueryService::FILTER_NOT_PATROLLED] ) )
+               || ( isset( $show[WatchedItemQueryService::FILTER_UNREAD] )
+                       && isset( $show[WatchedItemQueryService::FILTER_NOT_UNREAD] ) );
+       }
+
+       private function extractOutputData( WatchedItem $watchedItem, array $recentChangeInfo ) {
                /* Determine the title of the page that has been changed. */
-               $title = Title::makeTitle( $row->rc_namespace, $row->rc_title );
+               $title = Title::makeTitle(
+                       $watchedItem->getLinkTarget()->getNamespace(),
+                       $watchedItem->getLinkTarget()->getDBkey()
+               );
                $user = $this->getUser();
 
                /* Our output data. */
                $vals = [];
-               $type = intval( $row->rc_type );
+               $type = intval( $recentChangeInfo['rc_type'] );
                $vals['type'] = RecentChange::parseFromRCType( $type );
                $anyHidden = false;
 
                /* Create a new entry in the result for the title. */
                if ( $this->fld_title || $this->fld_ids ) {
                        // These should already have been filtered out of the query, but just in case.
-                       if ( $type === RC_LOG && ( $row->rc_deleted & LogPage::DELETED_ACTION ) ) {
+                       if ( $type === RC_LOG && ( $recentChangeInfo['rc_deleted'] & LogPage::DELETED_ACTION ) ) {
                                $vals['actionhidden'] = true;
                                $anyHidden = true;
                        }
                        if ( $type !== RC_LOG ||
-                               LogEventsList::userCanBitfield( $row->rc_deleted, LogPage::DELETED_ACTION, $user )
+                               LogEventsList::userCanBitfield(
+                                       $recentChangeInfo['rc_deleted'],
+                                       LogPage::DELETED_ACTION,
+                                       $user
+                               )
                        ) {
                                if ( $this->fld_title ) {
                                        ApiQueryBase::addTitleInfo( $vals, $title );
                                }
                                if ( $this->fld_ids ) {
-                                       $vals['pageid'] = intval( $row->rc_cur_id );
-                                       $vals['revid'] = intval( $row->rc_this_oldid );
-                                       $vals['old_revid'] = intval( $row->rc_last_oldid );
+                                       $vals['pageid'] = intval( $recentChangeInfo['rc_cur_id'] );
+                                       $vals['revid'] = intval( $recentChangeInfo['rc_this_oldid'] );
+                                       $vals['old_revid'] = intval( $recentChangeInfo['rc_last_oldid'] );
                                }
                        }
                }
 
                /* Add user data and 'anon' flag, if user is anonymous. */
                if ( $this->fld_user || $this->fld_userid ) {
-                       if ( $row->rc_deleted & Revision::DELETED_USER ) {
+                       if ( $recentChangeInfo['rc_deleted'] & Revision::DELETED_USER ) {
                                $vals['userhidden'] = true;
                                $anyHidden = true;
                        }
-                       if ( Revision::userCanBitfield( $row->rc_deleted, Revision::DELETED_USER, $user ) ) {
+                       if ( Revision::userCanBitfield(
+                               $recentChangeInfo['rc_deleted'],
+                               Revision::DELETED_USER,
+                               $user
+                       ) ) {
                                if ( $this->fld_userid ) {
-                                       $vals['userid'] = (int)$row->rc_user;
+                                       $vals['userid'] = (int)$recentChangeInfo['rc_user'];
                                        // for backwards compatibility
-                                       $vals['user'] = (int)$row->rc_user;
+                                       $vals['user'] = (int)$recentChangeInfo['rc_user'];
                                }
 
                                if ( $this->fld_user ) {
-                                       $vals['user'] = $row->rc_user_text;
+                                       $vals['user'] = $recentChangeInfo['rc_user_text'];
                                }
 
-                               if ( !$row->rc_user ) {
+                               if ( !$recentChangeInfo['rc_user'] ) {
                                        $vals['anon'] = true;
                                }
                        }
@@ -352,65 +326,73 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 
                /* Add flags, such as new, minor, bot. */
                if ( $this->fld_flags ) {
-                       $vals['bot'] = (bool)$row->rc_bot;
-                       $vals['new'] = $row->rc_type == RC_NEW;
-                       $vals['minor'] = (bool)$row->rc_minor;
+                       $vals['bot'] = (bool)$recentChangeInfo['rc_bot'];
+                       $vals['new'] = $recentChangeInfo['rc_type'] == RC_NEW;
+                       $vals['minor'] = (bool)$recentChangeInfo['rc_minor'];
                }
 
                /* Add sizes of each revision. (Only available on 1.10+) */
                if ( $this->fld_sizes ) {
-                       $vals['oldlen'] = intval( $row->rc_old_len );
-                       $vals['newlen'] = intval( $row->rc_new_len );
+                       $vals['oldlen'] = intval( $recentChangeInfo['rc_old_len'] );
+                       $vals['newlen'] = intval( $recentChangeInfo['rc_new_len'] );
                }
 
                /* Add the timestamp. */
                if ( $this->fld_timestamp ) {
-                       $vals['timestamp'] = wfTimestamp( TS_ISO_8601, $row->rc_timestamp );
+                       $vals['timestamp'] = wfTimestamp( TS_ISO_8601, $recentChangeInfo['rc_timestamp'] );
                }
 
                if ( $this->fld_notificationtimestamp ) {
-                       $vals['notificationtimestamp'] = ( $row->wl_notificationtimestamp == null )
+                       $vals['notificationtimestamp'] = ( $watchedItem->getNotificationTimestamp() == null )
                                ? ''
-                               : wfTimestamp( TS_ISO_8601, $row->wl_notificationtimestamp );
+                               : wfTimestamp( TS_ISO_8601, $watchedItem->getNotificationTimestamp() );
                }
 
                /* Add edit summary / log summary. */
                if ( $this->fld_comment || $this->fld_parsedcomment ) {
-                       if ( $row->rc_deleted & Revision::DELETED_COMMENT ) {
+                       if ( $recentChangeInfo['rc_deleted'] & Revision::DELETED_COMMENT ) {
                                $vals['commenthidden'] = true;
                                $anyHidden = true;
                        }
-                       if ( Revision::userCanBitfield( $row->rc_deleted, Revision::DELETED_COMMENT, $user ) ) {
-                               if ( $this->fld_comment && isset( $row->rc_comment ) ) {
-                                       $vals['comment'] = $row->rc_comment;
+                       if ( Revision::userCanBitfield(
+                               $recentChangeInfo['rc_deleted'],
+                               Revision::DELETED_COMMENT,
+                               $user
+                       ) ) {
+                               if ( $this->fld_comment && isset( $recentChangeInfo['rc_comment'] ) ) {
+                                       $vals['comment'] = $recentChangeInfo['rc_comment'];
                                }
 
-                               if ( $this->fld_parsedcomment && isset( $row->rc_comment ) ) {
-                                       $vals['parsedcomment'] = Linker::formatComment( $row->rc_comment, $title );
+                               if ( $this->fld_parsedcomment && isset( $recentChangeInfo['rc_comment'] ) ) {
+                                       $vals['parsedcomment'] = Linker::formatComment( $recentChangeInfo['rc_comment'], $title );
                                }
                        }
                }
 
                /* Add the patrolled flag */
                if ( $this->fld_patrol ) {
-                       $vals['patrolled'] = $row->rc_patrolled == 1;
-                       $vals['unpatrolled'] = ChangesList::isUnpatrolled( $row, $user );
+                       $vals['patrolled'] = $recentChangeInfo['rc_patrolled'] == 1;
+                       $vals['unpatrolled'] = ChangesList::isUnpatrolled( (object)$recentChangeInfo, $user );
                }
 
-               if ( $this->fld_loginfo && $row->rc_type == RC_LOG ) {
-                       if ( $row->rc_deleted & LogPage::DELETED_ACTION ) {
+               if ( $this->fld_loginfo && $recentChangeInfo['rc_type'] == RC_LOG ) {
+                       if ( $recentChangeInfo['rc_deleted'] & LogPage::DELETED_ACTION ) {
                                $vals['actionhidden'] = true;
                                $anyHidden = true;
                        }
-                       if ( LogEventsList::userCanBitfield( $row->rc_deleted, LogPage::DELETED_ACTION, $user ) ) {
-                               $vals['logid'] = intval( $row->rc_logid );
-                               $vals['logtype'] = $row->rc_log_type;
-                               $vals['logaction'] = $row->rc_log_action;
-                               $vals['logparams'] = LogFormatter::newFromRow( $row )->formatParametersForApi();
+                       if ( LogEventsList::userCanBitfield(
+                               $recentChangeInfo['rc_deleted'],
+                               LogPage::DELETED_ACTION,
+                               $user
+                       ) ) {
+                               $vals['logid'] = intval( $recentChangeInfo['rc_logid'] );
+                               $vals['logtype'] = $recentChangeInfo['rc_log_type'];
+                               $vals['logaction'] = $recentChangeInfo['rc_log_action'];
+                               $vals['logparams'] = LogFormatter::newFromRow( $recentChangeInfo )->formatParametersForApi();
                        }
                }
 
-               if ( $anyHidden && ( $row->rc_deleted & Revision::DELETED_RESTRICTED ) ) {
+               if ( $anyHidden && ( $recentChangeInfo['rc_deleted'] & Revision::DELETED_RESTRICTED ) ) {
                        $vals['suppressed'] = true;
                }
 
@@ -473,16 +455,16 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        'show' => [
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => [
-                                       'minor',
-                                       '!minor',
-                                       'bot',
-                                       '!bot',
-                                       'anon',
-                                       '!anon',
-                                       'patrolled',
-                                       '!patrolled',
-                                       'unread',
-                                       '!unread',
+                                       WatchedItemQueryService::FILTER_MINOR,
+                                       WatchedItemQueryService::FILTER_NOT_MINOR,
+                                       WatchedItemQueryService::FILTER_BOT,
+                                       WatchedItemQueryService::FILTER_NOT_BOT,
+                                       WatchedItemQueryService::FILTER_ANON,
+                                       WatchedItemQueryService::FILTER_NOT_ANON,
+                                       WatchedItemQueryService::FILTER_PATROLLED,
+                                       WatchedItemQueryService::FILTER_NOT_PATROLLED,
+                                       WatchedItemQueryService::FILTER_UNREAD,
+                                       WatchedItemQueryService::FILTER_NOT_UNREAD,
                                ]
                        ],
                        'type' => [
index 742f8f5..806861e 100644 (file)
@@ -24,6 +24,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This query action allows clients to retrieve a list of pages
  * on the logged-in user's watchlist.
@@ -49,95 +51,78 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
         * @return void
         */
        private function run( $resultPageSet = null ) {
-               $this->selectNamedDB( 'watchlist', DB_SLAVE, 'watchlist' );
-
                $params = $this->extractRequestParams();
 
                $user = $this->getWatchlistUser( $params );
 
                $prop = array_flip( (array)$params['prop'] );
                $show = array_flip( (array)$params['show'] );
-               if ( isset( $show['changed'] ) && isset( $show['!changed'] ) ) {
+               if ( isset( $show[WatchedItemQueryService::FILTER_CHANGED] )
+                       && isset( $show[WatchedItemQueryService::FILTER_NOT_CHANGED] )
+               ) {
                        $this->dieUsageMsg( 'show' );
                }
 
-               $this->addTables( 'watchlist' );
-               $this->addFields( [ 'wl_namespace', 'wl_title' ] );
-               $this->addFieldsIf( 'wl_notificationtimestamp', isset( $prop['changed'] ) );
-               $this->addWhereFld( 'wl_user', $user->getId() );
-               $this->addWhereFld( 'wl_namespace', $params['namespace'] );
-               $this->addWhereIf( 'wl_notificationtimestamp IS NOT NULL', isset( $show['changed'] ) );
-               $this->addWhereIf( 'wl_notificationtimestamp IS NULL', isset( $show['!changed'] ) );
+               $options = [];
+               if ( $params['namespace'] ) {
+                       $options['namespaceIds'] = $params['namespace'];
+               }
+               if ( isset( $show[WatchedItemQueryService::FILTER_CHANGED] ) ) {
+                       $options['filter'] = WatchedItemQueryService::FILTER_CHANGED;
+               }
+               if ( isset( $show[WatchedItemQueryService::FILTER_NOT_CHANGED] ) ) {
+                       $options['filter'] = WatchedItemQueryService::FILTER_NOT_CHANGED;
+               }
 
                if ( isset( $params['continue'] ) ) {
                        $cont = explode( '|', $params['continue'] );
                        $this->dieContinueUsageIf( count( $cont ) != 2 );
                        $ns = intval( $cont[0] );
                        $this->dieContinueUsageIf( strval( $ns ) !== $cont[0] );
-                       $title = $this->getDB()->addQuotes( $cont[1] );
-                       $op = $params['dir'] == 'ascending' ? '>' : '<';
-                       $this->addWhere(
-                               "wl_namespace $op $ns OR " .
-                               "(wl_namespace = $ns AND " .
-                               "wl_title $op= $title)"
-                       );
+                       $title = $cont[1];
+                       $options['startFrom'] = new TitleValue( $ns, $title );
                }
 
                if ( isset( $params['fromtitle'] ) ) {
                        list( $ns, $title ) = $this->prefixedTitlePartToKey( $params['fromtitle'] );
-                       $title = $this->getDB()->addQuotes( $title );
-                       $op = $params['dir'] == 'ascending' ? '>' : '<';
-                       $this->addWhere(
-                               "wl_namespace $op $ns OR " .
-                               "(wl_namespace = $ns AND " .
-                               "wl_title $op= $title)"
-                       );
+                       $options['from'] = new TitleValue( $ns, $title );
                }
 
                if ( isset( $params['totitle'] ) ) {
                        list( $ns, $title ) = $this->prefixedTitlePartToKey( $params['totitle'] );
-                       $title = $this->getDB()->addQuotes( $title );
-                       $op = $params['dir'] == 'ascending' ? '<' : '>'; // Reversed from above!
-                       $this->addWhere(
-                               "wl_namespace $op $ns OR " .
-                               "(wl_namespace = $ns AND " .
-                               "wl_title $op= $title)"
-                       );
+                       $options['until'] = new TitleValue( $ns, $title );
                }
 
-               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
-               // Don't ORDER BY wl_namespace if it's constant in the WHERE clause
-               if ( count( $params['namespace'] ) == 1 ) {
-                       $this->addOption( 'ORDER BY', 'wl_title' . $sort );
-               } else {
-                       $this->addOption( 'ORDER BY', [
-                               'wl_namespace' . $sort,
-                               'wl_title' . $sort
-                       ] );
+               $options['sort'] = WatchedItemStore::SORT_ASC;
+               if ( $params['dir'] === 'descending' ) {
+                       $options['sort'] = WatchedItemStore::SORT_DESC;
                }
-               $this->addOption( 'LIMIT', $params['limit'] + 1 );
-               $res = $this->select( __METHOD__ );
+               $options['limit'] = $params['limit'] + 1;
 
                $titles = [];
                $count = 0;
-               foreach ( $res as $row ) {
+               $items = MediaWikiServices::getInstance()->getWatchedItemQueryService()
+                       ->getWatchedItemsForUser( $user, $options );
+               foreach ( $items as $item ) {
+                       $ns = $item->getLinkTarget()->getNamespace();
+                       $dbKey = $item->getLinkTarget()->getDBkey();
                        if ( ++$count > $params['limit'] ) {
                                // We've reached the one extra which shows that there are
                                // additional pages to be had. Stop here...
-                               $this->setContinueEnumParameter( 'continue', $row->wl_namespace . '|' . $row->wl_title );
+                               $this->setContinueEnumParameter( 'continue', $ns . '|' . $dbKey );
                                break;
                        }
-                       $t = Title::makeTitle( $row->wl_namespace, $row->wl_title );
+                       $t = Title::makeTitle( $ns, $dbKey );
 
                        if ( is_null( $resultPageSet ) ) {
                                $vals = [];
                                ApiQueryBase::addTitleInfo( $vals, $t );
-                               if ( isset( $prop['changed'] ) && !is_null( $row->wl_notificationtimestamp ) ) {
-                                       $vals['changed'] = wfTimestamp( TS_ISO_8601, $row->wl_notificationtimestamp );
+                               if ( isset( $prop['changed'] ) && !is_null( $item->getNotificationTimestamp() ) ) {
+                                       $vals['changed'] = wfTimestamp( TS_ISO_8601, $item->getNotificationTimestamp() );
                                }
                                $fit = $this->getResult()->addValue( $this->getModuleName(), null, $vals );
                                if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'continue', $row->wl_namespace . '|' . $row->wl_title );
+                                       $this->setContinueEnumParameter( 'continue', $ns . '|' . $dbKey );
                                        break;
                                }
                        } else {
@@ -177,8 +162,8 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
                        'show' => [
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => [
-                                       'changed',
-                                       '!changed',
+                                       WatchedItemQueryService::FILTER_CHANGED,
+                                       WatchedItemQueryService::FILTER_NOT_CHANGED
                                ]
                        ],
                        'owner' => [
@@ -193,7 +178,6 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
                                        'ascending',
                                        'descending'
                                ],
-                               ApiBase::PARAM_HELP_MSG => 'api-help-param-direction',
                        ],
                        'fromtitle' => [
                                ApiBase::PARAM_TYPE => 'string'
index 6b3c26e..446a98c 100644 (file)
@@ -41,6 +41,7 @@ class ApiStashEdit extends ApiBase {
        const ERROR_UNCACHEABLE = 'uncacheable';
 
        const PRESUME_FRESH_TTL_SEC = 30;
+       const MAX_CACHE_TTL = 300; // 5 minutes
 
        public function execute() {
                $user = $this->getUser();
@@ -121,7 +122,7 @@ class ApiStashEdit extends ApiBase {
                if ( $user->pingLimiter( 'stashedit' ) ) {
                        $status = 'ratelimited';
                } elseif ( $dbw->lock( $key, __METHOD__, 1 ) ) {
-                       $status = self::parseAndStash( $page, $content, $user );
+                       $status = self::parseAndStash( $page, $content, $user, $params['summary'] );
                        $dbw->unlock( $key, __METHOD__ );
                } else {
                        $status = 'busy';
@@ -134,25 +135,28 @@ class ApiStashEdit extends ApiBase {
 
        /**
         * @param WikiPage $page
-        * @param Content $content
+        * @param Content $content Edit content
         * @param User $user
+        * @param string $summary Edit summary
         * @return integer ApiStashEdit::ERROR_* constant
         * @since 1.25
         */
-       public static function parseAndStash( WikiPage $page, Content $content, User $user ) {
+       public static function parseAndStash( WikiPage $page, Content $content, User $user, $summary ) {
                $cache = ObjectCache::getLocalClusterInstance();
                $logger = LoggerFactory::getInstance( 'StashEdit' );
 
                $format = $content->getDefaultFormat();
                $editInfo = $page->prepareContentForEdit( $content, null, $user, $format, false );
+               $title = $page->getTitle();
 
                if ( $editInfo && $editInfo->output ) {
-                       $key = self::getStashKey( $page->getTitle(), $content, $user );
+                       $key = self::getStashKey( $title, $content, $user );
 
                        // Let extensions add ParserOutput metadata or warm other caches
-                       Hooks::run( 'ParserOutputStashForEdit', [ $page, $content, $editInfo->output ] );
+                       Hooks::run( 'ParserOutputStashForEdit',
+                               [ $page, $content, $editInfo->output, $summary, $user ] );
 
-                       list( $stashInfo, $ttl ) = self::buildStashValue(
+                       list( $stashInfo, $ttl, $code ) = self::buildStashValue(
                                $editInfo->pstContent,
                                $editInfo->output,
                                $editInfo->timestamp,
@@ -162,14 +166,14 @@ class ApiStashEdit extends ApiBase {
                        if ( $stashInfo ) {
                                $ok = $cache->set( $key, $stashInfo, $ttl );
                                if ( $ok ) {
-                                       $logger->debug( "Cached parser output for key '$key'." );
+                                       $logger->debug( "Cached parser output for key '$key' ('$title')." );
                                        return self::ERROR_NONE;
                                } else {
-                                       $logger->error( "Failed to cache parser output for key '$key'." );
+                                       $logger->error( "Failed to cache parser output for key '$key' ('$title')." );
                                        return self::ERROR_CACHE;
                                }
                        } else {
-                               $logger->info( "Uncacheable parser output for key '$key'." );
+                               $logger->info( "Uncacheable parser output for key '$key' ('$title') [$code]." );
                                return self::ERROR_UNCACHEABLE;
                        }
                }
@@ -177,76 +181,6 @@ class ApiStashEdit extends ApiBase {
                return self::ERROR_PARSE;
        }
 
-       /**
-        * Attempt to cache PST content and corresponding parser output in passing
-        *
-        * This method can be called when the output was already generated for other
-        * reasons. Parsing should not be done just to call this method, however.
-        * $pstOpts must be that of the user doing the edit preview. If $pOpts does
-        * not match the options of WikiPage::makeParserOptions( 'canonical' ), this
-        * will do nothing. Provided the values are cacheable, they will be stored
-        * in memcached so that final edit submission might make use of them.
-        *
-        * @param Page|Article|WikiPage $page Page title
-        * @param Content $content Proposed page content
-        * @param Content $pstContent The result of preSaveTransform() on $content
-        * @param ParserOutput $pOut The result of getParserOutput() on $pstContent
-        * @param ParserOptions $pstOpts Options for $pstContent (MUST be for prospective author)
-        * @param ParserOptions $pOpts Options for $pOut
-        * @param string $timestamp TS_MW timestamp of parser output generation
-        * @return bool Success
-        */
-       public static function stashEditFromPreview(
-               Page $page, Content $content, Content $pstContent, ParserOutput $pOut,
-               ParserOptions $pstOpts, ParserOptions $pOpts, $timestamp
-       ) {
-               $cache = ObjectCache::getLocalClusterInstance();
-               $logger = LoggerFactory::getInstance( 'StashEdit' );
-
-               // getIsPreview() controls parser function behavior that references things
-               // like user/revision that don't exists yet. The user/text should already
-               // be set correctly by callers, just double check the preview flag.
-               if ( !$pOpts->getIsPreview() ) {
-                       return false; // sanity
-               } elseif ( $pOpts->getIsSectionPreview() ) {
-                       return false; // short-circuit (need the full content)
-               }
-
-               // PST parser options are for the user (handles signatures, etc...)
-               $user = $pstOpts->getUser();
-               // Get a key based on the source text, format, and user preferences
-               $key = self::getStashKey( $page->getTitle(), $content, $user );
-
-               // Parser output options must match cannonical options.
-               // Treat some options as matching that are different but don't matter.
-               $canonicalPOpts = $page->makeParserOptions( 'canonical' );
-               $canonicalPOpts->setIsPreview( true ); // force match
-               $canonicalPOpts->setTimestamp( $pOpts->getTimestamp() ); // force match
-               if ( !$pOpts->matches( $canonicalPOpts ) ) {
-                       $logger->info( "Uncacheable preview output for key '$key' (options)." );
-                       return false;
-               }
-
-               // Set the time the output was generated
-               $pOut->setCacheTime( wfTimestampNow() );
-
-               // Build a value to cache with a proper TTL
-               list( $stashInfo, $ttl ) = self::buildStashValue( $pstContent, $pOut, $timestamp, $user );
-               if ( !$stashInfo ) {
-                       $logger->info( "Uncacheable parser output for key '$key' (rev/TTL)." );
-                       return false;
-               }
-
-               $ok = $cache->set( $key, $stashInfo, $ttl );
-               if ( !$ok ) {
-                       $logger->error( "Failed to cache preview parser output for key '$key'." );
-               } else {
-                       $logger->debug( "Cached preview output for key '$key'." );
-               }
-
-               return $ok;
-       }
-
        /**
         * Check that a prepared edit is in cache and still up-to-date
         *
@@ -294,86 +228,42 @@ class ApiStashEdit extends ApiBase {
 
                if ( !is_object( $editInfo ) || !$editInfo->output ) {
                        $stats->increment( 'editstash.cache_misses.no_stash' );
-                       $logger->debug( "No cache value for key '$key'." );
+                       $logger->debug( "Empty cache for key '$key' ('$title'); user '{$user->getName()}'." );
                        return false;
                }
 
                $age = time() - wfTimestamp( TS_UNIX, $editInfo->output->getCacheTime() );
                if ( $age <= self::PRESUME_FRESH_TTL_SEC ) {
+                       // Assume nothing changed in this time
                        $stats->increment( 'editstash.cache_hits.presumed_fresh' );
                        $logger->debug( "Timestamp-based cache hit for key '$key' (age: $age sec)." );
-                       return $editInfo; // assume nothing changed
                } elseif ( isset( $editInfo->edits ) && $editInfo->edits === $user->getEditCount() ) {
                        // Logged-in user made no local upload/template edits in the meantime
                        $stats->increment( 'editstash.cache_hits.presumed_fresh' );
                        $logger->debug( "Edit count based cache hit for key '$key' (age: $age sec)." );
-                       return $editInfo;
                } elseif ( $user->isAnon()
                        && self::lastEditTime( $user ) < $editInfo->output->getCacheTime()
                ) {
                        // Logged-out user made no local upload/template edits in the meantime
                        $stats->increment( 'editstash.cache_hits.presumed_fresh' );
                        $logger->debug( "Edit check based cache hit for key '$key' (age: $age sec)." );
-                       return $editInfo;
-               }
-
-               $dbr = wfGetDB( DB_SLAVE );
-
-               $templates = []; // conditions to find changes/creations
-               $templateUses = 0; // expected existing templates
-               foreach ( $editInfo->output->getTemplateIds() as $ns => $stuff ) {
-                       foreach ( $stuff as $dbkey => $revId ) {
-                               $templates[(string)$ns][$dbkey] = (int)$revId;
-                               ++$templateUses;
-                       }
-               }
-               // Check that no templates used in the output changed...
-               if ( count( $templates ) ) {
-                       $res = $dbr->select(
-                               'page',
-                               [ 'ns' => 'page_namespace', 'dbk' => 'page_title', 'page_latest' ],
-                               $dbr->makeWhereFrom2d( $templates, 'page_namespace', 'page_title' ),
-                               __METHOD__
-                       );
-                       $changed = false;
-                       foreach ( $res as $row ) {
-                               $changed = $changed || ( $row->page_latest != $templates[$row->ns][$row->dbk] );
-                       }
-
-                       if ( $changed || $res->numRows() != $templateUses ) {
-                               $stats->increment( 'editstash.cache_misses.proven_stale' );
-                               $logger->info( "Stale cache for key '$key'; template changed. (age: $age sec)" );
-                               return false;
-                       }
-               }
-
-               $files = []; // conditions to find changes/creations
-               foreach ( $editInfo->output->getFileSearchOptions() as $name => $options ) {
-                       $files[$name] = (string)$options['sha1'];
+               } else {
+                       // User may have changed included content
+                       $editInfo = false;
                }
-               // Check that no files used in the output changed...
-               if ( count( $files ) ) {
-                       $res = $dbr->select(
-                               'image',
-                               [ 'name' => 'img_name', 'img_sha1' ],
-                               [ 'img_name' => array_keys( $files ) ],
-                               __METHOD__
-                       );
-                       $changed = false;
-                       foreach ( $res as $row ) {
-                               $changed = $changed || ( $row->img_sha1 != $files[$row->name] );
-                       }
 
-                       if ( $changed || $res->numRows() != count( $files ) ) {
-                               $stats->increment( 'editstash.cache_misses.proven_stale' );
-                               $logger->info( "Stale cache for key '$key'; file changed. (age: $age sec)" );
-                               return false;
-                       }
+               if ( !$editInfo ) {
+                       $stats->increment( 'editstash.cache_misses.proven_stale' );
+                       $logger->info( "Stale cache for key '$key'; old key with outside edits. (age: $age sec)" );
+               } elseif ( $editInfo->output->getFlag( 'vary-revision' ) ) {
+                       // This can be used for the initial parse, e.g. for filters or doEditContent(),
+                       // but a second parse will be triggered in doEditUpdates(). This is not optimal.
+                       $logger->info( "Cache for key '$key' ('$title') has vary_revision." );
+               } elseif ( $editInfo->output->getFlag( 'vary-revision-id' ) ) {
+                       // Similar to the above if we didn't guess the ID correctly.
+                       $logger->info( "Cache for key '$key' ('$title') has vary_revision_id." );
                }
 
-               $stats->increment( 'editstash.cache_hits.proven_fresh' );
-               $logger->debug( "Verified cache hit for key '$key' (age: $age sec)." );
-
                return $editInfo;
        }
 
@@ -427,7 +317,7 @@ class ApiStashEdit extends ApiBase {
         * @param ParserOutput $parserOutput
         * @param string $timestamp TS_MW
         * @param User $user
-        * @return array (stash info array, TTL in seconds) or (null, 0)
+        * @return array (stash info array, TTL in seconds, info code) or (null, 0, info code)
         */
        private static function buildStashValue(
                Content $pstContent, ParserOutput $parserOutput, $timestamp, User $user
@@ -435,20 +325,20 @@ class ApiStashEdit extends ApiBase {
                // 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.
                $since = time() - wfTimestamp( TS_UNIX, $parserOutput->getTimestamp() );
-               $ttl = min( $parserOutput->getCacheExpiry() - $since, 5 * 60 );
-
-               if ( $ttl > 0 && !$parserOutput->getFlag( 'vary-revision' ) ) {
-                       // Only store what is actually needed
-                       $stashInfo = (object)[
-                               'pstContent' => $pstContent,
-                               'output'     => $parserOutput,
-                               'timestamp'  => $timestamp,
-                               'edits'      => $user->getEditCount()
-                       ];
-                       return [ $stashInfo, $ttl ];
+               $ttl = min( $parserOutput->getCacheExpiry() - $since, self::MAX_CACHE_TTL );
+               if ( $ttl <= 0 ) {
+                       return [ null, 0, 'no_ttl' ];
                }
 
-               return [ null, 0 ];
+               // Only store what is actually needed
+               $stashInfo = (object)[
+                       'pstContent' => $pstContent,
+                       'output'     => $parserOutput,
+                       'timestamp'  => $timestamp,
+                       'edits'      => $user->getEditCount()
+               ];
+
+               return [ $stashInfo, $ttl, 'ok' ];
        }
 
        public function getAllowedParams() {
@@ -467,6 +357,9 @@ class ApiStashEdit extends ApiBase {
                                ApiBase::PARAM_TYPE => 'text',
                                ApiBase::PARAM_REQUIRED => true
                        ],
+                       'summary' => [
+                               ApiBase::PARAM_TYPE => 'string',
+                       ],
                        'contentmodel' => [
                                ApiBase::PARAM_TYPE => ContentHandler::getContentModels(),
                                ApiBase::PARAM_REQUIRED => true
index 0a79aa4..95659e5 100644 (file)
@@ -347,12 +347,13 @@ class ApiUpload extends ApiBase {
         * Throw an error that the user can recover from by providing a better
         * value for $parameter
         *
-        * @param array $error Error array suitable for passing to dieUsageMsg()
+        * @param array|string|MessageSpecifier $error Error suitable for passing to dieUsageMsg()
         * @param string $parameter Parameter that needs revising
         * @param array $data Optional extra data to pass to the user
+        * @param string $code Error code to use if the error is unknown
         * @throws UsageException
         */
-       private function dieRecoverableError( $error, $parameter, $data = [] ) {
+       private function dieRecoverableError( $error, $parameter, $data = [], $code = 'unknownerror' ) {
                try {
                        $data['filekey'] = $this->performStash();
                        $data['sessionkey'] = $data['filekey'];
@@ -365,6 +366,9 @@ class ApiUpload extends ApiBase {
                if ( isset( $parsed['data'] ) ) {
                        $data = array_merge( $data, $parsed['data'] );
                }
+               if ( $parsed['code'] === 'unknownerror' ) {
+                       $parsed['code'] = $code;
+               }
 
                $this->dieUsage( $parsed['info'], $parsed['code'], 0, $data );
        }
@@ -563,12 +567,28 @@ class ApiUpload extends ApiBase {
                                $this->dieUsage( $msg, 'filetype-banned', 0, $extradata );
                                break;
                        case UploadBase::VERIFICATION_ERROR:
-                               $params = $verification['details'];
-                               $key = array_shift( $params );
-                               $msg = $this->msg( $key, $params )->inLanguage( 'en' )->useDatabase( false )->text();
-                               ApiResult::setIndexedTagName( $verification['details'], 'detail' );
-                               $this->dieUsage( "This file did not pass file verification: $msg", 'verification-error',
-                                       0, [ 'details' => $verification['details'] ] );
+                               $parsed = $this->parseMsg( $verification['details'] );
+                               $info = "This file did not pass file verification: {$parsed['info']}";
+                               if ( $verification['details'][0] instanceof IApiMessage ) {
+                                       $code = $parsed['code'];
+                               } else {
+                                       // For backwards-compatibility, all of the errors from UploadBase::verifyFile() are
+                                       // reported as 'verification-error', and the real error code is reported in 'details'.
+                                       $code = 'verification-error';
+                               }
+                               if ( $verification['details'][0] instanceof IApiMessage ) {
+                                       $msg = $verification['details'][0];
+                                       $details = array_merge( [ $msg->getKey() ], $msg->getParams() );
+                               } else {
+                                       $details = $verification['details'];
+                               }
+                               ApiResult::setIndexedTagName( $details, 'detail' );
+                               $data = [ 'details' => $details ];
+                               if ( isset( $parsed['data'] ) ) {
+                                       $data = array_merge( $data, $parsed['data'] );
+                               }
+
+                               $this->dieUsage( $info, $code, 0, $data );
                                break;
                        case UploadBase::HOOK_ABORTED:
                                if ( is_array( $verification['error'] ) ) {
@@ -754,9 +774,14 @@ class ApiUpload extends ApiBase {
                                $this->mParams['text'], $watch, $this->getUser(), $this->mParams['tags'] );
 
                        if ( !$status->isGood() ) {
-                               $error = $status->getErrorsArray();
-                               ApiResult::setIndexedTagName( $error, 'error' );
-                               $this->dieUsage( 'An internal error occurred', 'internal-error', 0, $error );
+                               // Is there really no better way to do this?
+                               $errors = $status->getErrorsByType( 'error' );
+                               $msg = array_merge( [ $errors[0]['message'] ], $errors[0]['params'] );
+                               $data = $status->getErrorsArray();
+                               ApiResult::setIndexedTagName( $data, 'error' );
+                               // For backwards-compatibility, we use the 'internal-error' fallback key and merge $data
+                               // into the root of the response (rather than something sane like [ 'details' => $data ]).
+                               $this->dieRecoverableError( $msg, null, $data, 'internal-error' );
                        }
                        $result['result'] = 'Success';
                }
index 139793d..8ae1192 100644 (file)
@@ -26,26 +26,89 @@ use MediaWiki\MediaWikiServices;
  * @ingroup API
  */
 trait SearchApi {
+
+       /**
+        * When $wgSearchType is null, $wgSearchAlternatives[0] is null. Null isn't
+        * a valid option for an array for PARAM_TYPE, so we'll use a fake name
+        * that can't possibly be a class name and describes what the null behavior
+        * does
+        */
+       private static $BACKEND_NULL_PARAM = 'database-backed';
+
        /**
-        * Build the profile api param definitions.
+        * The set of api parameters that are shared between api calls that
+        * call the SearchEngine. Primarily this defines parameters that
+        * are utilized by self::buildSearchEngine().
         *
-        * @param string $profileType type of profile to customize
-        * @param string $helpMsg i18n message
-        * @param string|null $backendType SearchEngine backend type or null for default engine
-        * @return array|null the api param definition or null if profiles are
-        * not supported by the searchEngine implementation.
+        * @param bool $isScrollable True if the api offers scrolling
+        * @return array
         */
-       public function buildProfileApiParam( $profileType, $helpMsg, $backendType = null ) {
-               $searchEngine = null;
-               if ( $backendType !== null ) {
-                       $searchEngine = MediaWikiServices::getInstance()
-                               ->getSearchEngineFactory()->create( $backendType );
+       public function buildCommonApiParams( $isScrollable = true ) {
+               $params = [
+                       'search' => [
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_REQUIRED => true,
+                       ],
+                       'namespace' => [
+                               ApiBase::PARAM_DFLT => NS_MAIN,
+                               ApiBase::PARAM_TYPE => 'namespace',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ],
+                       'limit' => [
+                               ApiBase::PARAM_DFLT => 10,
+                               ApiBase::PARAM_TYPE => 'limit',
+                               ApiBase::PARAM_MIN => 1,
+                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2,
+                       ],
+               ];
+               if ( $isScrollable ) {
+                       $params['offset'] = [
+                               ApiBase::PARAM_DFLT => 0,
+                               ApiBase::PARAM_TYPE => 'integer',
+                               ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
+                       ];
+               }
+
+               $searchConfig = MediaWikiServices::getInstance()->getSearchEngineConfig();
+               $alternatives = $searchConfig->getSearchTypes();
+               if ( count( $alternatives ) > 1 ) {
+                       if ( $alternatives[0] === null ) {
+                               $alternatives[0] = self::$BACKEND_NULL_PARAM;
+                       }
+                       $this->allowedParams['backend'] = [
+                               ApiBase::PARAM_DFLT => $searchConfig->getSearchType(),
+                               ApiBase::PARAM_TYPE => $alternatives,
+                       ];
+                       // @todo: support profile selection when multiple
+                       // backends are available. The solution could be to
+                       // merge all possible profiles and let ApiBase
+                       // subclasses do the check. Making ApiHelp and ApiSandbox
+                       // comprehensive might be more difficult.
                } else {
-                       $searchEngine = MediaWikiServices::getInstance()->newSearchEngine();
+                       $params += $this->buildProfileApiParam();
                }
 
-               $profiles = $searchEngine->getProfiles( $profileType );
-               if ( $profiles ) {
+               return $params;
+       }
+
+       /**
+        * Build the profile api param definitions. Makes bold assumption only one search
+        * engine is available, ensure that is true before calling.
+        *
+        * @return array array containing available additional api param definitions.
+        *  Empty if profiles are not supported by the searchEngine implementation.
+        */
+       private function buildProfileApiParam() {
+               $configs = $this->getSearchProfileParams();
+               $searchEngine = MediaWikiServices::getInstance()->newSearchEngine();
+               $params = [];
+               foreach ( $configs as $paramName => $paramConfig ) {
+                       $profiles = $searchEngine->getProfiles( $paramConfig['profile-type'] );
+                       if ( !$profiles ) {
+                               continue;
+                       }
+
                        $types = [];
                        $helpMessages = [];
                        $defaultProfile = null;
@@ -58,20 +121,23 @@ trait SearchApi {
                                        $defaultProfile = $profile['name'];
                                }
                        }
-                       return [
+
+                       $params[$paramName] = [
                                ApiBase::PARAM_TYPE => $types,
-                               ApiBase::PARAM_HELP_MSG => $helpMsg,
+                               ApiBase::PARAM_HELP_MSG => $paramConfig['help-message'],
                                ApiBase::PARAM_HELP_MSG_PER_VALUE => $helpMessages,
                                ApiBase::PARAM_DFLT => $defaultProfile,
                        ];
                }
-               return null;
+
+               return $params;
        }
 
        /**
         * Build the search engine to use.
         * If $params is provided then the following searchEngine options
         * will be set:
+        *  - backend: which search backend to use
         *  - limit: mandatory
         *  - offset: optional, if set limit will be incremented by
         *    one ( to support the continue parameter )
@@ -84,6 +150,9 @@ trait SearchApi {
        public function buildSearchEngine( array $params = null ) {
                if ( $params != null ) {
                        $type = isset( $params['backend'] ) ? $params['backend'] : null;
+                       if ( $type === self::$BACKEND_NULL_PARAM ) {
+                               $type = null;
+                       }
                        $searchEngine = MediaWikiServices::getInstance()->getSearchEngineFactory()->create( $type );
                        $limit = $params['limit'];
                        $searchEngine->setNamespaces( $params['namespace'] );
@@ -97,9 +166,15 @@ trait SearchApi {
                                $limit += 1;
                        }
                        $searchEngine->setLimitOffset( $limit, $offset );
-                       foreach ( $this->getSearchProfileParams() as $type => $param ) {
-                               if ( isset( $params[$param] ) ) {
-                                       $searchEngine->setFeatureData( $type, $params[$param] );
+
+                       // Initialize requested search profiles.
+                       $configs = $this->getSearchProfileParams();
+                       foreach ( $configs as $paramName => $paramConfig ) {
+                               if ( isset( $params[$paramName] ) ) {
+                                       $searchEngine->setFeatureData(
+                                               $paramConfig['profile-type'],
+                                               $params[$paramName]
+                                       );
                                }
                        }
                } else {
@@ -109,8 +184,8 @@ trait SearchApi {
        }
 
        /**
-        * @return string[] the list of supported search profile types. Key is
-        * the profile type and its associated value is the request param.
+        * @return array[] array of arrays mapping from parameter name to a two value map
+        *  containing 'help-message' and 'profile-type' keys.
         */
        abstract public function getSearchProfileParams();
 }
diff --git a/includes/api/i18n/azb.json b/includes/api/i18n/azb.json
new file mode 100644 (file)
index 0000000..ca09cf6
--- /dev/null
@@ -0,0 +1,15 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Ilğım"
+               ]
+       },
+       "apihelp-main-param-action": "هانسی ایش گؤرولسون.",
+       "apihelp-main-param-requestid": "بۇرادا یازیلان هر میقدار جاوابا آرتیلاجاقدیر. ایستک‌لری فرقلندیرمه‌یه ایشلنه بیلر.",
+       "apihelp-block-param-nocreate": "حساب آچماغین قاباغینی آل.",
+       "apihelp-checktoken-param-token": "تِست اۆچون توکن.",
+       "apihelp-compare-param-fromtitle": "مۆقاییسه اۆچون ایلک باشلیق.",
+       "apihelp-delete-description": "بیر صفحه‌نی سیل.",
+       "apihelp-delete-param-unwatch": "صفحه‌نی ایزله‌دیکلر لیستیندن سیل.",
+       "apihelp-edit-description": "صفحه‌لری یارادیب دَییشدیر."
+}
index 3b5201a..c7bfb23 100644 (file)
@@ -15,7 +15,7 @@
        "apihelp-main-param-requestid": "Любое значэньне, пададзенае тут, будзе ўключанае ў адказ. Можа быць выкарыстанае для адрозьненьня запытаў.",
        "apihelp-main-param-servedby": "Уключае ў вынік назву сэрвэра, які апрацаваў запыт.",
        "apihelp-main-param-curtimestamp": "Уключае ў вынік пазнаку актуальнага часу.",
-       "apihelp-main-param-origin": "Пры звароце да API з дапамогай міждамэннага AJAX-запыту (CORS), выстаўце парамэтру значэньне зыходнага дамэну. Ён мусіць быць уключаны ў кожны папярэдні запыт і такім чынам мусіць быць часткай URI-запыту (ня цела POST). Ён мусіць супадаць з адной з крыніц у загалоўку <code>Origin</code>, павінна быць зададзена нешта кшталту <kbd>https://en.wikipedia.org</kbd> або <kbd>https://meta.wikimedia.org</kbd>. Калі парамэтар не супадае з загалоўкам <code>Origin</code>, будзе вернуты адказ з кодам памылкі 403. Калі парамэтар супадае з загалоўкам <code>Origin</code> і крыніца знаходзіцца ў белым сьпісе, будзе выстаўлены загаловак <code>Access-Control-Allow-Origin</code>.",
+       "apihelp-main-param-origin": "Пры звароце да API з дапамогай міждамэннага AJAX-запыту (CORS), выстаўце парамэтру значэньне зыходнага дамэну. Ён мусіць быць уключаны ў кожны папярэдні запыт і такім чынам мусіць быць часткай URI-запыту (ня цела POST).\n\nДля аўтэнтыфікаваных запытаў ён мусіць супадаць з адной з крыніц у загалоўку <code>Origin</code>, павінна быць зададзена нешта кшталту <kbd>https://en.wikipedia.org</kbd> або <kbd>https://meta.wikimedia.org</kbd>. Калі парамэтар не супадае з загалоўкам <code>Origin</code>, будзе вернуты адказ з кодам памылкі 403. Калі парамэтар супадае з загалоўкам <code>Origin</code> і крыніца знаходзіцца ў белым сьпісе, будуць выстаўленыя загалоўкі <code>Access-Control-Allow-Origin</code> і <code>Access-Control-Allow-Credentials</code>.\n\nДля неаўтэнтыфікаваных запытаў выстаўце значэньне <kbd>*</kbd>. Гэта прывядзе да выстаўленьня загалоўку <code>Access-Control-Allow-Origin</code>, але <code>Access-Control-Allow-Credentials</code> будзе мець значэньне <code>false</code> і ўсе зьвесткі пра карыстальніка будуць абмежаваныя.",
        "apihelp-main-param-uselang": "Мова для выкарыстаньня ў перакладах паведамленьняў. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> з <kbd>siprop=languages</kbd> вяртае сьпіс кодаў мовы, або трэба вызначыць <kbd>user</kbd>, каб ужываць налады мовы цяперашняга карыстальніка, або вызначыць <kbd>content</kbd>, каб ужываць мову зьместу гэтай вікі.",
        "apihelp-block-description": "Блякаваньне ўдзельніка.",
        "apihelp-block-param-user": "Імя ўдзельніка, IP-адрас або IP-дыяпазон, якія вы хочаце заблякаваць.",
index 837e3f9..987231f 100644 (file)
@@ -9,7 +9,9 @@
                        "Fitoschido"
                ]
        },
+       "apihelp-main-param-action": "Quina acció realitzar.",
        "apihelp-main-param-format": "El format de la sortida.",
+       "apihelp-main-param-curtimestamp": "Inclou la marca horària actual en el resultat.",
        "apihelp-block-description": "Bloca un usuari.",
        "apihelp-block-param-reason": "Raó del blocatge.",
        "apihelp-block-param-nocreate": "Evita la creació de comptes.",
index 45d0576..fa7c460 100644 (file)
@@ -15,6 +15,7 @@
        "apihelp-emailuser-param-subject": "Хьедаран корта.",
        "apihelp-emailuser-param-text": "Кехатан чулацам",
        "apihelp-expandtemplates-param-title": "АгӀонан корта.",
+       "apihelp-feedrecentchanges-param-hideminor": "Къайладаха жима нисдарш.",
        "apihelp-feedrecentchanges-param-tagfilter": "Тегийн луьттург.",
        "apihelp-login-example-login": "ЧугӀо",
        "apihelp-logout-description": "ЧугӀой сессийн хаамаш дӀацӀанбе.",
index fbddc8d..7cc2db3 100644 (file)
@@ -9,7 +9,8 @@
                        "Utar",
                        "Macofe",
                        "Danny B.",
-                       "LordMsz"
+                       "LordMsz",
+                       "Dvorapa"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Dokumentace]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Chyby a požadavky]\n</div>\n<strong>Stav:</strong> Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\n<strong>Chybné požadavky:</strong> Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete [[mw:API:Errors_and_warnings|v dokumentaci]].\n\n<strong>Testování:</strong> Pro jednoduché testování požadavků na API zkuste [[Special:ApiSandbox]].",
@@ -22,7 +23,7 @@
        "apihelp-main-param-requestid": "Libovolná zde uvedená hodnota bude zahrnuta v odpovědi. Lze použít pro rozlišení požadavků.",
        "apihelp-main-param-servedby": "Zahrnout do odpovědi název hostitele, který požadavek obsloužil.",
        "apihelp-main-param-curtimestamp": "Zahrnout do odpovědi aktuální časové razítko.",
-       "apihelp-main-param-origin": "Pokud k API přistupujete pomocí mezidoménového AJAXového požadavku (CORS), nastavte tento parametr na doménu původu. Musí být součástí všech předběžných požadavků, takže musí být součástí URI požadavku (nikoli těla POSTu). Hodnota musí přesně odpovídat jednomu z původů v hlavičce <code>Origin</code>, takže musí být nastavena na něco jako <kbd>https://en.wikipedia.org</kbd> nebo <kbd>https://meta.wikimedia.org</kbd>. Pokud parametr neodpovídá hlavičce <code>Origin</code>, bude vrácena odpověď 403. Pokud parametr odpovídá hlavičce <code>Origin</code> a tento původ je na bílé listině, bude nastavena hlavička <code>Access-Control-Allow-Origin</code>.",
+       "apihelp-main-param-origin": "Pokud k API přistupujete pomocí mezidoménového AJAXového požadavku (CORS), nastavte tento parametr na doménu původu. Musí být součástí všech předběžných požadavků, takže musí být součástí URI požadavku (nikoli těla POSTu).\n\nU autentizovaných požadavků hodnota musí přesně odpovídat jednomu z původů v hlavičce <code>Origin</code>, takže musí být nastavena na něco jako <kbd>https://en.wikipedia.org</kbd> nebo <kbd>https://meta.wikimedia.org</kbd>. Pokud parametr neodpovídá hlavičce <code>Origin</code>, bude vrácena odpověď 403. Pokud parametr odpovídá hlavičce <code>Origin</code> a tento původ je na bílé listině, budou nastaveny hlavičky <code>Access-Control-Allow-Origin</code> a <code>Access-Control-Allow-Credentials</code>.\n\nU neautentizovaných požadavků uveďte hodnotu <kbd>*</kbd>. To způsobí nastavení hlavičky <code>Access-Control-Allow-Origin</code>, ale hlavička <code>Access-Control-Allow-Credentials</code> bude <code>false</code> a budou omezena všechna data specifická pro uživatele.",
        "apihelp-main-param-uselang": "Jazyk, který se má použít pro překlad hlášení. Pomocí <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> se <kbd>siprop=languages</kbd> získáte seznam jazykových kódů nebo zadejte „<kbd>user</kbd>“ pro použití předvoleného jazyka aktuálního uživatele či „<kbd>content</kbd>“ pro použití jazyka obsahu této wiki.",
        "apihelp-block-description": "Zablokovat uživatele.",
        "apihelp-block-param-user": "Uživatelské jméno, IP adresa nebo rozsah IP adres, které chcete zablokovat.",
@@ -74,7 +75,7 @@
        "apihelp-edit-param-text": "Obsah stránky.",
        "apihelp-edit-param-minor": "Malá editace.",
        "apihelp-edit-param-notminor": "Nemalá editace.",
-       "apihelp-edit-param-bot": "Označit tuto editaci jako editaci bota.",
+       "apihelp-edit-param-bot": "Označit tuto editaci jako editaci robota.",
        "apihelp-edit-param-createonly": "Needitovat stránku, pokud již existuje.",
        "apihelp-edit-param-nocreate": "Pokud stránka neexistuje, vrátit chybu.",
        "apihelp-edit-param-watch": "Přidat stránku na seznam sledovaných.",
        "apihelp-feedcontributions-param-deletedonly": "Zobrazit pouze smazané příspěvky.",
        "apihelp-feedcontributions-param-toponly": "Zobrazit pouze ty editace, které jsou aktuální revize.",
        "apihelp-feedcontributions-param-newonly": "Zobrazit pouze ty editace, které vytvořily stránku.",
+       "apihelp-feedcontributions-param-hideminor": "Skrýt malé editace.",
        "apihelp-feedcontributions-param-showsizediff": "Zobrazit rozdíl velikosti mezi revizemi.",
        "apihelp-feedrecentchanges-param-namespace": "Jmenný prostor, na který mají být výsledky omezeny.",
        "apihelp-feedrecentchanges-param-from": "Zobrazit změny od",
        "apihelp-query+usercontribs-example-user": "Zobrazit příspěvky uživatele <kbd>Příklad</kbd>",
        "apihelp-query+watchlistraw-description": "Získat všechny stránky, které jsou aktuálním uživatelem sledovány.",
        "apihelp-query+watchlistraw-example-simple": "Seznam sledovaných stránek uživatele.",
+       "apihelp-stashedit-param-summary": "Změnit shrnutí.",
        "apihelp-unblock-param-user": "Uživatel, IP adresa nebo záběr IP adres k odblokování. Nelze použít dohromady s <var>$1id</var>.",
        "apihelp-watch-example-watch": "Sledovat stránku <kbd>Main Page</kbd>.",
        "apihelp-watch-example-generator": "Zobrazit prvních několik stránek z hlavního jmenného prostoru.",
diff --git a/includes/api/i18n/da.json b/includes/api/i18n/da.json
new file mode 100644 (file)
index 0000000..bbb981b
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Sarrus"
+               ]
+       },
+       "apihelp-feedrecentchanges-param-hideminor": "Skjul mindre ændringer."
+}
index 8c6a71f..dba5479 100644 (file)
@@ -29,7 +29,7 @@
        "apihelp-main-param-requestid": "Der angegebene Wert wird mit in die Antwort aufgenommen und kann zur Unterscheidung von Anfragen verwendet werden.",
        "apihelp-main-param-servedby": "Namen des bearbeitenden Hosts mit zurückgeben.",
        "apihelp-main-param-curtimestamp": "Aktuellen Zeitstempel mit zurückgeben.",
-       "apihelp-main-param-origin": "Beim Zugriff auf die API mittels Cross-Domain-AJAX-Anfrage (CORS) ist dieser Parameter auf die veranlassende Domain zu setzen. Er muss in jedem Pre-Flight-Request angegeben werden und deshalb ein Teil der Anfrage-URI sein (nicht des POST-Bodys). Er muss genau einer der Angaben im <code>Origin</code>-Header entsprechen, d.&nbsp;h. er muss auf etwas wie <kbd>https://de.wikipedia.org</kbd> oder <kbd>https://meta.wikimedia.org</kbd> gesetzt werden. Falls dieser Parameter nicht mit dem <code>Origin</code>-Header übereinstimmt, wird eine 403-Antwort zurückgegeben. Falls dieser Parameter dem <code>Origin</code>-Header entspricht und die Domain auf der Whitelist ist, wird ein <code>Access-Control-Allow-Origin</code>-Header gesetzt.",
+       "apihelp-main-param-origin": "Beim Zugriff auf die API mit einer Kreuz-Domain-AJAX-Anfrage (CORS) muss dies als entstehende Domäne festgelegt werden. Dies muss in jeder Vorfluganfrage mit eingeschlossen werden und deshalb ein Teil der Anfragen-URI sein (nicht des POST-Körpers).\n\nFür authentifizierte Anfragen muss dies exakt einem der Ursprünge im Header <code>Origin</code> entsprechen, so dass es auf etwas wie <kbd>https://de.wikipedia.org</kbd> oder <kbd>https://meta.wikimedia.org</kbd> festgelegt werden muss. Falls dieser Parameter nicht mit dem Header <code>Origin</code> übereinstimmt, wird eine 403-Antwort zurückgegeben. Falls dieser Parameter mit dem Header <code>Origin</code> übereinstimmt und der Ursprung weißgelistet ist, werden die Header <code>Access-Control-Allow-Origin</code> und <code>Access-Control-Allow-Credentials</code> festgelegt.\n\nGib für nicht authentifizierte Anfragen den Wert <kbd>*</kbd> an. Dies verursacht, dass der Header <code>Access-Control-Allow-Origin</code> festgelegt wird, aber <code>Access-Control-Allow-Credentials</code> wird <code>false</code> sein und alle benutzerspezifischen Daten werden beschränkt.",
        "apihelp-main-param-uselang": "Zu verwendende Sprache für Nachrichtenübersetzungen. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> mit <kbd>siprop=languages</kbd> gibt eine Liste der Sprachcodes zurück. Gib <kbd>user</kbd> zum Verwenden der aktuellen Benutzerspracheinstellung oder <kbd>content</kbd> an, um die Inhaltssprache des Wikis zu verwenden.",
        "apihelp-block-description": "Einen Benutzer sperren.",
        "apihelp-block-param-user": "Benutzername, IP-Adresse oder IP-Bereich, der gesperrt werden soll.",
        "apihelp-feedcontributions-param-deletedonly": "Nur gelöschte Beiträge anzeigen.",
        "apihelp-feedcontributions-param-toponly": "Nur aktuelle Versionen anzeigen.",
        "apihelp-feedcontributions-param-newonly": "Nur Seitenerstellungen anzeigen.",
+       "apihelp-feedcontributions-param-hideminor": "Blendet Kleinigkeiten aus.",
        "apihelp-feedcontributions-param-showsizediff": "Zeigt den Größenunterschied zwischen Versionen an.",
        "apihelp-feedcontributions-example-simple": "Beiträge für die Benutzer <kbd>Beispiel<kbd> zurückgeben",
        "apihelp-feedrecentchanges-description": "Gibt einen Letzte-Änderungen-Feed zurück.",
        "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1-Prüfsumme (Basis 16) der Version.",
        "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "Inhaltsmodell-Kennung der Version.",
        "apihelp-query+revisions+base-paramvalue-prop-content": "Text der Version.",
+       "apihelp-query+revisions+base-paramvalue-prop-tags": "Markierungen für die Version.",
        "apihelp-query+search-param-what": "Welcher Suchtyp ausgeführt werden soll.",
        "apihelp-query+search-param-info": "Welche Metadaten zurückgegeben werden sollen.",
        "apihelp-query+search-param-prop": "Eigenschaften zur Rückgabe:",
        "apihelp-query+siteinfo-example-simple": "Websiteinformationen abrufen",
        "apihelp-query+tags-description": "Änderungs-Tags auflisten.",
        "apihelp-query+tags-param-prop": "Zurückzugebende Eigenschaften:",
+       "apihelp-query+tags-paramvalue-prop-name": "Ergänzt den Namen der Markierung.",
+       "apihelp-query+tags-paramvalue-prop-displayname": "Ergänzt die Systemnachricht für die Markierung.",
+       "apihelp-query+tags-paramvalue-prop-description": "Ergänzt die Beschreibung der Markierung.",
        "apihelp-query+tags-example-simple": "Verfügbare Tags auflisten",
        "apihelp-query+templates-param-dir": "Die Auflistungsrichtung.",
        "apihelp-query+transcludedin-param-prop": "Zurückzugebende Eigenschaften:",
+       "apihelp-query+transcludedin-paramvalue-prop-pageid": "Seitenkennung jeder Seite.",
        "apihelp-query+usercontribs-description": "Alle Bearbeitungen von einem Benutzer abrufen.",
        "apihelp-query+usercontribs-param-limit": "Die maximale Anzahl der zurückzugebenden Beiträge.",
        "apihelp-query+usercontribs-param-start": "Der zurückzugebende Start-Zeitstempel.",
index 1ab1bc5..7892efa 100644 (file)
@@ -7,8 +7,15 @@
                ]
        },
        "apihelp-block-description": "Enê karberi bloqe ke",
+       "apihelp-block-param-reason": "Sebeba Bloqey",
+       "apihelp-block-param-nocreate": "Hesab viraştişi bloqe ke.",
+       "apihelp-checktoken-param-token": "Jetona test ke",
+       "apihelp-createaccount-description": "Yew Hesabê karberi yo newe vıraze",
        "apihelp-createaccount-param-name": "Nameyê karberi.",
+       "apihelp-createaccount-param-email": "E-postay karberi (keyfi)",
+       "apihelp-createaccount-param-realname": "Namey karberi yo raştay (keyfi)",
        "apihelp-delete-description": "Pele bestere.",
+       "apihelp-delete-example-simple": "<kbd>Main Page</kbd> besternê.",
        "apihelp-disabled-description": "Eno modul aktiv niyo.",
        "apihelp-edit-description": "Vıraze û pelan bıvurne.",
        "apihelp-edit-param-text": "Zerreki pele",
        "apihelp-emailuser-param-ccme": "Yew kopyaya nê posteyi mı rê bırışe.",
        "apihelp-expandtemplates-param-title": "Sernameyê pele.",
        "apihelp-expandtemplates-param-text": "Wikimetıni açarnê.",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "Herabıyaye wikimetin",
+       "apihelp-feedcontributions-param-feedformat": "Formata warikerdışi",
+       "apihelp-feedcontributions-param-hideminor": "Vuryayışanê werdiyan bınımne",
+       "apihelp-feedcontributions-param-showsizediff": "Goreyê ebati ferqê versiyoni bıasne.",
        "apihelp-feedrecentchanges-param-hideminor": "Vurnayışanê qıckekan bınımne.",
        "apihelp-feedrecentchanges-param-hidebots": "Vurnayışanê botan bınımne.",
        "apihelp-feedrecentchanges-param-hideanons": "Vurnayışanê karberanê anoniman bınımne.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrey etiketi",
        "apihelp-feedrecentchanges-example-simple": "Vurnayışê peyênan bıvin",
        "apihelp-feedrecentchanges-example-30days": "Peyni vurnayışanê 30 raco bımosne",
+       "apihelp-filerevert-param-comment": "Mışewre bar ke",
        "apihelp-login-param-name": "Nameyê karberi.",
        "apihelp-login-param-password": "Parola.",
        "apihelp-login-param-domain": "Domain (optional).",
        "apihelp-login-example-login": "Dekew.",
-       "apihelp-move-description": "Yew pele bere."
+       "apihelp-mergehistory-description": "Verorê pela yew ke",
+       "apihelp-move-description": "Yew pele bere.",
+       "apihelp-move-param-noredirect": "Hetenayış mevıraz",
+       "apihelp-options-example-reset": "Terciha pêron reset ke",
+       "apihelp-options-example-change": "Tercihanê <kbd>skin</kbd> u <kbd>hideminor</kbd> bıvurnê",
+       "apihelp-parse-example-page": "Peler analiz ke",
+       "apihelp-parse-example-text": "Wikimetini analiz ke",
+       "apihelp-parse-example-summary": "Xulasay analiz ke",
+       "apihelp-query+alllinks-paramvalue-prop-title": "Sernamey rê link dek",
+       "apihelp-query+blocks-example-simple": "Listey bloqeyan"
 }
index e4a2c2e..a8f0278 100644 (file)
@@ -16,7 +16,7 @@
        "apihelp-main-param-requestid": "Any value given here will be included in the response. May be used to distinguish requests.",
        "apihelp-main-param-servedby": "Include the hostname that served the request in the results.",
        "apihelp-main-param-curtimestamp": "Include the current timestamp in the result.",
-       "apihelp-main-param-origin": "When accessing the API using a cross-domain AJAX request (CORS), set this to the originating domain. This must be included in any pre-flight request, and therefore must be part of the request URI (not the POST body). This must match one of the origins in the <code>Origin</code> header exactly, so it has to be set to something like <kbd>https://en.wikipedia.org</kbd> or <kbd>https://meta.wikimedia.org</kbd>. If this parameter does not match the <code>Origin</code> header, a 403 response will be returned. If this parameter matches the <code>Origin</code> header and the origin is whitelisted, an <code>Access-Control-Allow-Origin</code> header will be set.",
+       "apihelp-main-param-origin": "When accessing the API using a cross-domain AJAX request (CORS), set this to the originating domain. This must be included in any pre-flight request, and therefore must be part of the request URI (not the POST body).\n\nFor authenticated requests, this must match one of the origins in the <code>Origin</code> header exactly, so it has to be set to something like <kbd>https://en.wikipedia.org</kbd> or <kbd>https://meta.wikimedia.org</kbd>. If this parameter does not match the <code>Origin</code> header, a 403 response will be returned. If this parameter matches the <code>Origin</code> header and the origin is whitelisted, the <code>Access-Control-Allow-Origin</code> and <code>Access-Control-Allow-Credentials</code> headers will be set.\n\nFor non-authenticated requests, specify the value <kbd>*</kbd>. This will cause the <code>Access-Control-Allow-Origin</code> header to be set, but <code>Access-Control-Allow-Credentials</code> will be <code>false</code> and all user-specific data will be restricted.",
        "apihelp-main-param-uselang": "Language to use for message translations. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> with <kbd>siprop=languages</kbd> returns a list of language codes, or specify <kbd>user</kbd> to use the current user's language preference, or specify <kbd>content</kbd> to use this wiki's content language.",
 
        "apihelp-block-description": "Block a user.",
@@ -73,7 +73,9 @@
        "apihelp-createaccount-param-language": "Language code to set as default for the user (optional, defaults to content language).",
        "apihelp-createaccount-example-pass": "Create user <kbd>testuser</kbd> with password <kbd>test123</kbd>.",
        "apihelp-createaccount-example-mail": "Create user <kbd>testmailuser</kbd> and email a randomly-generated password.",
-
+       "apihelp-cspreport-description": "Used by browsers to report violations of the Content Security Policy. This module should never be used, except when used automatically by a CSP compliant web browser.",
+       "apihelp-cspreport-param-reportonly": "Mark as being a report from a monitoring policy, not an enforced policy",
+       "apihelp-cspreport-param-source": "What generated the CSP header that triggered this report",
        "apihelp-delete-description": "Delete a page.",
        "apihelp-delete-param-title": "Title of the page to delete. Cannot be used together with <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "Page ID of the page to delete. Cannot be used together with <var>$1title</var>.",
        "apihelp-feedcontributions-param-deletedonly": "Show only deleted contributions.",
        "apihelp-feedcontributions-param-toponly": "Only show edits that are latest revisions.",
        "apihelp-feedcontributions-param-newonly": "Only show edits that are page creations.",
+       "apihelp-feedcontributions-param-hideminor": "Hide minor edits.",
        "apihelp-feedcontributions-param-showsizediff": "Show the size difference between revisions.",
        "apihelp-feedcontributions-example-simple": "Return contributions for user <kbd>Example</kbd>.",
 
        "apihelp-query+watchlistraw-param-show": "Only list items that meet these criteria.",
        "apihelp-query+watchlistraw-param-owner": "Used along with $1token to access a different user's watchlist.",
        "apihelp-query+watchlistraw-param-token": "A security token (available in the user's [[Special:Preferences#mw-prefsection-watchlist|preferences]]) to allow access to another user's watchlist.",
+       "apihelp-query+watchlistraw-param-dir": "The direction in which to list.",
        "apihelp-query+watchlistraw-param-fromtitle": "Title (with namespace prefix) to begin enumerating from.",
        "apihelp-query+watchlistraw-param-totitle": "Title (with namespace prefix) to stop enumerating at.",
        "apihelp-query+watchlistraw-example-simple": "List pages on the current user's watchlist.",
        "apihelp-stashedit-param-contentmodel": "Content model of the new content.",
        "apihelp-stashedit-param-contentformat": "Content serialization format used for the input text.",
        "apihelp-stashedit-param-baserevid": "Revision ID of the base revision.",
+       "apihelp-stashedit-param-summary": "Change summary.",
 
        "apihelp-tag-description": "Add or remove change tags from individual revisions or log entries.",
        "apihelp-tag-param-rcid": "One or more recent changes IDs from which to add or remove the tag.",
index 10f6c7f..f733c47 100644 (file)
@@ -21,7 +21,8 @@
                        "Mgpena",
                        "Rubentl134",
                        "2axterix2",
-                       "Dgstranz"
+                       "Dgstranz",
+                       "Copper12"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentación]]\n* [[mw:API:FAQ|Preguntas frecuentes]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de correos]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API de anuncios]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Errores y peticiones]\n</div>\n<strong>Estado:</strong> Todas las características que se muestran en esta página debería funcionar, pero la API aún está en desarrollo activo y puede cambiar en cualquier momento. Suscríbete a [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la lista de correo de mediawiki-api-announce] para estar al día de las actualizaciones.\n\n<strong>Solicitudes erróneas:</strong> Cuando se envían solicitudes erróneas a la API, se envía un encabezado HTTP con la clave \"MediaWiki-API-Error\" y ambos valores, del encabezado y el código de error, se establecerán en el mismo valor. Para más información, véase [[mw:API:Errors_and_warnings|API: Errores y advertencias]].\n\n<strong>Pruebas:</strong> para facilitar las pruebas de solicitudes a la API, consulta [[Special:ApiSandbox]].",
@@ -34,7 +35,7 @@
        "apihelp-main-param-requestid": "Cualquier valor dado aquí se incluirá en la respuesta. Se puede utilizar para distinguir solicitudes.",
        "apihelp-main-param-servedby": "Incluir el nombre del host que ha servido la solicitud en los resultados.",
        "apihelp-main-param-curtimestamp": "Incluir la marca de tiempo actual en el resultado.",
-       "apihelp-main-param-origin": "Cuando se accede a la API usando una petición AJAX de distinto dominio (CORS), establece este valor al dominio de origen. Debe ser incluido en cualquier petición pre-vuelo, y por lo tanto debe ser parte de la URI de la petición (no del cuerpo POST). Debe coincidir exactamente con uno de los orígenes de la cabecera <code>Origin</code>, por lo que debería ser algo como <kbd>https://en.wikipedia.org</kbd> o <kbd>https://meta.wikimedia.org</kbd>. Si este parámetro no coincide con la cabecera <code>Origin</code>, se devolverá una respuesta 403.\nSi este parámetro coincide con la cabecera <code>Origin</code> y el origen está en lista blanca, se creará una cabecera <code>Access-Control-Allow-Origin</code>.",
+       "apihelp-main-param-origin": "Cuando se accede a la API usando una petición AJAX de distinto dominio (CORS), se establece este valor al dominio de origen. Debe ser incluido en cualquier petición pre-vuelo, y por lo tanto debe ser parte de la URI de la petición (no del cuerpo POST). Debe coincidir exactamente con uno de los orígenes de la cabecera <code>Origin</code>, por lo que debería ser algo como <kbd>https://en.wikipedia.org</kbd> o <kbd>https://meta.wikimedia.org</kbd>. Si este parámetro no coincide con la cabecera <code>Origin</code>, se devolverá una respuesta 403.\nSi este parámetro coincide con la cabecera <code>Origin</code> y el origen está en lista blanca, se creará una cabecera <code>Access-Control-Allow-Origin</code>.",
        "apihelp-main-param-uselang": "El idioma que se usará para las traducciones de mensajes. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> con <kbd>siprop=languages</kbd> devuelve una lista de códigos de idiomas, o especifica <kbd>user</kbd> para usar la preferencia de idioma del usuario actual, o especifica <kbd>content</kbd> para usar el idioma de contenido de este wiki.",
        "apihelp-block-description": "Bloquear a un usuario.",
        "apihelp-block-param-user": "El nombre de usuario, dirección IP o intervalo de IP que quieres bloquear.",
@@ -50,6 +51,8 @@
        "apihelp-block-param-watchuser": "Vigilar las páginas de usuario y de discusión del usuario o de la dirección IP.",
        "apihelp-block-example-ip-simple": "Bloquear la dirección IP <kbd>192.0.2.5</kbd> durante 3 días por el motivo <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "Bloquear al usuario <kbd>Vandal</kbd> indefinidamente con el motivo <kbd>Vandalism</kbd> y evitar que se cree nuevas cuentas o envíe correos.",
+       "apihelp-changeauthenticationdata-description": "Cambiar los datos de autentificación para el usuario actual.",
+       "apihelp-changeauthenticationdata-example-password": "Intento para cambiar la contraseña del usuario actual a <kbd>ExamplePassword</kbd>.",
        "apihelp-checktoken-description": "Comprueba la validez de una ficha desde <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Tipo de ficha a probar.",
        "apihelp-checktoken-param-token": "Ficha a probar.",
@@ -57,6 +60,8 @@
        "apihelp-checktoken-example-simple": "Probar la validez de una ficha <kbd>csrf</kbd>.",
        "apihelp-clearhasmsg-description": "Limpia la marca <code>hasmsg</code> del usuario actual.",
        "apihelp-clearhasmsg-example-1": "Limpiar la marca <code>hasmsg</code> del usuario actual.",
+       "apihelp-clientlogin-description": "Entrar en wiki usando el flujo interactivo.",
+       "apihelp-clientlogin-example-login": "Comenzar el proceso para iniciar sesión en el wiki como usuario <kbd>Example</kbd> con la contraseña <kbd>ExamplePassword</kbd>.",
        "apihelp-compare-description": "Obtener la diferencia entre 2 páginas.\n\nSe debe pasar un número de revisión, un título de página o una ID tanto desde \"de\" hasta \"a\".",
        "apihelp-compare-param-fromtitle": "Primer título para comparar",
        "apihelp-compare-param-fromid": "ID de la primera página a comparar.",
@@ -77,6 +82,9 @@
        "apihelp-createaccount-param-language": "Código de idioma a establecer como predeterminado para el usuario (opcional, predeterminado al contenido del idioma).",
        "apihelp-createaccount-example-pass": "Crear usuario <kbd>testuser</kbd> con la contraseña <kbd>test123</kbd>.",
        "apihelp-createaccount-example-mail": "Crear usuario <kbd>testmailuser</kbd> y enviar una contraseña generada aleatoriamente.",
+       "apihelp-cspreport-description": "Utilizado por los navegadores para reportar violaciones de la política de seguridad de contenidos. Este módulo no debe usarse nunca, excepto cuando se usa automáticamente por un navegador web CSP compatible.",
+       "apihelp-cspreport-param-reportonly": "Marcar un informe de una política de vigilancia y no a una política forzada",
+       "apihelp-cspreport-param-source": "Qué generó la cabecera CSP que provocó este informe",
        "apihelp-delete-description": "Borrar una página.",
        "apihelp-delete-param-title": "Título de la página a eliminar. No se puede utilizar junto a <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "ID de la página a eliminar. No se puede utilizar junto a <var>$1title</var>.",
@@ -85,6 +93,7 @@
        "apihelp-delete-param-watch": "Añadir esta página a la lista de seguimiento del usuario actual.",
        "apihelp-delete-param-watchlist": "Incondicionalmente agregar o remover la página de la lista de seguimiento del usuario actual, usar las preferencias o no cambiar el seguimiento.",
        "apihelp-delete-param-unwatch": "Quitar la página de la lista de seguimiento del usuario actual.",
+       "apihelp-delete-param-oldimage": "El nombre de la imagen antigua es proporcionado conforme a lo dispuesto por [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].",
        "apihelp-delete-example-simple": "Borrar <kbd>Main Page</kbd>.",
        "apihelp-delete-example-reason": "Eliminar <kbd>Main Page</kbd> con el motivo <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Se desactivó este módulo.",
        "apihelp-edit-param-minor": "Edición menor.",
        "apihelp-edit-param-notminor": "Edición no menor.",
        "apihelp-edit-param-bot": "Marcar esta edición como de bot.",
+       "apihelp-edit-param-basetimestamp": "Marca de tiempo de la revisión base, usada para detectar conflictos de edición. Se puede obtener mediante [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]]",
+       "apihelp-edit-param-starttimestamp": "Marca de tiempo de cuando empezó el proceso de edición, usada para detectar conflictos de edición. Se puede obtener un valor apropiado usando <var>[[Special:ApiHelp/main|curtimestamp]]</var> cuando comiences el proceso de edición (por ejemplo, al cargar el contenido de la página por editar).",
        "apihelp-edit-param-recreate": "Reemplazar los errores acerca de la página de haber sido eliminados en el ínterin.",
        "apihelp-edit-param-createonly": "No editar la página si ya existe.",
        "apihelp-edit-param-nocreate": "Producir un error si la página no existe.",
        "apihelp-edit-param-watch": "Añadir la página a la lista de seguimiento del usuario actual.",
        "apihelp-edit-param-unwatch": "Quitar la página de la lista de seguimiento del usuario actual.",
+       "apihelp-edit-param-watchlist": "Incondicionalmente añadir o eliminar la página de lista del usuario actual, utilice referencias o no cambiar el reloj.",
+       "apihelp-edit-param-md5": "El hash MD5 del parámetro $1text, o los parámetros concatenados $1prependtext y $1appendtext. Si se establece, la edición no se hará a menos que el hash sea correcto.",
        "apihelp-edit-param-prependtext": "Añadir este texto al principio de la página. Reemplaza $1text.",
        "apihelp-edit-param-appendtext": "Añadir este texto al principio de la página. Reemplaza $1text.\n\nUtiliza $1section=new para añadir una nueva sección, en lugar de este parámetro.",
        "apihelp-edit-param-undo": "Deshacer esta revisión. Reemplaza $1text, $1prependtext y $1appendtext.",
        "apihelp-expandtemplates-param-title": "Título de la página.",
        "apihelp-expandtemplates-param-text": "Sintaxis wiki que se convertirá.",
        "apihelp-expandtemplates-param-revid": "Revisión de ID, para <nowiki>{{REVISIONID}}</nowiki> y variables similares.",
+       "apihelp-expandtemplates-param-prop": "Qué elementos de información se utilizan para llegar.\n\nTenga en cuenta que si no se seleccionan los valores, el resultado contendrá el wikitexto, pero la salida será en un formato obsoleto.",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "El wikitexto expandido.",
        "apihelp-expandtemplates-paramvalue-prop-categories": "Cualesquiera categorías presentes en la entrada que no están representadas en salida de wikitexto.",
        "apihelp-expandtemplates-paramvalue-prop-properties": "Propiedades de página definidas por palabras mágicas en el wikitexto.",
+       "apihelp-expandtemplates-paramvalue-prop-volatile": "Si la salida es volátil y no debe ser reutilizada en otro lugar dentro de la página.",
        "apihelp-expandtemplates-paramvalue-prop-ttl": "El tiempo máximo tras el cual deberían invalidarse los resultados en caché.",
        "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "Da las variables de configuración JavaScript específicas para la página.",
        "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "Da las variables de configuración JavaScript específicas para la página como una cadena JSON.",
+       "apihelp-expandtemplates-paramvalue-prop-parsetree": "El árbol XML analiza el árbol de la entrada.",
        "apihelp-expandtemplates-param-includecomments": "Incluir o no los comentarios HTML en la salida.",
        "apihelp-expandtemplates-param-generatexml": "Generar un árbol de análisis XML (remplazado por $1prop=parsetree).",
        "apihelp-expandtemplates-example-simple": "Expandir el wikitexto <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>.",
        "apihelp-feedcontributions-param-deletedonly": "Mostrar solo las contribuciones borradas.",
        "apihelp-feedcontributions-param-toponly": "Mostrar solo ediciones que son últimas revisiones.",
        "apihelp-feedcontributions-param-newonly": "Mostrar solo ediciones que son creaciones de páginas.",
+       "apihelp-feedcontributions-param-hideminor": "Ocultar ediciones menores.",
        "apihelp-feedcontributions-param-showsizediff": "Mostrar la diferencia de tamaño entre revisiones.",
        "apihelp-feedcontributions-example-simple": "Devolver las contribuciones del usuario <kbd>Example</kbd>.",
        "apihelp-feedrecentchanges-description": "Devuelve un canal de cambios recientes.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrar por etiquetas.",
        "apihelp-feedrecentchanges-param-target": "Mostrar solo los cambios en las páginas enlazadas en esta.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Mostrar los cambios en páginas enlazadas con la página seleccionada.",
+       "apihelp-feedrecentchanges-param-categories": "Mostrar sólo cambios en las páginas en todas estas categorías.",
+       "apihelp-feedrecentchanges-param-categories_any": "Mostrar sólo cambios en las páginas en cualquiera de las categorías en lugar.",
        "apihelp-feedrecentchanges-example-simple": "Mostrar los cambios recientes.",
        "apihelp-feedrecentchanges-example-30days": "Mostrar los cambios recientes limitados a 30 días.",
        "apihelp-feedwatchlist-description": "Devuelve el canal de una lista de seguimiento.",
        "apihelp-help-param-submodules": "Incluir ayuda para submódulos del módulo con nombre.",
        "apihelp-help-param-recursivesubmodules": "Incluir ayuda para submódulos recursivamente.",
        "apihelp-help-param-helpformat": "Formato de salida de la ayuda.",
+       "apihelp-help-param-wrap": "Envolver el producto en una estructura de respuesta de la API estándar.",
        "apihelp-help-param-toc": "Incluir una tabla de contenidos en la salida HTML.",
        "apihelp-help-example-main": "Ayuda del módulo principal",
        "apihelp-help-example-submodules": "Ayuda para <kbd>action=query</kbd> y todos sus submódulos.",
        "apihelp-imagerotate-param-rotation": "Grados que rotar una imagen en sentido horario.",
        "apihelp-imagerotate-example-simple": "Rotar <kbd>File:Example.png</kbd> <kbd>90</kbd> grados.",
        "apihelp-imagerotate-example-generator": "Rotar todas las imágenes en <kbd>Category:Flip</kbd> <kbd>180</kbd> grados.",
+       "apihelp-import-description": "Importar una página desde otra wiki, o desde un archivo XML.\n\nTenga en cuenta que el HTTP POST debe hacerse como una carga de archivos (es decir, el uso de multipart/form-data) al enviar un archivo para el parámetro <var>xml</var>.",
        "apihelp-import-param-summary": "Resumen de importación de entrada del registro.",
        "apihelp-import-param-xml": "Se cargó el archivo XML.",
        "apihelp-import-param-interwikisource": "Para importaciones interwiki: wiki desde la que importar.",
        "apihelp-import-param-namespace": "Importar a este espacio de nombres. No puede usarse simultáneamente con <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Importar como subpágina de esta página. No puede usarse simultáneamente con <var>$1namespace</var>.",
        "apihelp-import-example-import": "Importar [[meta:Help:ParserFunctions]] al espacio de nombres 100 con todo el historial.",
-       "apihelp-login-description": "Iniciar sesión y obtener cookies de autenticación.\n\nSi inicias sesión sin problemas, las cookies necesarias se incluirán en los encabezados de respuesta HTTP. Si se produce algún error al iniciar sesión y este persiste, se puede regular para evitar los ataques masivos automatizados para adivinar contraseñas.",
+       "apihelp-linkaccount-description": "Vincular una cuenta de un proveedor de terceros para el usuario actual.",
+       "apihelp-linkaccount-example-link": "Iniciar el proceso de vincular a una cuenta de <kbd>Ejemplo</kbd>.",
+       "apihelp-login-description": "Iniciar sesión y obtener las cookies de autenticación.\n\nEsta acción solo se debe utilizar en combinación con [[Special:BotPasswords]]; para la cuenta de inicio de sesión no se utiliza y puede fallar sin previo aviso. Para iniciar la sesión de forma segura a la cuenta principal, utilice <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "apihelp-login-description-nobotpasswords": "Iniciar sesión y obtener las cookies de autenticación.\n\nEsta acción esta obsoleta y puede fallar sin previo aviso. Para conectarse de forma segura, utilice <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "apihelp-login-description-nonauthmanager": "Iniciar sesión y obtener cookies de autenticación.\n\nSi inicias sesión sin problemas, las cookies necesarias se incluirán en los encabezados de respuesta HTTP. Si se produce algún error al iniciar sesión y este persiste, se puede regular para evitar los ataques masivos automatizados de adivinar contraseñas.",
        "apihelp-login-param-name": "Nombre de usuario.",
        "apihelp-login-param-password": "Contraseña.",
        "apihelp-login-param-domain": "Dominio (opcional).",
        "apihelp-managetags-param-operation": "Qué operación realizar:\n;create: Crear una nueva etiqueta de cambio de uso manual.\n;delete: Eliminar una etiqueta de cambio de la base de datos, eliminando la etiqueta de todas las revisiones, cambios en entradas recientes y registros en los que se ha utilizado.\n;activate: Activar una etiqueta de cambio, permitiendo a los usuarios aplicarla manualmente.\n;deactivate: Desactivar una etiqueta de cambio, evitando que los usuarios la apliquen manualmente.",
        "apihelp-managetags-param-tag": "Etiqueta para crear, eliminar, activar o desactivar. Para crear una etiqueta, esta debe no existir. Para eliminarla, debe existir. Para activarla, debe existir y no estar en uso por ninguna extensión. Para desactivarla, debe estar activada y definida manualmente.",
        "apihelp-managetags-param-reason": "Un motivo opcional para crear, eliminar, activar o desactivar la etiqueta.",
+       "apihelp-managetags-param-ignorewarnings": "Ya sea para ignorar las advertencias que se emiten durante la operación.",
        "apihelp-managetags-example-create": "Crear una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-delete": "Eliminar la etiqueta <kbd>vandlaism</kbd> con el motivo <kbd>Misspelt</kbd>",
        "apihelp-managetags-example-activate": "Activar una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-deactivate": "Desactivar una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>No longer required</kbd>",
        "apihelp-mergehistory-description": "Fusionar historiales de páginas.",
+       "apihelp-mergehistory-param-from": "El título de la página desde la que se combinará la historia. No se puede utilizar junto con <var>$1fromid</var>.",
+       "apihelp-mergehistory-param-fromid": "Page ID de la página desde la que se combinara el historial. No se puede utilizar junto con <var>$1from</var>.",
+       "apihelp-mergehistory-param-to": "El título de la página desde la que se combinara el historial. No se puede utilizar junto con <var>$1toid</var>.",
+       "apihelp-mergehistory-param-toid": "Page ID de la página desde la que se combinara el historial. No se puede utilizar junto con <var>$1to</var>.",
+       "apihelp-mergehistory-param-timestamp": "La marca de tiempo de las revisiones se moverá del historial de la página de origen al historial de la página de destino. Si se omite, todo el historial de la página de la página de origen se fusionará en la página de destino.",
        "apihelp-mergehistory-param-reason": "Motivo para la fusión del historial.",
+       "apihelp-mergehistory-example-merge": "Combinar todo el historial de <kbd>Oldpage</kbd> en <kbd>Newpage</kbd>.",
+       "apihelp-mergehistory-example-merge-timestamp": "Combinar las revisiones de <kbd>Oldpage</kbd> hasta el <kbd>2015-12-31T04:37:41Z</kbd> en <kbd>Newpage</kbd>.",
        "apihelp-move-description": "Trasladar una página.",
        "apihelp-move-param-from": "Título de la página a renombrar. No se puede utilizar con <var>$1fromid</var>.",
        "apihelp-move-param-fromid": "ID de la página a renombrar. No se puede utilizar con <var>$1from</var>.",
        "apihelp-move-param-noredirect": "No crear una redirección.",
        "apihelp-move-param-watch": "Añadir la página y su redirección a la lista de seguimiento del usuario actual.",
        "apihelp-move-param-unwatch": "Eliminar la página y la redirección de la lista de seguimiento del usuario.",
+       "apihelp-move-param-watchlist": "Incondicionalmente puede añadir o eliminar la página de lista del usuario actual, utilizar referencias o no cambiar el reloj.",
        "apihelp-move-param-ignorewarnings": "Ignorar cualquier aviso.",
        "apihelp-move-example-move": "Trasladar <kbd>Badtitle</kbd> a <kbd>Goodtitle</kbd> sin dejar una redirección.",
        "apihelp-opensearch-description": "Buscar en el wiki mediante el protocolo OpenSearch.",
        "apihelp-paraminfo-param-modules": "Lista de los nombres de los módulos (valores de los parámetros <var>action</var> y <var>format</var> o <kbd>main</kbd>). Se pueden especificar los submódulos con un <kbd>+</kbd>.",
        "apihelp-paraminfo-param-helpformat": "Formato de las cadenas de ayuda.",
        "apihelp-paraminfo-param-querymodules": "Lista de los nombres de los módulos de consulta (valor de los parámetros <var>prop</var>, <var>meta</var> or <var>list</var>). Utiliza <kbd>$1modules=query+foo</kbd> en vez de <kbd>$1querymodules=foo</kbd>.",
+       "apihelp-paraminfo-param-mainmodule": "Obtener también información sobre el módulo principal (primer nivel). Utilizar <kbd>$1modules=main</kbd> en su lugar.",
+       "apihelp-paraminfo-param-pagesetmodule": "Obtener también información sobre el módulo PageSet (Proporcionar títulos= y amigos).",
        "apihelp-paraminfo-param-formatmodules": "Lista de los nombres del formato de los módulos (valor del parámetro <var>format</var>). Utiliza <var>$1modules</var> en su lugar.",
        "apihelp-paraminfo-example-1": "Mostrar información para <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>, <kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>, <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd> y <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>.",
        "apihelp-parse-param-title": "Título de la página a la que pertenece el texto. Si se omite se debe especificar <var>$1contentmodel</var> y se debe utilizar el [[API]] como título.",
        "apihelp-parse-paramvalue-prop-properties": "Da varias propiedades definidas en el wikitexto analizado.",
        "apihelp-parse-paramvalue-prop-limitreportdata": "Da el informe del límite de forma estructurada. No da datos si <var>$1disablelimitreport</var> está establecido.",
        "apihelp-parse-paramvalue-prop-limitreporthtml": "Da la versión HTML del informe del límite. No da datos si <var>$1disablelimitreport</var> está establecido.",
+       "apihelp-parse-paramvalue-prop-parsetree": "El árbol de análisis sintáctico XML del contenido de la revisión (requiere modelo de contenido <code>$1</code>)",
+       "apihelp-parse-param-pst": "Guardar previamente los cambios antes de transformar la entrada antes de analizarla. Sólo es válido cuando se utiliza con el texto.",
+       "apihelp-parse-param-onlypst": "Guardar previamente los cambios antes de transformar (PST) en la entrada. Devuelve el mismo wikitexto, después de que un PST se ha aplicado. Sólo es válido cuando se utiliza con <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Incluye enlaces de idiomas proporcionados por las extensiones (para utilizar con <kbd>$1prop=langlinks</kbd>).",
+       "apihelp-parse-param-disablelimitreport": "Omitir el informe de límite (\"NewPP limit report\") desde la salida del analizador.",
        "apihelp-parse-param-disablepp": "Usa <var>$1disablelimitreport</var> en su lugar.",
+       "apihelp-parse-param-disableeditsection": "Omitir los enlaces de edición de sección de la salida del analizador.",
+       "apihelp-parse-param-disabletidy": "No ejecute la limpieza HTML (por ejemplo ordenada) en la salida del analizador.",
+       "apihelp-parse-param-generatexml": "Generar árbol de análisis sintáctico XML (requiere modelo de contenido <code>$1</code>; sustituido por <kbd>$2prop=parsetree</kbd>).",
        "apihelp-parse-param-preview": "Analizar en modo de vista previa.",
        "apihelp-parse-param-sectionpreview": "Analizar sección en modo de vista previa (también activa el modo de vista previa).",
        "apihelp-parse-param-disabletoc": "Omitir la tabla de contenidos en la salida.",
+       "apihelp-parse-param-contentformat": "Formato de serialización de contenido utilizado para la introducción de texto. Sólo es válido cuando se utiliza con $1text.",
        "apihelp-parse-example-page": "Analizar una página.",
        "apihelp-parse-example-text": "Analizar wikitexto.",
        "apihelp-parse-example-texttitle": "Analizar wikitexto, especificando el título de la página.",
        "apihelp-protect-param-pageid": "ID de la página a (des)proteger. No se puede utilizar con $1title.",
        "apihelp-protect-param-protections": "Lista de los niveles de protección, con formato <kbd>action=level</kbd> (por ejemplo: <kbd>edit=sysop</kbd>).\n\n<strong>Nota:</strong> Cualquier acción no mencionada tendrá las restricciones eliminadas.",
        "apihelp-protect-param-reason": "Motivo de la (des)protección.",
+       "apihelp-protect-param-tags": "Cambiar las etiquetas para aplicar a la entrada en el registro de protección.",
        "apihelp-protect-param-cascade": "Activar la protección en cascada (o sea, proteger plantillas e imágenes transcluidas usadas en esta página). Se ignorará si ninguno de los niveles de protección dados son compatibles con la función de cascada.",
        "apihelp-protect-example-protect": "Proteger una página",
        "apihelp-protect-example-unprotect": "Desproteger una página estableciendo la restricción a <kbd>all</kbd>.",
        "apihelp-query+allfileusages-example-unique-generator": "Recupera los títulos de todos los archivos y marca los faltantes.",
        "apihelp-query+allfileusages-example-generator": "Recupera las páginas que contienen los archivos.",
        "apihelp-query+allimages-description": "Enumerar todas las imágenes secuencialmente.",
+       "apihelp-query+allimages-param-sort": "Propiedad por la que realizar la ordenación.",
+       "apihelp-query+allimages-param-dir": "La dirección en la que se listará.",
        "apihelp-query+allimages-param-from": "El título de la imagen para comenzar la enumeración. Solo puede utilizarse con $1sort=name.",
        "apihelp-query+allimages-param-to": "El título de la imagen para detener la enumeración. Solo puede utilizarse con $1sort=name.",
        "apihelp-query+allimages-param-start": "El sello de tiempo para comenzar la enumeración. Solo puede utilizarse con $1sort=timestamp.",
        "apihelp-query+alllinks-paramvalue-prop-title": "Añade el título del enlace.",
        "apihelp-query+alllinks-param-namespace": "El espacio de nombres que enumerar.",
        "apihelp-query+alllinks-param-limit": "Cuántos elementos en total se devolverán.",
+       "apihelp-query+alllinks-param-dir": "La dirección en la que se listará.",
+       "apihelp-query+alllinks-example-unique": "Lista de títulos vinculados únicamente.",
        "apihelp-query+alllinks-example-unique-generator": "Obtiene todos los títulos enlazados, marcando los que falten.",
+       "apihelp-query+alllinks-example-generator": "Obtiene páginas que contienen los enlaces.",
+       "apihelp-query+allmessages-description": "Devolver los mensajes de este sitio.",
        "apihelp-query+allmessages-param-prop": "Qué propiedades se obtendrán.",
+       "apihelp-query+allmessages-param-nocontent": "Si se establece, no incluya el contenido de los mensajes en la salida.",
+       "apihelp-query+allmessages-param-args": "Los argumentos que se sustituyen en el mensaje.",
        "apihelp-query+allmessages-param-filter": "Devolver solo mensajes con nombres que contengan esta cadena.",
        "apihelp-query+allmessages-param-customised": "Devolver solo mensajes en este estado de personalización.",
        "apihelp-query+allmessages-param-lang": "Devolver mensajes en este idioma.",
        "apihelp-query+allpages-param-maxsize": "Limitar a páginas con este número máximo de bytes.",
        "apihelp-query+allpages-param-prtype": "Limitar a páginas protegidas.",
        "apihelp-query+allpages-param-limit": "Cuántas páginas en total se devolverán.",
+       "apihelp-query+allpages-param-dir": "La dirección en la que se listará.",
+       "apihelp-query+allpages-param-filterlanglinks": "Filtrar en función de si una página tiene langlinks. Tenga en cuenta que esto no puede considerar langlinks agregados por extensiones.",
        "apihelp-query+allpages-example-B": "Mostrar una lista de páginas que empiecen con la letra <kbd>B</kbd>.",
        "apihelp-query+allpages-example-generator": "Mostrar información acerca de 4 páginas que empiecen por la letra <kbd>T</kbd>.",
        "apihelp-query+allpages-example-generator-revisions": "Mostrar el contenido de las 2 primeras páginas que no redirijan y empiecen por <kbd>Re</kbd>.",
+       "apihelp-query+allredirects-description": "Obtener la lista de todas las redirecciones a un espacio de nombres.",
+       "apihelp-query+allredirects-param-from": "El título de la redirección para iniciar la enumeración.",
+       "apihelp-query+allredirects-param-to": "El título de la redirección para detener la enumeración.",
        "apihelp-query+allredirects-param-prefix": "Buscar todas las páginas de destino que empiecen con este valor.",
        "apihelp-query+allredirects-param-prop": "Qué piezas de información incluir:",
        "apihelp-query+allredirects-paramvalue-prop-title": "Añade el título de la redirección.",
+       "apihelp-query+allredirects-param-namespace": "El espacio de nombres a enumerar.",
        "apihelp-query+allredirects-param-limit": "Cuántos elementos se devolverán.",
+       "apihelp-query+allredirects-param-dir": "La dirección en la que se listará.",
+       "apihelp-query+allredirects-example-unique": "La lista de páginas de destino.",
+       "apihelp-query+allredirects-example-unique-generator": "Obtiene todas las páginas de destino, marcando los que faltan.",
+       "apihelp-query+allredirects-example-generator": "Obtiene páginas que contienen las redirecciones.",
        "apihelp-query+allrevisions-description": "Listar todas las revisiones.",
+       "apihelp-query+allrevisions-param-start": "La marca de tiempo para iniciar la enumeración.",
+       "apihelp-query+allrevisions-param-end": "La marca de tiempo para detener la enumeración.",
        "apihelp-query+allrevisions-param-user": "Listar solo las revisiones de este usuario.",
        "apihelp-query+allrevisions-param-excludeuser": "No listar las revisiones de este usuario.",
        "apihelp-query+allrevisions-param-namespace": "Listar solo las páginas en este espacio de nombres.",
        "apihelp-query+allrevisions-example-user": "Listar las últimas 50 contribuciones del usuario <kbd>Example</kbd>.",
        "apihelp-query+allrevisions-example-ns-main": "Listar las primeras 50 revisiones en el espacio de nombres principal.",
+       "apihelp-query+mystashedfiles-description": "Obtener una lista de archivos en la corriente de carga de usuarios.",
+       "apihelp-query+mystashedfiles-param-prop": "Propiedades a buscar para los archivos.",
+       "apihelp-query+mystashedfiles-paramvalue-prop-size": "Buscar el tamaño del archivo y las dimensiones de la imagen.",
        "apihelp-query+mystashedfiles-param-limit": "Cuántos archivos obtener.",
+       "apihelp-query+alltransclusions-param-from": "El título de la transclusión por la que empezar la enumeración.",
+       "apihelp-query+alltransclusions-param-to": "El título de la transclusión por la que terminar la enumeración.",
        "apihelp-query+alltransclusions-param-prefix": "Buscar todos los títulos transcluidos que comiencen con este valor.",
        "apihelp-query+alltransclusions-param-prop": "Qué piezas de información incluir:",
        "apihelp-query+alltransclusions-paramvalue-prop-title": "Añade el título de la transclusión.",
+       "apihelp-query+alltransclusions-param-limit": "Número de elementos que se desea obtener.",
        "apihelp-query+alltransclusions-example-unique": "Listar títulos transcluidos de forma única.",
        "apihelp-query+alltransclusions-example-unique-generator": "Obtiene todos los títulos transcluidos, marcando los que faltan.",
        "apihelp-query+allusers-description": "Enumerar todos los usuarios registrados.",
        "apihelp-query+categorymembers-paramvalue-prop-ids": "Añade el identificador de página.",
        "apihelp-query+categorymembers-paramvalue-prop-title": "Agrega el título y el identificador del espacio de nombres de la página.",
        "apihelp-query+categorymembers-paramvalue-prop-type": "Añade el tipo en el que se categorizó la página (<samp>page</samp>, <samp>subcat</samp> or <samp>file</samp>).",
+       "apihelp-query+categorymembers-param-sort": "Propiedad por la que realizar la ordenación.",
+       "apihelp-query+categorymembers-param-dir": "Dirección en la que desea ordenar.",
        "apihelp-query+categorymembers-param-startsortkey": "Utilizar $1starthexsortkey en su lugar.",
        "apihelp-query+categorymembers-param-endsortkey": "Utilizar $1endhexsortkey en su lugar.",
        "apihelp-query+categorymembers-example-simple": "Obtener las primeras 10 páginas en <kbd>Category:Physics</kbd>.",
        "apihelp-query+watchlist-paramvalue-type-log": "Entradas del registro.",
        "apihelp-query+watchlistraw-param-prop": "Qué propiedades adicionales se obtendrán:",
        "apihelp-query+watchlistraw-param-show": "Sólo listar los elementos que cumplen estos criterios.",
+       "apihelp-query+watchlistraw-param-dir": "La dirección en la que se listará.",
        "apihelp-query+watchlistraw-param-fromtitle": "Título (con el prefijo de espacio de nombres) desde el que se empezará a enumerar.",
        "apihelp-query+watchlistraw-param-totitle": "Título (con el prefijo de espacio de nombres) desde el que se dejará de enumerar.",
        "apihelp-query+watchlistraw-example-simple": "Listar las páginas de la lista de seguimiento del usuario actual.",
        "apihelp-stashedit-param-contentmodel": "Modelo del contenido nuevo.",
        "apihelp-stashedit-param-contentformat": "Formato de serialización de contenido utilizado para el texto de entrada.",
        "apihelp-stashedit-param-baserevid": "Identificador de la revisión de base.",
+       "apihelp-stashedit-param-summary": "Resumen de cambios.",
        "apihelp-tag-param-logid": "Uno o más identificadores de entradas del registro a los que agregar o eliminar la etiqueta.",
        "apihelp-tag-param-reason": "Motivo del cambio.",
        "apihelp-tag-example-rev": "Añadir la etiqueta <kbd>vandalism</kbd> al identificador de revisión 123 sin especificar un motivo",
index 079eeb2..5f09064 100644 (file)
@@ -29,6 +29,8 @@
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "Wikitestu zabaldua.",
        "apihelp-feedcontributions-param-year": "Urtetik aurrera (eta lehenagotik)",
        "apihelp-feedcontributions-param-month": "Hilabetetik aurrera (eta lehenagotik)",
+       "apihelp-feedcontributions-param-newonly": "Orrialde sorkuntza direnak soilik erakutsi",
+       "apihelp-feedcontributions-param-hideminor": "Aldaketa txikiak ezkutatu",
        "apihelp-feedrecentchanges-param-hideminor": "Ezkutatu aldaketa txikiak.",
        "apihelp-feedrecentchanges-param-hidebots": "Ezkutatu botek egindako aldaketak.",
        "apihelp-feedrecentchanges-param-hideanons": "Ezkutatu erabiltzaile anonimoek egindako aldaketak.",
index a429583..2ae81d4 100644 (file)
                        "Macofe",
                        "Huji",
                        "Ladsgroup",
-                       "Freshman404"
+                       "Freshman404",
+                       "Alifakoor"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|مستندات]]\n* [[mw:API:FAQ|پرسش‌های متداول]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api فهرست پست الکترونیکی]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce اعلانات رابط برنامه‌نویسی کاربردی]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R ایرادها و درخواست‌ها]\n</div>\n\n<strong>وضعیت:</strong> تمام ویژگی‌هایی که در این صفحه نمایش یافته‌اند باید کار بکنند، ولی رابط برنامه‌نویسی کاربردی کماکان در حال توسعه است، و ممکن است در هر زمان تغییر بکند. به عضویت [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ فهرست پست الکترونیکی mediawiki-api-announce] در بیایید تا از تغییرات باخبر شوید.\n\n<strong>درخواست‌های معیوب:</strong> وقتی درخواست‌های معیوب به رابط برنامه‌نویسی کاربردی فرستاده شوند، یک سرایند اچ‌تی‌تی‌پی با کلید «MediaWiki-API-Erorr» فرستاده می‌شود و بعد هم مقدار سرایند و هم کد خطای بازگردانده شده  هر دو به یک مقدار نسبت داده می‌شوند. برای اطلاعات بیشتر [[mw:API:Errors_and_warnings|API: Errors and warnings]] را ببینید.\n\n<strong>آزمایش:</strong> برای انجام درخواست‌های API آزمایشی [[Special:ApiSandbox]] را ببینید.",
        "apihelp-main-param-action": "کدام عملیات را انجام دهد.",
        "apihelp-main-param-format": "فرمت خروجی.",
+       "apihelp-main-param-smaxage": "تنظيم  <code>s-maxage</code> سرآیند کنترل حافضهٔ نهان HTTP بر اين تعداد ثانيه.",
+       "apihelp-main-param-maxage": "تنظيم  <code>s-maxage</code> سرآیند کنترل حافضهٔ نهان HTTP بر اين تعداد ثانيه.\nخطاها هيچگاه در حافظهٔ نهان قرار نمی‌گيرند.",
+       "apihelp-main-param-requestid": "هر مقداری که در اینجا وارد شود در پاسخ گنجانده می‌شود. ممکن است برای تمايز بين درخواست‌ها بکار رود.",
+       "apihelp-main-param-servedby": "نام ميزبانی که درخواست را سرويس داده در نتايج گنجانده شود.",
        "apihelp-main-param-curtimestamp": "برچسب زمان کنونی را در نتیجه قرار دهید.",
        "apihelp-block-description": "بستن کاربر",
        "apihelp-block-param-user": "نام کاربری، آدرس آی پی یا محدوده آی پی موردنظر شما برای بستن.",
        "apihelp-block-param-reblock": "اگر کاربر پیش از این مسدود شده‌است، مسدود موجود را بازنویسی کن.",
        "apihelp-block-param-watchuser": "صفحه‌های کاربر و بحث کاربر نشانی آی‌پی یا کاربر را پی‌گیری کنید.",
        "apihelp-block-example-ip-simple": "آی‌پی <kbd>۱۹۲٫۰٫۲٫۵</kbd> را برای سه روز همراه دلیل <kbd>برخورد اول</kbd> ببندید",
+       "apihelp-block-example-user-complex": "بستن کاربر<kbd>خرابکار</kbd> به شکل نامحدود به علت <kbd>خرابکاری</kbd>، همچنين جلوگيری از ايجاد حساب جديد و ارسال ايميل.",
+       "apihelp-changeauthenticationdata-description": "تغيير اطلاعات احراز هويت برای کاربر فعلی",
+       "apihelp-changeauthenticationdata-example-password": "تلاش برای تغيير گذرواژه فعلی کاربر به <kbd>نمونهٔ گذرواژه</kbd>.",
+       "apihelp-checktoken-param-type": "نوع توکنی که دارد آزمایش می‌شود.",
        "apihelp-checktoken-param-token": "توکن برای تست",
        "apihelp-checktoken-param-maxtokenage": "حداکثر عمر توکن به ثانیه.",
        "apihelp-checktoken-example-simple": "تست اعتبار یک توکن <kbd>csrf</kbd>",
        "apihelp-clearhasmsg-description": "پرچم <code>hasmsg</code> را برای کاربر جاری پاک کن.",
        "apihelp-clearhasmsg-example-1": "پاک‌کردن پرچم <code>hasmsg</code> برای کاربر جاری",
+       "apihelp-clientlogin-example-login": "شروع فرآیند ورود به ويکی به عنوان کاربر <kbd>نمونه</kbd> با گذرواژهٔ <kbd>نمونهٔ گذرواژه</kbd>",
        "apihelp-compare-description": "تفاوت بین ۲ صفحه را بیابید.\n\nشما باید یک شماره بازبینی، یک عنوان صفحه، یا یک شناسه صفحه برای هر دو «از» و «به» مشخص کنید.",
        "apihelp-compare-param-fromtitle": "عنوان اول برای مقایسه.",
        "apihelp-compare-param-fromid": "شناسه صفحه اول برای مقایسه.",
        "apihelp-query+allpages-param-minsize": "محدودکردن به صفحه‌هایی که همراه دست کم این تعداد بایت است.",
        "apihelp-query+allpages-param-limit": "میزان کل صفحه‌ها برای بازگرداندن.",
        "apihelp-query+allredirects-param-limit": "تعداد آیتم‌ها برای بازگرداندن.",
+       "apihelp-query+allrevisions-description": "فهرست همه نسخه‌ها",
+       "apihelp-query+mystashedfiles-param-limit": "تعداد پرونده‌هایی که باید بگیرد.",
+       "apihelp-query+allusers-param-dir": "جهتی که باید مرتب شود.",
+       "apihelp-query+allusers-paramvalue-prop-rights": "فهرست دسترسی‌هایی که کاربر دارد.",
+       "apihelp-query+allusers-paramvalue-prop-editcount": "شمار ويرایش کاربر را می‌افزايد",
+       "apihelp-query+allusers-paramvalue-prop-registration": "زمان ثبت نام کاربر را در صورت وجود می‌افزايد (ممکن است خالی باشد)",
+       "apihelp-query+allusers-param-limit": "تعداد کل نام‌های کاربری برای بازگرداندن.",
+       "apihelp-query+allusers-param-witheditsonly": "فقط کاربرانی را که ويرایش داشته اند ليست کن",
+       "apihelp-query+allusers-param-activeusers": "فقط کاربرانی را ليست کن که در $1 روز گذشته فعاليت داشته‌اند",
+       "apihelp-query+authmanagerinfo-description": "بازیابی اطلاعات در مورد وضعيت فعلی احراز هويت",
        "apihelp-query+backlinks-example-simple": "نمایش پیوندها به <kbd>Main page</kbd>.",
        "apihelp-query+blocks-example-simple": "فهرست بسته‌شده‌ها",
        "apihelp-query+categories-param-show": "کدام نوع رده‌ها نمایش داده‌شود.",
        "apihelp-query+categories-param-limit": "چه میزان رده بازگردانده شود.",
        "apihelp-query+categories-param-categories": "فقط این رده‌ها فهرست شود. کاربردی برای بررسی وجود یک صفحهٔ مشخص در یک ردهٔ مشخص.",
        "apihelp-query+categorymembers-description": "فهرست‌کردن همهٔ صفحه‌ها در یک ردهٔ مشخص‌شده.",
+       "apihelp-query+categorymembers-paramvalue-prop-ids": "افزودن شناسه صفحه",
        "apihelp-query+categorymembers-param-sort": "خصوصیت برای مرتب‌سازی",
        "apihelp-query+categorymembers-param-dir": "جهت مرتب شدن",
        "apihelp-query+categorymembers-param-startsortkey": "جایش از $1starthexsortkey استفاده کنید.",
+       "apihelp-query+deletedrevs-param-from": "شروع فهرست کردن مواردی که این عنوان را دارند.",
+       "apihelp-query+deletedrevs-param-to": "خاتمه فهرست کردن مواردی که این عنوان را دارند.",
+       "apihelp-query+deletedrevs-param-namespace": "فقط صفحات ین فضای نام را فهرست کن.",
+       "apihelp-query+deletedrevs-param-limit": "حداکثر تعداد بازنگری‌هايي که فهرست شوند.",
+       "apihelp-query+fileusage-paramvalue-prop-title": "عنوان هر صفحه.",
+       "apihelp-query+fileusage-param-limit": "تعدادی که باید بازگردانده شود.",
+       "apihelp-query+imageinfo-paramvalue-prop-dimensions": "نام مستعار برای size",
+       "apihelp-query+imageinfo-paramvalue-prop-sha1": "افزودن  SHA-1 hash برای پرونده",
+       "apihelp-query+imageinfo-paramvalue-prop-mime": "افزودن نوع MIME برای پرونده",
+       "apihelp-query+imageinfo-param-end": "زمان توقف فهرست کردن.",
        "apihelp-query+imageinfo-param-urlheight": "مشابه $1urlwidth.",
+       "apihelp-query+images-param-limit": "تعداد پرونده‌هایی که باید بازگرداند.",
        "apihelp-query+info-description": "دریافت اطلاعات سادهٔ صفحه.",
        "apihelp-query+iwbacklinks-param-prefix": "پیشوند میان‌ویکی.",
        "apihelp-query+iwbacklinks-param-title": "پیوند میان‌ویکی برای جستجو. باید همراه <var>$1blprefix</var> استفاده شود.",
        "apihelp-query+iwbacklinks-param-limit": "تعداد صفحه‌ها برای بازگرداندن.",
+       "apihelp-query+iwbacklinks-param-prop": "خصوصیتی که باید گرفته شود.",
+       "apihelp-query+iwlinks-paramvalue-prop-url": "افزودن نشانی اینترنتی کامل.",
+       "apihelp-query+langbacklinks-param-prop": "خصوصیتی که باید گرفته شود:",
+       "apihelp-query+langlinks-paramvalue-prop-url": "افزودن نشانی اینترنتی کامل.",
+       "apihelp-query+links-param-limit": "تعداد پیوندهایی که باید بازگرداند.",
+       "apihelp-query+linkshere-param-prop": "خصوصیتی که باید گرفته شود:",
+       "apihelp-query+linkshere-paramvalue-prop-pageid": "شناسه صفحه هر صفحه.",
+       "apihelp-query+linkshere-paramvalue-prop-title": "عنوان هر صفحه.",
+       "apihelp-query+linkshere-paramvalue-prop-redirect": "اگر صفحه تغییر مسیر بود برچسب بزن.",
+       "apihelp-query+linkshere-param-namespace": "فقط صفحات این فضای نام را فهرست کن.",
        "apihelp-query+linkshere-param-limit": "تعداد برای بازگرداندن.",
        "apihelp-query+logevents-description": "دریافت رویدادها از سیاهه‌ها.",
+       "apihelp-query+logevents-param-prop": "خصوصیتی که باید گرفته شود.",
+       "apihelp-query+logevents-paramvalue-prop-ids": "افزودن شناسه سیاهه رویداد.",
+       "apihelp-query+pageswithprop-paramvalue-prop-ids": "افزودن شناسه صفحه",
+       "apihelp-query+pageswithprop-param-dir": "جهت مرتب شدن",
        "apihelp-query+prefixsearch-param-search": "جستجوی رشته",
        "apihelp-query+prefixsearch-param-namespace": "فضاهای نامی برای جستجو",
        "apihelp-query+prefixsearch-param-limit": "حداکثر تعداد نتایج برای بازگرداندن.",
        "apihelp-query+random-example-generator": "بازگرداندن اطلاعات صفحه دربارهٔ دو صفحهٔ تصادفی از فضای نام اصلی",
        "apihelp-query+recentchanges-param-start": "برچسب زمانی برای آغاز شمارش از.",
        "apihelp-query+recentchanges-param-end": "برچسب زمانی برای پایان شمارش.",
+       "apihelp-query+recentchanges-paramvalue-prop-flags": "افزودن برچسب برای ویرایش.",
+       "apihelp-query+recentchanges-paramvalue-prop-timestamp": "افزودن زمان ویرایش.",
+       "apihelp-query+redirects-paramvalue-prop-title": "عنوان هر تغییرمسیر.",
        "apihelp-query+redirects-param-limit": "تعداد تغییرمسیرها برای بازگرداندن.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "متن نسخه ویرایش.",
+       "apihelp-query+revisions+base-paramvalue-prop-tags": "برچسب برای نسخه‌های ویرایش.",
+       "apihelp-query+siteinfo-param-prop": "اطلاعاتی که باید گرفته‌شود:",
+       "apihelp-query+siteinfo-paramvalue-prop-statistics": "بازرگرداندن آمار سایت.",
+       "apihelp-query+siteinfo-example-simple": "دریافت اطلاعات سایت.",
+       "apihelp-query+tags-description": "فهرست تغییرات برچسب‌ها.",
+       "apihelp-query+tags-param-limit": "حداکثر تعداد برچسب‌ها برای فهرست شدن.",
+       "apihelp-query+tags-param-prop": "خصوصیتی که باید گرفته شود:",
+       "apihelp-query+tags-paramvalue-prop-name": "افزودن نام برچسب.",
+       "apihelp-query+transcludedin-paramvalue-prop-title": "عنوان هر صفحه.",
+       "apihelp-query+watchlist-paramvalue-type-log": "مدخل‌های سیاهه.",
+       "apihelp-stashedit-param-text": "محتوای صفحه.",
+       "apihelp-stashedit-param-contentmodel": "مدل محتوایی محتوای جدید",
+       "apihelp-stashedit-param-summary": "خلاصه تغییرات.",
+       "apihelp-tag-param-reason": "دلیل تغییر.",
+       "apihelp-unblock-description": "بازکردن کاربر.",
+       "apihelp-undelete-param-reason": "دلیل احیا.",
+       "apihelp-upload-param-filename": "نام پرونده مقصد.",
        "apihelp-upload-param-ignorewarnings": "چشم‌پوشی از همهٔ هشدارها.",
+       "apihelp-upload-param-file": "محتوی پرونده.",
+       "apihelp-upload-param-url": "نشانی اینترنتی برای دریافت فایل.",
        "apihelp-userrights-param-user": "نام کاربری.",
+       "apihelp-userrights-param-userid": "شناسه کاربر.",
+       "apihelp-userrights-param-reason": "دلیل تغییر.",
+       "apihelp-none-description": "بیرون‌ریزی هیچ.",
+       "api-format-title": "نتیجه ای‌پی‌آی مدیاویکی",
+       "api-help-main-header": "پودمان اصلی",
+       "api-help-source": "منبع: $1",
        "api-help-param-deprecated": "توصیه.",
+       "api-help-param-limit": "بيش از $1 مجاز نيست",
+       "api-help-param-limit2": "بيش از $1 (برای ربات‌ها $2) مجاز نيست",
+       "api-help-param-default": "پیش‌فرض: $1",
        "api-credits-header": "اعتبار"
 }
index fa8aa03..46bb3e6 100644 (file)
@@ -38,7 +38,7 @@
        "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.",
        "apihelp-main-param-curtimestamp": "Inclure l’horodatage actuel dans le résultat.",
-       "apihelp-main-param-origin": "En accédant à l’API en utilisant une requête AJAX inter-domaines (CORS), mettre le domaine d’origine dans ce paramètre. Il doit être inclus dans toute requête de pre-flight, et doit donc faire partie de l’URI de la requête (pas du corps du POST). Il doit correspondre exactement à une des origines dans l’entête <code>Origin</code> header, donc il doit être fixé avec quelque chose comme <kbd>https://en.wikipedia.org</kbd> ou <kbd>https://meta.wikimedia.org</kbd>. Si ce paramètre ne correspond pas à l’entête <code>Origin</code>, une réponse 403 sera renvoyée. Si ce paramètre correspond à l’entête <code>Origin</code> et que l’origine est en liste blanche, un entête <code>Access-Control-Allow-Origin</code> sera positionné.",
+       "apihelp-main-param-origin": "En accédant à l’API en utilisant une requête AJAX inter-domaines (CORS), mettre le domaine d’origine dans ce paramètre. Il doit être inclus dans toute requête de pre-flight, et doit donc faire partie de l’URI de la requête (pas du corps du POST).\n\nPour les requêtes authentifiées, il doit correspondre exactement à une des origines dans l’entête <code>Origin</code> header, donc il doit être fixé avec quelque chose comme <kbd>https://en.wikipedia.org</kbd> ou <kbd>https://meta.wikimedia.org</kbd>. Si ce paramètre ne correspond pas à l’entête <code>Origin</code>, une réponse 403 sera renvoyée. Si ce paramètre correspond à l’entête <code>Origin</code> et que l’origine est en liste blanche, des entêtes <code>Access-Control-Allow-Origin</code> et <code>Access-Control-Allow-Credentials</code> seront positionnés.\n\nPour les requêtes non authentifiées, spécifiez la valeur <kbd>*</kbd>. Cela positionnera l’entête <code>Access-Control-Allow-Origin</code>, mais <code>Access-Control-Allow-Credentials</code> vaudra <code>false</code> et toutes les données spécifiques à l’utilisateur seront filtrées.",
        "apihelp-main-param-uselang": "Langue à utiliser pour les traductions de message. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> avec <kbd>siprop=languages</kbd> renvoie une liste de codes de langue, ou en spécifiant <kbd>user</kbd> pour utiliser la préférence de langue de l’utilisateur actuel, ou en spécifiant <kbd>content</kbd> pour utiliser le langage du contenu de ce wiki.",
        "apihelp-block-description": "Bloquer un utilisateur.",
        "apihelp-block-param-user": "Nom d’utilisateur, adresse IP ou plage d’adresses IP que vous voulez bloquer.",
@@ -75,7 +75,7 @@
        "apihelp-compare-param-torev": "Seconde révision à comparer.",
        "apihelp-compare-example-1": "Créer une différence entre les révisions 1 et 2",
        "apihelp-createaccount-description": "Créer un nouveau compte utilisateur.",
-       "apihelp-createaccount-param-preservestate": "Si <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> renvoyé true pour <samp>hasprimarypreservedstate</samp>, les demandes marquées comme <samp>primary-required</samp> doivent être omises. Si elle a retourné une valeur non vide pour <samp>preservedusername</samp>, ce nom d'utilisateur doit être utilisé pour le paramètre <var>username</var>.",
+       "apihelp-createaccount-param-preservestate": "Si <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> a retourné true pour <samp>hasprimarypreservedstate</samp>, les demandes marquées comme <samp>primary-required</samp> doivent être omises. Si elle a retourné une valeur non vide pour <samp>preservedusername</samp>, ce nom d'utilisateur doit être utilisé pour le paramètre <var>username</var>.",
        "apihelp-createaccount-example-create": "Commencer le processus de création d’un utilisateur <kbd>Exemple</kbd> avec le mot de passe <kbd>ExempleMotDePasse</kbd>.",
        "apihelp-createaccount-param-name": "Nom d’utilisateur.",
        "apihelp-createaccount-param-password": "Mot de passe (ignoré si <var>$1mailpassword</var> est défini).",
@@ -88,6 +88,9 @@
        "apihelp-createaccount-param-language": "Code de langue à mettre par défaut pour l’utilisateur (facultatif, par défaut langue du contenu).",
        "apihelp-createaccount-example-pass": "Créer l’utilisateur <kbd>testuser</kbd> avec le mot de passe <kbd>test123</kbd>.",
        "apihelp-createaccount-example-mail": "Créer l’utilisateur <kbd>testmailuser</kbd> et envoyer par courriel un mot de passe généré aléatoirement.",
+       "apihelp-cspreport-description": "Utilisé par les navigateurs pour signaler les violations de la politique de confidentialité du contenu. Ce module ne devrait jamais être utilisé, sauf quand il est utilisé automatiquement par un navigateur web compatible avec CSP.",
+       "apihelp-cspreport-param-reportonly": "Marquer comme étant un rapport d’une politique de surveillance, et non une politique exigée",
+       "apihelp-cspreport-param-source": "Ce qui a généré l’entête CSP qui a déclenché ce rapport",
        "apihelp-delete-description": "Supprimer une page.",
        "apihelp-delete-param-title": "Titre de la page que vous voulez supprimer. Impossible de l’utiliser avec <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "ID de la page que vous voulez supprimer. Impossible à utiliser avec <var>$1title</var>.",
        "apihelp-feedcontributions-param-deletedonly": "Afficher uniquement les contributions supprimées.",
        "apihelp-feedcontributions-param-toponly": "Afficher uniquement les modifications qui sont les dernières révisions.",
        "apihelp-feedcontributions-param-newonly": "Afficher uniquement les modifications qui sont des créations de page.",
+       "apihelp-feedcontributions-param-hideminor": "Masquer les modifications mineures.",
        "apihelp-feedcontributions-param-showsizediff": "Afficher la différence de taille entre les révisions.",
        "apihelp-feedcontributions-example-simple": "Renvoyer les contributions de l'utilisateur <kbd>Exemple</kbd>.",
        "apihelp-feedrecentchanges-description": "Renvoie un fil de modifications récentes.",
        "apihelp-query+watchlistraw-param-show": "Lister uniquement les éléments correspondant à ces critères.",
        "apihelp-query+watchlistraw-param-owner": "Utilisé avec $1token pour accéder à la liste de suivi d’un autre utilisateur.",
        "apihelp-query+watchlistraw-param-token": "Un jeton de sécurité (disponible dans les [[Special:Preferences#mw-prefsection-watchlist|préférences]] de l’utilisateur) pour permettre l’accès à la liste de suivi d’un autre utilisateur.",
+       "apihelp-query+watchlistraw-param-dir": "Le sens dans lequel lister.",
        "apihelp-query+watchlistraw-param-fromtitle": "Démarrer l'énumération avec ce Titre (inclure le préfixe d'espace de noms) :",
        "apihelp-query+watchlistraw-param-totitle": "Terminer l'énumération avec ce Titre (inclure le préfixe d'espace de noms) :",
        "apihelp-query+watchlistraw-example-simple": "Lister les pages dans la liste de suivi de l’utilisateur actuel",
        "apihelp-stashedit-param-contentmodel": "Modèle de contenu du nouveau contenu.",
        "apihelp-stashedit-param-contentformat": "Format de sérialisation de contenu utilisé pour le texte saisi.",
        "apihelp-stashedit-param-baserevid": "ID de révision de la révision de base.",
+       "apihelp-stashedit-param-summary": "Résumé du changement",
        "apihelp-tag-description": "Ajouter ou enlever des balises de modification aux révisions ou ou aux entrées de journal individuelles.",
        "apihelp-tag-param-rcid": "Un ou plus IDs de modification récente à partir desquels ajouter ou supprimer la balise.",
        "apihelp-tag-param-revid": "Un ou plus IDs de révision à partir desquels ajouter ou supprimer la balise.",
index 65b5c95..2e0cbc9 100644 (file)
@@ -50,6 +50,7 @@
        "apihelp-clearhasmsg-example-1": "Limpar a bandeira <code>hasmsg</code> para o usuario actual",
        "apihelp-clientlogin-description": "Conectarse á wiki usando o fluxo interactivo.",
        "apihelp-clientlogin-example-login": "Comezar o proceso de conexión á wiki como o usuario <kbd>Exemplo</kbd> con contrasinal <kbd>ExemploContrasinal</kbd>.",
+       "apihelp-clientlogin-example-login2": "Continuar a conexión despois dunha resposta de <samp>UI</samp> para unha autenticación de dous factores, proporcionando un <var>OATHToken</var> con valor <kbd>987654</kbd>.",
        "apihelp-compare-description": "Obter as diferencias entre dúas páxinas.\n\nDebe indicar un número de revisión, un título de páxina, ou un ID de páxina tanto para \"from\" como para \"to\".",
        "apihelp-compare-param-fromtitle": "Primeiro título para comparar.",
        "apihelp-compare-param-fromid": "Identificador da primeira páxina a comparar.",
@@ -71,6 +72,8 @@
        "apihelp-createaccount-param-language": "Código de lingua para usar como defecto polo usuario (de xeito opcional, usarase a lingua por defecto)",
        "apihelp-createaccount-example-pass": "Crear usuario <kbd>testuser</kbd> con contrasinal <kbd>test123</kbd>.",
        "apihelp-createaccount-example-mail": "Crear usuario <kbd>testmailuser</kbd>\"testmailuser\" e enviar por correo electrónico un contrasinal xenerado de forma aleatoria.",
+       "apihelp-cspreport-description": "Usado polos navegadores para informar de violacións da política de confidencialidade de contido. Este módulo non debe se usado nunca, excepto cando é usado automaticamente por un navegador web compatible con CSP.",
+       "apihelp-cspreport-param-source": "Que xerou a cabeceira CSP que lanzou este informe",
        "apihelp-delete-description": "Borrar a páxina.",
        "apihelp-delete-param-title": "Título da páxina a eliminar. Non pode usarse xunto con <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "Identificador da páxina a eliminar. Non pode usarse xunto con <var>$1title</var>.",
        "apihelp-feedcontributions-param-deletedonly": "Mostrar só as contribuciones eliminadas.",
        "apihelp-feedcontributions-param-toponly": "Mostrar só as edicións que que son as ultimas revisións.",
        "apihelp-feedcontributions-param-newonly": "Mostrar só as edicións que crearon páxinas.",
+       "apihelp-feedcontributions-param-hideminor": "Ocultar edicións menores.",
        "apihelp-feedcontributions-param-showsizediff": "Mostrar diferenza de tamaño entre edicións.",
        "apihelp-feedcontributions-example-simple": "Mostrar as contribucións do usuario <kbd>Example</kbd>.",
        "apihelp-feedrecentchanges-description": "Devolve un ficheiro de cambios recentes.",
        "apihelp-linkaccount-description": "Vincular unha conta dun provedor externo ó usuario actual.",
        "apihelp-linkaccount-example-link": "Comezar o proceso de vincular a unha conta de <kbd>Exemplo</kbd>.",
        "apihelp-login-description": "No caso dunha conexión correcta, as cookies necesarias incluiranse nas cabeceiras HTTP de resposta. No caso dunha conexión fallida, os intentos posteriores poden ser reducidos para limitar ataques automaticos de roubo de contrasinais.",
+       "apihelp-login-description-nobotpasswords": "Conectarse e obter as cookies de autenticación. \n\nEsta acción está obsoleta e pode fallar sen avisar. Para conectarse sen problema use <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "apihelp-login-description-nonauthmanager": "Conectarse e obter as cookies de autenticación. \n\nNo caso dunha conexión correcta, as cookies necesarias incluiranse nas cabeceiras HTTP de resposta. No caso dunha conexión fallida, os intentos posteriores poden ser reducidos para limitar ataques automaticos de roubo de contrasinais.",
        "apihelp-login-param-name": "Nome de usuario.",
        "apihelp-login-param-password": "Contrasinal",
        "apihelp-login-param-domain": "Dominio (opcional).",
        "apihelp-query+watchlistraw-param-show": "Só listar os elementos que cumplen estos criterios.",
        "apihelp-query+watchlistraw-param-owner": "Usado con $1token para acceder á lista de páxinas de vixiancia doutro usuario.",
        "apihelp-query+watchlistraw-param-token": "Identificador de seguridade (dispoñible nas [[Special:Preferences#mw-prefsection-watchlist|preferencias]] de usuario) para permitir o acceso a outros á súa páxina de vixiancia.",
+       "apihelp-query+watchlistraw-param-dir": "Dirección na cal listar.",
        "apihelp-query+watchlistraw-param-fromtitle": "Título (co prefixo de espazo de nomes) dende o que comezar a enumerar.",
        "apihelp-query+watchlistraw-param-totitle": "Título (co prefixo de espazo de nomes) no que rematar de enumerar.",
        "apihelp-query+watchlistraw-example-simple": "Listar páxinas na lista de vixiancia do usuario actual.",
        "apihelp-removeauthenticationdata-description": "Elimina os datos de autenticación do usuario actual.",
        "apihelp-removeauthenticationdata-example-simple": "Intenta eliminar os datos de usuario actual para <kbd>FooAuthenticationRequest</kbd>.",
        "apihelp-resetpassword-description": "Envía un correo de inicialización de contrasinal a un usuario.",
+       "apihelp-resetpassword-description-noroutes": "Non están dispoñibles as rutas de reinicio de contrasinal \n\nActive as rutas en <var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var> para usar este módulo.",
        "apihelp-resetpassword-param-user": "Usuario sendo reinicializado.",
        "apihelp-resetpassword-param-email": "Está reinicializándose o enderezo de correo electrónico do usuario.",
        "apihelp-resetpassword-param-capture": "Devolve os contrasinais temporais que se enviaron. Require o dereito de usuario <code>passwordreset</code> .",
        "apihelp-stashedit-param-contentmodel": "Modelo de contido para o novo contido.",
        "apihelp-stashedit-param-contentformat": "Formato de serialización de contido utilizado para o texto de entrada.",
        "apihelp-stashedit-param-baserevid": "Identificador da revisión da revisión de base.",
+       "apihelp-stashedit-param-summary": "Resumo do cambio.",
        "apihelp-tag-description": "Engadir ou eliminar etiquetas de cambio de revisións individuais ou entradas de rexistro.",
        "apihelp-tag-param-rcid": "Identificadores de un ou máis cambios recentes nos que engadir ou eliminar a etiqueta.",
        "apihelp-tag-param-revid": "Identificadores de unha ou máis revisións nas que engadir ou eliminar a etiqueta.",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Concedida a|Concedidas a}}: $2",
        "api-help-right-apihighlimits": "Usar os valores superiores das consultas da API (consultas lentas: $1; consultas rápidas: $2). Os límites para as consultas lentas tamén se aplican ós parámetros multivaluados.",
        "api-help-open-in-apisandbox": "<small>[abrir en zona de probas]</small>",
+       "api-help-authmanagerhelper-requests": "Só usar estas peticións de autenticación, co <samp>id</samp> devolto por <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$1</kbd> ou dunha resposta previa deste módulo.",
+       "api-help-authmanagerhelper-request": "Usar esta petición de autenticación, co <samp>id</samp> devolto por <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$1</kbd>.",
        "api-help-authmanagerhelper-messageformat": "Formato a usar para devolver as mensaxes.",
        "api-help-authmanagerhelper-mergerequestfields": "Fusionar os campos de información para todas as peticións de autenticación nunha táboa.",
        "api-help-authmanagerhelper-preservestate": "Conservar o estado dun intento previo de conexión fallida, se é posible.",
+       "api-help-authmanagerhelper-continue": "Esta petición é unha continucación despois dun resposta precedente <samp>UI</samp> ou <samp>REDIRECT</samp>. Esta ou <var>$1returnurl</var> é requirida.",
        "api-credits-header": "Créditos",
        "api-credits": "Desenvolvedores da API:\n* Roan Kattouw (desenvolvedor principal, set. 2007-2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (creador e desenvolvedor principal, set. 2006-sep. 2007)\n* Brad Jorsch (desenvolvedor principal, 2013-actualidade)\n\nEnvía comentarios, suxerencias e preguntas a mediawiki-api@lists.wikimedia.org\nou informa dun erro en https://phabricator.wikimedia.org/."
 }
index c85a62b..7d8da1e 100644 (file)
@@ -24,7 +24,7 @@
        "apihelp-main-param-requestid": "כל ערך שיינתן כאן ייכלל בתשובה. אפשר להשתמש בזה כדי להבדיל בין בקשות.",
        "apihelp-main-param-servedby": "לכלול את שם המארח ששירת את הבקשה בתוצאות.",
        "apihelp-main-param-curtimestamp": "הכללת חותם־הזמן הנוכחי בתוצאה.",
-       "apihelp-main-param-origin": "בעת גישה ל־API עם בקשת AJAX חוצה מתחמים (CORS), יש להציב כאן את המתחם שהבקשה יוצאת ממנו. זה היה להיות כלול בכל בקשה מקדימה, ולכן הוא חייב להיות חלק מה־URI של הבקשה (לא גוף ה־POST). זה חייב להיות תואם במדויק לאחד המקורות בכותרת <code>Origin</code>, כך שזה צריך להיות מוגדר למשהו כמו <kbd>https://en.wikipedia.org</kbd> או <kbd>https://meta.wikimedia.org</kbd>. אם הפרמטר הזה אינו תואם לכותרת <code>Origin</code>, תוחזר תשובת 403. אם הפרמטר הזה תורם לכותרת <code>Origin</code> והמקור נמצא ברשימה הלבנה, תוגדר כותרת <code>Access-Control-Allow-Origin</code>.",
+       "apihelp-main-param-origin": "בעת גישה ל־API עם בקשת AJAX חוצה מתחמים (CORS), יש להציב כאן את המתחם שהבקשה יוצאת ממנו. זה היה להיות כלול בכל בקשה מקדימה, ולכן הוא חייב להיות חלק מה־URI של הבקשה (לא גוף ה־POST).\n\nעבור בקשות מאומתות, זה חייב להיות תואם במדויק לאחד המקורות בכותרת <code>Origin</code>, כך שזה צריך להיות מוגדר למשהו כמו <kbd>https://en.wikipedia.org</kbd> או <kbd>https://meta.wikimedia.org</kbd>. אם הפרמטר הזה אינו תואם לכותרת <code>Origin</code>, תוחזר תשובת 403. אם הפרמטר הזה תורם לכותרת <code>Origin</code> והמקור נמצא ברשימה הלבנה, תוגדרנה הכותרות <code>Access-Control-Allow-Origin</code> ו־<code>Access-Control-Allow-Credentials</code>.\n\nעבור בקשות בלתי־מאומתות, יש לציין את הערך <kbd>*</kbd>. זה יגרום לכותרת להיות <code>Access-Control-Allow-Origin</code>, אבל <code>Access-Control-Allow-Credentials</code> תהיה <code>false</code> וכל הנתונים הייחודיים למשתמש יהיו מוגבלים.",
        "apihelp-main-param-uselang": "באיזו שפה להשתמש לתרגומי הודעות. הקריאה <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> עם <kbd>siprop=languages</kbd> מחזירה רשימת קודים. ציון <kbd>user</kbd> כדי להשתמש בהעדפת השפה של המשתמש הנוכחי, וציון <kbd>content</kbd> להשתמש בקוד השפה של הוויקי הזה.",
        "apihelp-block-description": "חסימת משתמש.",
        "apihelp-block-param-user": "שם משתמש, כתובת IP, או טווח IP שהנך רוצה לחסום.",
@@ -74,6 +74,9 @@
        "apihelp-createaccount-param-language": "קוד השפה שיוגדר כבררת המחדל למשתמש (רשות, בררת המחדל היא שפת התוכן).",
        "apihelp-createaccount-example-pass": "יצירת המשתמש <kbd>testuser</kbd> עם הססמה <kbd>test123</kbd>.",
        "apihelp-createaccount-example-mail": "יצירת המשתמש <kbd>testmailuser</kbd> ושליחת ססמה שיוצרה אקראית בדוא״ל.",
+       "apihelp-cspreport-description": "משמש דפדפנים לדיווח הפרות של מדיניות אבטחת תוכן. המודול הזה לעולם לא ישמש אלא אם הוא משמש עם דפדפן תומך CSP.",
+       "apihelp-cspreport-param-reportonly": "לסמן בתור דיווח ממדיניות מנטרת, לא מדיניות כפויה",
+       "apihelp-cspreport-param-source": "מה ייצר את כותרת ה־CSP שייצרה את הדו״ח הזה",
        "apihelp-delete-description": "מחיקת דף.",
        "apihelp-delete-param-title": "כותרת העמוד למחיקה. לא ניתן להשתמש בשילוב עם <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "מס׳ הזיהוי של העמוד למחיקה. לא ניתן להשתמש בשילוב עם <var>$1title</var>.",
@@ -92,7 +95,7 @@
        "apihelp-edit-param-section": "מספר הפסקה <kbd>0</kbd> לפסקה העליונה, <kbd>new</kbd> לפסקה חדשה.",
        "apihelp-edit-param-sectiontitle": "הכותרת לפסקה החדשה.",
        "apihelp-edit-param-text": "תוכן הדף.",
-       "apihelp-edit-param-summary": "תקצ×\99ר ×¢×¨×\99×\9b×\94. ×\92×\9d ×\92ותרת פסקה כש־$1section=new ו־$1sectiontitle אינו מוגדר.",
+       "apihelp-edit-param-summary": "תקצ×\99ר ×¢×¨×\99×\9b×\94. ×\92×\9d ×\9bותרת פסקה כש־$1section=new ו־$1sectiontitle אינו מוגדר.",
        "apihelp-edit-param-tags": "אילו תגי שינוי להחיל על הגרסה.",
        "apihelp-edit-param-minor": "עריכה משנית.",
        "apihelp-edit-param-notminor": "שינוי לא משני.",
        "apihelp-expandtemplates-param-includecomments": "האם לכלול הערות HTML בפלט.",
        "apihelp-expandtemplates-param-generatexml": "יצירת עץ פענוח XML (מוחלף ב־$1prop=parsetree).",
        "apihelp-expandtemplates-example-simple": "להרחיב את קוד הוויקי <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>.",
-       "apihelp-feedcontributions-description": "×\94×\97×\96רת הזנת תרומות משתמש.",
+       "apihelp-feedcontributions-description": "×\9c×\94×\97×\96×\99ר הזנת תרומות משתמש.",
        "apihelp-feedcontributions-param-feedformat": "תסדיר ההזנה.",
        "apihelp-feedcontributions-param-user": "לקבל תרומות של אילו משמשים.",
        "apihelp-feedcontributions-param-namespace": "לפי איזה מרחב שם לסנן את התרומות.",
        "apihelp-feedcontributions-param-deletedonly": "הצגת תרומות שנמחקו בלבד.",
        "apihelp-feedcontributions-param-toponly": "הצגת עריכות שהן הגרסה העדכנית ביותר בלבד.",
        "apihelp-feedcontributions-param-newonly": "להציג רק עריכות שהן יצירות דפים.",
+       "apihelp-feedcontributions-param-hideminor": "להסתיר עריכות משניות.",
        "apihelp-feedcontributions-param-showsizediff": "להציג את ההבדל בגודל בין גרסאות.",
        "apihelp-feedcontributions-example-simple": "החזרת תרומות עבור המשתמש <kbd>Example</kbd>.",
        "apihelp-feedrecentchanges-description": "להחזיר הזנת שינויים אחרונים.",
        "apihelp-query+allimages-param-start": "מאיזה חותם־זמן להתחיל למנות. יכול לשמש רק עם $1sort=timestamp.",
        "apihelp-query+allimages-param-end": "באיזה חותם זמן להפסיק לרשום. אפשר להשתמש בזה רק עם $1sort=timestamp.",
        "apihelp-query+allimages-param-prefix": "חיפוש כל שמות התמונות שמתחילים בערך הזה. יכול לשמש רק עם $1sort=name.",
-       "apihelp-query+allimages-param-minsize": "×\9c×\94×\92×\91×\99×\9c ×\9cת×\9e×\95× ×\95ת ×¢×\9d ×\9eספר ×\9b×\96×\94 ×©×\9c ×\91תים לפחות.",
-       "apihelp-query+allimages-param-maxsize": "×\9c×\94×\92×\91×\99×\9c ×\9cת×\9e×\95× ×\95ת ×¢×\9d ×\9eספר ×\9b×\96×\94 ×\9c×\9b×\9c ×\94×\99×\95תר ×©×\9c ×\91תים.",
+       "apihelp-query+allimages-param-minsize": "×\9c×\94×\92×\91×\99×\9c ×\9cת×\9e×\95× ×\95ת ×¢×\9d ×\9eספר ×\9b×\96×\94 ×©×\9c ×\91×\99×\99×\98ים לפחות.",
+       "apihelp-query+allimages-param-maxsize": "×\9c×\94×\92×\91×\99×\9c ×\9cת×\9e×\95× ×\95ת ×¢×\9d ×\9eספר ×\9b×\96×\94 ×\9c×\9b×\9c ×\94×\99×\95תר ×©×\9c ×\91×\99×\99×\98ים.",
        "apihelp-query+allimages-param-sha1": "גיבוב SHA1 של תמונה. דריסת $1sha1base36.",
        "apihelp-query+allimages-param-sha1base36": "גיבוב SHA1 של התמונה בבסיס 36 (הבסיס בו נעשה שימוש במדיה־ויקי).",
        "apihelp-query+allimages-param-user": "להחזיר רק קבצים שהועלו על־ידי המשתמש הזה. יכול לשמש רק עם $1sort=timestamp. לא יכול לשמש יחד עם $1filterbots.",
        "apihelp-query+allpages-param-prefix": "חיפוש כל שמות הדפים שמתחילים בערך הזה.",
        "apihelp-query+allpages-param-namespace": "איזה מרחב שם למנות.",
        "apihelp-query+allpages-param-filterredir": "אילו דפים לרשום.",
-       "apihelp-query+allpages-param-minsize": "×\9c×\94×\92×\91×\99×\9c ×\9c×\93פ×\99×\9d ×¢×\9d ×\9eספר ×\9b×\96×\94 ×\9cפ×\97×\95ת ×©×\9c ×\91תים.",
-       "apihelp-query+allpages-param-maxsize": "×\9c×\94×\92×\91×\99×\9c ×\9c×\93פ×\99×\9d ×©×\99ש ×\91×\94×\9d ×\9c×\9b×\9c ×\94×\99×\95תר ×\9eספר ×\9b×\96×\94 ×©×\9c ×\91תים.",
+       "apihelp-query+allpages-param-minsize": "×\9c×\94×\92×\91×\99×\9c ×\9c×\93פ×\99×\9d ×¢×\9d ×\9eספר ×\9b×\96×\94 ×\9cפ×\97×\95ת ×©×\9c ×\91×\99×\99×\98ים.",
+       "apihelp-query+allpages-param-maxsize": "×\9c×\94×\92×\91×\99×\9c ×\9c×\93פ×\99×\9d ×©×\99ש ×\91×\94×\9d ×\9c×\9b×\9c ×\94×\99×\95תר ×\9eספר ×\9b×\96×\94 ×©×\9c ×\91×\99×\99×\98ים.",
        "apihelp-query+allpages-param-prtype": "להגביל רק לדפים מוגנים.",
        "apihelp-query+allpages-param-prlevel": "לסנו הגנות לפי רמת ההגנה (חייב לשמש עם $1prtype= parameter).",
        "apihelp-query+allpages-param-prfiltercascade": "לסנן הגנות לפי דירוגיות (לא תקף כאשר $1prtype אינו מוגדר).",
        "apihelp-query+deletedrevs-param-excludeuser": "לא לרשום גרסאות מאת המשתמש הזה.",
        "apihelp-query+deletedrevs-param-namespace": "לרשום רק דפים במרחב השם הזה.",
        "apihelp-query+deletedrevs-param-limit": "המספר המרבי של הגרסאות שיירשם.",
-       "apihelp-query+deletedrevs-param-prop": "×\90×\99×\9c×\95 ×\9e×\90פ×\99×\99× ×\99×\9d ×\9cק×\91×\9c:\n;revid:×\94×\95ספת ×\9e×\96×\94×\94 ×\94×\92רס×\94 ×©×\9c ×\94×\92רס×\94 ×\94×\9e×\97×\95ק×\94.\n;parentid:×\94×\95ספת ×\9e×\96×\94×\94 ×\94×\92רס×\94 ×©×\9c ×\94×\92רס×\94 ×\94ק×\95×\93×\9eת ×©×\9c ×\94×\93×£.\n;user:×\94×\95ספת ×\94×\9eשת×\9eש ×©×¢×©×\94 ×\90ת ×\94×\92רס×\94.\n;userid:×\94×\95ספת ×\9e×\96×\94×\94 ×\94×\9eשת×\9eש ×©×¢×©×\94 ×\90ת ×\94×\92רס×\94.\n;comment:×\94×\95ספת ×\94×\94ער×\94 ×¢×\9c ×\94×\92רס×\94.\n;parsedcomment:×\94×\95ספת ×\94×\94ער×\94 ×\94×\9eפ×\95×¢× ×\97ת ×¢×\9c ×\94×\92רס×\94.\n;minor:×\9eת×\99×\99×\92 ×\90×\9d ×\94×\92רס×\94 ×\9eשנ×\99ת.\n;len:×\9e×\95ס×\99×£ ×\90ת ×\94×\90×\95ר×\9a (×\91×\91תים) של הגרסה.\n;sha1:הוספת ה־SHA-1 (בסיס 16) של הגרסה.\n;content:הוספת התוכן של הגרסה.\n;token:<span class=\"apihelp-deprecated\">מיושן.</span> נותן אסימון עריכה.\n;tags:תגים עבור הגרסה.",
+       "apihelp-query+deletedrevs-param-prop": "×\90×\99×\9c×\95 ×\9e×\90פ×\99×\99× ×\99×\9d ×\9cק×\91×\9c:\n;revid:×\94×\95ספת ×\9e×\96×\94×\94 ×\94×\92רס×\94 ×©×\9c ×\94×\92רס×\94 ×\94×\9e×\97×\95ק×\94.\n;parentid:×\94×\95ספת ×\9e×\96×\94×\94 ×\94×\92רס×\94 ×©×\9c ×\94×\92רס×\94 ×\94ק×\95×\93×\9eת ×©×\9c ×\94×\93×£.\n;user:×\94×\95ספת ×\94×\9eשת×\9eש ×©×¢×©×\94 ×\90ת ×\94×\92רס×\94.\n;userid:×\94×\95ספת ×\9e×\96×\94×\94 ×\94×\9eשת×\9eש ×©×¢×©×\94 ×\90ת ×\94×\92רס×\94.\n;comment:×\94×\95ספת ×\94×\94ער×\94 ×¢×\9c ×\94×\92רס×\94.\n;parsedcomment:×\94×\95ספת ×\94×\94ער×\94 ×\94×\9eפ×\95×¢× ×\97ת ×¢×\9c ×\94×\92רס×\94.\n;minor:×\9eת×\99×\99×\92 ×\90×\9d ×\94×\92רס×\94 ×\9eשנ×\99ת.\n;len:×\9e×\95ס×\99×£ ×\90ת ×\94×\90×\95ר×\9a (×\91×\91×\99×\99×\98ים) של הגרסה.\n;sha1:הוספת ה־SHA-1 (בסיס 16) של הגרסה.\n;content:הוספת התוכן של הגרסה.\n;token:<span class=\"apihelp-deprecated\">מיושן.</span> נותן אסימון עריכה.\n;tags:תגים עבור הגרסה.",
        "apihelp-query+deletedrevs-example-mode1": "רשימת כל הגרסאות המחוקות של הדפים <kbd>Main Page</kbd> ו־<kbd>Talk:Main Page</kbd>, עם תוכן (mode 1).",
        "apihelp-query+deletedrevs-example-mode2": "רשימת 50 העריכות המחוקות האחרונות של <kbd>Bob</kbd>‏ (mode 2).",
        "apihelp-query+deletedrevs-example-mode3-main": "רשימת 50 הגרסאות המחוקות הראשונות במרחב הראשי (mode 3).",
        "apihelp-query+filearchive-paramvalue-prop-sha1": "הוספת גיבוב SHA-1 עבור התמונה.",
        "apihelp-query+filearchive-paramvalue-prop-timestamp": "הוספת חותם־זמן לגרסה המועלית.",
        "apihelp-query+filearchive-paramvalue-prop-user": "הוספת המשתמש שהעלה על גרסת התמונה.",
-       "apihelp-query+filearchive-paramvalue-prop-size": "×\94×\95ספת ×\94×\92×\95×\93×\9c ×©×\9c ×\94ת×\9e×\95× ×\94 ×\91×\91תים והגובה, הרוחב ומניין הדפים (אם מתאים).",
+       "apihelp-query+filearchive-paramvalue-prop-size": "×\94×\95ספת ×\94×\92×\95×\93×\9c ×©×\9c ×\94ת×\9e×\95× ×\94 ×\91×\91×\99×\99×\98ים והגובה, הרוחב ומניין הדפים (אם מתאים).",
        "apihelp-query+filearchive-paramvalue-prop-dimensions": "כינוי ל־size.",
        "apihelp-query+filearchive-paramvalue-prop-description": "הוספת תיאור לגרסת התמונה.",
        "apihelp-query+filearchive-paramvalue-prop-parseddescription": "פענוח התיאור של הגרסה.",
        "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "פענוח ההערה על גרסה.",
        "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "הוספת הכותרת הקנונית של הקובץ.",
        "apihelp-query+imageinfo-paramvalue-prop-url": "מתן URL לקובץ ולדף התיאור.",
-       "apihelp-query+imageinfo-paramvalue-prop-size": "×\94×\95ספת ×\94×\92×\95×\93×\9c ×©×\9c ×\94ק×\95×\91×¥ ×\91×\91תים והגובה, הרוחב ומניין הדפים (אם זה מתאים).",
+       "apihelp-query+imageinfo-paramvalue-prop-size": "×\94×\95ספת ×\94×\92×\95×\93×\9c ×©×\9c ×\94ק×\95×\91×¥ ×\91×\91×\99×\99×\98ים והגובה, הרוחב ומניין הדפים (אם זה מתאים).",
        "apihelp-query+imageinfo-paramvalue-prop-dimensions": "כינוי ל־size.",
        "apihelp-query+imageinfo-paramvalue-prop-sha1": "הוספת גיבוב SHA-1 עבור הקובץ.",
        "apihelp-query+imageinfo-paramvalue-prop-mime": "הוספת סוג ה־MIME של הקובץ.",
        "apihelp-query+recentchanges-paramvalue-prop-timestamp": "הוספת חותם־זמן של העריכה.",
        "apihelp-query+recentchanges-paramvalue-prop-title": "הוספת שם הדף של העריכה.",
        "apihelp-query+recentchanges-paramvalue-prop-ids": "הוספת מזהה הדף, מזהה שינויים אחרונים, והמזהה הגרסה החדשה והישנה.",
-       "apihelp-query+recentchanges-paramvalue-prop-sizes": "×\94×\95ספת ×\90×\95ר×\9a ×\94×\93×£ ×\94×\97×\93ש ×\95×\94×\99ש×\9f ×\91×\91תים.",
+       "apihelp-query+recentchanges-paramvalue-prop-sizes": "×\94×\95ספת ×\90×\95ר×\9a ×\94×\93×£ ×\94×\97×\93ש ×\95×\94×\99ש×\9f ×\91×\91×\99×\99×\98ים.",
        "apihelp-query+recentchanges-paramvalue-prop-redirect": "מתייג שהדף הוא הפניה.",
        "apihelp-query+recentchanges-paramvalue-prop-patrolled": "מתייג עריכה בת־בדיקה בתור בדוקה או בלתי־בדוקה.",
        "apihelp-query+recentchanges-paramvalue-prop-loginfo": "הוספת מידע יומן (זהה יומן, סוג יומן וכו') לעיולי יומן.",
        "apihelp-query+revisions+base-paramvalue-prop-timestamp": "חותם־הזמן של הגרסה.",
        "apihelp-query+revisions+base-paramvalue-prop-user": "המתמש שעשה את הגרסה",
        "apihelp-query+revisions+base-paramvalue-prop-userid": "מזהה המשתמש של יוצר הגרסה.",
-       "apihelp-query+revisions+base-paramvalue-prop-size": "×\90×\95ר×\9a (×\91×\91תים) של הגרסה.",
+       "apihelp-query+revisions+base-paramvalue-prop-size": "×\90×\95ר×\9a (×\91×\91×\99×\99×\98ים) של הגרסה.",
        "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1 (בבסיס 16) של הגרסה.",
        "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "מזהה מודל התוכן של הגרסה.",
        "apihelp-query+revisions+base-paramvalue-prop-comment": "הערה מאת המשתמש על הגרסה.",
        "apihelp-query+search-param-info": "אילו מטא־נתונים להחזיר.",
        "apihelp-query+search-param-prop": "אילו מאפיינים להחזיר:",
        "apihelp-query+search-param-qiprofile": "באיזה פרופיל בלתי־תלוי בשאילתה להשתמש (משפיע על אלגוריתם הדירוג).",
-       "apihelp-query+search-paramvalue-prop-size": "×\94×\95ספת ×\92×\95×\93×\9c ×\94×\93×£ ×\91×\91תים.",
+       "apihelp-query+search-paramvalue-prop-size": "×\94×\95ספת ×\92×\95×\93×\9c ×\94×\93×£ ×\91×\91×\99×\99×\98ים.",
        "apihelp-query+search-paramvalue-prop-wordcount": "הוספת מניין המילים של הדף.",
        "apihelp-query+search-paramvalue-prop-timestamp": "הוספת חותם־הזמן של העריכה האחרונה של הדף.",
        "apihelp-query+search-paramvalue-prop-snippet": "הוספת קטע קצר מפוענח מהדף.",
        "apihelp-query+watchlistraw-param-show": "לרשום רק פריטים שעונים על אמות המידה האלו.",
        "apihelp-query+watchlistraw-param-owner": "משמש יחד עם $1token לגישה לרשימת מעקב של משתמש אחר.",
        "apihelp-query+watchlistraw-param-token": "אסימון אבטחה (זמין ב־[[Special:Preferences#mw-prefsection-watchlist|העדפות]]) שמאפשר לגשת לרשימת מעקב של משתמש אחר.",
+       "apihelp-query+watchlistraw-param-dir": "באיזה כיוון לרשום.",
        "apihelp-query+watchlistraw-param-fromtitle": "מאיזו כותרת (עם תחילית מרחב שם) להתחיל למנות.",
        "apihelp-query+watchlistraw-param-totitle": "באיזו כותרת (עם תחילית מרחב שם) להפסיק למנות.",
        "apihelp-query+watchlistraw-example-simple": "לרשום דפים ברשימת המעקב של המשתמש הנוכחי.",
        "apihelp-stashedit-param-contentmodel": "מודל התוכן של התוכן החדש.",
        "apihelp-stashedit-param-contentformat": "תסדיר הסדרת תוכן עבור טקסט הקלט.",
        "apihelp-stashedit-param-baserevid": "מזהה גסה של גרסת הבסיס.",
+       "apihelp-stashedit-param-summary": "לשנות תקציר.",
        "apihelp-tag-description": "הוספת או הסרה של תגים מגרסאות בודדות או עיולי יומן בודדים.",
        "apihelp-tag-param-rcid": "מזהה שינוי אחרון אחד או יותר שתג יתווסף אליו או יוסר ממנו.",
        "apihelp-tag-param-revid": "מזהה גרסה אחד או יותר שתג יתווסף אליה או יוסר ממנה.",
        "apihelp-upload-param-sessionkey": "אותו דבר כמו $1filekey, מושאר לצור תאימות אחורה.",
        "apihelp-upload-param-stash": "אם זה מוגדר, השרת יסליק זמנית את הקובץ במקום להוסיף אותו למאגר.",
        "apihelp-upload-param-filesize": "גודל הקובץ של כל ההעלאה.",
-       "apihelp-upload-param-offset": "×\94×\99ס×\98 ×\94×\97ת×\99×\9b×\94 ×\91×\91תים.",
+       "apihelp-upload-param-offset": "×\94×\99ס×\98 ×\94×\97ת×\99×\9b×\94 ×\91×\91×\99×\99×\98ים.",
        "apihelp-upload-param-chunk": "תוכן החתיכה.",
        "apihelp-upload-param-async": "להפוך פעולות קבצים גדולות לאסינכרוניות כשאפשר.",
        "apihelp-upload-param-checkstatus": "לאחזר רק מצב העלאה עבור מפתח הקובץ שניתן.",
index 147a832..0f8a9ad 100644 (file)
@@ -4,6 +4,7 @@
                        "McDutchie"
                ]
        },
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Listas de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annuncios sur le API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & demandas]\n</div>\n<strong>Stato:</strong> Tote le functiones monstrate in iste pagina deberea functionar, sed le API es ancora in disveloppamento active e pote cambiar a omne momento. Subscribe te al [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de diffusion mediawiki-api-announce] pro esser informate de actualisationes.\n\n<strong>Requestas erronee:</strong> Quando requestas erronee se invia al API, un capite HTTP essera inviate con le clave \"MediaWiki-API-Error\". Le valor de iste capite e le codice de error reinviate essera identic. Pro plus information vide [[mw:API:Errors_and_warnings|API: Errores e avisos]].\n\n<strong>Tests:</strong> Pro facilitar le test de requestas API, vide [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Qual action exequer.",
        "apihelp-main-param-format": "Le formato del resultato.",
        "apihelp-main-param-maxlag": "Le latentia maximal pote esser usate quando MediaWiki es installate in un cluster de base de datos replicate. Pro evitar actiones que causa additional latentia de replication de sito, iste parametro pote facer le cliente attender usque le latentia de replication es minus que le valor specificate. In caso de latentia excessive, le codice de error <samp>maxlag</samp> es retornate con un message como <samp>Attende $host: $lag secundas de latentia</samp>.<br />Vide [[mw:Manual:Maxlag_parameter|Manual: Maxlag parameter]] pro plus information.",
        "apihelp-main-param-requestid": "Omne valor fornite hic essera includite in le responsa. Pote esser usate pro distinguer requestas.",
        "apihelp-main-param-servedby": "Includer in le resultato le nomine del host que ha servite le requesta.",
        "apihelp-main-param-curtimestamp": "Includer le data e hora actual in le resultato.",
-       "apihelp-main-param-origin": "Quando acceder al API usante un requesta AJAX inter-dominios (CORS), mitte isto al dominio de origine. Isto debe esser includite in omne requesta pre-flight, e dunque debe facer parte del URI del requesta (e non del corpore POST). Isto debe corresponder exactemente a un del origines in le capite Origin:, dunque illo debe esser mittite a qualcusa como http://ia.wikipedia.org o https://meta.wikimedia.org. Si iste parametro non corresponde al capite Origin:, un responsa 403 essera retornate. Si iste parametro corresponde al capite Origin: e le origine es in le lista blanc, un capite Access-Control-Allow-Origin essera inserite.",
-       "apihelp-main-param-uselang": "Lingua a usar pro traductiones de messages. Un lista de codices pote esser obtenite ab [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] con siprop=languages, o specifica \"user\" pro usar le preferentia de lingua del usator actual, o specifica \"content\" pro usar le lingua de contento de iste wiki.",
+       "apihelp-main-param-origin": "Quando se accede al API usante un requesta AJAX inter-dominios (CORS), mitte le dominio de origine in iste parametro. Illo debe esser includite in omne requesta pre-flight, e dunque debe facer parte del URI del requesta (e non del corpore POST). Illo debe corresponder exactemente a un del origines in le capite <code>Origin</code>, dunque debe esser mittite a qualcosa como <kbd>http://ia.wikipedia.org</kbd> o <kbd>https://meta.wikimedia.org</kbd>. Si iste parametro non corresponde al capite <code>Origin</code>, un responsa 403 essera retornate. Si iste parametro corresponde al capite <code>Origin</code> e le origine es in le lista blanc, un capite <code>Access-Control-Allow-Origin</code> essera inserite.",
+       "apihelp-main-param-uselang": "Lingua a usar pro traductiones de messages <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> con <kbd>siprop=languages</kbd> retorna un lista de codices de lingua, o specifica <kbd>user</kbd> pro usar le preferentia de lingua del usator actual, o specifica <kbd>content</kbd> pro usar le lingua de contento de iste wiki.",
        "apihelp-block-description": "Blocar un usator.",
        "apihelp-block-param-user": "Nomine de usator, adresse IP o intervallo IP que tu vole blocar.",
-       "apihelp-block-param-expiry": "Tempore de expiration. Pote esser relative (p.ex. \"5 months\" o \"2 weeks\") o absolute (p.ex. \"2014-09-18T12:34:56Z\"). Si es mittite a \"infinite\", \"indefinite\" o \"never\", le blocada nunquam expirara.",
+       "apihelp-block-param-expiry": "Tempore de expiration. Pote esser relative (p.ex. <kbd>5 months</kbd> o <kbd>2 weeks<.kbd>) o absolute (p.ex. <kbd>2014-09-18T12:34:56Z</kbd>). Si es mittite a <kbd>infinite</kbd>, <kbd>indefinite</kbd> o <kbd>never</kbd>, le blocada nunquam expirara.",
        "apihelp-block-param-reason": "Motivo del blocada.",
        "apihelp-block-param-anononly": "Blocar solmente usatores anonyme (i.e. disactivar modificationes anonyme pro iste adresse IP).",
        "apihelp-block-param-nocreate": "Impedir le creation de contos.",
        "apihelp-block-param-autoblock": "Blocar automaticamente le adresse IP usate le plus recentemente, e omne IPs successive desde le quales ille/-a tenta facer modificationes.",
-       "apihelp-block-param-noemail": "Impedir que le usator invia e-mail per le wiki. (Require le derecto \"blockemail\").",
+       "apihelp-block-param-noemail": "Impedir que le usator invia e-mail per le wiki. (Require le derecto <code>blockemail</code>).",
+       "apihelp-block-param-hidename": "Celar le nomine de usator in le registro de blocadas. (Require le derecto <code>hideuser</code>.)",
+       "apihelp-block-param-allowusertalk": "Permitter que le usator modifica su proprie pagina de discussion (depende de <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-reblock": "Si le usator es jam blocate, superscriber le blocada existente.",
+       "apihelp-block-param-watchuser": "Observar le paginas de usator e discussion del usator o del adresse IP.",
+       "apihelp-block-example-ip-simple": "Blocar le adresse IP <kbd>192.0.2.5</kbd> pro tres dies con le motivo <kbd>Prime advertimento</kbd>.",
+       "apihelp-block-example-user-complex": "Blocar le usator <kbd>Vandalo</kbd> pro tempore indeterminate con le motivo <kbd>Vandalismo</kbd>, e impedir le creation de nove contos e le invio de e-mail.",
+       "apihelp-changeauthenticationdata-description": "Cambiar le datos de authentication pro le usator actual.",
+       "apihelp-changeauthenticationdata-example-password": "Tentar de cambiar le contrasigno del usator actual a <kbd>ExemploDeContrasigno</kbd>.",
+       "apihelp-checktoken-description": "Verificar le validitate de un indicio ab <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Typo de indicio a testar.",
        "apihelp-checktoken-param-token": "Indicio a testar.",
+       "apihelp-checktoken-param-maxtokenage": "Etate maxime permittite pro le indicio, in secundas.",
+       "apihelp-checktoken-example-simple": "Testar le validitate de un indicio <kbd>csrf</kbd>.",
+       "apihelp-clearhasmsg-description": "Cancella le signal <code>hasmsg</code> pro le usator actual.",
+       "apihelp-clearhasmsg-example-1": "Cancellar le signal <code>hasmsg</code> pro le usator actual.",
+       "apihelp-clientlogin-description": "Aperir session in le wiki usante le fluxo interactive.",
+       "apihelp-clientlogin-example-login": "Comenciar le processo de aperir session in le wiki como le usator <kbd>Exemplo</kbd> con le contrasigno <kbd>ExemploDeContrasigno</kbd>.",
+       "apihelp-clientlogin-example-login2": "Continuar a aperir session post un responsa <samp>UI</samp> pro authentication bifactorial, forniente un <var>OATHToken</var> de <kbd>987654</kbd>.",
+       "apihelp-compare-description": "Obtener le differentia inter duo paginas.\n\nEs necessari indicar un numero de version, un titulo de pagina o un ID de pagina, e pro \"from\" e pro \"to\".",
+       "apihelp-compare-param-fromtitle": "Prime titulo a comparar.",
+       "apihelp-compare-param-fromid": "Prime ID de pagina comparar.",
+       "apihelp-compare-param-fromrev": "Prime version a comparar.",
+       "apihelp-compare-param-totitle": "Secunde titulo a comparar.",
+       "apihelp-compare-param-toid": "Secunde ID de pagina a comparar.",
+       "apihelp-compare-param-torev": "Secunde version a comparar.",
+       "apihelp-compare-example-1": "Crear un diff inter version 1 e 2.",
+       "apihelp-createaccount-description": "Crear un nove conto de usator.",
        "apihelp-createaccount-param-name": "Nomine de usator.",
        "apihelp-query+prefixsearch-param-profile": "Le profilo de recerca a usar.",
        "apihelp-query+revisions-example-first5-not-localhost": "Obtener le prime 5 versiones del \"Pagina principal\" que non ha essite facite per le usator anonyme \"127.0.0.1\"",
index f876b1f..57e124c 100644 (file)
@@ -13,7 +13,9 @@
                        "Nemo bis",
                        "JackLantern",
                        "Urielejh",
-                       "Matteocng"
+                       "Matteocng",
+                       "Einreiher",
+                       "Mpiva"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentazione]] (in inglese)\n* [[mw:API:FAQ|FAQ]] (in inglese)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annunci sull'API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bug & richieste]\n</div>\n<strong>Stato:</strong> tutte le funzioni e caratteristiche mostrate su questa pagina dovrebbero funzionare, ma le API sono ancora in fase attiva di sviluppo, e potrebbero cambiare in qualsiasi momento. Iscriviti alla [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la mailing list sugli annunci delle API MediaWiki] per essere informato sugli aggiornamenti.\n\n<strong>Istruzioni sbagliate:</strong> quando vengono impartite alle API delle istruzioni sbagliate, un'intestazione HTTP verrà inviata col messaggio \"MediaWiki-API-Error\" e, sia il valore dell'intestazione, sia il codice d'errore, verranno impostati con lo stesso valore. Per maggiori informazioni leggi [[mw:API:Errors_and_warnings|API:Errori ed avvertimenti]] (in inglese).\n\n<strong>Test:</strong> per testare facilmente le richieste API, vedi [[Special:ApiSandbox]].",
        "apihelp-feedcontributions-param-deletedonly": "Mostra solo i contribuiti cancellati.",
        "apihelp-feedcontributions-param-toponly": "Mostra solo i contributi che sono le ultime versioni per la pagina.",
        "apihelp-feedcontributions-param-newonly": "Visualizza solo le modifiche che sono creazioni di pagina.",
+       "apihelp-feedcontributions-param-hideminor": "Nascondi le modifiche minori.",
        "apihelp-feedcontributions-param-showsizediff": "Mostra la differenza di dimensioni tra le versioni.",
        "apihelp-feedcontributions-example-simple": "Restituisce contributi per l'utente <kbd>Example</kbd>.",
        "apihelp-feedrecentchanges-param-feedformat": "Il formato del feed.",
        "apihelp-feedrecentchanges-param-namespace": "Namespace a cui limitare i risultati.",
        "apihelp-feedrecentchanges-param-associated": "Includi namespace associato (discussione o principale)",
+       "apihelp-feedrecentchanges-param-days": "Intervallo di giorni per i quali limitare i risultati.",
        "apihelp-feedrecentchanges-param-limit": "Numero massimo di risultati da restituire.",
        "apihelp-feedrecentchanges-param-from": "Mostra i cambiamenti da allora.",
        "apihelp-feedrecentchanges-param-hideminor": "Nascondi le modifiche minori.",
        "apihelp-feedrecentchanges-param-hideliu": "Nascondi le modifiche apportate dagli utenti registrati.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Nascondi modifiche verificate.",
        "apihelp-feedrecentchanges-param-hidemyself": "Nasconde le modifiche effettuate dall'utente attuale.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Nascondi le variazioni di appartenenza alle categorie.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtra per etichetta.",
        "apihelp-feedrecentchanges-param-target": "Mostra solo le modifiche alle pagine collegate da questa pagina.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Mostra solo le modifiche alle pagine collegate a quella specificata.",
+       "apihelp-feedrecentchanges-param-categories": "Mostra solo le variazioni sulle pagine di tutte queste categorie.",
+       "apihelp-feedrecentchanges-param-categories_any": "Mostra invece solo le variazioni sulle pagine in una qualunque categoria.",
        "apihelp-feedrecentchanges-example-simple": "Mostra le ultime modifiche.",
        "apihelp-feedrecentchanges-example-30days": "Mostra le modifiche degli ultimi 30 giorni.",
        "apihelp-feedwatchlist-param-feedformat": "Il formato del feed.",
+       "apihelp-feedwatchlist-param-hours": "Elenca le pagine modificate entro queste ultime ore.",
        "apihelp-feedwatchlist-param-linktosections": "Collega direttamente alla sezione modificata, se possibile.",
+       "apihelp-feedwatchlist-example-all6hrs": "Mostra tutte le modifiche alle pagine osservate nelle ultime 6 ore.",
        "apihelp-filerevert-description": "Ripristina un file ad una versione precedente.",
        "apihelp-filerevert-param-filename": "Nome del file di destinazione, senza il prefisso 'File:'.",
        "apihelp-filerevert-param-comment": "Commento sul caricamento.",
        "apihelp-filerevert-param-archivename": "Nome dell'archivio della versione da ripristinare.",
        "apihelp-filerevert-example-revert": "Ripristina <kbd>Wiki.png</kbd> alla versione del <kbd>2011-03-05T15:27:40Z</kbd>.",
+       "apihelp-help-description": "Mostra la guida per i moduli specificati.",
        "apihelp-help-param-toc": "Includi un indice nell'output HTML.",
        "apihelp-help-example-main": "Aiuto per il modulo principale.",
        "apihelp-help-example-submodules": "Aiuto per <kbd>action=query</kbd> e tutti i suoi sotto-moduli.",
        "apihelp-query+prefixsearch-param-search": "Stringa di ricerca.",
        "apihelp-query+prefixsearch-param-limit": "Numero massimo di risultati da restituire.",
        "apihelp-query+prefixsearch-param-offset": "Numero di risultati da saltare",
+       "apihelp-query+prefixsearch-param-profile": "Profilo di ricerca da utilizzare.",
        "apihelp-query+protectedtitles-description": "Elenca tutti i titoli protetti dalla creazione.",
        "apihelp-query+protectedtitles-param-namespace": "Elenca solo i titoli in questi namespace.",
        "apihelp-query+protectedtitles-param-level": "Elenca solo i titoli con questi livelli di protezione.",
        "apihelp-query+watchlistraw-param-limit": "Numero totale di risultati da restituire per ogni richiesta.",
        "apihelp-query+watchlistraw-param-prop": "Quali proprietà aggiuntive ottenere:",
        "apihelp-query+watchlistraw-paramvalue-prop-changed": "Aggiunge data e ora dell'ultima notifica all'utente riguardo la modifica.",
+       "apihelp-query+watchlistraw-param-dir": "La direzione in cui elencare.",
        "apihelp-query+watchlistraw-param-fromtitle": "Il titolo (con prefisso namespace) da cui iniziare l'elenco.",
        "apihelp-query+watchlistraw-param-totitle": "Il titolo (con prefisso namespace) al quale interrompere l'elenco.",
        "apihelp-query+watchlistraw-example-simple": "Elenca le pagine fra gli osservati speciali dell'utente attuale.",
        "apihelp-stashedit-param-sectiontitle": "Il titolo per una nuova sezione.",
        "apihelp-stashedit-param-text": "Contenuto della pagina.",
        "apihelp-stashedit-param-contentmodel": "Modello di contenuto dei nuovi contenuti.",
+       "apihelp-stashedit-param-summary": "Oggetto della modifica.",
        "apihelp-tag-param-reason": "Motivo per la modifica.",
        "apihelp-tokens-param-type": "Tipi di token da richiedere.",
        "apihelp-tokens-example-edit": "Recupera un token di modifica (il predefinito).",
        "api-help-examples": "{{PLURAL:$1|Esempio|Esempi}}:",
        "api-help-permissions": "{{PLURAL:$1|Permesso|Permessi}}:",
        "api-help-open-in-apisandbox": "<small>[apri in una sandbox]</small>",
-       "api-help-authmanager-general-usage": "La procedura generale per usare questo modulo Ã©:\n# Ottenere i campi disponibili da <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$4</kbd>, e un token <kbd>$5</kbd> da <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.\n# Mostra i campi all'utente e ottieni i dati che invia.\n# Esegui un post a questo modulo, fornendo <var>$1returnurl</var> e ogni campo rilevante.\n# Controlla <samp>status</samp> nella response.\n#* Se hai ricevuto <samp>PASS</samp> o <samp>FAIL</samp>, hai finito. L'operazione nel primo caso è andata a buon fine, nel secondo no.\n#* Se hai ricevuto <samp>UI</samp>, mostra i nuovi campi all'utente e ottieni i dati che invia. Esegui un post a questo modulo con <var>$1continue</var> e i campi rilevanti settati, quindi ripeti il punto 4.\n#* Se hai ricevuto <samp>REDIRECT</samp>, dirigi l'utente a <samp>redirecttarget</samp> e aspetta che ritorni a <var>$1returnurl</var>. A quel punto esegui un post a questo modulo con <var>$1continue</var> e ogni campo passato all'URL di ritorno, e ripeti il punto 4.\n#* Se hai ricevuto <samp>RESTART</samp>, vuol dire che l'autenticazione ha funzionato ma non abbiamo un account collegato. Potresti considerare questo caso come <samp>UI</samp> o come <samp>FAIL</samp>.",
+       "api-help-authmanager-general-usage": "La procedura generale per usare questo modulo Ã¨:\n# Ottenere i campi disponibili da <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$4</kbd>, e un token <kbd>$5</kbd> da <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.\n# Mostra i campi all'utente e ottieni i dati che invia.\n# Esegui un post a questo modulo, fornendo <var>$1returnurl</var> e ogni campo rilevante.\n# Controlla <samp>status</samp> nella response.\n#* Se hai ricevuto <samp>PASS</samp> o <samp>FAIL</samp>, hai finito. L'operazione nel primo caso è andata a buon fine, nel secondo no.\n#* Se hai ricevuto <samp>UI</samp>, mostra i nuovi campi all'utente e ottieni i dati che invia. Esegui un post a questo modulo con <var>$1continue</var> e i campi rilevanti settati, quindi ripeti il punto 4.\n#* Se hai ricevuto <samp>REDIRECT</samp>, dirigi l'utente a <samp>redirecttarget</samp> e aspetta che ritorni a <var>$1returnurl</var>. A quel punto esegui un post a questo modulo con <var>$1continue</var> e ogni campo passato all'URL di ritorno, e ripeti il punto 4.\n#* Se hai ricevuto <samp>RESTART</samp>, vuol dire che l'autenticazione ha funzionato ma non abbiamo un account collegato. Potresti considerare questo caso come <samp>UI</samp> o come <samp>FAIL</samp>.",
        "api-help-authmanagerhelper-messageformat": "Formato da utilizzare per per la restituzione dei messaggi.",
        "api-help-authmanagerhelper-preservestate": "Conserva lo stato da un precedente tentativo di accesso non riuscito, se possibile.",
        "api-help-authmanagerhelper-returnurl": "URL di ritorno per i flussi di autenticazione di terze parti, deve essere assoluto. E' necessario fornirlo, oppure va fornito <var>$1continue</var>.\n\nAlla ricezione di una risposta <samp>REDIRECT</samp>, in genere si apre un browser o una vista web all'URL specificato <samp>redirecttarget</samp> per un flusso di autenticazione di terze parti. Quando questo è completato, la terza parte invierà il browser o la vista web a questo URL. Dovresti estrarre qualsiasi parametro POST o della richiesta dall'URL e passarli come un request <var>$1continue</var> a questo modulo API.",
+       "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.",
        "api-credits-header": "Crediti"
 }
index d6596b1..2712c13 100644 (file)
        "apihelp-feedcontributions-param-deletedonly": "削除された投稿記録のみ表示します。",
        "apihelp-feedcontributions-param-toponly": "最新版の編集のみ表示します。",
        "apihelp-feedcontributions-param-newonly": "ページ作成を伴う編集のみを表示します。",
+       "apihelp-feedcontributions-param-hideminor": "細部の編集を非表示",
        "apihelp-feedcontributions-param-showsizediff": "版間のサイズの増減を表示する。",
        "apihelp-feedcontributions-example-simple": "利用者 <kbd>Example</kbd> の投稿記録を取得する。",
        "apihelp-feedrecentchanges-description": "最近の更新フィードを返します。",
        "apihelp-query+deletedrevisions-param-excludeuser": "この利用者による版を一覧表示しない。",
        "apihelp-query+deletedrevisions-example-titles": "ページ <kbd>Main Page</kbd> および <kbd>Talk:Main Page</kbd> の削除された版とその内容を一覧表示する。",
        "apihelp-query+deletedrevisions-example-revids": "削除された版 <kbd>123456</kbd> に関する情報を一覧表示する。",
+       "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|モード}}: $2",
        "apihelp-query+deletedrevs-param-start": "列挙の始点となるタイムスタンプ。",
        "apihelp-query+deletedrevs-param-end": "列挙の終点となるタイムスタンプ。",
        "apihelp-query+deletedrevs-param-from": "列挙の始点となるページ名。",
        "apihelp-query+watchlistraw-description": "現在の利用者のウォッチリストにあるすべてのページを取得します。",
        "apihelp-query+watchlistraw-param-namespace": "この名前空間に含まれるページのみを一覧表示します。",
        "apihelp-query+watchlistraw-param-prop": "追加で取得するプロパティ:",
+       "apihelp-query+watchlistraw-param-dir": "一覧表示する方向。",
        "apihelp-query+watchlistraw-example-generator": "現在の利用者のウォッチリスト上のページに関する情報を取得する。",
        "apihelp-revisiondelete-description": "版の削除および復元を行います。",
        "apihelp-revisiondelete-param-reason": "削除または復元の理由。",
index a3a2db4..1ec5b50 100644 (file)
                        "Revi",
                        "Yearning",
                        "Priviet",
-                       "Ykhwong"
+                       "Ykhwong",
+                       "Jonghaya"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|ì\84¤ëª\85문ì\84\9c]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api ë©\94ì\9d¼ë§\81 ë¦¬ì\8a¤í\8a¸]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API ì\95\8c림 ì\82¬í\95­]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R ë²\84ê·¸ ë°\8f ì\9a\94ì²­]\n</div>\n<strong>ì\83\81í\83\9c:</strong> ì\9d´ í\8e\98ì\9d´ì§\80ì\97\90 ë³´ì\97¬ì§\80ë\8a\94 ëª¨ë\93  ê¸°ë\8a¥ì\9d\80 ì \95ì\83\81ì \81ì\9c¼ë¡\9c ì\9e\91ë\8f\99í\95\98ì§\80ë§\8c, APIë\8a\94 ì\97¬ì \84í\9e\88 í\99\9cë°\9cí\95\98ê²\8c ê°\9cë°\9cë\90\98ê³  ì\9e\88ì\9c¼ë©°, ì\96¸ì \9cë\93 ì§\80 ë³\80ê²½ë\90  ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤. ì\97\85ë\8d°ì\9d´í\8a¸ ê³µì§\80를 ë°\9bì\95\84보려면 [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce ë©\94ì\9d¼ë§\81 ë¦¬ì\8a¤í\8a¸]를 êµ¬ë\8f\85í\95\98ì\8b­ì\8b\9cì\98¤.\n\n<strong>ì\9e\98못ë\90\9c ì\9a\94ì²­:</strong> APIì\97\90 ì\9e\98못ë\90\9c ì\9a\94ì²­ì\9d´ ì \84ì\86¡ë\90\98ë©´ HTTP í\97¤ë\8d\94ì\97\90ì\84\9c \"MediaWiki-API-Error\" í\82¤ë¥¼ ë³´ë\82´ê³ , í\97¤ë\8d\94 ê°\92ê³¼ ì\98¤ë¥\98 ì½\94ë\93\9cê°\80 ê°\99ê²\8c ì\84¤ì \95ë\90©ë\8b\88ë\8b¤. ì\9e\90ì\84¸í\95\9c ì \95ë³´ì\97\90 ë\8c\80í\95´ì\84\9cë\8a\94 [[mw:API:Errors_and_warnings|API:ì\98¤ë¥\98ì\99\80 ê²½ê³ ]]를 ì°¸ì¡°í\95\98ì\8b­ì\8b\9cì\98¤.\n\n<strong>í\85\8cì\8a¤í\8a¸í\95\98기:</strong> API ì\9a\94ì²­ì\9d\84 í\85\8cì\8a¤í\8a¸ì\9d\98 í\8e¸ì\9d\98를 ì\9c\84í\95´, [[Special:ApiSandbox]]를 ë³´ì\84¸ì\9a\94.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|ì\84¤ëª\85문ì\84\9c]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api ë©\94ì\9d¼ë§\81 ë¦¬ì\8a¤í\8a¸]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API ì\95\8c림 ì\82¬í\95­]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R ë²\84ê·¸ ë°\8f ì\9a\94ì²­]\n</div>\n<strong>ì\83\81í\83\9c:</strong> ì\9d´ í\8e\98ì\9d´ì§\80ì\97\90 ë³´ì\9d´ë\8a\94 ëª¨ë\93  ê¸°ë\8a¥ì\9d\80 ì \95ì\83\81ì \81ì\9c¼ë¡\9c ì\9e\91ë\8f\99í\95\98ì§\80ë§\8c, APIë\8a\94 ì\97¬ì \84í\9e\88 í\99\9cë°\9cí\95\98ê²\8c ê°\9cë°\9cë\90\98ê³  ì\9e\88ì\9c¼ë©°, ì\96¸ì \9cë\93 ì§\80 ë³\80ê²½ë\90  ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤. ì\97\85ë\8d°ì\9d´í\8a¸ ê³µì§\80를 ë°\9bì\95\84보려면 [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce ë©\94ì\9d¼ë§\81 ë¦¬ì\8a¤í\8a¸]를 êµ¬ë\8f\85í\95\98ì\8b­ì\8b\9cì\98¤.\n\n<strong>ì\9e\98못ë\90\9c ì\9a\94ì²­:</strong> APIì\97\90 ì\9e\98못ë\90\9c ì\9a\94ì²­ì\9d´ ì \84ì\86¡ë\90\98ë©´ \"MediaWiki-API-Error\" í\82¤ê°\80 í\8f¬í\95¨ë\90\9c HTTP í\97¤ë\8d\94ê°\80 ì \84ì\86¡ë\90\98ë©° ë°\98í\99\98ë\90\98ë\8a\94 í\97¤ë\8d\94ì\99\80 ì\98¤ë¥\98 ì½\94ë\93\9cì\9d\98 ê°\92ì\9d\80 ë\8f\99ì\9d¼í\95\9c ê°\92ì\9c¼ë¡\9c ì\84¤ì \95ë\90©ë\8b\88ë\8b¤. ì\9e\90ì\84¸í\95\9c ì \95ë³´ì\97\90 ë\8c\80í\95´ì\84\9cë\8a\94 [[mw:API:Errors_and_warnings|API:ì\98¤ë¥\98ì\99\80 ê²½ê³ ]]를 ì°¸ì¡°í\95\98ì\8b­ì\8b\9cì\98¤.\n\n<strong>í\85\8cì\8a¤í\8a¸í\95\98기:</strong> API ì\9a\94ì²­ í\85\8cì\8a¤í\8a¸ë¥¼ ì\9a©ì\9d´í\95\98ê²\8c í\95\98려면, [[Special:ApiSandbox]]를 ë³´ì\8b­ì\8b\9cì\98¤.",
        "apihelp-main-param-action": "수행할 동작",
        "apihelp-main-param-format": "출력값의 형식.",
        "apihelp-main-param-maxlag": "최대 랙은 미디어위키가 데이터베이스 복제된 클러스터에 설치되었을 때 사용될 수 있습니다. 특정한 행동이 사이트 복제 랙을 유발할 때, 이 변수는 클라이언트가 복제 랙이 설정된 숫자 아래로 내려갈 때까지 기다리도록 지시합니다. 과도한 랙의 경우, <samp>maxlag</samp> 오류 코드와 <samp>Waiting for $host: $lag seconds lagged</samp> 메시지가 제공됩니다.<br />[[mw:Manual:Maxlag_parameter|매뉴얼: Maxlag 변수]] 에서 더 많은 정보를 얻을 수 있습니다.",
        "apihelp-block-param-allowusertalk": "자신의 토론 문서를 편집할 수 있도록 허용합니다. (<var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var> 값에 따라 다름)",
        "apihelp-block-param-reblock": "사용자가 이미 차단된 경우, 기존 차단 설정을 바꿉니다.",
        "apihelp-block-param-watchuser": "해당 사용자 또는 IP 주소의 사용자 문서 및 토론 문서를 주시합니다.",
-       "apihelp-block-example-ip-simple": "IP <kbd>192.0.2.5</kbd>에 대해 <kbd>First strike</kbd>라는 이유로 3일간 차단하기",
+       "apihelp-block-example-ip-simple": "IP <kbd>192.0.2.5</kbd>에 대해 <kbd>First strike</kbd>라는 이유로 3일 간 차단하기",
        "apihelp-block-example-user-complex": "사용자 <kbd>Vandal</kbd>을 <kbd>Vandalism</kbd>이라는 이유로 무기한 차단하며 계정 생성 및 이메일 발송을 막기",
+       "apihelp-changeauthenticationdata-description": "현재 사용자의 인증 데이터를 변경합니다.",
+       "apihelp-changeauthenticationdata-example-password": "현재 사용자의 비밀번호를 <kbd>ExamplePassword</kbd>로 바꾸는 것을 시도합니다.",
+       "apihelp-checktoken-description": "<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>의 토큰의 유효성을 확인합니다.",
        "apihelp-checktoken-param-type": "테스트되는 토큰의 종류.",
        "apihelp-checktoken-param-token": "테스트할 토큰",
        "apihelp-checktoken-param-maxtokenage": "초로 계산된 토큰의 최대 나이.",
        "apihelp-checktoken-example-simple": "<kbd>csrf</kbd> 토큰의 유효성을 테스트합니다.",
        "apihelp-clearhasmsg-description": "현재 사용자의 <code>hasmsg</code> 플래그를 비웁니다.",
        "apihelp-clearhasmsg-example-1": "현재 계정의 <code>hasmsg</code> 플래그를 삭제합니다.",
+       "apihelp-clientlogin-description": "상호작용 플로우를 이용하여 위키에 로그인합니다.",
+       "apihelp-clientlogin-example-login": "사용자 <kbd>Example</kbd>, 비밀번호 <kbd>ExamplePassword</kbd>로 위키 로그인 과정을 시작합니다.",
        "apihelp-compare-description": "두 문서 간의 차이를 가져옵니다.\n\n대상이 되는 두 문서의 판 번호나 문서 제목 또는 문서 ID를 지정해야 합니다.",
        "apihelp-compare-param-fromtitle": "비교할 첫 이름.",
        "apihelp-compare-param-fromid": "비교할 첫 문서 ID.",
@@ -54,6 +60,7 @@
        "apihelp-compare-param-torev": "비교할 두 번째 판.",
        "apihelp-compare-example-1": "판 1과 2의 차이를 생성합니다.",
        "apihelp-createaccount-description": "새 사용자 계정을 만듭니다.",
+       "apihelp-createaccount-example-create": "비밀번호 <kbd>ExamplePassword</kbd>로 된 사용자 <kbd>Example</kbd>의 생성 과정을 시작합니다.",
        "apihelp-createaccount-param-name": "사용자 이름",
        "apihelp-createaccount-param-password": "비밀번호입니다. (<var>$1mailpassword</var>가 설정되어 있으면 무시됩니다)",
        "apihelp-createaccount-param-domain": "외부 인증의 도메인 (선택적)",
        "apihelp-createaccount-param-realname": "사용자 실명 (선택).",
        "apihelp-createaccount-param-mailpassword": "아무 값이든 존재한다면, 랜덤 비밀번호가 이메일로 전송됩니다.",
        "apihelp-createaccount-param-reason": "선택적인, 기록에 남을 계정을 만드는 이유",
+       "apihelp-createaccount-param-language": "사용자에게 기본으로 설정할 언어 코드. (선택 사항, 기본값으로는 본문의 언어입니다)",
        "apihelp-createaccount-example-pass": "사용자 <kbd>testuser</kbd>를 만들고 비밀번호를 <kbd>test123</kbd>으로 설정합니다.",
        "apihelp-createaccount-example-mail": "사용자 <kbd>testmailuser</kbd>를 만들고 자동 생성된 비밀번호를 이메일로 보냅니다.",
        "apihelp-delete-description": "문서 삭제",
+       "apihelp-delete-param-title": "삭제할 문서의 제목. <var>$1pageid</var>과 함께 사용할 수 없습니다.",
        "apihelp-delete-param-pageid": "삭제할 문서의 ID. <var>$1title</var>과 함께 사용할 수 없습니다.",
        "apihelp-delete-param-reason": "삭제의 이유. 설정하지 않으면 자동 생성되는 이유를 사용합니다.",
        "apihelp-delete-param-watch": "문서를 현재 사용자의 주시문서 목록에 추가합니다.",
        "apihelp-delete-example-simple": "<kbd>Main Page</kbd>를 삭제합니다.",
        "apihelp-disabled-description": "이 모듈은 해제되었습니다.",
        "apihelp-edit-description": "문서를 만들고 편집합니다.",
+       "apihelp-edit-param-section": "문단 번호입니다. <kbd>0</kbd>은 최상위 문단, <kbd>new</kbd>는 새 문단입니다.",
        "apihelp-edit-param-sectiontitle": "새 문단을 위한 제목.",
        "apihelp-edit-param-text": "문서 내용.",
        "apihelp-edit-param-summary": "편집 요약. 또한 $1section=new 및 $1sectiontitle이 설정되어 있지 않을 때 문단 제목.",
+       "apihelp-edit-param-tags": "이 판에 적용할 태그를 변경합니다.",
        "apihelp-edit-param-minor": "사소한 편집.",
        "apihelp-edit-param-notminor": "사소하지 않은 편집.",
        "apihelp-edit-param-bot": "이 편집을 봇으로 표시.",
+       "apihelp-edit-param-createonly": "이 페이지가 이미 존재하면 편집하지 않습니다.",
        "apihelp-edit-param-nocreate": "페이지가 존재하지 않으면 오류를 출력합니다.",
        "apihelp-edit-param-watch": "문서를 현재 사용자의 주시문서 목록에 추가합니다.",
        "apihelp-edit-param-unwatch": "문서를 현재 사용자의 주시문서 목록에서 제거합니다.",
        "apihelp-emailuser-param-subject": "제목 헤더.",
        "apihelp-emailuser-param-text": "메일 본문.",
        "apihelp-emailuser-param-ccme": "자신에게 메일의 복사본을 보냅니다.",
-       "apihelp-emailuser-example-email": "<kbd>WikiSysop</kbd> 사용자에게 텍스트 <kbd>콘텐츠</kbd>로 이메일을 보냅니다.",
+       "apihelp-emailuser-example-email": "<kbd>WikiSysop</kbd> 사용자에게 텍스트 <kbd>Content</kbd>로 이메일을 보냅니다.",
        "apihelp-expandtemplates-description": "모든 틀을 위키텍스트로 확장.",
        "apihelp-expandtemplates-param-title": "문서 제목",
        "apihelp-expandtemplates-param-text": "변환할 위키텍스트.",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "확장된 위키텍스트.",
        "apihelp-expandtemplates-paramvalue-prop-parsetree": "입력값의 XML 파서 트리.",
+       "apihelp-expandtemplates-param-includecomments": "출력에 HTML 주석을 포함할 것인지의 여부.",
+       "apihelp-expandtemplates-param-generatexml": "XML 구문 분석 트리를 생성합니다. ($1prop=parsetree로 대체함)",
+       "apihelp-expandtemplates-example-simple": "위키텍스트 <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>를 확장합니다.",
        "apihelp-feedcontributions-description": "사용자 기여 피드를 반환합니다.",
        "apihelp-feedcontributions-param-feedformat": "피드 포맷.",
        "apihelp-feedcontributions-param-user": "기여를 읽을 사용자 이름.",
        "apihelp-feedcontributions-param-namespace": "기여를 분류할 이름공간",
        "apihelp-feedcontributions-param-deletedonly": "삭제된 기여만 봅니다.",
        "apihelp-feedcontributions-param-toponly": "최신 판인 편집만 봅니다.",
+       "apihelp-feedcontributions-param-newonly": "새 글인 편집만 봅니다.",
+       "apihelp-feedcontributions-param-hideminor": "사소한 편집을 숨깁니다.",
+       "apihelp-feedcontributions-param-showsizediff": "판 사이의 크기 차이를 보여줍니다.",
+       "apihelp-feedrecentchanges-description": "최근 바뀜 피드를 반환합니다.",
        "apihelp-feedrecentchanges-param-feedformat": "피드 포맷.",
+       "apihelp-feedrecentchanges-param-namespace": "결과를 제한할 이름공간.",
        "apihelp-feedrecentchanges-param-invert": "선택한 항목을 제외한 모든 이름공간.",
+       "apihelp-feedrecentchanges-param-associated": "관련 (토론 또는 일반) 이름공간을 포함합니다.",
+       "apihelp-feedrecentchanges-param-limit": "반환할 결과의 최대 수.",
+       "apihelp-feedrecentchanges-param-from": "이후의 변경 사항을 보여줍니다.",
        "apihelp-feedrecentchanges-param-hideminor": "사소한 편집을 숨깁니다.",
        "apihelp-feedrecentchanges-param-hidebots": "봇의 편집을 숨깁니다.",
        "apihelp-feedrecentchanges-param-hideanons": "익명 사용자의 편집을 숨깁니다.",
        "apihelp-feedrecentchanges-param-hideliu": "등록된 사용자의 편집을 숨깁니다.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "검토된 편집을 숨깁니다.",
+       "apihelp-feedrecentchanges-param-hidemyself": "현재 사용자가 변경한 사항을 숨깁니다.",
        "apihelp-feedrecentchanges-param-tagfilter": "태그로 분류",
        "apihelp-feedrecentchanges-example-simple": "최근 바뀜을 봅니다.",
        "apihelp-feedrecentchanges-example-30days": "30일간의 최근 바뀜을 봅니다.",
+       "apihelp-feedwatchlist-description": "주시문서 목록 피드를 반환합니다.",
+       "apihelp-feedwatchlist-param-feedformat": "피드 포맷.",
+       "apihelp-feedwatchlist-example-default": "주시문서 목록 피드를 보여줍니다.",
        "apihelp-filerevert-description": "파일을 이전 판으로 되돌립니다.",
        "apihelp-filerevert-example-revert": "<kbd>Wiki.png</kbd>를 <kbd>2011-03-05T15:27:40Z</kbd> 판으로 되돌립니다.",
+       "apihelp-help-description": "지정된 모듈의 도움말을 보여줍니다.",
        "apihelp-help-param-helpformat": "도움말 출력 포맷.",
+       "apihelp-help-example-recursive": "모든 도움말을 한 페이지로 모읍니다.",
+       "apihelp-imagerotate-description": "하나 이상의 그림을 회전합니다.",
+       "apihelp-imagerotate-param-rotation": "시계 방향으로 회전할 그림의 각도.",
        "apihelp-import-param-xml": "업로드한 XML 파일.",
        "apihelp-login-param-name": "계정 이름.",
        "apihelp-login-param-password": "비밀번호.",
        "apihelp-login-param-domain": "도메인 (선택).",
+       "apihelp-login-param-token": "처음 요청에서 로그인 토큰을 취득했습니다.",
+       "apihelp-login-example-gettoken": "로그인 토큰을 검색합니다.",
        "apihelp-login-example-login": "로그인.",
+       "apihelp-logout-description": "로그아웃하고 세션 데이터를 지웁니다.",
+       "apihelp-logout-example-logout": "현재 사용자를 로그아웃합니다.",
+       "apihelp-mergehistory-description": "문서 역사를 합칩니다.",
        "apihelp-mergehistory-param-reason": "문서 병합 이유.",
        "apihelp-move-description": "문서 이동하기.",
        "apihelp-move-param-reason": "제목을 변경하는 이유",
        "apihelp-opensearch-description": "OpenSearch 프로토콜을 이용하여 위키 검색하기",
        "apihelp-opensearch-param-search": "문자열 검색",
        "apihelp-opensearch-param-limit": "반환할 결과의 최대 수",
+       "apihelp-opensearch-param-namespace": "검색할 이름공간.",
        "apihelp-opensearch-param-format": "출력 포맷.",
        "apihelp-options-param-reset": "사이트 기본으로 설정 초기화",
        "apihelp-options-example-reset": "모든 설정 초기화",
+       "apihelp-paraminfo-description": "API 모듈의 정보를 가져옵니다.",
        "apihelp-paraminfo-param-helpformat": "도움말 문자열 포맷.",
+       "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": "구문 분석된 위키텍스트의 그림을 제공합니다.",
+       "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-iwlinks": "구문 분석된 위키텍스트의 인터위키 링크를 제공합니다.",
+       "apihelp-parse-paramvalue-prop-wikitext": "구문 분석된 위키텍스트 원문을 제공합니다.",
+       "apihelp-parse-paramvalue-prop-properties": "구문 분석된 위키텍스트에 정의된 다양한 속성을 제공합니다.",
+       "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-disabletoc": "출력에서 목차를 제외합니다.",
+       "apihelp-parse-example-page": "페이지의 구문을 분석합니다.",
+       "apihelp-parse-example-text": "위키텍스트의 구문을 분석합니다.",
+       "apihelp-parse-example-summary": "요약을 구문 분석합니다.",
+       "apihelp-protect-description": "문서의 보호 수준을 변경합니다.",
        "apihelp-protect-param-reason": "보호 또는 보호 해제의 이유.",
        "apihelp-protect-example-protect": "문서 보호",
+       "apihelp-purge-param-forcelinkupdate": "링크 테이블을 업데이트합니다.",
+       "apihelp-query+allcategories-description": "모든 분류를 열거합니다.",
+       "apihelp-query+allcategories-param-prefix": "이 값으로 시작하는 모든 분류 제목을 검색합니다.",
+       "apihelp-query+allcategories-param-dir": "정렬 방향.",
+       "apihelp-query+allcategories-param-limit": "반환할 분류의 갯수입니다.",
+       "apihelp-query+allcategories-param-prop": "얻고자 하는 속성:",
+       "apihelp-query+allcategories-paramvalue-prop-size": "페이지 수를 분류에 추가합니다.",
+       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "<var>$3user</var>와 함께 사용할 수 없습니다.",
+       "apihelp-query+alldeletedrevisions-param-prefix": "이 값으로 시작하는 모든 문서 제목을 검색합니다.",
+       "apihelp-query+alldeletedrevisions-param-tag": "이 태그로 태그된 판만을 나열합니다.",
+       "apihelp-query+alldeletedrevisions-param-user": "이 사용자에 대한 판만 나열합니다.",
+       "apihelp-query+alldeletedrevisions-param-excludeuser": "이 사용자에 대한 판을 나열하지 않습니다.",
+       "apihelp-query+alldeletedrevisions-param-namespace": "이 이름공간의 문서만 나열합니다.",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "파일의 제목을 추가합니다.",
+       "apihelp-query+allfileusages-param-limit": "반환할 총 항목 수입니다.",
+       "apihelp-query+allfileusages-example-unique": "고유한 파일 제목을 나열합니다.",
+       "apihelp-query+allfileusages-example-unique-generator": "모든 파일 제목을 가져오되, 존재하지 않는 항목을 표시합니다.",
+       "apihelp-query+allfileusages-example-generator": "파일을 포함하는 문서를 가져옵니다.",
+       "apihelp-query+allimages-description": "모든 그림을 순차적으로 열거합니다.",
+       "apihelp-query+alllinks-paramvalue-prop-title": "링크의 제목을 추가합니다.",
+       "apihelp-query+alllinks-param-namespace": "열거할 이름공간.",
+       "apihelp-query+alllinks-param-limit": "반환할 총 항목 수입니다.",
+       "apihelp-query+allmessages-description": "이 사이트에서 반환할 메시지.",
        "apihelp-query+allmessages-example-ipb": "<kbd>ipb-</kbd>로 시작하는 메시지를 보입니다.",
+       "apihelp-query+allpages-param-namespace": "열거할 이름공간.",
+       "apihelp-query+allredirects-paramvalue-prop-title": "넘겨주기의 제목을 추가합니다.",
+       "apihelp-query+allredirects-param-namespace": "열거할 이름공간.",
+       "apihelp-query+allredirects-param-limit": "반환할 총 항목 수입니다.",
        "apihelp-query+allrevisions-description": "모든 판 표시.",
+       "apihelp-query+mystashedfiles-param-limit": "가져올 파일의 갯수.",
+       "apihelp-query+alltransclusions-param-prop": "포함할 정보:",
+       "apihelp-query+alltransclusions-param-namespace": "열거할 이름공간.",
+       "apihelp-query+alltransclusions-param-limit": "반환할 총 항목 수입니다.",
+       "apihelp-query+allusers-description": "등록된 모든 사용자를 열거합니다.",
+       "apihelp-query+allusers-param-dir": "정렬 방향.",
+       "apihelp-query+allusers-param-prop": "포함할 정보:",
+       "apihelp-query+allusers-paramvalue-prop-editcount": "사용자의 편집 수를 추가합니다.",
+       "apihelp-query+allusers-param-witheditsonly": "편집을 한 사용자만 나열합니다.",
+       "apihelp-query+allusers-example-Y": "<kbd>Y</kbd>로 시작하는 사용자를 나열합니다.",
+       "apihelp-query+authmanagerinfo-description": "현재의 인증 상태에 대한 정보를 검색합니다.",
+       "apihelp-query+backlinks-param-namespace": "열거할 이름공간.",
+       "apihelp-query+blocks-description": "차단된 모든 사용자와 IP 주소를 나열합니다.",
+       "apihelp-query+blocks-param-start": "나열을 시작할 타임스탬프",
+       "apihelp-query+blocks-param-end": "나열을 끝낼 타임스탬프",
+       "apihelp-query+blocks-param-ids": "나열할 차단 ID 목록 (선택 사항).",
+       "apihelp-query+blocks-param-users": "검색할 사용자 목록 (선택 사항).",
+       "apihelp-query+blocks-param-prop": "얻고자 하는 속성:",
+       "apihelp-query+blocks-paramvalue-prop-id": "블록의 ID를 추가합니다.",
+       "apihelp-query+blocks-paramvalue-prop-user": "차단된 사용자의 사용자 이름을 추가합니다.",
+       "apihelp-query+blocks-paramvalue-prop-userid": "차단된 사용자의 사용자 ID를 추가합니다.",
+       "apihelp-query+blocks-paramvalue-prop-by": "차단을 수행하는 사용자의 사용자 이름을 추가합니다.",
+       "apihelp-query+blocks-paramvalue-prop-byid": "차단을 수행하는 사용자의 사용자 ID를 추가합니다.",
+       "apihelp-query+blocks-paramvalue-prop-timestamp": "차단된 시점의 타임스탬프를 추가합니다.",
+       "apihelp-query+blocks-paramvalue-prop-expiry": "차단 만료 시점의 타임스탬프를 추가합니다.",
+       "apihelp-query+blocks-paramvalue-prop-reason": "차단 이유를 추가합니다.",
+       "apihelp-query+blocks-paramvalue-prop-range": "차단에 영향을 받는 IP 주소 대역을 추가합니다.",
+       "apihelp-query+categories-param-limit": "반환할 분류의 갯수입니다.",
+       "apihelp-query+categorymembers-paramvalue-prop-ids": "페이지 ID를 추가합니다.",
+       "apihelp-query+categorymembers-paramvalue-prop-title": "문서의 제목과 이름공간 ID를 추가합니다.",
+       "apihelp-query+categorymembers-paramvalue-prop-timestamp": "문서가 포함된 시기의 타임스탬프를 추가합니다.",
+       "apihelp-query+categorymembers-param-limit": "반환할 문서의 최대 수입니다.",
+       "apihelp-query+categorymembers-param-startsortkey": "$1starthexsortkey를 대신 사용해 주십시오.",
+       "apihelp-query+categorymembers-param-endsortkey": "$1endhexsortkey를 대신 사용해 주십시오.",
+       "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|모드|모드}}: $2",
+       "apihelp-query+deletedrevs-param-start": "나열을 시작할 타임스탬프",
+       "apihelp-query+deletedrevs-param-end": "나열을 끝낼 타임스탬프",
+       "apihelp-query+deletedrevs-param-limit": "나열할 판의 최대 양.",
+       "apihelp-query+disabled-description": "이 쿼리 모듈은 비활성화되었습니다.",
+       "apihelp-query+duplicatefiles-description": "해시 값 기반으로 주어진 파일들 중 중복된 모든 파일을 나열합니다.",
+       "apihelp-query+duplicatefiles-param-limit": "반환할 중복 파일의 수.",
+       "apihelp-query+embeddedin-param-namespace": "열거할 이름공간.",
+       "apihelp-query+extlinks-param-limit": "반환할 링크의 수.",
+       "apihelp-query+exturlusage-param-prop": "포함할 정보:",
+       "apihelp-query+exturlusage-paramvalue-prop-ids": "문서의 ID를 추가합니다.",
+       "apihelp-query+exturlusage-paramvalue-prop-title": "문서의 제목과 이름공간 ID를 추가합니다.",
+       "apihelp-query+exturlusage-paramvalue-prop-url": "문서에 사용된 URL을 추가합니다.",
+       "apihelp-query+exturlusage-param-namespace": "열거할 문서 이름공간.",
+       "apihelp-query+exturlusage-param-limit": "반환할 문서 수.",
+       "apihelp-query+filearchive-description": "삭제된 모든 파일을 순서대로 열거합니다.",
+       "apihelp-query+filearchive-paramvalue-prop-sha1": "그림에 대한 SHA-1 해시를 추가합니다.",
+       "apihelp-query+filearchive-paramvalue-prop-user": "그림 판을 올린 사용자를 추가합니다.",
+       "apihelp-query+filearchive-paramvalue-prop-description": "그림 판의 설명을 추가합니다.",
+       "apihelp-query+filearchive-paramvalue-prop-mime": "그림의 MIME를 추가합니다.",
+       "apihelp-query+filearchive-paramvalue-prop-mediatype": "그림의 미디어 유형을 추가합니다.",
+       "apihelp-query+filearchive-paramvalue-prop-metadata": "그림의 버전에 대한 Exif 메타데이터를 나열합니다.",
+       "apihelp-query+filearchive-example-simple": "삭제된 모든 파일의 목록을 표시합니다.",
+       "apihelp-query+filerepoinfo-description": "위키에 구성된 그림 저장소에 대한 메타 정보를 반환합니다.",
+       "apihelp-query+filerepoinfo-example-simple": "파일 저장소의 정보를 가져옵니다.",
+       "apihelp-query+fileusage-param-prop": "얻고자 하는 속성:",
+       "apihelp-query+fileusage-paramvalue-prop-pageid": "각 문서의 페이지 ID.",
+       "apihelp-query+fileusage-paramvalue-prop-title": "각 문서의 제목.",
+       "apihelp-query+fileusage-paramvalue-prop-redirect": "문서가 넘겨주기이면 표시합니다.",
+       "apihelp-query+fileusage-param-namespace": "이 이름공간의 문서만 포함합니다.",
+       "apihelp-query+fileusage-param-limit": "반환할 항목 수.",
+       "apihelp-query+fileusage-param-show": "이 기준을 충족하는 항목만 표시합니다:\n;redirect:넘겨주기만 표시합니다.\n;!redirect:넘겨주기가 아닌 항목만 표시합니다.",
+       "apihelp-query+imageinfo-paramvalue-prop-timestamp": "업로드된 판에 대한 타임스탬프를 추가합니다.",
+       "apihelp-query+imageinfo-paramvalue-prop-sha1": "파일에 대한 SHA-1 해시를 추가합니다.",
+       "apihelp-query+imageinfo-paramvalue-prop-mediatype": "파일의 미디어 유형을 추가합니다.",
+       "apihelp-query+imageinfo-param-urlheight": "$1urlwidth와 유사합니다.",
+       "apihelp-query+imageinfo-example-simple": "[[:File:Albert Einstein Head.jpg]]의 현재 판에 대한 정보를 가져옵니다.",
+       "apihelp-query+imageinfo-example-dated": "2008년 및 그 이후의 [[:File:Test.jpg]]의 판에 대한 정보를 가져옵니다.",
+       "apihelp-query+images-param-limit": "반환할 파일 수.",
+       "apihelp-query+imageusage-param-namespace": "열거할 이름공간.",
+       "apihelp-query+imageusage-example-generator": "[[:File:Albert Einstein Head.jpg]]를 이용하여 페이지의 정보를 가져옵니다.",
+       "apihelp-query+info-description": "기본 페이지 정보를 가져옵니다.",
+       "apihelp-query+info-param-prop": "얻고자 하는 추가 속성:",
+       "apihelp-query+info-paramvalue-prop-protection": "각 문서의 보호 수준을 나열합니다.",
+       "apihelp-query+info-paramvalue-prop-readable": "사용자가 이 문서를 읽을 수 있는지의 여부.",
+       "apihelp-query+iwbacklinks-param-prefix": "인터위키의 접두사.",
+       "apihelp-query+iwbacklinks-param-title": "검색할 인터위키 링크. <var>$1blprefix</var>와 함께 사용해야 합니다.",
+       "apihelp-query+iwbacklinks-param-limit": "반활한 총 문서 수.",
+       "apihelp-query+iwbacklinks-param-prop": "얻고자 하는 속성:",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "인터위키의 접두사를 추가합니다.",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "인터위키의 제목을 추가합니다.",
+       "apihelp-query+iwlinks-paramvalue-prop-url": "전체 URL을 추가합니다.",
+       "apihelp-query+langbacklinks-param-lang": "언어 링크의 언어.",
+       "apihelp-query+langbacklinks-paramvalue-prop-lllang": "언어 링크의 언어 코드를 추가합니다.",
+       "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "언어 링크의 제목을 추가합니다.",
+       "apihelp-query+langlinks-paramvalue-prop-url": "전체 URL을 추가합니다.",
+       "apihelp-query+langlinks-param-lang": "이 언어 코드의 언어 링크만 반환합니다.",
+       "apihelp-query+linkshere-paramvalue-prop-pageid": "각 문서의 페이지 ID.",
+       "apihelp-query+linkshere-paramvalue-prop-title": "각 문서의 제목.",
+       "apihelp-query+linkshere-param-namespace": "이 이름공간의 문서만 포함합니다.",
+       "apihelp-query+linkshere-param-limit": "반환할 항목 수.",
+       "apihelp-query+linkshere-param-show": "이 기준을 충족하는 항목만 표시합니다:\n;redirect:넘겨주기만 표시합니다.\n;!redirect:넘겨주기가 아닌 항목만 표시합니다.",
+       "apihelp-query+logevents-paramvalue-prop-ids": "로그 이벤트의 ID를 추가합니다.",
+       "apihelp-query+logevents-paramvalue-prop-type": "로그 이벤트의 유형을 추가합니다.",
+       "apihelp-query+pagepropnames-param-limit": "반환할 이름의 최대 수.",
+       "apihelp-query+pageswithprop-param-prop": "포함할 정보:",
+       "apihelp-query+pageswithprop-paramvalue-prop-ids": "페이지 ID를 추가합니다.",
+       "apihelp-query+pageswithprop-paramvalue-prop-title": "문서의 제목과 이름공간 ID를 추가합니다.",
        "apihelp-query+pageswithprop-param-limit": "나타낼 문서의 최대 수입니다.",
        "apihelp-query+pageswithprop-param-dir": "정렬 순서",
        "apihelp-query+prefixsearch-param-search": "문자열 검색",
+       "apihelp-query+prefixsearch-param-namespace": "검색할 이름공간.",
+       "apihelp-query+prefixsearch-param-limit": "반환할 결과의 최대 수",
+       "apihelp-query+prefixsearch-param-profile": "검색 프로파일 사용",
+       "apihelp-query+protectedtitles-paramvalue-prop-level": "보호 수준을 추가합니다.",
+       "apihelp-query+recentchanges-param-prop": "추가 정보를 포함합니다:",
+       "apihelp-query+recentchanges-paramvalue-prop-user": "편집에 임할 사용자를 추가하고 IP인 경우 태그합니다.",
+       "apihelp-query+recentchanges-paramvalue-prop-userid": "편집에 임할 사용자를 추가합니다.",
+       "apihelp-query+recentchanges-paramvalue-prop-flags": "편집에 대한 플래그를 추가합니다.",
+       "apihelp-query+revisions+base-paramvalue-prop-size": "판의 길이. (바이트)",
+       "apihelp-query+revisions+base-paramvalue-prop-sha1": "판의 SHA-1 (base 16).",
+       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "판의 콘텐츠 모델 ID.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "판의 텍스트.",
+       "apihelp-query+revisions+base-paramvalue-prop-tags": "판의 태그.",
+       "apihelp-query+search-param-qiprofile": "쿼리 독립적인 프로파일 사용(순위 알고리즘에 영향있음)",
+       "apihelp-query+search-paramvalue-prop-size": "바이트 단위로 문서의 크기를 추가합니다.",
+       "apihelp-query+search-paramvalue-prop-wordcount": "문서의 낱말 수를 추가합니다.",
+       "apihelp-query+search-paramvalue-prop-timestamp": "문서가 마지막으로 편집된 시기의 타임스탬프를 추가합니다.",
+       "apihelp-query+search-example-simple": "<kbd>meaning</kbd>을 검색합니다.",
+       "apihelp-query+search-example-text": "<kbd>meaning</kbd>의 텍스트를 검색합니다.",
+       "apihelp-query+siteinfo-param-prop": "가져올 정보:",
+       "apihelp-query+siteinfo-paramvalue-prop-general": "전반적인 시스템 정보.",
+       "apihelp-query+siteinfo-paramvalue-prop-statistics": "사이트 통계를 반환합니다.",
+       "apihelp-query+siteinfo-paramvalue-prop-interwikimap": "인터위키 맵을 반환합니다. (<var>$1inlanguagecode</var>를 사용하여 필터링 및 지역화 선택 가능)",
+       "apihelp-query+siteinfo-paramvalue-prop-usergroups": "사용자 그룹 및 관련 권한을 반환합니다.",
+       "apihelp-query+siteinfo-paramvalue-prop-libraries": "위키에 설치된 라이브러리를 반환합니다.",
+       "apihelp-query+siteinfo-paramvalue-prop-extensions": "위키에 설치된 확장 기능을 반환합니다.",
+       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "업로드가 허용된 파일 확장자(파일 종류)의 목록을 반환합니다.",
+       "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "이용 가능한 경우 위키 권한 (라이선스) 정보를 반환합니다.",
+       "apihelp-query+siteinfo-paramvalue-prop-restrictions": "이용 가능한 제한 (보호) 종류의 정보를 반환합니다.",
+       "apihelp-query+siteinfo-paramvalue-prop-languages": "미디어위키가 지원하는 언어 목록을 반환합니다. (<var>$1inlanguagecode</var>를 사용하여 지역화 선택 가능)",
+       "apihelp-query+siteinfo-paramvalue-prop-skins": "사용 중인 모든 스킨의 목록을 반환합니다. (<var>$1inlanguagecode</var>를 사용하여 지역화 선택이 가능하며, 이를 사용하지 않으면 본문의 언어를 사용함)",
+       "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "파서 확장 태그의 목록을 반환합니다.",
+       "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "파서 함수 훅의 목록을 반환합니다.",
+       "apihelp-query+siteinfo-paramvalue-prop-variables": "변수 ID의 목록을 반환합니다.",
+       "apihelp-query+siteinfo-paramvalue-prop-protocols": "외부 링크에 허용된 프로토콜의 목록을 반환합니다.",
+       "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "사용자 환경 설정의 기본값을 반환합니다.",
+       "apihelp-query+siteinfo-paramvalue-prop-uploaddialog": "업로드 대화 상자 구성을 반환합니다.",
+       "apihelp-query+siteinfo-param-numberingroup": "사용자 그룹의 사용자 수를 나열합니다.",
+       "apihelp-query+siteinfo-example-simple": "사이트 정보를 가져옵니다.",
+       "apihelp-query+siteinfo-example-interwiki": "로컬 인터위키 접두사 목록을 가져옵니다.",
+       "apihelp-query+tags-param-limit": "나열할 태그의 최대 수.",
+       "apihelp-query+tags-paramvalue-prop-name": "태그의 이름을 추가합니다.",
+       "apihelp-query+tags-paramvalue-prop-description": "태그의 설명을 추가합니다.",
+       "apihelp-query+tags-paramvalue-prop-hitcount": "판의 수와 이 판을 가진 로그 엔트리를 추가합니다.",
+       "apihelp-query+templates-param-limit": "반환할 틀 수.",
+       "apihelp-query+tokens-param-type": "요청할 토큰의 종류.",
+       "apihelp-query+transcludedin-paramvalue-prop-pageid": "각 문서의 페이지 ID.",
+       "apihelp-query+transcludedin-paramvalue-prop-title": "각 문서의 제목.",
+       "apihelp-query+transcludedin-paramvalue-prop-redirect": "문서가 넘겨주기이면 표시합니다.",
+       "apihelp-query+transcludedin-param-namespace": "이 이름공간의 문서만 포함합니다.",
+       "apihelp-query+transcludedin-param-limit": "반환할 항목 수.",
+       "apihelp-query+transcludedin-param-show": "이 기준을 충족하는 항목만 표시합니다:\n;redirect:넘겨주기만 표시합니다.\n;!redirect:넘겨주기가 아닌 항목만 표시합니다.",
+       "apihelp-query+usercontribs-description": "한 사용자의 모든 편집을 가져옵니다.",
+       "apihelp-query+usercontribs-param-limit": "반환할 기여의 최대 수.",
+       "apihelp-query+usercontribs-paramvalue-prop-ids": "페이지 ID와 판 ID를 추가합니다.",
+       "apihelp-query+usercontribs-paramvalue-prop-title": "문서의 제목과 이름공간 ID를 추가합니다.",
+       "apihelp-query+usercontribs-paramvalue-prop-timestamp": "편집의 타임스탬프를 추가합니다.",
+       "apihelp-query+usercontribs-paramvalue-prop-size": "편집의 새로운 크기를 추가합니다.",
+       "apihelp-query+usercontribs-paramvalue-prop-flags": "편집의 플래그를 추가합니다.",
+       "apihelp-query+usercontribs-paramvalue-prop-patrolled": "점검한 편집을 태그합니다.",
+       "apihelp-query+usercontribs-paramvalue-prop-tags": "편집의 태그를 나열합니다.",
+       "apihelp-query+usercontribs-param-tag": "이 태그로 태그된 판만을 나열합니다.",
+       "apihelp-query+usercontribs-param-toponly": "최신 판인 변경 사항만 나열합니다.",
+       "apihelp-query+usercontribs-example-user": "사용자 <kbd>Example</kbd>의 기여를 표시합니다.",
+       "apihelp-query+usercontribs-example-ipprefix": "<kbd>192.0.2.</kbd>로 시작하는 모든 IP 주소의 기여를 표시합니다.",
+       "apihelp-query+userinfo-description": "현재 사용자의 정보를 가져옵니다.",
+       "apihelp-query+userinfo-param-prop": "포함할 정보:",
+       "apihelp-query+userinfo-paramvalue-prop-blockinfo": "현재 사용자가 차단되면 누구에 의해 무슨 이유로 차단되었는지 태그합니다.",
+       "apihelp-query+userinfo-paramvalue-prop-hasmsg": "현재 사용자가 대기 중인 메시지가 있다면 <samp>messages</samp> 태그를 추가합니다.",
+       "apihelp-query+userinfo-paramvalue-prop-groups": "현재 사용자가 소속된 모든 그룹을 나열합니다.",
+       "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "현재 사용자가 자동으로 소속된 모든 그룹을 나열합니다.",
+       "apihelp-query+userinfo-paramvalue-prop-rights": "현재 사용자가 가진 모든 권한을 나열합니다.",
+       "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "현재 사용자가 추가 및 제거할 수 있는 그룹을 나열합니다.",
+       "apihelp-query+userinfo-paramvalue-prop-options": "현재 사용자가 설정한 모든 설정을 나열합니다.",
+       "apihelp-query+userinfo-paramvalue-prop-editcount": "현재 사용자의 편집 수를 추가합니다.",
+       "apihelp-query+userinfo-paramvalue-prop-realname": "사용자의 실명을 추가합니다.",
+       "apihelp-query+userinfo-paramvalue-prop-email": "사용자의 이메일 주소와 이메일 인증 날짜를 추가합니다.",
+       "apihelp-query+userinfo-paramvalue-prop-registrationdate": "사용자의 등록 날짜를 추가합니다.",
+       "apihelp-query+userinfo-example-simple": "현재 사용자의 정보를 가져옵니다.",
+       "apihelp-query+userinfo-example-data": "현재 사용자의 추가 정보를 가져옵니다.",
+       "apihelp-query+users-description": "사용자 목록에 대한 정보를 가져옵니다.",
+       "apihelp-query+users-param-prop": "포함할 정보:",
+       "apihelp-query+users-paramvalue-prop-editcount": "사용자의 편집 수를 추가합니다.",
+       "apihelp-query+users-paramvalue-prop-registration": "사용자의 등록 타임스탬프를 추가합니다.",
+       "apihelp-query+users-param-token": "<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>을 대신 사용하십시오.",
+       "apihelp-query+users-example-simple": "사용자 <kbd>Example</kbd>의 정보를 반환합니다.",
+       "apihelp-query+watchlist-description": "현재 사용자의 주시목록의 문서의 최근 바뀜을 가져옵니다.",
+       "apihelp-query+watchlist-param-user": "이 사용자의 변경 사항만 나열합니다.",
+       "apihelp-query+watchlist-param-excludeuser": "이 사용자의 변경 사항을 나열하지 않습니다.",
+       "apihelp-query+watchlist-paramvalue-prop-ids": "판 ID와 페이지 ID를 추가합니다.",
+       "apihelp-query+watchlist-paramvalue-prop-title": "문서의 제목을 추가합니다.",
+       "apihelp-query+watchlist-paramvalue-prop-flags": "편집에 대한 플래그를 추가합니다.",
+       "apihelp-query+watchlist-paramvalue-prop-loginfo": "적절한 곳에 로그 정보를 추가합니다.",
+       "apihelp-removeauthenticationdata-description": "현재 사용자의 인증 데이터를 제거합니다.",
+       "apihelp-revisiondelete-description": "판을 삭제하거나 되살립니다.",
+       "apihelp-revisiondelete-param-reason": "삭제 또는 복구 이유.",
        "apihelp-rollback-param-tags": "되돌리기를 적용하기 위해 태그합니다.",
+       "apihelp-stashedit-param-sectiontitle": "새 문단을 위한 제목.",
+       "apihelp-stashedit-param-text": "문서 내용.",
+       "apihelp-stashedit-param-contentmodel": "새 콘텐츠의 콘텐츠 모델.",
+       "apihelp-tag-param-reason": "변경 이유.",
+       "apihelp-tokens-param-type": "요청할 토큰의 종류.",
        "apihelp-unblock-description": "사용자를 차단 해제합니다.",
+       "apihelp-unblock-param-reason": "차단 해제 이유.",
+       "apihelp-userrights-param-user": "사용자 이름.",
+       "apihelp-userrights-param-userid": "사용자 ID.",
        "apihelp-rawfm-description": "출력 데이터, 디버깅 요소를 포함, (HTML에 포함된)JSON형식.",
+       "apihelp-xml-param-includexmlnamespace": "지정하면 XML 이름공간을 추가합니다.",
+       "api-format-title": "미디어위키 API 결과",
        "api-help-title": "미디어위키 API 도움말",
        "api-help-lead": "이 페이지는 자동으로 생성된 미디어위키 API 도움말 문서입니다.\n\n설명 문서 및 예시: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "메인 모듈",
        "api-help-flag-deprecated": "이 모듈은 사용되지 않습니다.",
+       "api-help-flag-internal": "<strong>이 모듈은 내부용이거나 불안정합니다.</strong> 동작은 예고 없이 변경될 수 있습니다.",
        "api-help-flag-readrights": "이 모듈은 read 권한을 요구합니다.",
        "api-help-flag-writerights": "이 모듈은 write 권한을 요구합니다.",
        "api-help-flag-mustbeposted": "이 모듈은 POST 요청만을 허용합니다.",
+       "api-help-flag-generator": "이 모듈은 생성기로 사용할 수 있습니다.",
        "api-help-source": "출처: $1",
+       "api-help-source-unknown": "소스: <span class=\"apihelp-unknown\">알 수 없음</span>",
        "api-help-license": "라이선스: [[$1|$2]]",
        "api-help-license-noname": "라이선스: [[$1|링크 참조]]",
        "api-help-license-unknown": "라이선스: <span class=\"apihelp-unknown\">알 수 없음</span>",
        "api-help-param-deprecated": "사용 중지됨.",
        "api-help-param-required": "이 변수는 필수 입력 사항입니다.",
        "api-help-datatypes-header": "데이터 유형",
-       "api-help-datatypes": "API 요청 내 몇몇 매개변수형에 대해 더 자세히 설명해보겠습니다:\n;boolean\n:Boolean 매개변수들은 HTML 체크박스처럼 동작합니다: 만약 매개변수가 지정되었다면, 값에 상관없이 참의 값으로 여겨집니다. 거짓값은 매개변수 전체를 생략하세요.\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:* 미디어위키 형식, <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>+<var>##</var></kbd>, 또는 <kbd>-<var>##</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:* 1부터 13자리까지의 숫자로 표현된 1970-01-01T00:00:00Z 부터 흐른 시간(초) (<kbd>0</kbd>을 제외)\n:* 문자열 <kbd>now</kbd>",
+       "api-help-datatypes": "API 요청 내 몇몇 매개변수형에 대해 더 자세히 설명해보겠습니다:\n;boolean\n:Boolean 매개변수들은 HTML 체크박스처럼 동작합니다: 만약 매개변수가 지정되었다면, 값에 상관없이 참의 값으로 여겨집니다. 거짓값은 매개변수 전체를 생략하세요.\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:* 미디어위키 형식, <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>+<var>##</var></kbd>, 또는 <kbd>-<var>##</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:* 1부터 13자리까지의 숫자로 표현된 1970-01-01T00:00:00Z 부터 흐른 시간(초) (<kbd>0</kbd>을 제외)\n:* 문자열 <kbd>now</kbd>",
+       "api-help-param-type-limit": "유형: 정수 또는 <kbd>max</kbd>",
        "api-help-param-type-integer": "유형: {{PLURAL:$1|1=정수|2=정수 목록}}",
        "api-help-param-type-boolean": "유형: 부울 ([[Special:ApiHelp/main#main/datatypes|자세한 정보]])",
        "api-help-param-list": "{{PLURAL:$1|1=하나의 값|2=값 (\"{{!}}\"로 구분)}}: $2",
+       "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=비어 있어야 함|비어 있을 수 있거나 $2}}",
+       "api-help-param-limit": "$1 초과는 허용되지 않습니다.",
+       "api-help-param-limit2": "$1 초과는 허용되지 않습니다. (봇의 경우 $2)",
+       "api-help-param-integer-min": "{{PLURAL:$1|1=값|2=값들}}은 $2 이상이어야 합니다.",
+       "api-help-param-integer-max": "{{PLURAL:$1|1=값|2=값들}}은 $3 이하여야 합니다.",
+       "api-help-param-integer-minmax": "{{PLURAL:$1|1=값|2=값들}}은 $2와 $3 사이여야 합니다.",
+       "api-help-param-multi-max": "값들의 최대 수는 {{PLURAL:$1|$1}}입니다. (봇의 경우 {{PLURAL:$2|$2}})",
        "api-help-param-default": "기본값: $1",
        "api-help-param-default-empty": "기본값: <span class=\"apihelp-empty\">(비어 있음)</span>",
+       "api-help-param-token-webui": "호환성을 위해, 웹 UI에 사용된 토큰도 허용합니다.",
+       "api-help-param-continue": "더 많은 결과를 이용할 수 있을 때, 계속하려면 이것을 사용하십시오.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(설명 없음)</span>",
        "api-help-examples": "{{PLURAL:$1|예시}}:",
        "api-help-permissions": "{{PLURAL:$1|권한}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|다음 그룹에 부여됨}}: $2",
-       "api-credits": "API 개발자:\n* Roan Kattouw (선임 개발자, 2007년 9월–2009년)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (초기 개발자, 선임 개발자 2006년 9월~2007년 9월)\n* Brad Jorsch (선임 개발자 2013년–현재)\n\n당신의 의견이나 제안, 질문은 mediawiki-api@lists.wikimedia.org 로 보내주시거나,\nhttps://phabricator.wikimedia.org/ 에 버그 신고를 해 주시기 바랍니다.."
+       "api-help-open-in-apisandbox": "<small>[연습장에서 열기]</small>",
+       "api-help-authmanagerhelper-messageformat": "반환 메시지에 사용할 형식.",
+       "api-credits": "API 개발자:\n* Roan Kattouw (선임 개발자, 2007년 9월–2009년)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (초기 개발자, 선임 개발자 2006년 9월~2007년 9월)\n* Brad Jorsch (선임 개발자 2013년–현재)\n\n당신의 의견이나 제안, 질문은 mediawiki-api@lists.wikimedia.org 로 보내주시거나,\nhttps://phabricator.wikimedia.org/ 에 버그 보고를 해 주시기 바랍니다."
 }
index 26da426..7db9665 100644 (file)
        "apihelp-feedcontributions-param-deletedonly": "zeijsch blohß de fottjeschmeße Beijdrähsch.",
        "apihelp-feedcontributions-param-toponly": "Zeich blohß de Änderonge, di och de neußte sin.",
        "apihelp-feedcontributions-param-newonly": "Zeich blohß de Änderonge, woh Sigge neu aanjelaat woode sin.",
+       "apihelp-feedcontributions-param-hideminor": "Donn kein Minni-Ännderonge ennblände.",
        "apihelp-feedcontributions-param-showsizediff": "Zeijsch de Ongerscheijd en de Jrühße zwesche de Väsjohne.",
        "apihelp-feedcontributions-example-simple": "Zeijsch de Änderonge vum Metmaacher <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Example</kbd>.",
        "apihelp-feedrecentchanges-description": "Donn ene Kannahl för de neuste Änderonge ußjävve.",
        "apihelp-imagerotate-param-rotation": "Öm wi vill Jrahd sulle de Bellder noh de Uhr drieh wääde?",
        "apihelp-imagerotate-example-simple": "Drieh de <kbd>Dattei:Beijschpell.png</kbd> öm <kbd>90</kbd> Jrahd.",
        "apihelp-imagerotate-example-generator": "Drieh alle Bellder en dä <kbd>Saachjropp:Ömdriehje</kbd> öm <kbd>180</kbd> Jrahd.",
-       "apihelp-import-param-summary": "Zersammefaßong för der Empohrt.",
+       "apihelp-import-param-summary": "Zersammefaßong för der Empohrt för et Logbohch.",
        "apihelp-import-param-xml": "Donn en Dattei em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Extensible Markup Language\">XML</i>-Fommaht huhjahde.",
        "apihelp-import-param-interwikisource": "För et Empottehre us enem andere Wikki: Dat Wikki vun woh der Empohrt kumme sull.",
        "apihelp-import-param-interwikipage": "För et Empottehre us enem andere Wikki: De Sigg zom Empottehre.",
        "apihelp-import-param-namespace": "En heh dat Appachtemang emmpotehre. Kam_mer nit mem Parramehter „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1rootpage</var>“ zersamme bruche.",
        "apihelp-import-param-rootpage": "Als Ongersigg vun heh dä Sigg empottehre. Km_mer nit zosamme met däm Parramehter „<varlang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1namespace</var>“ bruche.",
        "apihelp-import-example-import": "Donn di Sigg „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[meta:Help:ParserFunctions]]</code>“ en et Appachtemang <code>100</code>empottehre, met alle älldere Väsjohne ennjeschloßße.",
+       "apihelp-linkaccount-example-link": "Fang dä Vörjang vum Verlengk obb ene Zohjang aan vun <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Example</kbd> aan.",
        "apihelp-login-param-name": "Metmaacher_Nahme.",
        "apihelp-login-param-password": "Paßwoot.",
        "apihelp-login-param-domain": "De Domaijn (kann fott bliehve)",
        "apihelp-managetags-example-delete": "Schmiiß de Makkehrong mem Nahme „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">vandlaism</kbd>“ fott mem Jrond „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Misspelt</kbd>“.",
        "apihelp-managetags-example-activate": "Donn en Makkehrong aktevehre mem Nahme „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">spam</kbd>“ mem Jrond „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">For use in edit patrolling</kbd>“.",
        "apihelp-managetags-example-deactivate": "Donn en Makkehrong mem Nahme „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">spam</kbd>“ nit mieh aktihv maache, mem Jrond „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">For use in edit patrolling</kbd>“.",
+       "apihelp-mergehistory-description": "Väsjohne fun Sigge zosamme lähje.",
+       "apihelp-mergehistory-param-from": "De Övverschreff vun dä Sigg, vun däh de verjange Väsjohne zesamme jelaat wähde sulle. Kam_mer nit zesamme met <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1fromid</var> bruche.",
+       "apihelp-mergehistory-param-fromid": "De Kännong vun dä Sigg, vun däh de verjange Väsjohne zesamme jelaat wähde sulle. Kam_mer nit zesamme met <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1fromid</var> bruche.",
+       "apihelp-mergehistory-param-to": "De Övverschreff vun dä Sigg, wohen de verjange Väsjohne zesamme jelaat wähde sulle. Kam_mer nit zesamme met <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1toid</var> bruche.",
+       "apihelp-mergehistory-param-toid": "De Kännong vun dä Sigg, wohen de verjange Väsjohne zesamme jelaat wähde sulle. Kam_mer nit zesamme met <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1toid</var> bruche.",
        "apihelp-mergehistory-param-reason": "Der Jrond för et Zesammelähje vun dä älldere Väsjohne.",
        "apihelp-mergehistory-example-merge": "Donn de jannze älldere Väsjohne vun dä Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Oldpage</kbd>“ met dä Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Newpage</kbd>“ zesammelähje.",
        "apihelp-mergehistory-example-merge-timestamp": "Donn de älldere Väsjohne vun dä Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Oldpage</kbd>“ bes zom <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">2015-12-31T04:37:41Z</kbd> met dä Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Newpage</kbd>“ zesammelähje.",
        "apihelp-parse-paramvalue-prop-headitems": "Jitt de Saacher för enn der <code>&lt;head&gt;</code> vun dä Sigg ze donn.",
        "apihelp-parse-paramvalue-prop-modules": "Jitt dem <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Delivery system in MediaWiki for the optimized run-time loading and managing of modules\">ResourceLoader</i> sing Moduhle uß, di en dä Sigg jebruch wähde. Äntwehder „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">jsconfigvars</kbd>“ udder „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">encodedjsconfigvars</kbd>“ moß mer met „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">modules</kbd>“ zesamme aanforrdere.",
        "apihelp-parse-paramvalue-prop-jsconfigvars": "Livvert de Varrejahble vun dä Ennschtällonge vum JavaSkrep, di äxtra för heh di Sigg enjeschtallt sin.",
+       "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Livvert de Varrejahble vun dä Ennschtällonge vum JavaSkrep, di äxtra för heh di Sigg enjeschtallt sin als ene Täx em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"JavaScript Object Notation\">JSON</i>-Fommaht.",
        "apihelp-parse-paramvalue-prop-iwlinks": "Jitt de Engewikkilengks em jepahßde Wikkitäx uß.",
        "apihelp-parse-paramvalue-prop-wikitext": "Jitt de der ojinahl Wikkitäx us, dä jepahß woode es.",
        "apihelp-parse-paramvalue-prop-properties": "Jitt devärse Eijeschafte uß, di em jepahßde Wikkitäx faßjelaat woode sen.",
        "apihelp-parse-param-section": "Donn blohß der Ennhalld vun däm Affschnett met dä Nommer paase.\n\nWann „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">new</kbd>“ enjejovve es, donn dä Täx <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1text</var> un de Övverschreff <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1sectiontitle</var> paase, wi wänn_enne neuje Affschnett en dä Sigg derbei köhm.\n\nDä Parramehter „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">new</kbd>“ es blohß zohjelohße, wann och <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">text</var> aanjejovve es.",
        "apihelp-parse-param-sectiontitle": "De Övverschreff för dä neuje Afschnet, wann <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">section</var> = <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">new</kbd> es.\n\nAnders wi beim Beärbeide vun dä Sigg weed dä Parramehter nit dorsch de <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">summary</var> ußjetuusch, wann hä fottjelohße udder läddesch es.",
        "apihelp-parse-param-disablelimitreport": "Jiff keine Bereesch vum Vüürbereijde zom Paase (der „<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">NewPP limit report</i>“) mem Paaser singe Dahte zosamme uß.",
+       "apihelp-parse-param-disablepp": "Nämm <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1disablelimitreport</var> schtatt dämm.",
        "apihelp-parse-param-disableeditsection": "Donn de Lenks för Affschnedde ze änndere en de Ußjahbe vum Paaser eruß lohße.",
+       "apihelp-parse-param-disabletidy": "Donn et <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i> vun dä Ußjahbe nit oprühme, för e Beijschpell met <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"correct and cleans up HTML and XML documents fixing markup errors and upgrading legacy code\">tidy</i>.",
        "apihelp-parse-param-disabletoc": "Donn et Ennhaldsverzeijscheneß en de Ußjahbe vottlohße.",
        "apihelp-parse-example-page": "Donn en Sigg pahse.",
        "apihelp-parse-example-text": "Donn Wikkitäx pahse.",
        "apihelp-protect-param-reason": "Der Jrond för et Schöze udder Freijävve.",
        "apihelp-protect-param-tags": "Donn de Makehronge aanpaße, dat se för dä Enndraach em Logbohch vum Sigge Schöze jehühre.",
        "apihelp-protect-param-cascade": "Donn en Schotz-Kaskahd zohlohße, alsu ene Schoz för ennjeföhschte Schablohne un upjerohfe Bellder vun dä Sigg. Deiht nix, wann keine von dä aanjejovve Zoote Schoz en Kaskahd zohlöht.",
+       "apihelp-protect-param-watchlist": "Donn di Sigg ohne Bedengonge op däm aktoälle Metmaacher sing Oppaßleß udder nemm se druß fott, donn de Enschtällonge nämme, udder donn de Oppaßleß jaa nit verändere.",
        "apihelp-protect-example-protect": "Donn en Sigg schöze.",
+       "apihelp-protect-example-unprotect": "Donn en Sigg nit mih schöze un doh för saz de Beschrängkonge op <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">all</kbd>“. <!--  https://phabricator.wikimedia.org/T141367 -->",
+       "apihelp-protect-example-unprotect2": "Donn dä Schoz för en Sigg ophävve, un doh för kein Beschrängkonge säze.",
        "apihelp-purge-param-forcelinkupdate": "Bräng de Tabälle met de lengks obb ene neue Schtand.",
        "apihelp-purge-example-simple": "Donn fö de Sigge „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main Page</kbd>“ un „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">API</kbd>“ de zweschejeschpeijscherte Väsjohn fottschmiiße.",
        "apihelp-purge-example-generator": "Donn fö de eezte zehn Sigge em Schtanndadd_Appachtemang de zweschejeschpeijscherte Väsjohn fottschmiiße.",
        "apihelp-query+allredirects-param-to": "De Övverschreff vun dä Sigg, woh et Zälle ophühre sull.",
        "apihelp-query+allredirects-param-prefix": "Söhk not Sigge, di esu aanfange.",
        "apihelp-query+allredirects-param-unique": "Zeijsch blohß de ongerscheidlijje Zihl_Sigg. Kam_mer nit zesamme met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1prop=ids|fragment|interwiki</code>“ bruche. Wam_mer et als ene  Jenerahtor bruche deiht, kritt mer Zihlsiggge anschtatt vun Quällesigge.",
+       "apihelp-query+allredirects-param-prop": "Wat för en Aanjahbe ennschlehße:",
+       "apihelp-query+allredirects-paramvalue-prop-ids": "Deiht de Kännonge vun dä Ömleijdongssigg derbei. Kam_mer nit zersamme met „< var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1unique</var>“ bruche.",
        "apihelp-query+allredirects-paramvalue-prop-title": "Deiht dä Ömleijdong ehr Övverschreff derbei.",
        "apihelp-query+allredirects-param-namespace": "Dat Appachtemang zom opzälle.",
        "apihelp-query+allredirects-param-limit": "Wi vill sulle överhoup aanjezeisch wääde?",
        "apihelp-query+allrevisions-param-generatetitles": "Wann als ene  Jenerahtor enjesaz, brängk dat Övverschreffte un kein Kännonge vun Väsjohne.",
        "apihelp-query+allrevisions-example-user": "Donn de läzde fuffzisch Beijdrähsch vum Metmaacher „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Example</kbd>“ opleßte.",
        "apihelp-query+allrevisions-example-ns-main": "Donn de eezde fuffzisch Väsjohne em Houp-Appachemang opleßte.",
+       "apihelp-query+mystashedfiles-description": "Holl en Leß vun dem aktoälle Metmaacher singe upload stash.",
        "apihelp-query+mystashedfiles-param-prop": "Wat för en Aanjahbe holle för di Datteije.",
        "apihelp-query+mystashedfiles-param-limit": "Wi vill Datteije holle?",
        "apihelp-query+alltransclusions-param-from": "De Övverschreff vun dä ennjeföhschte Sigg, woh de Leß medd aanfange sull.",
        "apihelp-query+allusers-param-group": "Donn blohß Metmaacher uß dä aanjejovve Jroppe enschlehße.",
        "apihelp-query+allusers-param-excludegroup": "Donn keine Metmaacher uß dä aanjejovve Jroppe enschlehße.",
        "apihelp-query+allusers-param-prop": "Wat för en Aanjahbe med enzschlehße:",
+       "apihelp-query+allusers-paramvalue-prop-implicitgroups": "Donn alle Jroppe opleste, woh dä Metmaacher automattesch dren es.",
        "apihelp-query+allusers-paramvalue-prop-rights": "De Rääschde vn däm Memaacher.",
        "apihelp-query+allusers-paramvalue-prop-editcount": "Donn de Aanzahl Änderonge derbei, di dä Metmaacher em Wikki jemaat hät.",
+       "apihelp-query+allusers-paramvalue-prop-registration": "Wann aanjejovve, deihd dat heh et Dattom un de Zigg derbei, wann dä Metmaacher sesch aanjemälld hät, wann müjjelech. Dat kann läddesch blihve.",
        "apihelp-query+allusers-param-limit": "Wi vill Nahme Metmaacher sulle mer krijje?",
        "apihelp-query+allusers-param-witheditsonly": "Blohß Metmahcher, di och ens jät verändert han.",
        "apihelp-query+allusers-param-activeusers": "Donn blohß Metmaacher opleßte, di  {{PLURAL:$1|der läzde Daach|en de läzde $1 Dääsch|keine läzde Daach}} aktihf wohre.",
        "apihelp-query+iwbacklinks-example-simple": "Holl Sigge, di op „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[wikibooks:Test]]</code>“ verlengke.",
        "apihelp-query+iwbacklinks-example-generator": "Holl Ennfommazjuhne övver Sigge, di op „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[wikibooks:Test]]</code>“ verlengke.",
        "apihelp-query+iwlinks-description": "Jiff alle Engerwikki_Lengks vun de aanjejovve Sigge uß.",
+       "apihelp-query+iwlinks-paramvalue-prop-url": "Deiht dä kumplätte <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Locator\">URL</i> derbei.",
        "apihelp-query+iwlinks-param-limit": "Wi vill Engerwikki_Lengks zem ußjävve?",
        "apihelp-query+iwlinks-param-prefix": "Jiff blohß de Engerwikki_Lengks uß, di dermet aanfange.",
+       "apihelp-query+iwlinks-param-title": "Dä Engerwiki Lengk för dernoh ze söhke. Moß met <var>$1prefix</var> zesamme jebruch wähde.",
        "apihelp-query+iwlinks-param-dir": "En wälsche Reihjefollsch opleßte.",
        "apihelp-query+langbacklinks-param-lang": "Schprohch för dä Schprohche_Lengk.",
        "apihelp-query+langbacklinks-param-title": "Der Schprohche_Lengk för noh ze söhke. Moß zersamme met <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1lang</code> jebruch wähde.",
        "apihelp-query+langbacklinks-param-limit": "Wi vill Sigge ensjesammp zem ußjävve?",
+       "apihelp-query+langbacklinks-param-prop": "Wat för en Prijoretähte holle:",
+       "apihelp-query+langbacklinks-paramvalue-prop-lllang": "Deiht de Kännong för de Schprohch för dä Schprohchelengk derbei.",
+       "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Deiht de Övverschreff för dä Schprohchelengk derbei.",
        "apihelp-query+langbacklinks-param-dir": "En wälsche Reihjefollsch opleßte.",
        "apihelp-query+langbacklinks-example-simple": "Holl Sigge, di op „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[:fr:Test]]</code>“ verlengke.",
        "apihelp-query+langbacklinks-example-generator": "Holl Ennfommazjuhne övver Sigge, di op „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[:fr:Test]]</code>“ verlengke.",
        "apihelp-query+langlinks-description": "Jiff alle Schprohche_Lengks vun de aanjejovve Sigge uß.",
        "apihelp-query+langlinks-param-limit": "Wi vill Schprohche_Lengks holle?",
+       "apihelp-query+langlinks-paramvalue-prop-url": "Deiht dä kumplätte <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Locator\">URL</i> derbei.",
+       "apihelp-query+langlinks-paramvalue-prop-autonym": "Deiht dä Nahme vun de Moterschprohch derbei.",
        "apihelp-query+langlinks-param-lang": "Donn blohß de Schprohche_Lengks met däm aanjejovve Schprohche_Köözel.",
        "apihelp-query+langlinks-param-dir": "En wälsche Reihjefollsch opleßte.",
        "apihelp-query+links-description": "Jiff alle Lengks vun de aanjejovve Sigge uß.",
+       "apihelp-query+links-param-namespace": "Zeijsch blohß de Lengks en dä Appachtemangs.",
        "apihelp-query+links-param-limit": "Wi vill Lengks ußjävve?",
        "apihelp-query+links-param-titles": "Donn blohß e Lengks of heh di Övverschreffte opleßte. Dadd es johd, öm eruß ze fenge ovv en en beschtemmpte Sigg op ene beschtemmpte Övverschreff verlengk es.",
        "apihelp-query+links-param-dir": "En wälsche Reihjefollsch opleßte.",
+       "apihelp-query+links-example-simple": "Holl de Lengks vun dä Sigg <kbd>Main Page</kbd>",
        "apihelp-query+linkshere-description": "Fengk alle Sigge, di op de aanjejovve Sigge lengke.",
        "apihelp-query+linkshere-param-prop": "Wat för en Eijeschaffte holle:",
        "apihelp-query+linkshere-paramvalue-prop-pageid": "Page ID of each page.",
        "apihelp-query+linkshere-example-simple": "Holl en Leß vun Sigge, di op de Sigg „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[Main Page]]</code>“ lengke donn.",
        "apihelp-query+linkshere-example-generator": "Holl Ennfommazjuhne övver Sigge, di op de Sigg „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[Main Page]]</code>“ lengke.",
        "apihelp-query+logevents-description": "Holl Enndrähsch us de Logböhscher.",
+       "apihelp-query+logevents-param-prop": "Wat för en Eijeschaffte holle:",
        "apihelp-query+logevents-param-type": "Söhk blohß heh di Zood Enndrähsch us de Logböhscher.",
        "apihelp-query+logevents-param-start": "Et Dattom un de Zigg vun woh aff opjezallt wähde sull.",
        "apihelp-query+logevents-param-end": "Dattum un Uhrzigg, bes wann opzälle.",
        "apihelp-query+pageprops-description": "Jitt devärse Eijeschafte uß, di em Ennhald vun dä Sigg faßjelaat wohde sen.",
        "apihelp-query+pageprops-example-simple": "Holl de Eijeschaffte för di Sigge „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main Page</kbd>“ un „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">MediaWiki</kbd>“.",
        "apihelp-query+pageswithprop-description": "Donn alle Sigge met bechtemmpte Sigge_Eijeschaff opleßte.",
+       "apihelp-query+pageswithprop-param-prop": "Wat för en Aanjahbe ennschlehße:",
        "apihelp-query+pageswithprop-paramvalue-prop-ids": "Deiht de Kännong vun de Sigge derbei.",
+       "apihelp-query+pageswithprop-paramvalue-prop-title": "Donn de Övverschrevv un de Kännong för di Sigg derbei.",
        "apihelp-query+pageswithprop-paramvalue-prop-value": "Deiht der Wäät för de Eijeschaff vun dä Sigg derbei.",
        "apihelp-query+pageswithprop-param-limit": "De jrüüßte Zahl Sigge för ußzejävve.",
        "apihelp-query+pageswithprop-param-dir": "En wälsche Reihjefollsch opleßte.",
        "apihelp-query+recentchanges-description": "Donn de  neußte Änderonge opleßte.",
        "apihelp-query+recentchanges-param-start": "Et Dattom un de Zigg vun woh aff opjezallt wähde sull.",
        "apihelp-query+recentchanges-param-end": "Dattum un Uhrzigg, bes wann opzälle.",
+       "apihelp-query+recentchanges-param-namespace": "Donn de Änderonge blohß us de aanjejovve Appachtemans nämme.",
        "apihelp-query+recentchanges-param-user": "Donn blohß Änderonge vun heh däm Metmaacher opleßte.",
        "apihelp-query+recentchanges-param-excludeuser": "Donn kein Änderonge vun heh däm Metmaacher opleßte.",
        "apihelp-query+recentchanges-param-tag": "Donn blohß Änderonge met heh dä Makkehrong opleßte.",
+       "apihelp-query+recentchanges-param-prop": "Donn zohsäzlejje Aanjahbe ennschlehße:",
+       "apihelp-query+recentchanges-paramvalue-prop-flags": "Deihd de Makkehronge vun dä Änderong derbei.",
+       "apihelp-query+recentchanges-paramvalue-prop-timestamp": "Deihd et Dattom un de Uhrzigg vun dä Änderong derbei.",
+       "apihelp-query+recentchanges-paramvalue-prop-title": "Deihd de neuje Övverschreff noh dä Änderong derbei.",
        "apihelp-query+recentchanges-paramvalue-prop-tags": "Donn de Makkehronge för dä Enndraach opleßte.",
        "apihelp-query+recentchanges-paramvalue-prop-sha1": "Donn de Pröhvsom för di Enndrähsch oplesßte, di met enne Väsjohn zesamme hange.",
        "apihelp-query+recentchanges-param-token": "Nemm „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>“ schtatt dämm.",
        "apihelp-query+revisions+base-paramvalue-prop-userid": "Däm Metmaacher sing Kännong, dä di Väsjohn aanjelaat hät.",
        "apihelp-query+revisions+base-paramvalue-prop-size": "Der Ömvang en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Bytes</i> vun dä Väsjohn.",
        "apihelp-query+revisions+base-paramvalue-prop-sha1": "De <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"secure hash algorithm\">SHA-1 (base 16)</i> Prööfsomm vun dä Väsjohn.",
-       "apihelp-query+revisions+base-paramvalue-prop-comment": "De Aanmärkong vum Metmaacher för di äsjohn.",
+       "apihelp-query+revisions+base-paramvalue-prop-comment": "De Aanmärkong vum Metmaacher för di Väsjohn.",
+       "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "De jepaaste Aanmärkong vum Metmaacher för di Väsjohn.",
        "apihelp-query+revisions+base-paramvalue-prop-content": "Der Täx vun dä Väsjohn.",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "Makkehronge vun dä Väsjohn.",
        "apihelp-query+revisions+base-param-limit": "Wi vill Väsjohne sulle ußjejovve wähde?",
        "apihelp-query+search-param-what": "Wat för en Aat ze Söhke?",
        "apihelp-query+search-param-info": "Wat för en Metta_Dahte ußzejävve.",
        "apihelp-query+search-param-prop": "Wat för en Eijeschaffte holle:",
+       "apihelp-query+search-paramvalue-prop-wordcount": "Deiht de Aanzahl Wööter en dä Sigg derbeij.",
+       "apihelp-query+search-paramvalue-prop-timestamp": "Deihd et Dattum un de Uhrzigg derbei, wann di Sigg et läz veränndert wohd.",
+       "apihelp-query+search-paramvalue-prop-redirecttitle": "Deiht dä zopaß Ömleijdong ehr Övverschreff derbei.",
        "apihelp-query+search-param-limit": "Wi vill Sigge ensjesamp ußjävve?",
        "apihelp-query+search-param-interwiki": "Donn de Engerwiki Lengks met ußjävve beim Söhke, wann_er doh sin.",
        "apihelp-query+search-example-simple": "Söhk noh „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">meaning</kbd>“.",
        "apihelp-query+search-example-text": "Söhk en Täxte noh „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">meaning</kbd>“.",
        "apihelp-query+search-example-generator": "Holl anjahbe övver di Sigge, di jefonge wähde beim söhke noh \n„<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">meaning</kbd>“",
        "apihelp-query+siteinfo-description": "Jiff alljemeine Ennfommazjuhne övver heh di ẞaid_uß.",
+       "apihelp-query+siteinfo-param-prop": "Wat för en Ennfommazjuhne holle:",
+       "apihelp-query+siteinfo-paramvalue-prop-general": "Alljemeine Aanjabe zom Süßtehm.",
+       "apihelp-query+siteinfo-paramvalue-prop-statistics": "Jivv Schtatistike vum Wikki uß.",
+       "apihelp-query+siteinfo-paramvalue-prop-variables": "Jid en Leß med de verföhschbahre Kännonge us.",
        "apihelp-query+siteinfo-param-filteriw": "Donn blohß de Enndrähsch för heh et Wikki udder blohß de Enndrähsch för ußerhallef en di Leß.",
        "apihelp-query+siteinfo-param-showalldb": "Donn alle ẞööver för de Dahtebangke opleßte, nit blohß di am mihßte hengerher sin.",
        "apihelp-query+siteinfo-param-numberingroup": "Donn de Aanzahl Metmaacher en de Jroppe vun Metmaacher opleßte.",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "Donn de Kännong för jehde Sigg un jehe Väsjohn derbei.",
        "apihelp-query+usercontribs-paramvalue-prop-title": "Donn de Övverschrevv un de Kännong för et Appachtemang derbei.",
        "apihelp-query+usercontribs-paramvalue-prop-timestamp": "Deihd et Dattom un de Uhrzigg vun dä Änderong derbei.",
+       "apihelp-query+usercontribs-paramvalue-prop-comment": "Deihd de Zosammefaßong vun dä Änderong derbei.",
+       "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "Deihd de jepaaste Zosammefaßong vun dä Änderong derbei.",
        "apihelp-query+usercontribs-paramvalue-prop-size": "Deihd de neuje Jrühße noh dä Änderong derbei.",
        "apihelp-query+usercontribs-paramvalue-prop-sizediff": "Deihd de Änderong vun dä Jrühße vun dä Änderong derbei.",
        "apihelp-query+usercontribs-paramvalue-prop-flags": "Deihd de Makkehronge vun dä Änderong derbei.",
+       "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Nohjelohrte Änderonge makkehre.",
        "apihelp-query+usercontribs-paramvalue-prop-tags": "Donn de Makkehronge vun dä Änderong opleßte.",
        "apihelp-query+usercontribs-param-tag": "Donn blohß Väsjohne met heh dä Makehrong opleßte.",
        "apihelp-query+usercontribs-param-toponly": "Bloß Änderonge aanzeije, woh de neußte Väsjohn beij eruß kohm.",
        "apihelp-query+userinfo-example-data": "Holl zohsäzlejje Aanjahbe övver dä aktoälle Metmaacher.",
        "apihelp-query+users-description": "Holl Aanjahbe övver en Leß vun Metmaacher.",
        "apihelp-query+users-param-prop": "Wat för en Aanjahbe med enzschlehße:",
+       "apihelp-query+users-paramvalue-prop-groups": "Donn alle Jroppe opleßte, woh all de Metmaacher dren sin.",
+       "apihelp-query+users-paramvalue-prop-implicitgroups": "Donn alle Jroppe opleßte, woh ene Metmaacher aotomattesch dren es.",
        "apihelp-query+users-paramvalue-prop-rights": "Donn alle Rääschte opleßte, di alle Metmaacher han.",
        "apihelp-query+users-paramvalue-prop-editcount": "Donn däm Metmaacher sing Aanzahl Ännderonge derbeij.",
        "apihelp-query+users-paramvalue-prop-registration": "Donn et Dattom vun dämm Metmaacher singe eetze Aanmäldong derbei.",
        "apihelp-query+watchlist-paramvalue-prop-flags": "Deihd de Makkehronge vun dä Änderong derbei.",
        "apihelp-query+watchlist-paramvalue-prop-user": "Deiht dä Metmaacher derbei, dä di Änderong jemaat hät.",
        "apihelp-query+watchlist-paramvalue-prop-userid": "Deiht de kännong vn äm Metmaacher derbei, dä di Änderong jemaat hät.",
+       "apihelp-query+watchlist-paramvalue-prop-comment": "Deihd de Zosammefaßong vun dä Änderong derbei.",
+       "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "Deihd de jepaaste Zosammefaßong vun dä Änderong derbei.",
        "apihelp-query+watchlist-paramvalue-prop-timestamp": "Deihd et Dattom un de Uhrzigg vun dä Änderong derbei.",
+       "apihelp-query+watchlist-paramvalue-prop-patrol": "Makkehrt de nohjelohrte Ännderonge.",
+       "apihelp-query+watchlist-paramvalue-prop-sizes": "Deiht de vörrijje un de neuje Läng vun dä Sigg derbei.",
        "apihelp-query+watchlist-param-type": "Wat för en Änderonge aanzeije:",
        "apihelp-query+watchlist-paramvalue-type-edit": "Jewöhnlejje Ännderonge aan Sigge.",
        "apihelp-query+watchlist-paramvalue-type-external": "Änderonge vun Ußerhallef.",
        "apihelp-query+watchlistraw-param-namespace": "Donn blohß Sigge en heh däm Appachtemang opleßte.",
        "apihelp-query+watchlistraw-param-limit": "Wi vell Äjehbneße ennsjesammp pro Oprohv ußjejovve wähde sulle.",
        "apihelp-query+watchlistraw-param-prop": "Wat för en zohsäzlejje Eijeschaffte holle:",
+       "apihelp-query+watchlistraw-param-dir": "En wälsche Reihjefollsch opleßte.",
        "apihelp-query+watchlistraw-example-simple": "Donn alle Sigge uß dem aktälle Metmaacher sing Oppaßleß opleßte.",
+       "apihelp-removeauthenticationdata-example-simple": "Versöhk dem aktoäle Metmaacher sing Dahte för <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">FooAuthenticationRequest</kbd> fott ze nämme.",
+       "apihelp-resetpassword-example-email": "Schegg en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> mem Passwod neu säze aan alle Matmaacher met dä Addräß <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">user@example.com</kbd>.",
        "apihelp-revisiondelete-description": "Versione fottschmieße un widder zeröck holle.",
        "apihelp-revisiondelete-param-hide": "Wat för jehde Väsjohn ze veschteijsche.",
        "apihelp-revisiondelete-param-show": "Wat för jehde Väsjohn zerökzeholle.",
        "apihelp-stashedit-param-sectiontitle": "De Övverschreff för ene neuje Afschnett",
        "apihelp-stashedit-param-text": "Dä Sigg ehre Ennhalld.",
        "apihelp-stashedit-param-contentmodel": "Et Enhalltsmodäll för dä neue Ennhalld.",
+       "apihelp-stashedit-param-summary": "Zosammefaßong änndere",
        "apihelp-tag-description": "Donn Makkehronge vun einzel Väsjohne udder Enndraähsch em Logbohch fott nämme udder se verjävve.",
        "apihelp-tag-param-rcid": "Ein udder mih Kännonge uß de neuste Ännderonge, woh di Makkehrong derbei jedonn udder fott jenumme wähde sull.",
        "apihelp-tag-param-revid": "Ein Kännong udder mih, woh di Makkehrong derbei jedonn udder fott jenumme wähde sull.",
        "apihelp-tag-example-log": "Donn de Makkehrong „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">spam</kbd>“ vun dämm Enndrahch met dä Kännong „<kbd>123</kbd>“ em Logbohch fott nämme un als Jrond draaach „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Wrongly applied</kbd>“ enn.",
        "apihelp-unblock-description": "Don en Schpärr för ene Metmaacher ophävve.",
        "apihelp-unblock-param-reason": "Der Jrond för de Schpärr opzehävve.",
+       "apihelp-unblock-param-tags": "Donn de Makehronge änndere, di för dä Enndraach em Logbohch vum Schpärre jesaz wähde sulle.",
        "apihelp-undelete-param-title": "De Övverschreff vun dä Sigg zom zerök holle.",
        "apihelp-undelete-param-reason": "Der Jrond för et Zerök holle.",
        "apihelp-undelete-param-tags": "Donn de Makehronge aanpaße, dat se för dä Enndraach em Logbohch vum Sigge fott Schmihße jehühre.",
        "api-help-param-default": "Schtandatt: $1",
        "api-help-param-default-empty": "Schtandatt: <span class=\"apihelp-empty\">(läddesch)</span>",
        "api-help-param-disabled-in-miser-mode": "Dadd es wäje em [[mw:Manual:$wgMiserMode|miser mode]] affjeschalldt.",
-       "api-help-param-limited-in-miser-mode": "<strong>opjepaß:</strong> Weil der  [[mw:Manual:$wgMiserMode|miser mode]] enjeschalld es, künne heh winnijer wi <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1limit</var> Äjehpneße ußjejejovve wähde, vör em Wigger_Mache. En Jränzfäll künne et Noll sin.",
+       "api-help-param-limited-in-miser-mode": "<strong>Opjepaß:</strong> Weil der [[mw:Manual:$wgMiserMode|miser mode]] enjeschalld es, künne heh winnijer wi <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1limit</var> Äjehpneße ußjejejovve wähde, vör em Wigger_Mache. En Jränzfäll künne et Noll sin.",
        "api-help-param-direction": "En wälsche Reihjefollsch opleßte:\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">newer</code>:De Ählsde et eez. Opjepaß: „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1start</code>“ moß fröhjer sin wi „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1end</code>“.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">older</code>:De Neuste et eez, der Schtanndatt. Opjepaß: „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1start</code>“ moß schpääder sin wi „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1end</code>“.",
        "api-help-param-continue": "Wann mih ze holle es, nemm dat för wigger ze maache.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(nix drövver bikannt)</span>",
index 12ec506..be09192 100644 (file)
@@ -21,6 +21,9 @@
        "apihelp-emailuser-param-target": "Bikarhênerê ku e-name jê rê bê şandin.",
        "apihelp-expandtemplates-param-title": "Sernavê rûpelê.",
        "apihelp-feedcontributions-param-deletedonly": "Tenê beşdariyên jêbirî nîşan bide.",
+       "apihelp-feedcontributions-param-hideminor": "Guherandinên biçûk veşêre.",
+       "apihelp-feedrecentchanges-param-hideminor": "Guherandinên biçûk veşêre.",
+       "apihelp-feedrecentchanges-param-hidebots": "Guherandinên botan veşêre.",
        "apihelp-feedrecentchanges-example-simple": "Guherandinên dawî nîşan bide.",
        "apihelp-feedrecentchanges-example-30days": "Guherandinên dawî yên 30 rojan nîşan bide",
        "apihelp-filerevert-param-comment": "Şîroveyê bar bike.",
@@ -35,5 +38,7 @@
        "apihelp-parse-example-summary": "Kurteyekê analîz bike",
        "apihelp-protect-description": "Asta parastinê ya rûpelekê biguherîne.",
        "apihelp-protect-example-protect": "Rûpelekê biparêze.",
-       "apihelp-tag-param-reason": "Sedemê bo guherandinê."
+       "apihelp-query+alllinks-paramvalue-prop-title": "Sernavê girêdanê lê zêde dike.",
+       "apihelp-tag-param-reason": "Sedemê bo guherandinê.",
+       "api-help-parameters": "{{PLURAL:$1|Parametre}}:"
 }
index 76fd47d..041203e 100644 (file)
@@ -41,6 +41,7 @@
        "apihelp-feedcontributions-param-month": "Vum Mount (a virdrun).",
        "apihelp-feedcontributions-param-deletedonly": "Nëmme geläscht Kontributioune weisen.",
        "apihelp-feedcontributions-param-toponly": "Nëmmen Ännerunge weisen déi déi lescht Versioun sinn.",
+       "apihelp-feedcontributions-param-hideminor": "Kleng Ännerunge verstoppen.",
        "apihelp-feedrecentchanges-param-days": "Deeg, op déi d'Resultater limitéiert gi sollen",
        "apihelp-feedrecentchanges-param-hideminor": "Kleng Ännerunge verstoppen.",
        "apihelp-feedrecentchanges-param-hidebots": "Ännerunge vu Botte verstoppen.",
        "apihelp-stashedit-param-title": "Titel vun der Säit déi geännert gëtt.",
        "apihelp-stashedit-param-sectiontitle": "Den Titel fir en neien Abschnitt.",
        "apihelp-stashedit-param-text": "Inhalt vun der Säit",
+       "apihelp-stashedit-param-summary": "Resumé änneren",
        "apihelp-tag-param-reason": "Grond fir d'Ännerung.",
        "apihelp-unblock-description": "D'Spär vun engem Benotzer ophiewen.",
        "apihelp-unblock-param-reason": "Grond fir d'Spär opzehiewen",
index 432d9c0..d88e0ec 100644 (file)
@@ -98,5 +98,6 @@
        "apihelp-query+watchlist-paramvalue-type-log": "नोंद प्रविष्ट्या",
        "apihelp-query+watchlist-paramvalue-type-categorize": "वर्ग सदस्यता बदलते.",
        "apihelp-stashedit-param-title": "पानाच्या मथळ्याचे संपादन होत आहे.",
-       "apihelp-stashedit-param-sectiontitle": "नविन विभागाचा मथळा"
+       "apihelp-stashedit-param-sectiontitle": "नविन विभागाचा मथळा",
+       "apihelp-stashedit-param-summary": "सारांश बदला."
 }
index 865ebd9..4b99320 100644 (file)
@@ -29,6 +29,7 @@
        "apihelp-block-description": "Gebruiker blokkeren.",
        "apihelp-block-param-user": "Gebruikersnaam, IP-adres of IP-range om te blokkeren.",
        "apihelp-block-param-reason": "Reden voor blokkade.",
+       "apihelp-block-param-anononly": "Alleen anonieme gebruikers blokkeren (uitschakelen van anonieme bewerkingen via dit IP-adres)",
        "apihelp-block-param-nocreate": "Voorkom registeren van accounts.",
        "apihelp-block-param-autoblock": "Blokkeer automatisch het laatst gebruikte IP-adres en ieder volgend IP-adres van waaruit ze proberen aan te melden.",
        "apihelp-block-param-reblock": "De huidige blokkade aanpassen als de gebruiker al geblokkeerd is.",
index 2acc27b..96fe70e 100644 (file)
@@ -90,6 +90,7 @@
        "apihelp-feedcontributions-param-deletedonly": "Pokazuj tylko usunięty wkład.",
        "apihelp-feedcontributions-param-toponly": "Pokazuj tylko edycje będące ostatnią zmianą strony.",
        "apihelp-feedcontributions-param-newonly": "Pokazuj tylko edycje tworzące stronę.",
+       "apihelp-feedcontributions-param-hideminor": "Ukryj drobne zmiany.",
        "apihelp-feedcontributions-param-showsizediff": "Pokaż różnicę rozmiaru między wersjami.",
        "apihelp-feedrecentchanges-param-feedformat": "Format danych wyjściowych.",
        "apihelp-feedrecentchanges-param-namespace": "Przestrzeń nazw, do której ograniczone są wyniki.",
index 89fa617..c2545fc 100644 (file)
@@ -45,6 +45,7 @@
        "apihelp-query+watchlist-paramvalue-prop-title": "د يو مخ سرليک ورگډوي.",
        "apihelp-query+watchlist-paramvalue-type-new": "مخ جوړونې.",
        "apihelp-stashedit-param-sectiontitle": "د يوې نوې برخې سرليک.",
+       "apihelp-stashedit-param-summary": "د بدلون لنډيز.",
        "apihelp-tag-param-reason": "د بدلون سبب.",
        "apihelp-unblock-param-reason": "د بنديز ليرې کولو سبب.",
        "apihelp-undelete-param-reason": "د بيازېرملو سبب.",
index a72b088..38af0cb 100644 (file)
@@ -7,7 +7,9 @@
                        "Rhcastilhos",
                        "Macofe",
                        "Almondega",
-                       "Raphaelras"
+                       "Raphaelras",
+                       "Caçador de Palavras",
+                       "LucyDiniz"
                ]
        },
        "apihelp-main-param-action": "Qual ação executar.",
        "apihelp-stashedit-param-text": "Conteúdo da página",
        "apihelp-stashedit-param-contentmodel": "Modelo de conteúdo do novo conteúdo.",
        "apihelp-stashedit-param-contentformat": "Formato de serialização de conteúdo usado para o texto de entrada.",
+       "apihelp-stashedit-param-summary": "Mudar sumário.",
        "apihelp-tag-param-reason": "Motivo para a mudança.",
        "apihelp-unblock-description": "Desbloquear usuário",
        "apihelp-unblock-param-id": "ID do bloco para desbloquear (obtido através de <kbd>list=blocks</kbd>). Não pode ser usado em conjunto com <var>$1user</var>.",
index b70ebe9..40d5786 100644 (file)
@@ -35,6 +35,7 @@
        "apihelp-expandtemplates-param-title": "Título da página.",
        "apihelp-feedcontributions-param-feedformat": "O formato do feed.",
        "apihelp-feedcontributions-param-deletedonly": "Mostrar apenas contribuições eliminadas.",
+       "apihelp-feedcontributions-param-hideminor": "Ocultar edições menores.",
        "apihelp-feedcontributions-param-showsizediff": "Mostrar diferença de tamanho entre edições.",
        "apihelp-feedrecentchanges-param-feedformat": "O formato do feed.",
        "apihelp-feedrecentchanges-param-limit": "Número máximo de resultados a apresentar.",
@@ -97,6 +98,9 @@
        "api-help-lead": "Esta é uma página de documentação API do MediaWiki gerada automaticamente.\n\nDocumentação e exemplos: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "Módulo principal",
        "api-help-flag-deprecated": "Este módulo está obsoleto.",
+       "api-help-flag-readrights": "Este módulo requer direitos de leitura.",
+       "api-help-flag-writerights": "Este módulo requer direitos de leitura.",
+       "api-help-flag-mustbeposted": "Este módulo aceita somente solicitações POST.",
        "api-help-source": "Fonte: $1",
        "api-help-license": "Licença: [[$1|$2]]",
        "api-help-license-noname": "Licença: [[$1|Ver ligação]]",
        "api-help-param-deprecated": "Obsoleto.",
        "api-help-param-required": "Este parâmetro é obrigatório.",
        "api-help-datatypes-header": "Tipo de dados",
+       "api-help-datatypes": "Alguns tipos de parâmetro na API necessitam de mais explicações:\n;boolean\n:Os parâmetros booleanos funcionam como as caixas de seleção HTML: se o parâmetro for especificado, independentemente do valor, é considerado verdadeiro. Para um valor falso, omitir o parâmetro completo.\n;timestamp\n:Timestamps podem ser especificados em vários formatos. Formato de data e hora ISO 8601 é recomendado. Todos os horários estão em UTC, qualquer inclusão de fuso horário é ignorado.\n:* Data e hora ISO 8601, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (pontuação e <kbd>Z</kbd> são opcionais)\n:* Data e hora ISO 8601 com segundos fracionários (ignorado), <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> (traços, dois pontos e <kbd>Z</kbd> são opcionais)\n:* Formato do MediaWiki, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* Formato numérico genérico, <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (fuso horário opcional do <kbd>GMT</kbd>, <kbd>+<var>##</var></kbd>, or <kbd>-<var>##</var></kbd> são ignorados)\n:* Formato EXIF, <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:*Formato RFC 2822 (o fuso horário pode ser omitido), <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato RFC 850 (o fuso horário pode ser omitido), <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato 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:* Segundos desde 1970-01-01T00:00:00Z como um inteiro de 1 a 13 dígitos (excluindo <kbd>0</kbd>)\n:* A string <kbd>now</kbd>",
        "api-help-param-type-limit": "Tipo: inteiro ou <kbd>max</kbd>",
        "api-help-param-type-boolean": "Tipo: boolean ([[Special:ApiHelp/main#main/datatypes|detalhes]])",
        "api-help-param-type-user": "Tipo: {{PLURAL:$1|1=nome de utilizador|2=lista de nomes de utilizadores}}",
        "api-help-param-list": "{{PLURAL:$1|1=Um dos seguintes valores|2=Valores (separar com <kbd>{{!}}</kbd>)}}: $2",
        "api-help-param-multi-separate": "Separe os valores com <kbd>|</kbd>.",
+       "api-help-param-multi-max": "O número máximo de valores é {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} para robôs).",
        "api-help-param-default": "Padrão: $1",
        "api-help-param-default-empty": "Padrão: <span class=\"apihelp-empty\">(vazio)</span>",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(sem descrição)</span>",
index 362a473..6c47aa4 100644 (file)
@@ -75,6 +75,9 @@
        "apihelp-createaccount-param-language": "{{doc-apihelp-param|createaccount|language}}",
        "apihelp-createaccount-example-pass": "{{doc-apihelp-example|createaccount}}",
        "apihelp-createaccount-example-mail": "{{doc-apihelp-example|createaccount}}",
+       "apihelp-cspreport-description": "{{doc-apihelp-description|cspreport}}",
+       "apihelp-cspreport-param-reportonly": "{{doc-apihelp-param|cspreport|reportonly}}",
+       "apihelp-cspreport-param-source": "{{doc-apihelp-param|cspreport|source}}",
        "apihelp-delete-description": "{{doc-apihelp-description|delete}}",
        "apihelp-delete-param-title": "{{doc-apihelp-param|delete|title}}",
        "apihelp-delete-param-pageid": "{{doc-apihelp-param|delete|pageid}}",
        "apihelp-feedcontributions-param-deletedonly": "{{doc-apihelp-param|feedcontributions|deletedonly}}",
        "apihelp-feedcontributions-param-toponly": "{{doc-apihelp-param|feedcontributions|toponly}}",
        "apihelp-feedcontributions-param-newonly": "{{doc-apihelp-param|feedcontributions|newonly}}",
+       "apihelp-feedcontributions-param-hideminor": "{{doc-apihelp-param|feedcontributions|hideminor}}",
        "apihelp-feedcontributions-param-showsizediff": "{{doc-apihelp-param|feedcontributions|showsizediff}}",
        "apihelp-feedcontributions-example-simple": "{{doc-apihelp-example|feedcontributions}}",
        "apihelp-feedrecentchanges-description": "{{doc-apihelp-description|feedrecentchanges}}",
        "apihelp-query+watchlistraw-param-show": "{{doc-apihelp-param|query+watchlistraw|show}}",
        "apihelp-query+watchlistraw-param-owner": "{{doc-apihelp-param|query+watchlistraw|owner}}",
        "apihelp-query+watchlistraw-param-token": "{{doc-apihelp-param|query+watchlistraw|token}}",
+       "apihelp-query+watchlistraw-param-dir": "{{doc-apihelp-param|query+watchlistraw|dir}}",
        "apihelp-query+watchlistraw-param-fromtitle": "{{doc-apihelp-param|query+watchlistraw|fromtitle}}",
        "apihelp-query+watchlistraw-param-totitle": "{{doc-apihelp-param|query+watchlistraw|totitle}}",
        "apihelp-query+watchlistraw-example-simple": "{{doc-apihelp-example|query+watchlistraw}}",
        "apihelp-stashedit-param-contentmodel": "{{doc-apihelp-param|stashedit|contentmodel}}",
        "apihelp-stashedit-param-contentformat": "{{doc-apihelp-param|stashedit|contentformat}}",
        "apihelp-stashedit-param-baserevid": "{{doc-apihelp-param|stashedit|baserevid}}",
+       "apihelp-stashedit-param-summary": "{{doc-apihelp-param|stashedit|summary}}",
        "apihelp-tag-description": "{{doc-apihelp-description|tag}}",
        "apihelp-tag-param-rcid": "{{doc-apihelp-param|tag|rcid}}",
        "apihelp-tag-param-revid": "{{doc-apihelp-param|tag|revid}}",
diff --git a/includes/api/i18n/sah.json b/includes/api/i18n/sah.json
new file mode 100644 (file)
index 0000000..89e17f4
--- /dev/null
@@ -0,0 +1,9 @@
+{
+       "@metadata": {
+               "authors": [
+                       "София",
+                       "HalanTul"
+               ]
+       },
+       "apihelp-stashedit-param-summary": "Түмүгү уларыт."
+}
index ad4bee4..fdf003d 100644 (file)
@@ -10,5 +10,6 @@
        "apihelp-query+watchlist-paramvalue-type-edit": "قاعديوار صفحاتي ترميمون.",
        "apihelp-query+watchlist-paramvalue-type-external": "خارجي تبديليون.",
        "apihelp-query+watchlist-paramvalue-type-new": "صفحن جون تخليقون.",
-       "apihelp-query+watchlist-paramvalue-type-log": "لاگ داخلائون."
+       "apihelp-query+watchlist-paramvalue-type-log": "لاگ داخلائون.",
+       "apihelp-stashedit-param-summary": "تَتُ تبديل ڪريو."
 }
index 5de1dee..3205248 100644 (file)
        "apihelp-feedcontributions-param-deletedonly": "Visa bara borttagna bidrag.",
        "apihelp-feedcontributions-param-toponly": "Visa endast ändringar som är senaste revideringen.",
        "apihelp-feedcontributions-param-newonly": "Visa endast redigeringar där sidor skapas.",
+       "apihelp-feedcontributions-param-hideminor": "Göm mindre ändringar.",
        "apihelp-feedcontributions-param-showsizediff": "Visa skillnaden i storlek mellan revisioner.",
        "apihelp-feedcontributions-example-simple": "Returnera bidrag för <kbd>Exempel</kbd>",
        "apihelp-feedrecentchanges-description": "Returnerar ett flöde med senaste ändringar.",
        "apihelp-query+langbacklinks-example-simple": "Hämta sidor som länkar till [[:fr:Test]].",
        "apihelp-query+langlinks-param-dir": "Riktningen att lista mot.",
        "apihelp-query+links-param-dir": "Riktningen att lista mot.",
+       "apihelp-query+prefixsearch-param-profile": "Sök profil att använda.",
        "apihelp-query+protectedtitles-param-limit": "Hur många sidor att returnera totalt.",
        "apihelp-query+protectedtitles-example-simple": "Lista skyddade titlar.",
        "apihelp-query+recentchanges-example-simple": "Lista de senaste ändringarna.",
        "apihelp-query+watchlistraw-description": "Hämta alla sidor på den aktuella användarens bevakningslista.",
        "apihelp-query+watchlistraw-example-simple": "Lista sidor på den aktuella användarens bevakningslista.",
        "apihelp-setnotificationtimestamp-example-all": "Återställ meddelandestatus för hela bevakningslistan.",
+       "apihelp-stashedit-param-summary": "Ändra sammanfattning.",
        "apihelp-upload-param-filekey": "Nyckel som identifierar en tidigare uppladdning som lagrats temporärt.",
        "apihelp-upload-param-stash": "Om angiven, kommer servern att temporärt lagra filen istället för att lägga till den i centralförvaret.",
        "apihelp-upload-example-url": "Ladda upp från URL.",
diff --git a/includes/api/i18n/udm.json b/includes/api/i18n/udm.json
new file mode 100644 (file)
index 0000000..fe9d085
--- /dev/null
@@ -0,0 +1,9 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Kaganer"
+               ]
+       },
+       "apihelp-edit-example-edit": "Бамез тупатъяно.",
+       "apihelp-login-example-login": "Пырыны."
+}
index 0802c53..517496f 100644 (file)
@@ -24,7 +24,7 @@
        "apihelp-main-param-requestid": "Будь-яке значення, вказане тут, буде включене у відповідь. Може використовуватися, щоб відрізняти запити.",
        "apihelp-main-param-servedby": "Включити в результати ім'я хоста, який обробив запит.",
        "apihelp-main-param-curtimestamp": "Включити в результат поточну мітку часу.",
-       "apihelp-main-param-origin": "При доступі до API з використанням крос-доменного AJAX-запиту (CORS), задайте параметру значення вихідного домена. Він має бути включений у будь-який попередній запит і таким чином мусить бути частиною запиту URI (не тіла POST). Він повинен точно співпадати з одним з виходів у заголовку <code>Origin</code>, тобто бути заданим чимось на зразок <kbd>https://uk.wikipedia.org</kbd> або <kbd>https://meta.wikimedia.org</kbd>. Якщо цей параметр не співпадає з заголовком <code>Origin</code>, повернеться помилка 403. Якщо цей параметр співпадає з заголовком <code>Origin</code> і вихід знаходиться у білому списку, буде встановлено заголовок <code>Access-Control-Allow-Origin</code>.",
+       "apihelp-main-param-origin": "При доступі до API з використанням крос-доменного AJAX-запиту (CORS), задайте параметру значення вихідного домена. Він має бути включений у будь-який попередній запит і таким чином мусить бути частиною запиту URI (не тіла POST). \n\nДля автентифікованих запитів він повинен точно співпадати з одним з виходів у заголовку <code>Origin</code>, тобто бути заданим чимось на зразок <kbd>https://uk.wikipedia.org</kbd> або <kbd>https://meta.wikimedia.org</kbd>. Якщо цей параметр не співпадає з заголовком <code>Origin</code>, повернеться помилка 403. Якщо цей параметр співпадає з заголовком <code>Origin</code> і вихід знаходиться у білому списку, буде встановлено заголовки <code>Access-Control-Allow-Origin</code> і <code>Access-Control-Allow-Credentials</code>.\n\nДля неавтентифікованих запитів укажіть значення <kbd>*</kbd>. Це дасть встановлення заголовка <code>Access-Control-Allow-Origin</code>, але <code>Access-Control-Allow-Credentials</code> буде <code>false</code> і всі дані про користувача будуть заборонені.",
        "apihelp-main-param-uselang": "Мова, що використовується для перекладу повідомлень. Список кодів можна видати на <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> з <kbd>siprop=languages</kbd> або вказати <kbd>user</kbd> на використання поточного налаштування мови користувача, або вказати <kbd>content</kbd> на використання мови вмісту цієї вікі.",
        "apihelp-block-description": "Заблокувати користувача.",
        "apihelp-block-param-user": "Ім'я користувача, IP-адреса або діапазон IP-адрес для блокування.",
@@ -41,6 +41,7 @@
        "apihelp-block-example-ip-simple": "Блокувати IP-адресу <kbd>192.0.2.5</kbd> на три дні з причиною <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "Блокувати користувача<kbd>Vandal</kbd> на невизначений термін з причиною <kbd>Vandalism</kbd> і заборонити створення нових облікових записів та надсилання електронної пошти.",
        "apihelp-changeauthenticationdata-description": "Зміна параметрів аутентифікації для поточного користувача.",
+       "apihelp-changeauthenticationdata-example-password": "Спроба змінити поточний пароль користувача на <kbd>ExamplePassword</kbd>.",
        "apihelp-checktoken-description": "Перевірити коректність токена з <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Тип токена, який тестується.",
        "apihelp-checktoken-param-token": "Токен для тесту.",
@@ -48,6 +49,9 @@
        "apihelp-checktoken-example-simple": "Перевірити дійсність токена <kbd>csrf</kbd>.",
        "apihelp-clearhasmsg-description": "Очищає прапорець <code>hasmsg</code> для поточного користувача.",
        "apihelp-clearhasmsg-example-1": "Очистити прапорець <code>hasmsg</code> для поточного користувача.",
+       "apihelp-clientlogin-description": "Увійдіть у вікі з допомогою інтерактивного потоку.",
+       "apihelp-clientlogin-example-login": "Почати процес входу у вікі як користувач <kbd>Example</kbd> з паролем <kbd>ExamplePassword</kbd>.",
+       "apihelp-clientlogin-example-login2": "Продовжити вхід в систему після відповіді <samp>UI</samp> для двофакторної автентифікації, надаючи <var>OATHToken</var> як <kbd>987654</kbd>.",
        "apihelp-compare-description": "Отримати порівняння двох сторінок.\n\nПовинні бути номер версії, назва сторінки або ID сторінки для «від» і «до».",
        "apihelp-compare-param-fromtitle": "Перший заголовок для порівняння.",
        "apihelp-compare-param-fromid": "Перший ID сторінки для порівняння.",
@@ -57,6 +61,8 @@
        "apihelp-compare-param-torev": "Друга версія для порівняння.",
        "apihelp-compare-example-1": "Створити порівняння версій 1 і 2.",
        "apihelp-createaccount-description": "Створити новий обліковий запис користувача.",
+       "apihelp-createaccount-param-preservestate": "Якщо запит <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> повернув істину для <samp>hasprimarypreservedstate</samp>, запити позначені як <samp>primary-required</samp> повинні бути пропущені. Якщо він повернув не порожнє значення для <samp>preservedusername</samp>, це ім'я користувача повинно бути використано для параметру <var>username</var>.",
+       "apihelp-createaccount-example-create": "Почати процес створення користувача <kbd>Example</kbd> з паролем <kbd>ExamplePassword</kbd>.",
        "apihelp-createaccount-param-name": "Ім'я користувача.",
        "apihelp-createaccount-param-password": "Пароль (ігнорується, якщо встановлено <var>$1mailpassword</var>).",
        "apihelp-createaccount-param-domain": "Домен для зовнішньої аутентифікації (опціонально).",
@@ -68,6 +74,7 @@
        "apihelp-createaccount-param-language": "Код мови для встановлення за замовчуванням для користувача (необов'язково, за замовчуванням — мова вмісту).",
        "apihelp-createaccount-example-pass": "Створити користувача <kbd>testuser</kbd> з паролем <kbd>test123</kbd>.",
        "apihelp-createaccount-example-mail": "Створити користувача <kbd>testmailuser</kbd> і надіслати на електронну пошту випадково-згенерований пароль.",
+       "apihelp-cspreport-description": "Використовується браузерами для повідомлення порушень Правил безпеки контенту (Content Security Policy). Цей модуль не повинен використовуватися, окрім випадків автоматичного використання веб-браузером для CSP-скарги.",
        "apihelp-delete-description": "Вилучити сторінку.",
        "apihelp-delete-param-title": "Назва сторінки для вилучення. Не можна використати разом з <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "ID-сторінки на вилучення. Не можна використати разом з <var>$1title</var>.",
        "apihelp-feedcontributions-param-deletedonly": "Показати лише вилучений внесок.",
        "apihelp-feedcontributions-param-toponly": "Показати лише редагування, які є останніми версіями.",
        "apihelp-feedcontributions-param-newonly": "Показати лише редагування, які є створеннями сторінок.",
+       "apihelp-feedcontributions-param-hideminor": "Приховати незначні редагування.",
        "apihelp-feedcontributions-param-showsizediff": "Показати різницю розміру між версіями.",
        "apihelp-feedcontributions-example-simple": "Вивести внесок для користувача <kbd>Example</kbd>.",
        "apihelp-feedrecentchanges-description": "Видає стрічку нових редагувань.",
        "apihelp-import-param-namespace": "Імпортувати у цей простір назв. Не можна використати разом з <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Імпортувати як підсторінку цієї сторінки. Не можна використати разом з <var>$1namespace</var>.",
        "apihelp-import-example-import": "Імпортувати [[meta:Help:ParserFunctions]] у простір назв 100 з повною історією.",
-       "apihelp-login-description": "Увійти в систему й отримати куки автентифікації.\n\nУ випадку успішного входження в систему, потрібні куки буде включено в заголовки HTTP-відповіді. У разі невдалого входу, подальші спроби будуть обмежені до ліміту автоматичних спроб підбирання пароля.",
+       "apihelp-linkaccount-description": "Пов'язати обліковий запис третьої сторони з поточним користувачем.",
+       "apihelp-linkaccount-example-link": "Почати процес пов'язування з обліковм записом з <kbd>Example</kbd>.",
+       "apihelp-login-description": "Увійти в систему й отримати куки автентифікації.\n\nЦю дію треба використовувати лише в комбінації з [[Special:BotPasswords]]; використання для входу в основний обліковий запис застаріле і може ламатися без попередження. Щоб безпечно увійти в основний обліковий запис, використовуйте <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "apihelp-login-description-nobotpasswords": "Увійти й отримати куки автентифікації.\n\nЦя дія застаріла і може ламатися без попередження. Щоб безпечно входити в систему, використовуйте <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "apihelp-login-description-nonauthmanager": "Увійти й отримати куки автентифікації.\n\nУ випадку успішного входження в систему будуть включені в заголовки відповіді HTTP. У випадку невдалого входження подальші спроби можуть бути урізані, щоб обмежити атаки автоматичного вгадування пароля.",
        "apihelp-login-param-name": "Ім'я користувача.",
        "apihelp-login-param-password": "Пароль.",
        "apihelp-login-param-domain": "Домен (необов'язково).",
        "apihelp-query+allusers-param-activeusers": "Перерахувати лише користувачів, що були активні $1 {{PLURAL:$1|останній день|останні дні|останніх днів}}.",
        "apihelp-query+allusers-param-attachedwiki": "Із <kbd>$1prop=centralids</kbd>, також вказати, чи користувач має приєднану вікі, визначену цим ідентифікатором.",
        "apihelp-query+allusers-example-Y": "Перерахувати користувачів, починаючи з <kbd>Y</kbd>.",
+       "apihelp-query+authmanagerinfo-description": "Отримати інформацію про поточний стан автентифікації.",
+       "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "Перевірити, чи поточний стан автентифікації користувача є достатнім для даної конфіденційної операції.",
+       "apihelp-query+authmanagerinfo-param-requestsfor": "Отримати інформацію про запити автентифікації, потрібні для даної дії автентифікації.",
+       "apihelp-query+filerepoinfo-example-login": "Вибірка запитів, що можуть бути використані при початку входу.",
+       "apihelp-query+filerepoinfo-example-login-merged": "Отримати запити, які можуть бути використані при початку входу, з об'єднаними полями форми.",
+       "apihelp-query+filerepoinfo-example-securitysensitiveoperation": "Перевірити чи автентифікація є достатньою для дії <kbd>foo</kbd>.",
        "apihelp-query+backlinks-description": "Знайти усі сторінки, що посилаються на подану сторінку.",
        "apihelp-query+backlinks-param-title": "Назва для пошуку. Не можна використати разом з <var>$1pageid</var>.",
        "apihelp-query+backlinks-param-pageid": "ID сторінки для пошуку. Не можна використати разом з <var>$1title</var>.",
        "apihelp-query+prefixsearch-param-limit": "Максимальна кількість результатів для виведення.",
        "apihelp-query+prefixsearch-param-offset": "Кількість результатів, які пропустити.",
        "apihelp-query+prefixsearch-example-simple": "Шукати назви сторінок, які починаються з <kbd>meaning</kbd>.",
+       "apihelp-query+prefixsearch-param-profile": "Профіль пошуку для використання.",
        "apihelp-query+protectedtitles-description": "Вивести список усіх назв, захищених від створення.",
        "apihelp-query+protectedtitles-param-namespace": "Перерахувати назви лише в цих просторах назв.",
        "apihelp-query+protectedtitles-param-level": "Перерахувати лише назви з цими рівням захисту.",
        "apihelp-query+search-param-what": "Який тип пошуку виконати.",
        "apihelp-query+search-param-info": "Які метадані отримати.",
        "apihelp-query+search-param-prop": "Які властивості для виведення:",
+       "apihelp-query+search-param-qiprofile": "Незалежний профіль запиту для використання (впливає на алгоритм ранжування).",
        "apihelp-query+search-paramvalue-prop-size": "Додає розмір сторінки в байтах.",
        "apihelp-query+search-paramvalue-prop-wordcount": "Додає кількість слів на сторінці.",
        "apihelp-query+search-paramvalue-prop-timestamp": "Додає часову мітку останнього редагування сторінки.",
        "apihelp-query+users-paramvalue-prop-emailable": "Помічає чи хоче користувач отримувати електронну пошту через [[Special:Emailuser]].",
        "apihelp-query+users-paramvalue-prop-gender": "Помічає стать користувача. Повертає \"male\", \"female\", або \"unknown\".",
        "apihelp-query+users-paramvalue-prop-centralids": "Додає центральні ідентифікатори і стан приєднання для користувача.",
+       "apihelp-query+users-paramvalue-prop-cancreate": "Вказує, чи можна створити обліковий запис для допустимих, але незареєстрованих імен користувачів.",
        "apihelp-query+users-param-attachedwiki": "Із <kbd>$1prop=centralids</kbd>, вказати, чи користувач має приєднану вікі, визначену цим ідентифікатором.",
        "apihelp-query+users-param-users": "Список користувачів, для яких отримати інформацію.",
        "apihelp-query+users-param-token": "Використати натомість <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-query+watchlistraw-param-show": "Перелічити лише елементи, які відповідають цим критеріям.",
        "apihelp-query+watchlistraw-param-owner": "Використовується разом з $1token для доступу до списку спостереження різних користувачів.",
        "apihelp-query+watchlistraw-param-token": "Токен безпеки (доступний у [[Special:Preferences#mw-prefsection-watchlist|налаштуваннях]] користувача) для отримання доступу до списку спостереження іншого користувача.",
+       "apihelp-query+watchlistraw-param-dir": "Напрямок, у якому перелічити.",
        "apihelp-query+watchlistraw-param-fromtitle": "Назва (з префіксом простору назв), з якої почати перерахування.",
        "apihelp-query+watchlistraw-param-totitle": "Назва (з префіксом простору назв), якою закінчити перерахування.",
        "apihelp-query+watchlistraw-example-simple": "Перелічити сторінки у списку спостереження поточного користувача.",
        "apihelp-query+watchlistraw-example-generator": "Вибрати інформацію про сторінку для сторінок у списку спостереження поточного користувача.",
+       "apihelp-removeauthenticationdata-description": "Вилучити параметри автентифікації для поточного користувача.",
+       "apihelp-removeauthenticationdata-example-simple": "Спроба вилучити дані поточного користувача для <kbd>FooAuthenticationRequest</kbd>.",
+       "apihelp-resetpassword-description": "Відправити користувачу лист для відновлення пароля.",
+       "apihelp-resetpassword-description-noroutes": "Немає доступних способів відновити пароль.\n\nУвімкніть способи у <var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var>, щоб використовувати цей модуль.",
+       "apihelp-resetpassword-param-user": "Користувача відновлено.",
+       "apihelp-resetpassword-param-email": "Адреса електронної пошти користувача відновлено.",
+       "apihelp-resetpassword-param-capture": "Повернути тимчасові паролі, які були надіслані. Вимагає право користувача <code>passwordreset</code>.",
+       "apihelp-resetpassword-example-user": "Надіслати лист для скидання пароля користувачу <kbd>Example</kbd>.",
+       "apihelp-resetpassword-example-email": "Надіслати лист для скидання пароля усім користувачам з адресою електронної пошти <kbd>user@example.com</kbd>.",
        "apihelp-revisiondelete-description": "Вилучити або відновити версії.",
        "apihelp-revisiondelete-param-type": "Тип здійснюваного вилучення версії.",
        "apihelp-revisiondelete-param-target": "Назва сторінки, версію якої вилучити, якщо вимагається для цього типу.",
        "apihelp-stashedit-param-contentmodel": "Модель вмісту нового вмісту.",
        "apihelp-stashedit-param-contentformat": "Формат серіалізації вмісту, використовуваний для введеного тексту.",
        "apihelp-stashedit-param-baserevid": "Ідентифікатор базової версії.",
+       "apihelp-stashedit-param-summary": "Змінити опис.",
        "apihelp-tag-description": "Додати або вилучити зміни міток з окремих версій або записів журналу.",
        "apihelp-tag-param-rcid": "Один або більше ідентифікаторів останніх змін, до яких додати або вилучити мітки.",
        "apihelp-tag-param-revid": "Один або більше ідентифікатор з якого додати або вилучити мітку.",
        "apihelp-undelete-param-watchlist": "Безумовно додати або вилучити сторінку із списку спостереження поточного користувача, використати налаштування, або не змінювати статус (не)спостереження.",
        "apihelp-undelete-example-page": "Відновити сторінку <kbd>Main Page</kbd>.",
        "apihelp-undelete-example-revisions": "Відновити дві версії сторінки <kbd>Main Page</kbd>.",
+       "apihelp-unlinkaccount-description": "Вилучити пов'язаний обліковий запис третьої сторони з поточного користувача.",
        "apihelp-upload-description": "Завантажити файл, або отримати статус завантажень у процесі.\n\nДоступні декілька методів:\n* Завантажити вміст файлу напряму, використовуючи параметр <var>$1file</var>.\n* Завантажити файл шматками, використовуючи параметри <var>$1filesize</var>, <var>$1chunk</var>, та <var>$1offset</var>.\n* Змусити сервер Медіавікі отримати файл за URL, використовуючи параметр <var>$1url</var>.\n* Завершити раніше розпочате завантаження, яке не вдалось через попередження, використовуючи параметр <var>$1filekey</var>.\nЗауважте, що HTTP POST повинен бути здійснений як завантаження файлу (наприклад, використовуючи <code>multipart/form-data</code>)",
        "apihelp-upload-param-filename": "Цільова назва файлу.",
        "apihelp-upload-param-comment": "Коментар завантаження. Також використовується як початковий текст сторінок для нових файлів, якщо <var>$1text</var> не вказано.",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Надано|Надані}}: $2",
        "api-help-right-apihighlimits": "Використовувати вищі ліміти у запитах API (повільні запити: $1; швидкі запити: $2). Ліміти для повільних запитів також застосовуються до багатозначних параметрів.",
        "api-help-open-in-apisandbox": "<small>[відкрити в пісочниці]</small>",
+       "api-help-authmanagerhelper-messageformat": "Формат до використання для повернення повідомлень.",
+       "api-help-authmanagerhelper-mergerequestfields": "Об'єднати інформацію всіх автентифікаційних запитів у один масив.",
+       "api-help-authmanagerhelper-preservestate": "Зберегти статус з попередньої спроби входу, що не вдалась, якщо можливо.",
        "api-credits-header": "Автор(и)",
        "api-credits": "Розробники API:\n* Roan Kattouw (головний розробник вер. 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (творець, головний розробник вер. 2006 – вер. 2007)\n* Brad Jorsch (головний розробник 2013 – тепер)\n\nБудь ласка, надсилайте свої коментарі, пропозиції та запитання на mediawiki-api@lists.wikimedia.org\nабо зафайліть звіт про баґ на https://phabricator.wikimedia.org/."
 }
index 8e42964..d20f4c4 100644 (file)
@@ -18,7 +18,9 @@
                        "Umherirrender",
                        "Apflu",
                        "Hzy980512",
-                       "PhiLiP"
+                       "PhiLiP",
+                       "Arthur2e5",
+                       "損齋"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|文档]]\n* [[mw:API:FAQ|常见问题]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 邮件列表]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 程序错误与功能请求]\n</div>\n<strong>状态信息:</strong>本页所展示的所有特性都应正常工作,但是API仍在开发当中,将会随时变化。请订阅[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 邮件列表]以便获得更新通知。\n\n<strong>错误请求:</strong>当API收到错误请求时,HTTP header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅[[mw:API:Errors_and_warnings|API: 错误与警告]]。\n\n<strong>测试中:</strong>测试API请求的易用性,请参见[[Special:ApiSandbox]]。",
@@ -31,7 +33,7 @@
        "apihelp-main-param-requestid": "任何在此提供的值将包含在响应中。可能可以用以区别请求。",
        "apihelp-main-param-servedby": "包含保存结果请求的主机名。",
        "apihelp-main-param-curtimestamp": "在结果中包括当前时间戳。",
-       "apihelp-main-param-origin": "当通过跨域名AJAX请求(CORS)访问API时,设置此作为起始域名。这必须包括在任何pre-flight请求中,并因此必须是请求的URI的一部分(而不是POST正文)。这必须匹配<code>Origin</code>中的一个起点:从头到底,因此它已经设置为像<kbd>https://zh.wikipedia.org</kbd>或<kbd>https://meta.wikimedia.org</kbd>的东西。如果此参数不匹配<code>Origin</code>页顶,就返回403错误响应。如果此参数匹配<code>Origin</code>页顶并且起点被白名单,将设置一个<code>Access-Control-Allow-Origin</code>开头。",
+       "apihelp-main-param-origin": "当通过跨域名AJAX请求(CORS)访问API时,设置此作为起始域名。这必须包括在任何pre-flight请求中,并因此必须是请求的URI的一部分(而不是POST正文)。\n\n对于已验证的请求,这必须正确匹配<code>Origin</code>标头中的原点之一,因此它已经设置为像<kbd>https://zh.wikipedia.org</kbd>或<kbd>https://meta.wikimedia.org</kbd>的东西。如果此参数不匹配<code>Origin</code>页顶,就返回403错误响应。如果此参数匹配<code>Origin</code>页顶并且起点被白名单,将设置<code>Access-Control-Allow-Origin</code>和<code>Access-Control-Allow-Credentials</code>开头。\n\n对于未验证的请求,会指定值<kbd>*</kbd>。这将导致<code>Access-Control-Allow-Origin</code>标头被设置,但<code>Access-Control-Allow-Credentials</code>将为<code>false</code>,且所有用户特定数据将受限制。",
        "apihelp-main-param-uselang": "用于消息翻译的语言。<kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>与<kbd>siprop=languages</kbd>可返回语言代码列表,或指定<kbd>user</kbd>以使用当前用户的语言设置,或指定<kbd>content</kbd>以使用此wiki的内容语言。",
        "apihelp-block-description": "封禁一位用户。",
        "apihelp-block-param-user": "您要封禁的用户、IP地址或IP地址段。",
@@ -68,6 +70,7 @@
        "apihelp-compare-param-torev": "要比较的第二个修订版本。",
        "apihelp-compare-example-1": "在版本1和2中创建差异。",
        "apihelp-createaccount-description": "创建一个新用户账户。",
+       "apihelp-createaccount-param-preservestate": "如果<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>返回用于<samp>hasprimarypreservedstate</samp>的真值,标记为<samp>primary-required</samp>的请求应被忽略。如果它返回用于<samp>preservedusername</samp>的非空值,用户名必须用于<var>username</var>参数。",
        "apihelp-createaccount-example-create": "开始创建用户<kbd>Example</kbd>和密码<kbd>ExamplePassword</kbd>的过程。",
        "apihelp-createaccount-param-name": "用户名。",
        "apihelp-createaccount-param-password": "密码(如果设置<var>$1mailpassword</var>则忽略)。",
@@ -80,6 +83,8 @@
        "apihelp-createaccount-param-language": "要为用户设置为默认值的语言代码(可选,默认为内容语言)。",
        "apihelp-createaccount-example-pass": "创建用户<kbd>testuser</kbd>和密码<kbd>test123</kbd>。",
        "apihelp-createaccount-example-mail": "创建用户<kbd>testmailuser</kbd>并电邮发送一个随机生成的密码。",
+       "apihelp-cspreport-description": "由浏览器使用以报告违反内容安全方针的内容。此模块应永不使用,除了在被CSP兼容的浏览器自动使用时。",
+       "apihelp-cspreport-param-reportonly": "标记作为来自监视方针的报告,而不是执行方针的报告",
        "apihelp-delete-description": "删除一个页面。",
        "apihelp-delete-param-title": "要删除的页面标题。不能与<var>$1pageid</var>一起使用。",
        "apihelp-delete-param-pageid": "要删除的页面的页面 ID。不能与<var>$1title</var>一起使用。",
@@ -93,7 +98,7 @@
        "apihelp-delete-example-reason": "删除<kbd>Main Page</kbd>,原因<kbd>Preparing for move</kbd>。",
        "apihelp-disabled-description": "此模块已禁用。",
        "apihelp-edit-description": "创建和编辑页面。",
-       "apihelp-edit-param-title": "您希望编辑的页面标题。不能与<var>$1pageid</var>一起使用。",
+       "apihelp-edit-param-title": "编辑的页面标题。不能与<var>$1pageid</var>一起使用。",
        "apihelp-edit-param-pageid": "要编辑的页面的页面 ID。不能与<var>$1title</var>一起使用。",
        "apihelp-edit-param-section": "段落数。<kbd>0</kbd>用于首段,<kbd>new</kbd>用于新的段落。",
        "apihelp-edit-param-sectiontitle": "新段落的标题。",
        "apihelp-feedcontributions-param-deletedonly": "仅显示已删除的贡献。",
        "apihelp-feedcontributions-param-toponly": "仅仅显示那些作为最新修订的编辑。",
        "apihelp-feedcontributions-param-newonly": "仅仅显示那些作为页面创建的编辑。",
+       "apihelp-feedcontributions-param-hideminor": "隐藏小编辑。",
        "apihelp-feedcontributions-param-showsizediff": "显示修订版本之间的大小差别。",
        "apihelp-feedcontributions-example-simple": "返回用户<kbd>Example</kbd>的贡献。",
        "apihelp-feedrecentchanges-description": "返回最近更改的摘要。",
        "apihelp-query+allusers-param-attachedwiki": "与<kbd>$1prop=centralids</kbd>一起使用,也表明用户是否附加于此ID定义的wiki。",
        "apihelp-query+allusers-example-Y": "列出以<kbd>Y</kbd>开头的用户。",
        "apihelp-query+authmanagerinfo-description": "检索有关当前身份验证状态的信息。",
+       "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "测试用户当前的身份验证状态是否足够用于指定的安全敏感操作。",
+       "apihelp-query+authmanagerinfo-param-requestsfor": "取得指定身份验证操作所需的有关身份验证请求的信息。",
        "apihelp-query+filerepoinfo-example-login": "检索当开始登录时可能使用的请求。",
        "apihelp-query+filerepoinfo-example-login-merged": "检索当开始登录时可能使用的请求,并合并表单字段。",
        "apihelp-query+filerepoinfo-example-securitysensitiveoperation": "测试身份验证对操作<kbd>foo</kbd>是否足够。",
        "apihelp-query+users-paramvalue-prop-emailable": "Tags if the user can and wants to receive email through [[Special:Emailuser]].",
        "apihelp-query+users-paramvalue-prop-gender": "标记用户性别。返回“male”、“female”或“unknown”。",
        "apihelp-query+users-paramvalue-prop-centralids": "添加中心ID并为用户附加状态。",
+       "apihelp-query+users-paramvalue-prop-cancreate": "表明是否可以为有效但尚未注册的用户名创建一个账户。",
        "apihelp-query+users-param-attachedwiki": "与<kbd>$1prop=centralids</kbd>一起使用,表明用户是否附加于此ID定义的wiki。",
        "apihelp-query+users-param-users": "要获取信息的用户列表。",
        "apihelp-query+users-param-token": "请改用<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>。",
        "apihelp-query+watchlistraw-param-show": "只列出符合这些标准的项目。",
        "apihelp-query+watchlistraw-param-owner": "与$1token一起使用以访问不同用户的监视列表。",
        "apihelp-query+watchlistraw-param-token": "允许访问其他用户监视列表的安全密钥(可通过用户的[[Special:Preferences#mw-prefsection-watchlist|参数设置]]找到)。",
+       "apihelp-query+watchlistraw-param-dir": "罗列所采用的方向。",
        "apihelp-query+watchlistraw-param-fromtitle": "要列举的起始标题(带名字空间前缀)。",
        "apihelp-query+watchlistraw-param-totitle": "要列举的最终标题(带名字空间前缀)。",
        "apihelp-query+watchlistraw-example-simple": "列出当前用户的监视列表中的页面。",
        "apihelp-stashedit-param-contentmodel": "新内容的内容模型。",
        "apihelp-stashedit-param-contentformat": "用于输入文本的内容序列化格式。",
        "apihelp-stashedit-param-baserevid": "基础修订的修订ID。",
+       "apihelp-stashedit-param-summary": "更改摘要。",
        "apihelp-tag-description": "从个别修订或日志记录中添加或移除更改标签。",
        "apihelp-tag-param-rcid": "要添加或移除标签的一个或更多的最近更改ID。",
        "apihelp-tag-param-revid": "要添加或移除标签的一个或更多的修订ID。",
        "api-help-license-noname": "许可协议:[[$1|参见链接]]",
        "api-help-license-unknown": "许可协议:<span class=\"apihelp-unknown\">未知</span>",
        "api-help-parameters": "{{PLURAL:$1|参数}}:",
-       "api-help-param-deprecated": "不推荐使用。",
+       "api-help-param-deprecated": "已弃用。",
        "api-help-param-required": "这个参数是必须的。",
        "api-help-datatypes-header": "数据类型",
        "api-help-datatypes": "一些在API请求中的参数类型需要更进一步解释:\n;boolean\n:布尔参数就像HTML复选框一样工作:如果指定参数,无论何值都被认为是真。如果要假值,则可完全忽略参数。\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>+<var>##</var></kbd>或<kbd>-<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>",
        "api-help-permissions-granted-to": "{{PLURAL:$1|授予}}:$2",
        "api-help-right-apihighlimits": "在API查询中使用更高的上限(慢查询:$1;快查询:$2)。慢查询的限制也适用于多值参数。",
        "api-help-open-in-apisandbox": "<small>[在沙盒中打开]</small>",
+       "api-help-authmanager-general-usage": "使用此模块的一般程序是:\n# 通过<kbd>amirequestsfor=$4</kbd>取得来自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的可用字段,和来自<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>的<kbd>$5</kbd>令牌。\n# 向用户显示字段,并获得其提交内容。\n# 发送至此模块,提供<var>$1returnurl</var>及任何相关字段。\n# Check the <samp>status</samp> in the response.\n#* If you received <samp>PASS</samp> or <samp>FAIL</samp>, you're done. The operation either succeeded or it didn't.\n#* If you received <samp>UI</samp>, present the new fields to the user and obtain their submission. Then post to this module with <var>$1continue</var> and the relevant fields set, and repeat step 4.\n#* If you received <samp>REDIRECT</samp>, direct the user to the <samp>redirecttarget</samp> and wait for the return to <var>$1returnurl</var>. Then post to this module with <var>$1continue</var> and any fields passed to the return URL, and repeat step 4.\n#* If you received <samp>RESTART</samp>, that means the authentication worked but we don't have a linked user account. You might treat this as <samp>UI</samp> or as <samp>FAIL</samp>.",
        "api-help-authmanagerhelper-request": "使用此身份验证请求,通过返回自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的<samp>id</samp>与<kbd>amirequestsfor=$1</kbd>。",
        "api-help-authmanagerhelper-messageformat": "返回消息使用的格式。",
+       "api-help-authmanagerhelper-mergerequestfields": "合并用于所有身份验证请求的字段信息至一个数组中。",
+       "api-help-authmanagerhelper-additional-params": "此模块允许额外参数,取决于可用的身份验证请求。使用<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>与<kbd>amirequestsfor=$1</kbd>(或之前来自此模块的相应,如果可以)以决定可用请求及其使用的字段。",
        "api-credits-header": "制作人员",
        "api-credits": "API 开发人员:\n* Yuri Astrakhan(创建者,2006年9月~2007年9月的开发组领导)\n* Roan Kattouw(2007年9月~2009年的开发组领导)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Brad Jorsch(2013年至今的开发组领导)\n\n请将您的评论、建议和问题发送至mediawiki-api@lists.wikimedia.org,或提交错误请求至https://phabricator.wikimedia.org/。"
 }
index 48a9c88..d997dbb 100644 (file)
@@ -45,7 +45,7 @@ abstract class AbstractPreAuthenticationProvider extends AbstractAuthenticationP
                return \StatusValue::newGood();
        }
 
-       public function testUserForCreation( $user, $autocreate ) {
+       public function testUserForCreation( $user, $autocreate, array $options = [] ) {
                return \StatusValue::newGood();
        }
 
index 2e0d669..ea3dfa3 100644 (file)
@@ -91,7 +91,7 @@ abstract class AbstractPrimaryAuthenticationProvider extends AbstractAuthenticat
        public function postAccountCreation( $user, $creator, AuthenticationResponse $response ) {
        }
 
-       public function testUserForCreation( $user, $autocreate ) {
+       public function testUserForCreation( $user, $autocreate, array $options = [] ) {
                return \StatusValue::newGood();
        }
 
index 89fd6f9..00493bc 100644 (file)
@@ -77,7 +77,7 @@ abstract class AbstractSecondaryAuthenticationProvider extends AbstractAuthentic
        public function postAccountCreation( $user, $creator, AuthenticationResponse $response ) {
        }
 
-       public function testUserForCreation( $user, $autocreate ) {
+       public function testUserForCreation( $user, $autocreate, array $options = [] ) {
                return \StatusValue::newGood();
        }
 
index 2ed0d61..82eeff0 100644 (file)
@@ -878,10 +878,22 @@ class AuthManager implements LoggerAwareInterface {
        /**
         * Determine whether a particular account can be created
         * @param string $username
-        * @param int $flags Bitfield of User:READ_* constants
+        * @param array $options
+        *  - flags: (int) Bitfield of User:READ_* constants, default User::READ_NORMAL
+        *  - creating: (bool) For internal use only. Never specify this.
         * @return Status
         */
-       public function canCreateAccount( $username, $flags = User::READ_NORMAL ) {
+       public function canCreateAccount( $username, $options = [] ) {
+               // Back compat
+               if ( is_int( $options ) ) {
+                       $options = [ 'flags' => $options ];
+               }
+               $options += [
+                       'flags' => User::READ_NORMAL,
+                       'creating' => false,
+               ];
+               $flags = $options['flags'];
+
                if ( !$this->canCreateAccounts() ) {
                        return Status::newFatal( 'authmanager-create-disabled' );
                }
@@ -905,7 +917,7 @@ class AuthManager implements LoggerAwareInterface {
                        $this->getPrimaryAuthenticationProviders() +
                        $this->getSecondaryAuthenticationProviders();
                foreach ( $providers as $provider ) {
-                       $status = $provider->testUserForCreation( $user, false );
+                       $status = $provider->testUserForCreation( $user, false, $options );
                        if ( !$status->isGood() ) {
                                return Status::wrap( $status );
                        }
@@ -1010,7 +1022,9 @@ class AuthManager implements LoggerAwareInterface {
                        return AuthenticationResponse::newFail( $status->getMessage() );
                }
 
-               $status = $this->canCreateAccount( $username, User::READ_LOCKING );
+               $status = $this->canCreateAccount(
+                       $username, [ 'flags' => User::READ_LOCKING, 'creating' => true ]
+               );
                if ( !$status->isGood() ) {
                        $this->logger->debug( __METHOD__ . ': {user} cannot be created: {reason}', [
                                'user' => $username,
@@ -1575,11 +1589,15 @@ class AuthManager implements LoggerAwareInterface {
                }
 
                // Denied by providers?
+               $options = [
+                       'flags' => User::READ_LATEST,
+                       'creating' => true,
+               ];
                $providers = $this->getPreAuthenticationProviders() +
                        $this->getPrimaryAuthenticationProviders() +
                        $this->getSecondaryAuthenticationProviders();
                foreach ( $providers as $provider ) {
-                       $status = $provider->testUserForCreation( $user, $source );
+                       $status = $provider->testUserForCreation( $user, $source, $options );
                        if ( !$status->isGood() ) {
                                $ret = Status::wrap( $status );
                                $this->logger->debug( __METHOD__ . ': Provider denied creation of {username}: {reason}', [
@@ -1650,7 +1668,7 @@ class AuthManager implements LoggerAwareInterface {
                        throw $ex;
                }
 
-               $this->setDefaultUserOptions( $user, true );
+               $this->setDefaultUserOptions( $user, false );
 
                // Inform the providers
                $this->callMethodOnProviders( 6, 'autoCreatedAccount', [ $user, $source ] );
@@ -1677,6 +1695,10 @@ class AuthManager implements LoggerAwareInterface {
                        $logid = $logEntry->insert();
                }
 
+               // Commit database changes, so even if something else later blows up
+               // the newly-created user doesn't get lost.
+               wfGetLBFactory()->commitMasterChanges( __METHOD__ );
+
                if ( $login ) {
                        $this->setSessionDataForUser( $user );
                }
index 8d85b44..8845858 100644 (file)
@@ -161,35 +161,13 @@ class AuthManagerAuthPlugin extends \AuthPlugin {
        }
 
        public function addUser( $user, $password, $email = '', $realname = '' ) {
-               global $wgUser;
-
-               $data = [
-                       'username' => $user->getName(),
-                       'password' => $password,
-                       'retype' => $password,
-                       'email' => $email,
-                       'realname' => $realname,
-               ];
-               if ( $this->domain !== null && $this->domain !== '' ) {
-                       $data['domain'] = $this->domain;
-               }
-               $reqs = AuthManager::singleton()->getAuthenticationRequests( AuthManager::ACTION_CREATE );
-               $reqs = AuthenticationRequest::loadRequestsFromSubmission( $reqs, $data );
-
-               $res = AuthManager::singleton()->beginAccountCreation( $wgUser, $reqs, 'null:' );
-               switch ( $res->status ) {
-                       case AuthenticationResponse::PASS:
-                               return true;
-                       case AuthenticationResponse::FAIL:
-                               // Hope it's not a PreAuthenticationProvider that failed...
-                               $msg = $res->message instanceof \Message ? $res->message : new \Message( $res->message );
-                               $this->logger->info( __METHOD__ . ': Authentication failed: ' . $msg->plain() );
-                               return false;
-                       default:
-                               throw new \BadMethodCallException(
-                                       'AuthManager does not support such simplified account creation'
-                               );
-               }
+               throw new \BadMethodCallException(
+                       'Creation of users via AuthPlugin is not supported with '
+                       . 'AuthManager. Generally, user creation should be left to either '
+                       . 'Special:CreateAccount, auto-creation when triggered by a '
+                       . 'SessionProvider or PrimaryAuthenticationProvider, or '
+                       . 'User::newSystemUser().'
+               );
        }
 
        public function strict() {
index 070da9f..f7a7ec1 100644 (file)
@@ -23,7 +23,6 @@ namespace MediaWiki\Auth;
 
 use Config;
 use StatusValue;
-use User;
 
 /**
  * Check if the user is blocked, and prevent authentication if so.
@@ -75,7 +74,7 @@ class CheckBlocksSecondaryAuthenticationProvider extends AbstractSecondaryAuthen
                return AuthenticationResponse::newAbstain();
        }
 
-       public function testUserForCreation( $user, $autocreate ) {
+       public function testUserForCreation( $user, $autocreate, array $options = [] ) {
                $block = $user->isBlockedFromCreateAccount();
                if ( $block ) {
                        $errorParams = [
index 57f1e6b..beb11f4 100644 (file)
@@ -2,7 +2,6 @@
 
 namespace MediaWiki\Auth;
 
-use StatusValue;
 use User;
 
 /**
@@ -51,7 +50,11 @@ class ConfirmLinkSecondaryAuthenticationProvider extends AbstractSecondaryAuthen
                        return AuthenticationResponse::newAbstain();
                }
 
-               $maybeLink = array_filter( $state['maybeLink'], function ( $req ) {
+               $maybeLink = array_filter( $state['maybeLink'], function ( $req ) use ( $user ) {
+                       if ( !$req->action ) {
+                               $req->action = AuthManager::ACTION_CHANGE;
+                       }
+                       $req->username = $user->getName();
                        return $this->manager->allowsAuthenticationDataChange( $req )->isGood();
                } );
                if ( !$maybeLink ) {
index c632e3c..d32640e 100644 (file)
@@ -3,7 +3,6 @@
 namespace MediaWiki\Auth;
 
 use Config;
-use StatusValue;
 
 /**
  * Handles email notification / email address confirmation for account creation.
index 1a8a758..cab6e32 100644 (file)
@@ -96,7 +96,7 @@ class LegacyHookPreAuthenticationProvider extends AbstractPreAuthenticationProvi
                return StatusValue::newGood();
        }
 
-       public function testUserForCreation( $user, $autocreate ) {
+       public function testUserForCreation( $user, $autocreate, array $options = [] ) {
                if ( $autocreate !== false ) {
                        $abortError = '';
                        if ( !\Hooks::run( 'AbortAutoAccount', [ $user, &$abortError ] ) ) {
@@ -106,27 +106,6 @@ class LegacyHookPreAuthenticationProvider extends AbstractPreAuthenticationProvi
                                        $user, $user, LoginForm::ABORTED, $abortError, 'AbortAutoAccount'
                                );
                        }
-               } else {
-                       $abortError = '';
-                       $abortStatus = null;
-                       if ( !\Hooks::run( 'AbortNewAccount', [ $user, &$abortError, &$abortStatus ] ) ) {
-                               // Hook point to add extra creation throttles and blocks
-                               $this->logger->debug( __METHOD__ . ': a hook blocked creation' );
-                               if ( $abortStatus === null ) {
-                                       // Report back the old string as a raw message status.
-                                       // This will report the error back as 'createaccount-hook-aborted'
-                                       // with the given string as the message.
-                                       // To return a different error code, return a StatusValue object.
-                                       $msg = wfMessage( 'createaccount-hook-aborted' )->rawParams( $abortError );
-                                       return StatusValue::newFatal( $msg );
-                               } else {
-                                       // For MediaWiki 1.23+ and updated hooks, return the Status object
-                                       // returned from the hook.
-                                       $ret = StatusValue::newGood();
-                                       $ret->merge( $abortStatus );
-                                       return $ret;
-                               }
-                       }
                }
 
                return StatusValue::newGood();
index 846d16e..13fae6e 100644 (file)
@@ -83,9 +83,17 @@ interface PreAuthenticationProvider extends AuthenticationProvider {
         *   into such.
         * @param bool|string $autocreate False if this is not an auto-creation, or
         *  the source of the auto-creation passed to AuthManager::autoCreateUser().
+        * @param array $options
+        *  - flags: (int) Bitfield of User:READ_* constants, default User::READ_NORMAL
+        *  - creating: (bool) If false (or missing), this call is only testing if
+        *    a user could be created. If set, this (non-autocreation) is for
+        *    actually creating an account and will be followed by a call to
+        *    testForAccountCreation(). In this case, the provider might return
+        *    StatusValue::newGood() here and let the later call to
+        *    testForAccountCreation() do a more thorough test.
         * @return StatusValue
         */
-       public function testUserForCreation( $user, $autocreate );
+       public function testUserForCreation( $user, $autocreate, array $options = [] );
 
        /**
         * Post-creation callback
index 169e7f1..c44c8fc 100644 (file)
@@ -277,9 +277,17 @@ interface PrimaryAuthenticationProvider extends AuthenticationProvider {
         *   into such.
         * @param bool|string $autocreate False if this is not an auto-creation, or
         *  the source of the auto-creation passed to AuthManager::autoCreateUser().
+        * @param array $options
+        *  - flags: (int) Bitfield of User:READ_* constants, default User::READ_NORMAL
+        *  - creating: (bool) If false (or missing), this call is only testing if
+        *    a user could be created. If set, this (non-autocreation) is for
+        *    actually creating an account and will be followed by a call to
+        *    testForAccountCreation(). In this case, the provider might return
+        *    StatusValue::newGood() here and let the later call to
+        *    testForAccountCreation() do a more thorough test.
         * @return StatusValue
         */
-       public function testUserForCreation( $user, $autocreate );
+       public function testUserForCreation( $user, $autocreate, array $options = [] );
 
        /**
         * Post-auto-creation callback
index 0d52d25..1ccc9c6 100644 (file)
@@ -200,9 +200,17 @@ interface SecondaryAuthenticationProvider extends AuthenticationProvider {
         *   into such.
         * @param bool|string $autocreate False if this is not an auto-creation, or
         *  the source of the auto-creation passed to AuthManager::autoCreateUser().
+        * @param array $options
+        *  - flags: (int) Bitfield of User:READ_* constants, default User::READ_NORMAL
+        *  - creating: (bool) If false (or missing), this call is only testing if
+        *    a user could be created. If set, this (non-autocreation) is for
+        *    actually creating an account and will be followed by a call to
+        *    testForAccountCreation(). In this case, the provider might return
+        *    StatusValue::newGood() here and let the later call to
+        *    testForAccountCreation() do a more thorough test.
         * @return StatusValue
         */
-       public function testUserForCreation( $user, $autocreate );
+       public function testUserForCreation( $user, $autocreate, array $options = [] );
 
        /**
         * Post-auto-creation callback
index 5b14a3b..f47c606 100644 (file)
 namespace MediaWiki\Auth;
 
 use BagOStuff;
-use Config;
 use MediaWiki\Logger\LoggerFactory;
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Psr\Log\LogLevel;
-use Psr\Log\NullLogger;
-use User;
 
 /**
  * A helper class for throttling authentication attempts.
index 0fb9ed8..4970a2b 100644 (file)
@@ -23,6 +23,7 @@
 use Cdb\Reader as CdbReader;
 use Cdb\Writer as CdbWriter;
 use CLDRPluralRuleParser\Evaluator;
+use CLDRPluralRuleParser\Error as CLDRPluralRuleError;
 use MediaWiki\MediaWikiServices;
 
 /**
index 9948040..77038ed 100644 (file)
@@ -236,6 +236,9 @@ class ChangesList extends ContextSource {
 
        /**
         * Show formatted char difference
+        *
+        * Needs the css module 'mediawiki.special.changeslist' to style output
+        *
         * @param int $old Number of bytes
         * @param int $new Number of bytes
         * @param IContextSource $context
index 099a295..d3a414b 100644 (file)
@@ -358,8 +358,7 @@ class EnhancedChangesList extends ChangesList {
        protected function getLineData( array $block, RCCacheEntry $rcObj, array $queryParams = [] ) {
                $RCShowChangedSize = $this->getConfig()->get( 'RCShowChangedSize' );
 
-               # Classes to apply -- TODO implement
-               $classes = [];
+               $classes = [ 'mw-enhanced-rc' ];
                $type = $rcObj->mAttribs['rc_type'];
                $data = [];
                $lineParams = [];
@@ -367,8 +366,9 @@ class EnhancedChangesList extends ChangesList {
                if ( $rcObj->watched
                        && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
                ) {
-                       $lineParams['classes'] = [ 'mw-enhanced-watched' ];
+                       $classes = [ 'mw-enhanced-watched' ];
                }
+
                $separator = ' <span class="mw-changeslist-separator">. .</span> ';
 
                $data['recentChangesFlags'] = [
@@ -442,7 +442,7 @@ class EnhancedChangesList extends ChangesList {
 
                // give the hook a chance to modify the data
                $success = Hooks::run( 'EnhancedChangesListModifyLineData',
-                       [ $this, &$data, $block, $rcObj ] );
+                       [ $this, &$data, $block, $rcObj, &$classes ] );
                if ( !$success ) {
                        // skip entry if hook aborted it
                        return [];
@@ -461,6 +461,8 @@ class EnhancedChangesList extends ChangesList {
                        unset( $data['timestampLink'] );
                }
 
+               $lineParams['classes'] = array_values( $classes );
+
                // everything else: makes it easier for extensions to add or remove data
                $lineParams['data'] = array_values( $data );
 
index 9fb0660..fe254af 100644 (file)
@@ -53,6 +53,8 @@ abstract class Collation {
                                return new IdentityCollation;
                        case 'uca-default':
                                return new IcuCollation( 'root' );
+                       case 'uca-default-u-kn':
+                               return new IcuCollation( 'root-u-kn' );
                        case 'xx-uca-ckb':
                                return new CollationCkb;
                        case 'xx-uca-et':
index 27f917b..f5d3c33 100644 (file)
@@ -36,6 +36,9 @@ class IcuCollation extends Collation {
        /** @var Language */
        protected $digitTransformLanguage;
 
+       /** @var boolean */
+       private $useNumericCollation = false;
+
        /** @var array */
        private $firstLetterData;
 
@@ -93,7 +96,14 @@ class IcuCollation extends Collation {
                'be-tarask' => [ "Ё" ],
                'cy' => [ "Ch", "Dd", "Ff", "Ng", "Ll", "Ph", "Rh", "Th" ],
                'en' => [],
-               'fa' => [ "آ", "ء", "ه" ],
+               // RTL, let's put each letter on a new line
+               'fa' => [
+                       "آ",
+                       "ء",
+                       "ه",
+                       "ا",
+                       "و"
+               ],
                'fi' => [ "Å", "Ä", "Ö" ],
                'fr' => [],
                'hu' => [ "Cs", "Dz", "Dzs", "Gy", "Ly", "Ny", "Ö", "Sz", "Ty", "Ü", "Zs" ],
@@ -190,6 +200,15 @@ class IcuCollation extends Collation {
 
                $this->primaryCollator = Collator::create( $locale );
                $this->primaryCollator->setStrength( Collator::PRIMARY );
+
+               // If the special suffix for numeric collation is present, turn on numeric collation.
+               if ( substr( $locale, -5, 5 ) === '-u-kn' ) {
+                       $this->useNumericCollation = true;
+                       // Strip off the special suffix so it doesn't trip up fetchFirstLetterData().
+                       $this->locale = substr( $this->locale, 0, -5 );
+                       $this->mainCollator->setAttribute( Collator::NUMERIC_COLLATION, Collator::ON );
+                       $this->primaryCollator->setAttribute( Collator::NUMERIC_COLLATION, Collator::ON );
+               }
        }
 
        public function getSortKey( $string ) {
@@ -206,8 +225,9 @@ class IcuCollation extends Collation {
                        return '';
                }
 
-               // Check for CJK
                $firstChar = mb_substr( $string, 0, 1, 'UTF-8' );
+
+               // If the first character is a CJK character, just return that character.
                if ( ord( $firstChar ) > 0x7f && self::isCjk( UtfNormal\Utils::utf8ToCodepoint( $firstChar ) ) ) {
                        return $firstChar;
                }
@@ -225,7 +245,19 @@ class IcuCollation extends Collation {
                        // Before the first letter
                        return '';
                }
-               return $this->getLetterByIndex( $min );
+
+               $sortLetter = $this->getLetterByIndex( $min );
+
+               if ( $this->useNumericCollation ) {
+                       // If the sort letter is a number, return '0–9' (or localized equivalent).
+                       // ASCII value of 0 is 48. ASCII value of 9 is 57.
+                       // Note that this also applies to non-Arabic numerals since they are
+                       // mapped to Arabic numeral sort letters. For example, ২ sorts as 2.
+                       if ( ord( $sortLetter ) >= 48 && ord( $sortLetter ) <= 57 ) {
+                               $sortLetter = wfMessage( 'category-header-numerals' )->numParams( 0, 9 )->text();
+                       }
+               }
+               return $sortLetter;
        }
 
        /**
@@ -401,6 +433,7 @@ class IcuCollation extends Collation {
        }
 
        /**
+        * Test if a code point is a CJK (Chinese, Japanese, Korean) character
         * @since 1.16.3
         */
        public static function isCjk( $codepoint ) {
@@ -444,6 +477,13 @@ class IcuCollation extends Collation {
                $versionPrefix = substr( $icuVersion, 0, 3 );
                // Source: http://site.icu-project.org/download
                $map = [
+                       '57.' => '8.0',
+                       '56.' => '8.0',
+                       '55.' => '7.0',
+                       '54.' => '7.0',
+                       '53.' => '6.3',
+                       '52.' => '6.3',
+                       '51.' => '6.2',
                        '50.' => '6.2',
                        '49.' => '6.1',
                        '4.8' => '6.0',
index e744655..811b241 100644 (file)
@@ -281,7 +281,7 @@ abstract class AbstractContent implements Content {
         *
         * @since 1.21
         *
-        * @return null
+        * @return Title|null
         *
         * @see Content::getRedirectTarget
         */
index 694b633..2bbf6ca 100644 (file)
@@ -63,4 +63,12 @@ abstract class CodeContentHandler extends TextContentHandler {
        protected function getContentClass() {
                throw new MWException( 'Subclass must override' );
        }
+
+       /**
+        * @param SearchEngine $engine
+        * @return array
+        */
+       public function getFieldsForSearchIndex( SearchEngine $engine ) {
+               return [];
+       }
 }
index e225fb7..1ecd614 100644 (file)
@@ -1248,4 +1248,26 @@ abstract class ContentHandler {
 
                return $ok;
        }
+
+       /**
+        * Get fields definition for search index
+        * @param SearchEngine $engine
+        * @return SearchIndexField[] List of fields this content handler can provide.
+        * @since 1.28
+        */
+       public function getFieldsForSearchIndex( SearchEngine $engine ) {
+               /* Default fields:
+               /*
+                * namespace
+                * namespace_text
+                * redirect
+                * source_text
+                * suggest
+                * timestamp
+                * title
+                * text
+                * text_bytes
+                */
+               return [];
+       }
 }
index ad40cd9..748c810 100644 (file)
@@ -31,8 +31,7 @@
 class TextContentHandler extends ContentHandler {
 
        // @codingStandardsIgnoreStart bug 57585
-       public function __construct( $modelId = CONTENT_MODEL_TEXT,
-               $formats = [ CONTENT_FORMAT_TEXT ] ) {
+       public function __construct( $modelId = CONTENT_MODEL_TEXT, $formats = [ CONTENT_FORMAT_TEXT ] ) {
                parent::__construct( $modelId, $formats );
        }
        // @codingStandardsIgnoreEnd
@@ -41,7 +40,7 @@ class TextContentHandler extends ContentHandler {
         * Returns the content's text as-is.
         *
         * @param Content $content
-        * @param string $format The serialization format to check
+        * @param string  $format The serialization format to check
         *
         * @return mixed
         */
@@ -143,4 +142,10 @@ class TextContentHandler extends ContentHandler {
                return true;
        }
 
+       public function getFieldsForSearchIndex( SearchEngine $engine ) {
+               $fields = [];
+               $fields['language'] =
+                       $engine->makeSearchFieldMapping( 'language', SearchIndexField::INDEX_TYPE_KEYWORD );
+               return $fields;
+       }
 }
index 0701a0f..4e8f0df 100644 (file)
@@ -108,4 +108,41 @@ class WikitextContentHandler extends TextContentHandler {
                return true;
        }
 
+       public function getFieldsForSearchIndex( SearchEngine $engine ) {
+               $fields = [];
+
+               $fields['category'] =
+                       $engine->makeSearchFieldMapping( 'category', SearchIndexField::INDEX_TYPE_TEXT );
+               $fields['category']->setFlag( SearchIndexField::FLAG_CASEFOLD );
+
+               $fields['external_link'] =
+                       $engine->makeSearchFieldMapping( 'external_link', SearchIndexField::INDEX_TYPE_KEYWORD );
+
+               $fields['heading'] =
+                       $engine->makeSearchFieldMapping( 'heading', SearchIndexField::INDEX_TYPE_TEXT );
+               $fields['heading']->setFlag( SearchIndexField::FLAG_SCORING );
+
+               $fields['auxiliary_text'] =
+                       $engine->makeSearchFieldMapping( 'auxiliary_text', SearchIndexField::INDEX_TYPE_TEXT );
+
+               $fields['opening_text'] =
+                       $engine->makeSearchFieldMapping( 'opening_text', SearchIndexField::INDEX_TYPE_TEXT );
+               $fields['opening_text']->setFlag( SearchIndexField::FLAG_SCORING |
+                                                 SearchIndexField::FLAG_NO_HIGHLIGHT );
+
+               $fields['outgoing_link'] =
+                       $engine->makeSearchFieldMapping( 'outgoing_link', SearchIndexField::INDEX_TYPE_KEYWORD );
+
+               $fields['template'] =
+                       $engine->makeSearchFieldMapping( 'template', SearchIndexField::INDEX_TYPE_KEYWORD );
+               $fields['template']->setFlag( SearchIndexField::FLAG_CASEFOLD );
+
+               // FIXME: this really belongs in separate file handler but files
+               // do not have separate handler. Sadness.
+               $fields['file_text'] =
+                       $engine->makeSearchFieldMapping( 'file_text', SearchIndexField::INDEX_TYPE_TEXT );
+
+               return $fields;
+       }
+
 }
index af5f8f9..1893c73 100644 (file)
@@ -417,11 +417,15 @@ class DBConnRef implements IDatabase {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
 
-       public function onTransactionIdle( $callback ) {
+       public function onTransactionResolution( callable $callback ) {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
 
-       public function onTransactionPreCommitOrIdle( $callback ) {
+       public function onTransactionIdle( callable $callback ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function onTransactionPreCommitOrIdle( callable $callback ) {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
 
index 6bdcb24..2e3e225 100644 (file)
@@ -52,10 +52,14 @@ abstract class DatabaseBase implements IDatabase {
        protected $mConn = null;
        protected $mOpened = false;
 
-       /** @var callable[] */
+       /** @var array[] List of (callable, method name) */
        protected $mTrxIdleCallbacks = [];
-       /** @var callable[] */
+       /** @var array[] List of (callable, method name) */
        protected $mTrxPreCommitCallbacks = [];
+       /** @var array[] List of (callable, method name) */
+       protected $mTrxEndCallbacks = [];
+       /** @var bool Whether to suppress triggering of post-commit callbacks */
+       protected $suppressPostCommitCallbacks = false;
 
        protected $mTablePrefix;
        protected $mSchema;
@@ -692,9 +696,6 @@ abstract class DatabaseBase implements IDatabase {
        }
 
        public function close() {
-               if ( count( $this->mTrxIdleCallbacks ) ) { // sanity
-                       throw new MWException( "Transaction idle callbacks still pending." );
-               }
                if ( $this->mConn ) {
                        if ( $this->trxLevel() ) {
                                if ( !$this->mTrxAutomatic ) {
@@ -707,6 +708,8 @@ abstract class DatabaseBase implements IDatabase {
 
                        $closed = $this->closeConnection();
                        $this->mConn = false;
+               } elseif ( $this->mTrxIdleCallbacks || $this->mTrxEndCallbacks ) { // sanity
+                       throw new MWException( "Transaction callbacks still pending." );
                } else {
                        $closed = true;
                }
@@ -2385,14 +2388,19 @@ abstract class DatabaseBase implements IDatabase {
         * queries. If a deadlock occurs during the processing, the transaction
         * will be rolled back and the callback function will be called again.
         *
+        * Avoid using this method outside of Job or Maintenance classes.
+        *
         * Usage:
         *   $dbw->deadlockLoop( callback, ... );
         *
         * Extra arguments are passed through to the specified callback function.
+        * This method requires that no transactions are already active to avoid
+        * causing premature commits or exceptions.
         *
         * Returns whatever the callback function returned on its successful,
         * iteration, or false on error, for example if the retry limit was
         * reached.
+        *
         * @return mixed
         * @throws DBUnexpectedError
         * @throws Exception
@@ -2448,38 +2456,76 @@ abstract class DatabaseBase implements IDatabase {
                return false;
        }
 
-       final public function onTransactionIdle( $callback ) {
+       final public function onTransactionResolution( callable $callback ) {
+               if ( !$this->mTrxLevel ) {
+                       throw new DBUnexpectedError( $this, "No transaction is active." );
+               }
+               $this->mTrxEndCallbacks[] = [ $callback, wfGetCaller() ];
+       }
+
+       final public function onTransactionIdle( callable $callback ) {
                $this->mTrxIdleCallbacks[] = [ $callback, wfGetCaller() ];
                if ( !$this->mTrxLevel ) {
-                       $this->runOnTransactionIdleCallbacks();
+                       $this->runOnTransactionIdleCallbacks( self::TRIGGER_IDLE );
                }
        }
 
-       final public function onTransactionPreCommitOrIdle( $callback ) {
+       final public function onTransactionPreCommitOrIdle( callable $callback ) {
                if ( $this->mTrxLevel ) {
                        $this->mTrxPreCommitCallbacks[] = [ $callback, wfGetCaller() ];
                } else {
-                       $this->onTransactionIdle( $callback ); // this will trigger immediately
+                       // If no transaction is active, then make one for this callback
+                       $this->begin( __METHOD__ );
+                       try {
+                               call_user_func( $callback );
+                               $this->commit( __METHOD__ );
+                       } catch ( Exception $e ) {
+                               $this->rollback( __METHOD__ );
+                               throw $e;
+                       }
                }
        }
 
        /**
-        * Actually any "on transaction idle" callbacks.
+        * Whether to disable running of post-commit callbacks
+        *
+        * This method should not be used outside of Database/LoadBalancer
+        *
+        * @param bool $suppress
+        * @since 1.28
+        */
+       final public function setPostCommitCallbackSupression( $suppress ) {
+               $this->suppressPostCommitCallbacks = $suppress;
+       }
+
+       /**
+        * Actually run and consume any "on transaction idle/resolution" callbacks.
         *
+        * This method should not be used outside of Database/LoadBalancer
+        *
+        * @param integer $trigger IDatabase::TRIGGER_* constant
         * @since 1.20
         */
-       protected function runOnTransactionIdleCallbacks() {
+       public function runOnTransactionIdleCallbacks( $trigger ) {
+               if ( $this->suppressPostCommitCallbacks ) {
+                       return;
+               }
+
                $autoTrx = $this->getFlag( DBO_TRX ); // automatic begin() enabled?
 
                $e = $ePrior = null; // last exception
                do { // callbacks may add callbacks :)
-                       $callbacks = $this->mTrxIdleCallbacks;
-                       $this->mTrxIdleCallbacks = []; // recursion guard
+                       $callbacks = array_merge(
+                               $this->mTrxIdleCallbacks,
+                               $this->mTrxEndCallbacks // include "transaction resolution" callbacks
+                       );
+                       $this->mTrxIdleCallbacks = []; // consumed (and recursion guard)
+                       $this->mTrxEndCallbacks = []; // consumed (recursion guard)
                        foreach ( $callbacks as $callback ) {
                                try {
                                        list( $phpCallback ) = $callback;
                                        $this->clearFlag( DBO_TRX ); // make each query its own transaction
-                                       call_user_func( $phpCallback );
+                                       call_user_func_array( $phpCallback, [ $trigger ] );
                                        if ( $autoTrx ) {
                                                $this->setFlag( DBO_TRX ); // restore automatic begin()
                                        } else {
@@ -2505,15 +2551,17 @@ abstract class DatabaseBase implements IDatabase {
        }
 
        /**
-        * Actually any "on transaction pre-commit" callbacks.
+        * Actually run and consume any "on transaction pre-commit" callbacks.
+        *
+        * This method should not be used outside of Database/LoadBalancer
         *
         * @since 1.22
         */
-       protected function runOnTransactionPreCommitCallbacks() {
+       public function runOnTransactionPreCommitCallbacks() {
                $e = $ePrior = null; // last exception
                do { // callbacks may add callbacks :)
                        $callbacks = $this->mTrxPreCommitCallbacks;
-                       $this->mTrxPreCommitCallbacks = []; // recursion guard
+                       $this->mTrxPreCommitCallbacks = []; // consumed (and recursion guard)
                        foreach ( $callbacks as $callback ) {
                                try {
                                        list( $phpCallback ) = $callback;
@@ -2548,12 +2596,12 @@ abstract class DatabaseBase implements IDatabase {
 
        final public function endAtomic( $fname = __METHOD__ ) {
                if ( !$this->mTrxLevel ) {
-                       throw new DBUnexpectedError( $this, 'No atomic transaction is open.' );
+                       throw new DBUnexpectedError( $this, "No atomic transaction is open (got $fname)." );
                }
                if ( !$this->mTrxAtomicLevels ||
                        array_pop( $this->mTrxAtomicLevels ) !== $fname
                ) {
-                       throw new DBUnexpectedError( $this, 'Invalid atomic section ended.' );
+                       throw new DBUnexpectedError( $this, "Invalid atomic section ended (got $fname)." );
                }
 
                if ( !$this->mTrxAtomicLevels && $this->mTrxAutomaticAtomic ) {
@@ -2593,7 +2641,7 @@ abstract class DatabaseBase implements IDatabase {
                        } else {
                                // The transaction was automatic and has done write operations
                                if ( $this->mTrxDoneWrites ) {
-                                       wfDebug( "$fname: Automatic transaction with writes in progress" .
+                                       wfLogDBError( "$fname: Automatic transaction with writes in progress" .
                                                " (from {$this->mTrxFname}), performing implicit commit!\n"
                                        );
                                }
@@ -2607,10 +2655,11 @@ abstract class DatabaseBase implements IDatabase {
                                $this->getTransactionProfiler()->transactionWritingOut(
                                        $this->mServer, $this->mDBname, $this->mTrxShortId, $writeTime );
                        }
-                       $this->runOnTransactionIdleCallbacks();
+
+                       $this->runOnTransactionIdleCallbacks( self::TRIGGER_COMMIT );
                }
 
-               # Avoid fatals if close() was called
+               // Avoid fatals if close() was called
                $this->assertOpen();
 
                $this->doBegin( $fname );
@@ -2620,8 +2669,6 @@ abstract class DatabaseBase implements IDatabase {
                $this->mTrxAutomatic = false;
                $this->mTrxAutomaticAtomic = false;
                $this->mTrxAtomicLevels = [];
-               $this->mTrxIdleCallbacks = [];
-               $this->mTrxPreCommitCallbacks = [];
                $this->mTrxShortId = wfRandomString( 12 );
                $this->mTrxWriteDuration = 0.0;
                $this->mTrxWriteCallers = [];
@@ -2671,7 +2718,7 @@ abstract class DatabaseBase implements IDatabase {
                        }
                }
 
-               # Avoid fatals if close() was called
+               // Avoid fatals if close() was called
                $this->assertOpen();
 
                $this->runOnTransactionPreCommitCallbacks();
@@ -2682,7 +2729,8 @@ abstract class DatabaseBase implements IDatabase {
                        $this->getTransactionProfiler()->transactionWritingOut(
                                $this->mServer, $this->mDBname, $this->mTrxShortId, $writeTime );
                }
-               $this->runOnTransactionIdleCallbacks();
+
+               $this->runOnTransactionIdleCallbacks( self::TRIGGER_COMMIT );
        }
 
        /**
@@ -2710,17 +2758,19 @@ abstract class DatabaseBase implements IDatabase {
                        }
                }
 
-               # Avoid fatals if close() was called
+               // Avoid fatals if close() was called
                $this->assertOpen();
 
                $this->doRollback( $fname );
-               $this->mTrxIdleCallbacks = []; // cancel
-               $this->mTrxPreCommitCallbacks = []; // cancel
                $this->mTrxAtomicLevels = [];
                if ( $this->mTrxDoneWrites ) {
                        $this->getTransactionProfiler()->transactionWritingOut(
                                $this->mServer, $this->mDBname, $this->mTrxShortId );
                }
+
+               $this->mTrxIdleCallbacks = []; // clear
+               $this->mTrxPreCommitCallbacks = []; // clear
+               $this->runOnTransactionIdleCallbacks( self::TRIGGER_ROLLBACK );
        }
 
        /**
@@ -3294,9 +3344,14 @@ abstract class DatabaseBase implements IDatabase {
                if ( $this->mTrxLevel && $this->mTrxDoneWrites ) {
                        trigger_error( "Uncommitted DB writes (transaction from {$this->mTrxFname})." );
                }
-               if ( count( $this->mTrxIdleCallbacks ) || count( $this->mTrxPreCommitCallbacks ) ) {
+               $danglingCallbacks = array_merge(
+                       $this->mTrxIdleCallbacks,
+                       $this->mTrxPreCommitCallbacks,
+                       $this->mTrxEndCallbacks
+               );
+               if ( $danglingCallbacks ) {
                        $callers = [];
-                       foreach ( $this->mTrxIdleCallbacks as $callbackInfo ) {
+                       foreach ( $danglingCallbacks as $callbackInfo ) {
                                $callers[] = $callbackInfo[1];
                        }
                        $callers = implode( ', ', $callers );
index 3ebc3ec..02a8d30 100644 (file)
@@ -36,6 +36,8 @@ abstract class DatabaseMysqlBase extends Database {
        protected $lagDetectionMethod;
        /** @var array Method to detect slave lag */
        protected $lagDetectionOptions = [];
+       /** @var bool bool Whether to use GTID methods */
+       protected $useGTIDs = false;
 
        /** @var string|null */
        private $serverVersion = null;
@@ -43,13 +45,14 @@ abstract class DatabaseMysqlBase extends Database {
        /**
         * Additional $params include:
         *   - lagDetectionMethod : set to one of (Seconds_Behind_Master,pt-heartbeat).
-        *                          pt-heartbeat assumes the table is at heartbeat.heartbeat
-        *                          and uses UTC timestamps in the heartbeat.ts column.
-        *                          (https://www.percona.com/doc/percona-toolkit/2.2/pt-heartbeat.html)
+        *       pt-heartbeat assumes the table is at heartbeat.heartbeat
+        *       and uses UTC timestamps in the heartbeat.ts column.
+        *       (https://www.percona.com/doc/percona-toolkit/2.2/pt-heartbeat.html)
         *   - lagDetectionOptions : if using pt-heartbeat, this can be set to an array map to change
-        *                           the default behavior. Normally, the heartbeat row with the server
-        *                           ID of this server's master will be used. Set the "conds" field to
-        *                           override the query conditions, e.g. ['shard' => 's1'].
+        *       the default behavior. Normally, the heartbeat row with the server
+        *       ID of this server's master will be used. Set the "conds" field to
+        *       override the query conditions, e.g. ['shard' => 's1'].
+        *   - useGTIDs : use GTID methods like MASTER_GTID_WAIT() when possible.
         * @param array $params
         */
        function __construct( array $params ) {
@@ -61,6 +64,7 @@ abstract class DatabaseMysqlBase extends Database {
                $this->lagDetectionOptions = isset( $params['lagDetectionOptions'] )
                        ? $params['lagDetectionOptions']
                        : [];
+               $this->useGTIDs = !empty( $params['useGTIDs' ] );
        }
 
        /**
@@ -788,13 +792,20 @@ abstract class DatabaseMysqlBase extends Database {
                        return 0; // already reached this point for sure
                }
 
-               # Commit any open transactions
+               // Commit any open transactions
                $this->commit( __METHOD__, 'flush' );
 
-               # Call doQuery() directly, to avoid opening a transaction if DBO_TRX is set
-               $encFile = $this->addQuotes( $pos->file );
-               $encPos = intval( $pos->pos );
-               $res = $this->doQuery( "SELECT MASTER_POS_WAIT($encFile, $encPos, $timeout)" );
+               // Call doQuery() directly, to avoid opening a transaction if DBO_TRX is set
+               if ( $this->useGTIDs && $pos->gtids ) {
+                       // Wait on the GTID set (MariaDB only)
+                       $gtidArg = implode( ',', $pos->gtids );
+                       $res = $this->doQuery( "SELECT MASTER_GTID_WAIT($gtidArg, $timeout)" );
+               } else {
+                       // Wait on the binlog coordinates
+                       $encFile = $this->addQuotes( $pos->file );
+                       $encPos = intval( $pos->pos );
+                       $res = $this->doQuery( "SELECT MASTER_POS_WAIT($encFile, $encPos, $timeout)" );
+               }
 
                $row = $res ? $this->fetchRow( $res ) : false;
                if ( !$row ) {
@@ -827,15 +838,23 @@ abstract class DatabaseMysqlBase extends Database {
         * @return MySQLMasterPos|bool
         */
        function getSlavePos() {
-               $res = $this->query( 'SHOW SLAVE STATUS', 'DatabaseBase::getSlavePos' );
+               $res = $this->query( 'SHOW SLAVE STATUS', __METHOD__ );
                $row = $this->fetchObject( $res );
 
                if ( $row ) {
                        $pos = isset( $row->Exec_master_log_pos )
                                ? $row->Exec_master_log_pos
                                : $row->Exec_Master_Log_Pos;
+                       // Also fetch the last-applied GTID set (MariaDB)
+                       if ( $this->useGTIDs ) {
+                               $res = $this->query( "SHOW GLOBAL VARIABLES LIKE 'gtid_slave_pos'", __METHOD__ );
+                               $gtidRow = $this->fetchObject( $res );
+                               $gtidSet = $gtidRow ? $gtidRow->Value : '';
+                       } else {
+                               $gtidSet = '';
+                       }
 
-                       return new MySQLMasterPos( $row->Relay_Master_Log_File, $pos );
+                       return new MySQLMasterPos( $row->Relay_Master_Log_File, $pos, $gtidSet );
                } else {
                        return false;
                }
@@ -847,11 +866,20 @@ abstract class DatabaseMysqlBase extends Database {
         * @return MySQLMasterPos|bool
         */
        function getMasterPos() {
-               $res = $this->query( 'SHOW MASTER STATUS', 'DatabaseBase::getMasterPos' );
+               $res = $this->query( 'SHOW MASTER STATUS', __METHOD__ );
                $row = $this->fetchObject( $res );
 
                if ( $row ) {
-                       return new MySQLMasterPos( $row->File, $row->Position );
+                       // Also fetch the last-written GTID set (MariaDB)
+                       if ( $this->useGTIDs ) {
+                               $res = $this->query( "SHOW GLOBAL VARIABLES LIKE 'gtid_binlog_pos'", __METHOD__ );
+                               $gtidRow = $this->fetchObject( $res );
+                               $gtidSet = $gtidRow ? $gtidRow->Value : '';
+                       } else {
+                               $gtidSet = '';
+                       }
+
+                       return new MySQLMasterPos( $row->File, $row->Position, $gtidSet );
                } else {
                        return false;
                }
@@ -1443,20 +1471,43 @@ class MySQLField implements Field {
        }
 }
 
+/**
+ * DBMasterPos class for MySQL/MariaDB
+ *
+ * Note that master positions and sync logic here make some assumptions:
+ *  - Binlog-based usage assumes single-source replication and non-hierarchical replication.
+ *  - GTID-based usage allows getting/syncing with multi-source replication. It is assumed
+ *    that GTID sets are complete (e.g. include all domains on the server).
+ */
 class MySQLMasterPos implements DBMasterPos {
-       /** @var string */
+       /** @var string Binlog file */
        public $file;
-       /** @var int Position */
+       /** @var int Binglog file position */
        public $pos;
+       /** @var string[] GTID list */
+       public $gtids = [];
        /** @var float UNIX timestamp */
        public $asOfTime = 0.0;
 
-       function __construct( $file, $pos ) {
+       /**
+        * @param string $file Binlog file name
+        * @param integer $pos Binlog position
+        * @param string $gtid Comma separated GTID set [optional]
+        */
+       function __construct( $file, $pos, $gtid = '' ) {
                $this->file = $file;
                $this->pos = $pos;
+               $this->gtids = array_map( 'trim', explode( ',', $gtid ) );
                $this->asOfTime = microtime( true );
        }
 
+       /**
+        * @return string <binlog file>/<position>, e.g db1034-bin.000976/843431247
+        */
+       function __toString() {
+               return "{$this->file}/{$this->pos}";
+       }
+
        function asOfTime() {
                return $this->asOfTime;
        }
@@ -1466,10 +1517,29 @@ class MySQLMasterPos implements DBMasterPos {
                        throw new InvalidArgumentException( "Position not an instance of " . __CLASS__ );
                }
 
-               $thisPos = $this->getCoordinates();
-               $thatPos = $pos->getCoordinates();
+               // Prefer GTID comparisons, which work with multi-tier replication
+               $thisPosByDomain = $this->getGtidCoordinates();
+               $thatPosByDomain = $pos->getGtidCoordinates();
+               if ( $thisPosByDomain && $thatPosByDomain ) {
+                       $reached = true;
+                       // Check that this has positions GTE all of those in $pos for all domains in $pos
+                       foreach ( $thatPosByDomain as $domain => $thatPos ) {
+                               $thisPos = isset( $thisPosByDomain[$domain] ) ? $thisPosByDomain[$domain] : -1;
+                               $reached = $reached && ( $thatPos <= $thisPos );
+                       }
 
-               return ( $thisPos && $thatPos && $thisPos >= $thatPos );
+                       return $reached;
+               }
+
+               // Fallback to the binlog file comparisons
+               $thisBinPos = $this->getBinlogCoordinates();
+               $thatBinPos = $pos->getBinlogCoordinates();
+               if ( $thisBinPos && $thatBinPos && $thisBinPos['binlog'] === $thatBinPos['binlog'] ) {
+                       return ( $thisBinPos['pos'] >= $thatBinPos['pos'] );
+               }
+
+               // Comparing totally different binlogs does not make sense
+               return false;
        }
 
        function channelsMatch( DBMasterPos $pos ) {
@@ -1477,36 +1547,56 @@ class MySQLMasterPos implements DBMasterPos {
                        throw new InvalidArgumentException( "Position not an instance of " . __CLASS__ );
                }
 
-               $thisBinlog = $this->getBinlogName();
-               $thatBinlog = $pos->getBinlogName();
+               // Prefer GTID comparisons, which work with multi-tier replication
+               $thisPosDomains = array_keys( $this->getGtidCoordinates() );
+               $thatPosDomains = array_keys( $pos->getGtidCoordinates() );
+               if ( $thisPosDomains && $thatPosDomains ) {
+                       // Check that this has GTIDs for all domains in $pos
+                       return !array_diff( $thatPosDomains, $thisPosDomains );
+               }
 
-               return ( $thisBinlog !== false && $thisBinlog === $thatBinlog );
-       }
+               // Fallback to the binlog file comparisons
+               $thisBinPos = $this->getBinlogCoordinates();
+               $thatBinPos = $pos->getBinlogCoordinates();
 
-       function __toString() {
-               // e.g db1034-bin.000976/843431247
-               return "{$this->file}/{$this->pos}";
+               return ( $thisBinPos && $thatBinPos && $thisBinPos['binlog'] === $thatBinPos['binlog'] );
        }
 
        /**
-        * @return string|bool
+        * @note: this returns false for multi-source replication GTID sets
+        * @see https://mariadb.com/kb/en/mariadb/gtid
+        * @see https://dev.mysql.com/doc/refman/5.6/en/replication-gtids-concepts.html
+        * @return array Map of (domain => integer position) or false
         */
-       protected function getBinlogName() {
-               $m = [];
-               if ( preg_match( '!^(.+)\.(\d+)/(\d+)$!', (string)$this, $m ) ) {
-                       return $m[1];
+       protected function getGtidCoordinates() {
+               $gtidInfos = [];
+               foreach ( $this->gtids as $gtid ) {
+                       $m = [];
+                       // MariaDB style: <domain>-<server id>-<sequence number>
+                       if ( preg_match( '!^(\d+)-\d+-(\d+)$!', $gtid, $m ) ) {
+                               $gtidInfos[(int)$m[1]] = (int)$m[2];
+                       // MySQL style: <UUID domain>:<sequence number>
+                       } elseif ( preg_match( '!^(\w{8}-\w{4}-\w{4}-\w{4}-\w{12}):(\d+)$!', $gtid, $m ) ) {
+                               $gtidInfos[$m[1]] = (int)$m[2];
+                       } else {
+                               $gtidInfos = [];
+                               break; // unrecognized GTID
+                       }
+
                }
 
-               return false;
+               return $gtidInfos;
        }
 
        /**
-        * @return array|bool (int, int)
+        * @see http://dev.mysql.com/doc/refman/5.7/en/show-master-status.html
+        * @see http://dev.mysql.com/doc/refman/5.7/en/show-slave-status.html
+        * @return array|bool (binlog, (integer file number, integer position)) or false
         */
-       protected function getCoordinates() {
+       protected function getBinlogCoordinates() {
                $m = [];
-               if ( preg_match( '!\.(\d+)/(\d+)$!', (string)$this, $m ) ) {
-                       return [ (int)$m[1], (int)$m[2] ];
+               if ( preg_match( '!^(.+)\.(\d+)/(\d+)$!', (string)$this, $m ) ) {
+                       return [ 'binlog' => $m[1], 'pos' => [ (int)$m[2], (int)$m[3] ] ];
                }
 
                return false;
index 9e53653..f9ba050 100644 (file)
@@ -432,7 +432,7 @@ class DatabaseOracle extends Database {
 
        /**
         * Frees resources associated with the LOB descriptor
-        * @param ResultWrapper|resource $res
+        * @param ResultWrapper|ORAResult $res
         */
        function freeResult( $res ) {
                if ( $res instanceof ResultWrapper ) {
@@ -443,7 +443,7 @@ class DatabaseOracle extends Database {
        }
 
        /**
-        * @param ResultWrapper|stdClass $res
+        * @param ResultWrapper|ORAResult $res
         * @return mixed
         */
        function fetchObject( $res ) {
@@ -454,6 +454,10 @@ class DatabaseOracle extends Database {
                return $res->fetchObject();
        }
 
+       /**
+        * @param ResultWrapper|ORAResult $res
+        * @return mixed
+        */
        function fetchRow( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
@@ -462,6 +466,10 @@ class DatabaseOracle extends Database {
                return $res->fetchRow();
        }
 
+       /**
+        * @param ResultWrapper|ORAResult $res
+        * @return int
+        */
        function numRows( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
@@ -470,6 +478,10 @@ class DatabaseOracle extends Database {
                return $res->numRows();
        }
 
+       /**
+        * @param ResultWrapper|ORAResult $res
+        * @return int
+        */
        function numFields( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
index 839d6a0..c9127ff 100644 (file)
@@ -1383,6 +1383,11 @@ SQL;
                return (bool)$exists;
        }
 
+       /**
+        * @var string $table
+        * @var string $field
+        * @return PostgresField|null
+        */
        function fieldInfo( $table, $field ) {
                return PostgresField::fromText( $this, $table, $field );
        }
index 0a71df2..aa2a980 100644 (file)
  * @ingroup Database
  */
 interface IDatabase {
+       /* Constants to onTransactionResolution() callbacks */
+       const TRIGGER_IDLE = 1;
+       const TRIGGER_COMMIT = 2;
+       const TRIGGER_ROLLBACK = 3;
+
        /**
         * A string describing the current software version, and possibly
         * other details in a user-friendly way. Will be listed on Special:Version, etc.
@@ -1216,7 +1221,24 @@ interface IDatabase {
        public function getMasterPos();
 
        /**
-        * Run an anonymous function as soon as there is no transaction pending.
+        * Run a callback as soon as the current transaction commits or rolls back.
+        * An error is thrown if no transaction is pending. Queries in the function will run in
+        * AUTO-COMMIT mode unless there are begin() calls. Callbacks must commit any transactions
+        * that they begin.
+        *
+        * This is useful for combining cooperative locks and DB transactions.
+        *
+        * The callback takes one argument:
+        * How the transaction ended (IDatabase::TRIGGER_COMMIT or IDatabase::TRIGGER_ROLLBACK)
+        *
+        * @param callable $callback
+        * @return mixed
+        * @since 1.28
+        */
+       public function onTransactionResolution( callable $callback );
+
+       /**
+        * Run a callback as soon as there is no transaction pending.
         * If there is a transaction and it is rolled back, then the callback is cancelled.
         * Queries in the function will run in AUTO-COMMIT mode unless there are begin() calls.
         * Callbacks must commit any transactions that they begin.
@@ -1228,15 +1250,19 @@ interface IDatabase {
         *
         * Updates will execute in the order they were enqueued.
         *
+        * The callback takes one argument:
+        * How the transaction ended (IDatabase::TRIGGER_COMMIT or IDatabase::TRIGGER_IDLE)
+        *
         * @param callable $callback
         * @since 1.20
         */
-       public function onTransactionIdle( $callback );
+       public function onTransactionIdle( callable $callback );
 
        /**
-        * Run an anonymous function before the current transaction commits or now if there is none.
+        * Run a callback before the current transaction commits or now if there is none.
         * If there is a transaction and it is rolled back, then the callback is cancelled.
-        * Callbacks must not start nor commit any transactions.
+        * Callbacks must not start nor commit any transactions. If no transaction is active,
+        * then a transaction will wrap the callback.
         *
         * This is useful for updates that easily cause deadlocks if locks are held too long
         * but where atomicity is strongly desired for these updates and some related updates.
@@ -1246,7 +1272,7 @@ interface IDatabase {
         * @param callable $callback
         * @since 1.22
         */
-       public function onTransactionPreCommitOrIdle( $callback );
+       public function onTransactionPreCommitOrIdle( callable $callback );
 
        /**
         * Begin an atomic section of statements
index 5b048b5..053f9f8 100644 (file)
@@ -204,15 +204,12 @@ abstract class LBFactory implements DestructibleService {
         * 1. To commit changes to the masters.
         * 2. To release the snapshot on all connections, master and slave.
         * @param string $fname Caller name
+        * @param array $options Options map:
+        *   - maxWriteDuration: abort if more than this much time was spent in write queries
         */
-       public function commitAll( $fname = __METHOD__ ) {
-               $this->logMultiDbTransaction();
-
-               $start = microtime( true );
+       public function commitAll( $fname = __METHOD__, array $options = [] ) {
+               $this->commitMasterChanges( $fname, $options );
                $this->forEachLBCallMethod( 'commitAll', [ $fname ] );
-               $timeMs = 1000 * ( microtime( true ) - $start );
-
-               RequestContext::getMain()->getStats()->timing( "db.commit-all", $timeMs );
        }
 
        /**
@@ -222,21 +219,17 @@ abstract class LBFactory implements DestructibleService {
         *   - maxWriteDuration: abort if more than this much time was spent in write queries
         */
        public function commitMasterChanges( $fname = __METHOD__, array $options = [] ) {
-               $limit = isset( $options['maxWriteDuration'] ) ? $options['maxWriteDuration'] : 0;
-
-               $this->logMultiDbTransaction();
-               $this->forEachLB( function ( LoadBalancer $lb ) use ( $limit ) {
-                       $lb->forEachOpenConnection( function ( IDatabase $db ) use ( $limit ) {
-                               $time = $db->pendingWriteQueryDuration();
-                               if ( $limit > 0 && $time > $limit ) {
-                                       throw new DBTransactionError(
-                                               $db,
-                                               wfMessage( 'transaction-duration-limit-exceeded', $time, $limit )->text()
-                                       );
-                               }
-                       } );
-               } );
-
+               // Perform all pre-commit callbacks, aborting on failure
+               $this->forEachLBCallMethod( 'runMasterPreCommitCallbacks' );
+               // Perform all pre-commit checks, aborting on failure
+               $this->forEachLBCallMethod( 'approveMasterChanges', [ $options ] );
+               // Log the DBs and methods involved in multi-DB transactions
+               $this->logIfMultiDbTransaction();
+               // Actually perform the commit on all master DB connections
+               $this->forEachLBCallMethod( 'commitMasterChanges', [ $fname ] );
+               // Run all post-commit callbacks
+               $this->forEachLBCallMethod( 'runMasterPostCommitCallbacks' );
+               // Commit any dangling DBO_TRX transactions from callbacks on one DB to another DB
                $this->forEachLBCallMethod( 'commitMasterChanges', [ $fname ] );
        }
 
@@ -252,7 +245,7 @@ abstract class LBFactory implements DestructibleService {
        /**
         * Log query info if multi DB transactions are going to be committed now
         */
-       private function logMultiDbTransaction() {
+       private function logIfMultiDbTransaction() {
                $callersByDB = [];
                $this->forEachLB( function ( LoadBalancer $lb ) use ( &$callersByDB ) {
                        $masterName = $lb->getServerName( $lb->getWriterIndex() );
index d96c665..a67eac1 100644 (file)
@@ -1004,14 +1004,10 @@ class LoadBalancer {
         * Close all open connections
         */
        public function closeAll() {
-               foreach ( $this->mConns as $conns2 ) {
-                       foreach ( $conns2 as $conns3 ) {
-                               /** @var DatabaseBase $conn */
-                               foreach ( $conns3 as $conn ) {
-                                       $conn->close();
-                               }
-                       }
-               }
+               $this->forEachOpenConnection( function ( DatabaseBase $conn ) {
+                       $conn->close();
+               } );
+
                $this->mConns = [
                        'local' => [],
                        'foreignFree' => [],
@@ -1051,35 +1047,68 @@ class LoadBalancer {
         * @param string $fname Caller name
         */
        public function commitAll( $fname = __METHOD__ ) {
-               foreach ( $this->mConns as $conns2 ) {
-                       foreach ( $conns2 as $conns3 ) {
-                               /** @var DatabaseBase[] $conns3 */
-                               foreach ( $conns3 as $conn ) {
-                                       if ( $conn->trxLevel() ) {
-                                               $conn->commit( $fname, 'flush' );
-                                       }
-                               }
+               $this->forEachOpenConnection( function ( DatabaseBase $conn ) use ( $fname ) {
+                       $conn->commit( $fname, 'flush' );
+               } );
+       }
+
+       /**
+        * Perform all pre-commit callbacks that remain part of the atomic transactions
+        * and disable any post-commit callbacks until runMasterPostCommitCallbacks()
+        * @since 1.28
+        */
+       public function runMasterPreCommitCallbacks() {
+               $this->forEachOpenMasterConnection( function ( DatabaseBase $conn ) {
+                       // Any error will cause all DB transactions to be rolled back together.
+                       $conn->runOnTransactionPreCommitCallbacks();
+                       // Defer post-commit callbacks until COMMIT finishes for all DBs.
+                       $conn->setPostCommitCallbackSupression( true );
+               } );
+       }
+
+       /**
+        * Perform all pre-commit checks for things like replication safety
+        * @param array $options Includes:
+        *   - maxWriteDuration : max write query duration time in seconds
+        * @throws DBTransactionError
+        * @since 1.28
+        */
+       public function approveMasterChanges( array $options ) {
+               $limit = isset( $options['maxWriteDuration'] ) ? $options['maxWriteDuration'] : 0;
+               $this->forEachOpenMasterConnection( function ( DatabaseBase $conn ) use ( $limit ) {
+                       // Assert that the time to replicate the transaction will be sane.
+                       // If this fails, then all DB transactions will be rollback back together.
+                       $time = $conn->pendingWriteQueryDuration();
+                       if ( $limit > 0 && $time > $limit ) {
+                               throw new DBTransactionError(
+                                       $conn,
+                                       wfMessage( 'transaction-duration-limit-exceeded', $time, $limit )->text()
+                               );
                        }
-               }
+               } );
        }
 
        /**
-        * Issue COMMIT only on master, only if queries were done on connection
+        * Issue COMMIT on all master connections where writes where done
         * @param string $fname Caller name
         */
        public function commitMasterChanges( $fname = __METHOD__ ) {
-               $masterIndex = $this->getWriterIndex();
-               foreach ( $this->mConns as $conns2 ) {
-                       if ( empty( $conns2[$masterIndex] ) ) {
-                               continue;
+               $this->forEachOpenMasterConnection( function ( DatabaseBase $conn ) use ( $fname ) {
+                       if ( $conn->writesOrCallbacksPending() ) {
+                               $conn->commit( $fname, 'flush' );
                        }
-                       /** @var DatabaseBase $conn */
-                       foreach ( $conns2[$masterIndex] as $conn ) {
-                               if ( $conn->trxLevel() && $conn->writesOrCallbacksPending() ) {
-                                       $conn->commit( $fname, 'flush' );
-                               }
-                       }
-               }
+               } );
+       }
+
+       /**
+        * Issue all pending post-commit callbacks
+        * @since 1.28
+        */
+       public function runMasterPostCommitCallbacks() {
+               $this->forEachOpenMasterConnection( function ( DatabaseBase $db ) {
+                       $db->setPostCommitCallbackSupression( false );
+                       $db->runOnTransactionIdleCallbacks( IDatabase::TRIGGER_COMMIT );
+               } );
        }
 
        /**
@@ -1283,16 +1312,11 @@ class LoadBalancer {
         */
        public function pingAll() {
                $success = true;
-               foreach ( $this->mConns as $conns2 ) {
-                       foreach ( $conns2 as $conns3 ) {
-                               /** @var DatabaseBase[] $conns3 */
-                               foreach ( $conns3 as $conn ) {
-                                       if ( !$conn->ping() ) {
-                                               $success = false;
-                                       }
-                               }
+               $this->forEachOpenConnection( function ( DatabaseBase $conn ) use ( &$success ) {
+                       if ( !$conn->ping() ) {
+                               $success = false;
                        }
-               }
+               } );
 
                return $success;
        }
@@ -1303,9 +1327,28 @@ class LoadBalancer {
         * @param array $params
         */
        public function forEachOpenConnection( $callback, array $params = [] ) {
-               foreach ( $this->mConns as $conns2 ) {
-                       foreach ( $conns2 as $conns3 ) {
-                               foreach ( $conns3 as $conn ) {
+               foreach ( $this->mConns as $connsByServer ) {
+                       foreach ( $connsByServer as $serverConns ) {
+                               foreach ( $serverConns as $conn ) {
+                                       $mergedParams = array_merge( [ $conn ], $params );
+                                       call_user_func_array( $callback, $mergedParams );
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Call a function with each open connection object to a master
+        * @param callable $callback
+        * @param array $params
+        * @since 1.28
+        */
+       public function forEachOpenMasterConnection( $callback, array $params = [] ) {
+               $masterIndex = $this->getWriterIndex();
+               foreach ( $this->mConns as $connsByServer ) {
+                       if ( isset( $connsByServer[$masterIndex] ) ) {
+                               /** @var DatabaseBase $conn */
+                               foreach ( $connsByServer[$masterIndex] as $conn ) {
                                        $mergedParams = array_merge( [ $conn ], $params );
                                        call_user_func_array( $callback, $mergedParams );
                                }
index 0fd3b08..432a9e1 100644 (file)
@@ -22,6 +22,7 @@ namespace MediaWiki\Logger\Monolog;
 
 use Kafka\MetaDataFromKafka;
 use Kafka\Produce;
+use Kafka\Protocol\Decoder;
 use MediaWiki\Logger\LoggerFactory;
 use Monolog\Handler\AbstractProcessingHandler;
 use Monolog\Logger;
@@ -68,6 +69,7 @@ class KafkaHandler extends AbstractProcessingHandler {
                'alias' => [], // map from monolog channel to kafka topic
                'swallowExceptions' => false, // swallow exceptions sending records
                'logExceptions' => null, // A PSR3 logger to inform about errors
+               'requireAck' => 0,
        ];
 
        /**
@@ -118,6 +120,10 @@ class KafkaHandler extends AbstractProcessingHandler {
                        $options['logExceptions'] = LoggerFactory::getInstance( $options['logExceptions'] );
                }
 
+               if ( isset( $options['requireAck'] ) ) {
+                       $produce->setRequireAck( $options['requireAck'] );
+               }
+
                return new self( $produce, $options, $level, $bubble );
        }
 
@@ -165,13 +171,42 @@ class KafkaHandler extends AbstractProcessingHandler {
         */
        protected function send() {
                try {
-                       $this->produce->send();
+                       $response = $this->produce->send();
                } catch ( \Kafka\Exception $e ) {
                        $ignore = $this->warning(
                                'Error sending records to kafka: {exception}',
                                [ 'exception' => $e ] );
                        if ( !$ignore ) {
                                throw $e;
+                       } else {
+                               return;
+                       }
+               }
+
+               if ( is_bool( $response ) ) {
+                       return;
+               }
+
+               $errors = [];
+               foreach ( $response as $topicName => $partitionResponse ) {
+                       foreach ( $partitionResponse as $partition => $info ) {
+                               if ( $info['errCode'] === 0 ) {
+                                       // no error
+                                       continue;
+                               }
+                               $errors[] = sprintf(
+                                       'Error producing to %s (errno %d): %s',
+                                       $topicName,
+                                       $info['errCode'],
+                                       Decoder::getError( $info['errCode'] )
+                               );
+                       }
+               }
+
+               if ( $errors ) {
+                       $error = implode( "\n", $errors );
+                       if ( !$this->warning( $error ) ) {
+                               throw new \RuntimeException( $error );
                        }
                }
        }
index a9921b3..0da5d7d 100644 (file)
@@ -4,31 +4,43 @@
  * Deferrable Update for closure/callback updates via IDatabase::doAtomicSection()
  * @since 1.27
  */
-class AtomicSectionUpdate implements DeferrableUpdate {
+class AtomicSectionUpdate implements DeferrableUpdate, DeferrableCallback {
        /** @var IDatabase */
        private $dbw;
        /** @var string */
        private $fname;
-       /** @var Closure|callable */
+       /** @var callable */
        private $callback;
 
        /**
         * @param IDatabase $dbw
         * @param string $fname Caller name (usually __METHOD__)
         * @param callable $callback
-        * @throws InvalidArgumentException
         * @see IDatabase::doAtomicSection()
         */
-       public function __construct( IDatabase $dbw, $fname, $callback ) {
+       public function __construct( IDatabase $dbw, $fname, callable $callback ) {
                $this->dbw = $dbw;
                $this->fname = $fname;
-               if ( !is_callable( $callback ) ) {
-                       throw new InvalidArgumentException( 'Not a valid callback/closure!' );
-               }
                $this->callback = $callback;
+
+               if ( $this->dbw->trxLevel() ) {
+                       $this->dbw->onTransactionResolution( [ $this, 'cancelOnRollback' ] );
+               }
        }
 
        public function doUpdate() {
-               $this->dbw->doAtomicSection( $this->fname, $this->callback );
+               if ( $this->callback ) {
+                       $this->dbw->doAtomicSection( $this->fname, $this->callback );
+               }
+       }
+
+       public function cancelOnRollback( $trigger ) {
+               if ( $trigger === IDatabase::TRIGGER_ROLLBACK ) {
+                       $this->callback = null;
+               }
+       }
+
+       public function getOrigin() {
+               return $this->fname;
        }
 }
diff --git a/includes/deferred/AutoCommitUpdate.php b/includes/deferred/AutoCommitUpdate.php
new file mode 100644 (file)
index 0000000..ef5903b
--- /dev/null
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * Deferrable Update for closure/callback updates that should use auto-commit mode
+ * @since 1.28
+ */
+class AutoCommitUpdate implements DeferrableUpdate, DeferrableCallback {
+       /** @var IDatabase */
+       private $dbw;
+       /** @var string */
+       private $fname;
+       /** @var callable */
+       private $callback;
+
+       /**
+        * @param IDatabase $dbw
+        * @param string $fname Caller name (usually __METHOD__)
+        * @param callable $callback Callback that takes (IDatabase, method name string)
+        */
+       public function __construct( IDatabase $dbw, $fname, callable $callback ) {
+               $this->dbw = $dbw;
+               $this->fname = $fname;
+               $this->callback = $callback;
+
+               if ( $this->dbw->trxLevel() ) {
+                       $this->dbw->onTransactionResolution( [ $this, 'cancelOnRollback' ] );
+               }
+       }
+
+       public function doUpdate() {
+               if ( !$this->callback ) {
+                       return;
+               }
+
+               $autoTrx = $this->dbw->getFlag( DBO_TRX );
+               $this->dbw->clearFlag( DBO_TRX );
+               try {
+                       /** @var Exception $e */
+                       $e = null;
+                       call_user_func_array( $this->callback, [ $this->dbw, $this->fname ] );
+               } catch ( Exception $e ) {
+               }
+               if ( $autoTrx ) {
+                       $this->dbw->setFlag( DBO_TRX );
+               }
+               if ( $e ) {
+                       throw $e;
+               }
+       }
+
+       public function cancelOnRollback( $trigger ) {
+               if ( $trigger === IDatabase::TRIGGER_ROLLBACK ) {
+                       $this->callback = null;
+               }
+       }
+
+       public function getOrigin() {
+               return $this->fname;
+       }
+}
diff --git a/includes/deferred/CallableUpdate.php b/includes/deferred/CallableUpdate.php
deleted file mode 100644 (file)
index 4b19c20..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-/**
- * Deferrable Update for closure/callback
- */
-class MWCallableUpdate implements DeferrableUpdate {
-       /** @var Closure|callable */
-       private $callback;
-
-       /**
-        * @param callable $callback
-        * @throws InvalidArgumentException
-        */
-       public function __construct( $callback ) {
-               if ( !is_callable( $callback ) ) {
-                       throw new InvalidArgumentException( 'Not a valid callback/closure!' );
-               }
-               $this->callback = $callback;
-       }
-
-       public function doUpdate() {
-               call_user_func( $this->callback );
-       }
-}
diff --git a/includes/deferred/DeferrableCallback.php b/includes/deferred/DeferrableCallback.php
new file mode 100644 (file)
index 0000000..2eb0d5d
--- /dev/null
@@ -0,0 +1,13 @@
+<?php
+
+/**
+ * Callback wrapper that has an originating method
+ *
+ * @since 1.28
+ */
+interface DeferrableCallback {
+       /**
+        * @return string Originating method name
+        */
+       function getOrigin();
+}
index e3b7570..9768838 100644 (file)
@@ -61,7 +61,7 @@ class DeferredUpdates {
        }
 
        /**
-        * Add a callable update.  In a lot of cases, we just need a callback/closure,
+        * Add a callable update. In a lot of cases, we just need a callback/closure,
         * defining a new DeferrableUpdate object is not necessary
         *
         * @see MWCallableUpdate::__construct()
@@ -70,7 +70,7 @@ class DeferredUpdates {
         * @param integer $type DeferredUpdates constant (PRESEND or POSTSEND) (since 1.27)
         */
        public static function addCallableUpdate( $callable, $type = self::POSTSEND ) {
-               self::addUpdate( new MWCallableUpdate( $callable ), $type );
+               self::addUpdate( new MWCallableUpdate( $callable, wfGetCaller() ), $type );
        }
 
        /**
@@ -126,8 +126,10 @@ class DeferredUpdates {
        }
 
        public static function execute( array &$queue, $mode ) {
-               $updates = $queue; // snapshot of queue
+               $stats = \MediaWiki\MediaWikiServices::getInstance()->getStatsdDataFactory();
+               $method = RequestContext::getMain()->getRequest()->getMethod();
 
+               $updates = $queue; // snapshot of queue
                // Keep doing rounds of updates until none get enqueued
                while ( count( $updates ) ) {
                        $queue = []; // clear the queue
@@ -141,6 +143,11 @@ class DeferredUpdates {
                                } else {
                                        $otherUpdates[] = $update;
                                }
+
+                               $name = $update instanceof DeferrableCallback
+                                       ? get_class( $update ) . '-' . $update->getOrigin()
+                                       : get_class( $update );
+                               $stats->increment( 'deferred_updates.' . $method . '.' . $name );
                        }
 
                        // Delegate DataUpdate execution to the DataUpdate class
index b8bd747..0009781 100644 (file)
@@ -27,23 +27,28 @@ class LinksDeletionUpdate extends SqlDataUpdate implements EnqueueableDataUpdate
        protected $page;
        /** @var integer */
        protected $pageId;
+       /** @var string */
+       protected $timestamp;
 
        /**
         * @param WikiPage $page Page we are updating
         * @param integer|null $pageId ID of the page we are updating [optional]
+        * @param string|null $timestamp TS_MW timestamp of deletion
         * @throws MWException
         */
-       function __construct( WikiPage $page, $pageId = null ) {
+       function __construct( WikiPage $page, $pageId = null, $timestamp = null ) {
                parent::__construct( false ); // no implicit transaction
 
                $this->page = $page;
-               if ( $page->exists() ) {
+               if ( $pageId ) {
+                       $this->pageId = $pageId; // page ID at time of deletion
+               } elseif ( $page->exists() ) {
                        $this->pageId = $page->getId();
-               } elseif ( $pageId ) {
-                       $this->pageId = $pageId;
                } else {
                        throw new InvalidArgumentException( "Page ID not known. Page doesn't exist?" );
                }
+
+               $this->timestamp = $timestamp ?: wfTimestampNow();
        }
 
        public function doUpdate() {
@@ -56,6 +61,8 @@ class LinksDeletionUpdate extends SqlDataUpdate implements EnqueueableDataUpdate
                // This handles the case when updates have to batched into several COMMITs.
                $scopedLock = LinksUpdate::acquirePageLock( $this->mDb, $id );
 
+               $title = $this->page->getTitle();
+
                // Delete restrictions for it
                $this->mDb->delete( 'page_restrictions', [ 'pr_page' => $id ], __METHOD__ );
 
@@ -68,13 +75,27 @@ class LinksDeletionUpdate extends SqlDataUpdate implements EnqueueableDataUpdate
                );
                $catBatches = array_chunk( $cats, $batchSize );
                foreach ( $catBatches as $catBatch ) {
-                       $this->page->updateCategoryCounts( [], $catBatch );
+                       $this->page->updateCategoryCounts( [], $catBatch, $id );
                        if ( count( $catBatches ) > 1 ) {
                                $this->mDb->commit( __METHOD__, 'flush' );
                                wfGetLBFactory()->waitForReplication( [ 'wiki' => $this->mDb->getWikiID() ] );
                        }
                }
 
+               // Refresh the category table entry if it seems to have no pages. Check
+               // master for the most up-to-date cat_pages count.
+               if ( $title->getNamespace() === NS_CATEGORY ) {
+                       $row = $this->mDb->selectRow(
+                               'category',
+                               [ 'cat_id', 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files' ],
+                               [ 'cat_title' => $title->getDBkey(), 'cat_pages <= 0' ],
+                               __METHOD__
+                       );
+                       if ( $row ) {
+                               $cat = Category::newFromRow( $row, $title )->refreshCounts();
+                       }
+               }
+
                // If using cascading deletes, we can skip some explicit deletes
                if ( !$this->mDb->cascadingDeletes() ) {
                        // Delete outgoing links
@@ -127,7 +148,6 @@ class LinksDeletionUpdate extends SqlDataUpdate implements EnqueueableDataUpdate
 
                // If using cleanup triggers, we can skip some manual deletes
                if ( !$this->mDb->cleanupTriggers() ) {
-                       $title = $this->page->getTitle();
                        // Find recentchanges entries to clean up...
                        $rcIdsForTitle = $this->mDb->selectFieldValues(
                                'recentchanges',
@@ -135,7 +155,9 @@ class LinksDeletionUpdate extends SqlDataUpdate implements EnqueueableDataUpdate
                                [
                                        'rc_type != ' . RC_LOG,
                                        'rc_namespace' => $title->getNamespace(),
-                                       'rc_title' => $title->getDBkey()
+                                       'rc_title' => $title->getDBkey(),
+                                       'rc_timestamp < ' .
+                                               $this->mDb->addQuotes( $this->mDb->timestamp( $this->timestamp ) )
                                ],
                                __METHOD__
                        );
@@ -157,10 +179,8 @@ class LinksDeletionUpdate extends SqlDataUpdate implements EnqueueableDataUpdate
                        }
                }
 
-               $this->mDb->onTransactionIdle( function() use ( &$scopedLock ) {
-                       // Release the lock *after* the final COMMIT for correctness
-                       ScopedCallback::consume( $scopedLock );
-               } );
+               // Commit and release the lock
+               ScopedCallback::consume( $scopedLock );
        }
 
        private function batchDeleteByPK( $table, array $conds, array $pk, $bSize ) {
@@ -188,7 +208,7 @@ class LinksDeletionUpdate extends SqlDataUpdate implements EnqueueableDataUpdate
                        'wiki' => $this->mDb->getWikiID(),
                        'job'  => new JobSpecification(
                                'deleteLinks',
-                               [ 'pageId' => $this->pageId ],
+                               [ 'pageId' => $this->pageId, 'timestamp' => $this->timestamp ],
                                [ 'removeDuplicates' => true ],
                                $this->page->getTitle()
                        )
index d4a61fa..22944eb 100644 (file)
@@ -168,18 +168,16 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
         *
         * @param IDatabase $dbw
         * @param integer $pageId
-        * @return ScopedCallback|null Returns null on failure
+        * @param string $why One of (job, atomicity)
+        * @return ScopedCallback
         * @throws RuntimeException
         * @since 1.27
         */
-       public static function acquirePageLock( IDatabase $dbw, $pageId ) {
-               $scopedLock = $dbw->getScopedLockAndFlush(
-                       "LinksUpdate:pageid:$pageId",
-                       __METHOD__,
-                       15
-               );
+       public static function acquirePageLock( IDatabase $dbw, $pageId, $why = 'atomicity' ) {
+               $key = "LinksUpdate:$why:pageid:$pageId";
+               $scopedLock = $dbw->getScopedLockAndFlush( $key, __METHOD__, 15 );
                if ( !$scopedLock ) {
-                       throw new RuntimeException( "Could not acquire lock on page #$pageId." );
+                       throw new RuntimeException( "Could not acquire lock '$key'." );
                }
 
                return $scopedLock;
diff --git a/includes/deferred/MWCallableUpdate.php b/includes/deferred/MWCallableUpdate.php
new file mode 100644 (file)
index 0000000..d63c292
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * Deferrable Update for closure/callback
+ */
+class MWCallableUpdate implements DeferrableUpdate, DeferrableCallback {
+       /** @var callable */
+       private $callback;
+       /** @var string */
+       private $fname;
+
+       /**
+        * @param callable $callback
+        * @param string $fname Calling method
+        */
+       public function __construct( callable $callback, $fname = 'unknown' ) {
+               $this->callback = $callback;
+               $this->fname = $fname;
+       }
+
+       public function doUpdate() {
+               call_user_func( $this->callback );
+       }
+
+       public function getOrigin() {
+               return $this->fname;
+       }
+}
index 5a62185..b8e2726 100644 (file)
@@ -74,7 +74,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
                        $this->doUpdatePendingDeltas();
                } else {
                        // Need a separate transaction because this a global lock
-                       wfGetDB( DB_MASTER )->onTransactionIdle( [ $this, 'tryDBUpdateInternal' ] );
+                       DeferredUpdates::addCallableUpdate( [ $this, 'tryDBUpdateInternal' ] );
                }
        }
 
index f35356c..949a0ac 100644 (file)
  * @ingroup DifferenceEngine
  */
 
-/**
- * Constant to indicate diff cache compatibility.
- * Bump this when changing the diff formatting in a way that
- * fixes important bugs or such to force cached diff views to
- * clear.
- */
+// Deprecated, use class constant instead
 define( 'MW_DIFF_VERSION', '1.11a' );
 
 /**
@@ -34,6 +29,13 @@ define( 'MW_DIFF_VERSION', '1.11a' );
  * @ingroup DifferenceEngine
  */
 class DifferenceEngine extends ContextSource {
+       /**
+        * Constant to indicate diff cache compatibility.
+        * Bump this when changing the diff formatting in a way that
+        * fixes important bugs or such to force cached diff views to
+        * clear.
+        */
+       const DIFF_VERSION = MW_DIFF_VERSION;
 
        /** @var int */
        public $mOldid;
@@ -777,7 +779,7 @@ class DifferenceEngine extends ContextSource {
                        throw new MWException( 'mOldid and mNewid must be set to get diff cache key.' );
                }
 
-               return wfMemcKey( 'diff', 'version', MW_DIFF_VERSION,
+               return wfMemcKey( 'diff', 'version', self::DIFF_VERSION,
                        'oldid', $this->mOldid, 'newid', $this->mNewid );
        }
 
@@ -891,18 +893,23 @@ class DifferenceEngine extends ContextSource {
                if ( $wgExternalDiffEngine == 'wikidiff' || $wgExternalDiffEngine == 'wikidiff3' ) {
                        wfDeprecated( "\$wgExternalDiffEngine = '{$wgExternalDiffEngine}'", '1.27' );
                        $wgExternalDiffEngine = false;
+               } elseif ( $wgExternalDiffEngine == 'wikidiff2' ) {
+                       // Same as above, but with no deprecation warnings
+                       $wgExternalDiffEngine = false;
+               } elseif ( !is_string( $wgExternalDiffEngine ) && $wgExternalDiffEngine !== false ) {
+                       // And prevent people from shooting themselves in the foot...
+                       wfWarn( '$wgExternalDiffEngine is set to a non-string value, forcing it to false' );
+                       $wgExternalDiffEngine = false;
                }
 
-               if ( $wgExternalDiffEngine == 'wikidiff2' ) {
-                       if ( function_exists( 'wikidiff2_do_diff' ) ) {
-                               # Better external diff engine, the 2 may some day be dropped
-                               # This one does the escaping and segmenting itself
-                               $text = wikidiff2_do_diff( $otext, $ntext, 2 );
-                               $text .= $this->debug( 'wikidiff2' );
+               if ( function_exists( 'wikidiff2_do_diff' ) && $wgExternalDiffEngine === false ) {
+                       # Better external diff engine, the 2 may some day be dropped
+                       # This one does the escaping and segmenting itself
+                       $text = wikidiff2_do_diff( $otext, $ntext, 2 );
+                       $text .= $this->debug( 'wikidiff2' );
 
-                               return $text;
-                       }
-               } elseif ( $wgExternalDiffEngine !== false ) {
+                       return $text;
+               } elseif ( $wgExternalDiffEngine !== false && is_executable( $wgExternalDiffEngine ) ) {
                        # Diff via the shell
                        $tmpDir = wfTempDir();
                        $tempName1 = tempnam( $tmpDir, 'diff_' );
index 63adc29..7d8b244 100644 (file)
@@ -93,10 +93,11 @@ class MWExceptionHandler {
                                }
                        }
                } else {
-                       $message = "Exception encountered, of type \"" . get_class( $e ) . "\"";
-
-                       if ( $wgShowExceptionDetails ) {
-                               $message .= "\n" . self::getLogMessage( $e ) . "\nBacktrace:\n" .
+                       if ( !$wgShowExceptionDetails ) {
+                               $message = self::getPublicLogMessage( $e );
+                       } else {
+                               $message = self::getLogMessage( $e ) .
+                                       "\nBacktrace:\n" .
                                        self::getRedactedTraceAsString( $e ) . "\n";
                        }
 
@@ -487,12 +488,16 @@ TXT;
                return "[$id] $url   $type from line $line of $file: $message";
        }
 
-       public static function getPublicLogMessage( Exception $e ) {
+       /**
+        * @param Exception|Throwable $e
+        * @return string
+        */
+       public static function getPublicLogMessage( $e ) {
                $reqId = WebRequest::getRequestId();
                $type = get_class( $e );
                return '[' . $reqId . '] '
                        . gmdate( 'Y-m-d H:i:s' ) . ': '
-                       . 'Fatal exception of type ' . $type;
+                       . 'Fatal exception of type "' . $type . '"';
        }
 
        /**
diff --git a/includes/export/DumpStringOutput.php b/includes/export/DumpStringOutput.php
new file mode 100644 (file)
index 0000000..837a62d
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Stream outputter that buffers and returns data as a string.
+ *
+ * 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 Dump
+ * @since 1.28
+ */
+class DumpStringOutput extends DumpOutput {
+       private $output = '';
+
+       /**
+        * @param string $string
+        */
+       function write( $string ) {
+               $this->output .= $string;
+       }
+
+       /**
+        * Get the string containing the output.
+        *
+        * @return string
+        */
+       public function __toString() {
+               return $this->output;
+       }
+}
index 54de26d..c1f2d59 100644 (file)
@@ -134,13 +134,21 @@ class WikiExporter {
         * @param int $start Inclusive lower limit (this id is included)
         * @param int $end Exclusive upper limit (this id is not included)
         *   If 0, no upper limit.
+        * @param bool $orderRevs order revisions within pages in ascending order
         */
-       public function pagesByRange( $start, $end ) {
-               $condition = 'page_id >= ' . intval( $start );
-               if ( $end ) {
-                       $condition .= ' AND page_id < ' . intval( $end );
+       public function pagesByRange( $start, $end, $orderRevs ) {
+               if ( $orderRevs ) {
+                       $condition = 'rev_page >= ' . intval( $start );
+                       if ( $end ) {
+                               $condition .= ' AND rev_page < ' . intval( $end );
+                       }
+               } else {
+                       $condition = 'page_id >= ' . intval( $start );
+                       if ( $end ) {
+                               $condition .= ' AND page_id < ' . intval( $end );
+                       }
                }
-               $this->dumpFrom( $condition );
+               $this->dumpFrom( $condition, $orderRevs );
        }
 
        /**
@@ -245,7 +253,7 @@ class WikiExporter {
         * @throws MWException
         * @throws Exception
         */
-       protected function dumpFrom( $cond = '' ) {
+       protected function dumpFrom( $cond = '', $orderRevs = false ) {
                # For logging dumps...
                if ( $this->history & self::LOGS ) {
                        $where = [ 'user_id = log_user' ];
@@ -332,7 +340,16 @@ class WikiExporter {
                                }
                        } elseif ( $this->history & WikiExporter::FULL ) {
                                # Full history dumps...
-                               $join['revision'] = [ 'INNER JOIN', 'page_id=rev_page' ];
+                               # query optimization for history stub dumps
+                               if ( $this->text == WikiExporter::STUB && $orderRevs ) {
+                                       $tables = [ 'revision', 'page' ];
+                                       $opts[] = 'STRAIGHT_JOIN';
+                                       $opts['ORDER BY'] = [ 'rev_page ASC', 'rev_id ASC' ];
+                                       $opts['USE INDEX']['revision'] = 'rev_page_id';
+                                       $join['page'] = [ 'INNER JOIN', 'rev_page=page_id' ];
+                               } else {
+                                       $join['revision'] = [ 'INNER JOIN', 'page_id=rev_page' ];
+                               }
                        } elseif ( $this->history & WikiExporter::CURRENT ) {
                                # Latest revision dumps...
                                if ( $this->list_authors && $cond != '' ) { // List authors, if so desired
@@ -369,7 +386,6 @@ class WikiExporter {
                        if ( $this->buffer == WikiExporter::STREAM ) {
                                $prev = $this->db->bufferResults( false );
                        }
-
                        $result = null; // Assuring $result is not undefined, if exception occurs early
                        try {
                                Hooks::run( 'ModifyExportQuery',
index 03974f7..10183f4 100644 (file)
@@ -1005,15 +1005,21 @@ abstract class FileBackend {
 
        /**
         * Stream the file at a storage path in the backend.
+        *
         * If the file does not exists, an HTTP 404 error will be given.
         * Appropriate HTTP headers (Status, Content-Type, Content-Length)
         * will be sent if streaming began, while none will be sent otherwise.
         * Implementations should flush the output buffer before sending data.
         *
         * @param array $params Parameters include:
-        *   - src     : source storage path
-        *   - headers : list of additional HTTP headers to send on success
-        *   - latest  : use the latest available data
+        *   - src      : source storage path
+        *   - headers  : list of additional HTTP headers to send if the file exists
+        *   - options  : HTTP request header map with lower case keys (since 1.28). Supports:
+        *                range             : format is "bytes=(\d*-\d*)"
+        *                if-modified-since : format is an HTTP date
+        *   - headless : only include the body (and headers from "headers") (since 1.28)
+        *   - latest   : use the latest available data
+        *   - allowOB  : preserve any output buffers (since 1.28)
         * @return Status
         */
        abstract public function streamFile( array $params );
index 4d9587e..a29119c 100644 (file)
@@ -844,30 +844,19 @@ abstract class FileBackendStore extends FileBackend {
                $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                $status = Status::newGood();
 
-               $info = $this->getFileStat( $params );
-               if ( !$info ) { // let StreamFile handle the 404
-                       $status->fatal( 'backend-fail-notexists', $params['src'] );
-               }
-
-               // Set output buffer and HTTP headers for stream
-               $extraHeaders = isset( $params['headers'] ) ? $params['headers'] : [];
-               $res = StreamFile::prepareForStream( $params['src'], $info, $extraHeaders );
-               if ( $res == StreamFile::NOT_MODIFIED ) {
-                       // do nothing; client cache is up to date
-               } elseif ( $res == StreamFile::READY_STREAM ) {
-                       $status = $this->doStreamFile( $params );
-                       if ( !$status->isOK() ) {
-                               // Per bug 41113, nasty things can happen if bad cache entries get
-                               // stuck in cache. It's also possible that this error can come up
-                               // with simple race conditions. Clear out the stat cache to be safe.
-                               $this->clearCache( [ $params['src'] ] );
-                               $this->deleteFileCache( $params['src'] );
-                               trigger_error( "Bad stat cache or race condition for file {$params['src']}." );
-                       }
-               } else {
+               // Always set some fields for subclass convenience
+               $params['options'] = isset( $params['options'] ) ? $params['options'] : [];
+               $params['headers'] = isset( $params['headers'] ) ? $params['headers'] : [];
+
+               // Don't stream it out as text/html if there was a PHP error
+               if ( ( empty( $params['headless'] ) || $params['headers'] ) && headers_sent() ) {
+                       print "Headers already sent, terminating.\n";
                        $status->fatal( 'backend-fail-stream', $params['src'] );
+                       return $status;
                }
 
+               $status->merge( $this->doStreamFile( $params ) );
+
                return $status;
        }
 
@@ -879,10 +868,21 @@ abstract class FileBackendStore extends FileBackend {
        protected function doStreamFile( array $params ) {
                $status = Status::newGood();
 
+               $flags = 0;
+               $flags |= !empty( $params['headless'] ) ? StreamFile::STREAM_HEADLESS : 0;
+               $flags |= !empty( $params['allowOB'] ) ? StreamFile::STREAM_ALLOW_OB : 0;
+
                $fsFile = $this->getLocalReference( $params );
-               if ( !$fsFile ) {
-                       $status->fatal( 'backend-fail-stream', $params['src'] );
-               } elseif ( !readfile( $fsFile->getPath() ) ) {
+
+               if ( $fsFile ) {
+                       $res = StreamFile::stream( $fsFile->getPath(),
+                               $params['headers'], true, $params['options'], $flags );
+               } else {
+                       $res = false;
+                       StreamFile::send404Message( $params['src'], $flags );
+               }
+
+               if ( !$res ) {
                        $status->fatal( 'backend-fail-stream', $params['src'] );
                }
 
index 6e32c62..e2c1ede 100644 (file)
@@ -183,21 +183,6 @@ class MemoryFileBackend extends FileBackendStore {
                return $tmpFiles;
        }
 
-       protected function doStreamFile( array $params ) {
-               $status = Status::newGood();
-
-               $src = $this->resolveHashKey( $params['src'] );
-               if ( $src === null || !isset( $this->files[$src] ) ) {
-                       $status->fatal( 'backend-fail-stream', $params['src'] );
-
-                       return $status;
-               }
-
-               print $this->files[$src]['data'];
-
-               return $status;
-       }
-
        protected function doDirectoryExists( $container, $dir, array $params ) {
                $prefix = rtrim( "$container/$dir", '/' ) . '/';
                foreach ( $this->files as $path => $data ) {
index 0f7e4b5..2adf934 100644 (file)
@@ -1045,32 +1045,62 @@ class SwiftFileBackend extends FileBackendStore {
        protected function doStreamFile( array $params ) {
                $status = Status::newGood();
 
+               $flags = !empty( $params['headless'] ) ? StreamFile::STREAM_HEADLESS : 0;
+
                list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
                if ( $srcRel === null ) {
+                       StreamFile::send404Message( $params['src'], $flags );
                        $status->fatal( 'backend-fail-invalidpath', $params['src'] );
+
+                       return $status;
                }
 
                $auth = $this->getAuthentication();
                if ( !$auth || !is_array( $this->getContainerStat( $srcCont ) ) ) {
+                       StreamFile::send404Message( $params['src'], $flags );
                        $status->fatal( 'backend-fail-stream', $params['src'] );
 
                        return $status;
                }
 
-               $handle = fopen( 'php://output', 'wb' );
+               // 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 );
+                       $status->fatal( 'backend-fail-stream', $params['src'] );
 
+                       return $status;
+               }
+
+               // Send the requested additional headers
+               foreach ( $params['headers'] as $header ) {
+                       header( $header ); // aways send
+               }
+
+               if ( empty( $params['allowOB'] ) ) {
+                       // Cancel output buffering and gzipping if set
+                       wfResetOutputBuffers();
+               }
+
+               $handle = fopen( 'php://output', 'wb' );
                list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->http->run( [
                        'method' => 'GET',
                        'url' => $this->storageUrl( $auth, $srcCont, $srcRel ),
                        'headers' => $this->authTokenHeaders( $auth )
-                               + $this->headersFromParams( $params ),
+                               + $this->headersFromParams( $params ) + $params['options'],
                        'stream' => $handle,
+                       'flags'  => [ 'relayResponseHeaders' => empty( $params['headless'] ) ]
                ] );
 
                if ( $rcode >= 200 && $rcode <= 299 ) {
                        // good
                } elseif ( $rcode === 404 ) {
                        $status->fatal( 'backend-fail-stream', $params['src'] );
+                       // Per bug 41113, nasty things can happen if bad cache entries get
+                       // stuck in cache. It's also possible that this error can come up
+                       // with simple race conditions. Clear out the stat cache to be safe.
+                       $this->clearCache( [ $params['src'] ] );
+                       $this->deleteFileCache( $params['src'] );
                } else {
                        $this->onError( $status, __METHOD__, $params, $rerr, $rcode, $rdesc );
                }
index f4410ca..e5ded45 100644 (file)
@@ -37,7 +37,7 @@
  * @since 1.19
  */
 abstract class DBLockManager extends QuorumLockManager {
-       /** @var array Map of DB names to server config */
+       /** @var array[] Map of DB names to server config */
        protected $dbServers; // (DB name => server config array)
        /** @var BagOStuff */
        protected $statusCache;
@@ -46,7 +46,7 @@ abstract class DBLockManager extends QuorumLockManager {
        protected $safeDelay; // integer number of seconds
 
        protected $session = 0; // random integer
-       /** @var array Map Database connections (DB name => Database) */
+       /** @var IDatabase[] Map Database connections (DB name => Database) */
        protected $conns = [];
 
        /**
@@ -113,6 +113,8 @@ abstract class DBLockManager extends QuorumLockManager {
                return $status;
        }
 
+       abstract protected function doGetLocksOnServer( $lockSrv, array $paths, $type );
+
        protected function freeLocksOnServer( $lockSrv, array $pathsByType ) {
                return Status::newGood();
        }
index 9ad2428..4ab913d 100644 (file)
@@ -533,11 +533,10 @@ class FileRepo {
        public function findFileFromKey( $sha1, $options = [] ) {
                $time = isset( $options['time'] ) ? $options['time'] : false;
                # First try to find a matching current version of a file...
-               if ( $this->fileFactoryKey ) {
-                       $img = call_user_func( $this->fileFactoryKey, $sha1, $this, $time );
-               } else {
+               if ( !$this->fileFactoryKey ) {
                        return false; // find-by-sha1 not supported
                }
+               $img = call_user_func( $this->fileFactoryKey, $sha1, $this, $time );
                if ( $img && $img->exists() ) {
                        return $img;
                }
@@ -1586,12 +1585,13 @@ class FileRepo {
         *
         * @param string $virtualUrl
         * @param array $headers Additional HTTP headers to send on success
+        * @param array $optHeaders HTTP request headers (if-modified-since, range, ...)
         * @return Status
         * @since 1.27
         */
-       public function streamFileWithStatus( $virtualUrl, $headers = [] ) {
+       public function streamFileWithStatus( $virtualUrl, $headers = [], $optHeaders = [] ) {
                $path = $this->resolveToStoragePath( $virtualUrl );
-               $params = [ 'src' => $path, 'headers' => $headers ];
+               $params = [ 'src' => $path, 'headers' => $headers, 'options' => $optHeaders ];
 
                return $this->backend->streamFile( $params );
        }
index c767078..a7f6e6f 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup FileAbstraction
  */
 
+use \MediaWiki\Logger\LoggerFactory;
+
 /**
  * Bump this number when serialized cache records may be incompatible.
  */
@@ -127,6 +129,8 @@ class LocalFile extends File {
        // @note: higher than IDBAccessObject constants
        const LOAD_ALL = 16; // integer; load all the lazy fields too (like metadata)
 
+       const ATOMIC_SECTION_LOCK = 'LocalFile::lockingTransaction';
+
        /**
         * Create a LocalFile from a title
         * Do not call this except from inside a repo class.
@@ -1418,97 +1422,103 @@ class LocalFile extends File {
                # Do some cache purges after final commit so that:
                # a) Changes are more likely to be seen post-purge
                # b) They won't cause rollback of the log publish/update above
-               $that = $this;
-               $dbw->onTransactionIdle( function () use (
-                       $that, $reupload, $wikiPage, $newPageContent, $comment, $user, $logEntry, $logId, $descId, $tags
-               ) {
-                       # Update memcache after the commit
-                       $that->invalidateCache();
-
-                       $updateLogPage = false;
-                       if ( $newPageContent ) {
-                               # New file page; create the description page.
-                               # There's already a log entry, so don't make a second RC entry
-                               # CDN and file cache for the description page are purged by doEditContent.
-                               $status = $wikiPage->doEditContent(
-                                       $newPageContent,
-                                       $comment,
-                                       EDIT_NEW | EDIT_SUPPRESS_RC,
-                                       false,
-                                       $user
-                               );
-
-                               if ( isset( $status->value['revision'] ) ) {
-                                       // Associate new page revision id
-                                       $logEntry->setAssociatedRevId( $status->value['revision']->getId() );
-                               }
-                               // This relies on the resetArticleID() call in WikiPage::insertOn(),
-                               // which is triggered on $descTitle by doEditContent() above.
-                               if ( isset( $status->value['revision'] ) ) {
-                                       /** @var $rev Revision */
-                                       $rev = $status->value['revision'];
-                                       $updateLogPage = $rev->getPage();
-                               }
-                       } else {
-                               # Existing file page: invalidate description page cache
-                               $wikiPage->getTitle()->invalidateCache();
-                               $wikiPage->getTitle()->purgeSquid();
-                               # Allow the new file version to be patrolled from the page footer
-                               Article::purgePatrolFooterCache( $descId );
-                       }
-
-                       # Update associated rev id. This should be done by $logEntry->insert() earlier,
-                       # but setAssociatedRevId() wasn't called at that point yet...
-                       $logParams = $logEntry->getParameters();
-                       $logParams['associated_rev_id'] = $logEntry->getAssociatedRevId();
-                       $update = [ 'log_params' => LogEntryBase::makeParamBlob( $logParams ) ];
-                       if ( $updateLogPage ) {
-                               # Also log page, in case where we just created it above
-                               $update['log_page'] = $updateLogPage;
-                       }
-                       $that->getRepo()->getMasterDB()->update(
-                               'logging',
-                               $update,
-                               [ 'log_id' => $logId ],
-                               __METHOD__
-                       );
-                       $that->getRepo()->getMasterDB()->insert(
-                               'log_search',
-                               [
-                                       'ls_field' => 'associated_rev_id',
-                                       'ls_value' => $logEntry->getAssociatedRevId(),
-                                       'ls_log_id' => $logId,
-                               ],
-                               __METHOD__
-                       );
+               DeferredUpdates::addUpdate(
+                       new AutoCommitUpdate(
+                               $dbw,
+                               __METHOD__,
+                               function () use (
+                                       $reupload, $wikiPage, $newPageContent, $comment, $user,
+                                       $logEntry, $logId, $descId, $tags
+                               ) {
+                                       # Update memcache after the commit
+                                       $this->invalidateCache();
+
+                                       $updateLogPage = false;
+                                       if ( $newPageContent ) {
+                                               # New file page; create the description page.
+                                               # There's already a log entry, so don't make a second RC entry
+                                               # CDN and file cache for the description page are purged by doEditContent.
+                                               $status = $wikiPage->doEditContent(
+                                                       $newPageContent,
+                                                       $comment,
+                                                       EDIT_NEW | EDIT_SUPPRESS_RC,
+                                                       false,
+                                                       $user
+                                               );
+
+                                               if ( isset( $status->value['revision'] ) ) {
+                                                       // Associate new page revision id
+                                                       $logEntry->setAssociatedRevId( $status->value['revision']->getId() );
+                                               }
+                                               // This relies on the resetArticleID() call in WikiPage::insertOn(),
+                                               // which is triggered on $descTitle by doEditContent() above.
+                                               if ( isset( $status->value['revision'] ) ) {
+                                                       /** @var $rev Revision */
+                                                       $rev = $status->value['revision'];
+                                                       $updateLogPage = $rev->getPage();
+                                               }
+                                       } else {
+                                               # Existing file page: invalidate description page cache
+                                               $wikiPage->getTitle()->invalidateCache();
+                                               $wikiPage->getTitle()->purgeSquid();
+                                               # Allow the new file version to be patrolled from the page footer
+                                               Article::purgePatrolFooterCache( $descId );
+                                       }
 
-                       # Add change tags, if any
-                       if ( $tags ) {
-                               $logEntry->setTags( $tags );
-                       }
+                                       # Update associated rev id. This should be done by $logEntry->insert() earlier,
+                                       # but setAssociatedRevId() wasn't called at that point yet...
+                                       $logParams = $logEntry->getParameters();
+                                       $logParams['associated_rev_id'] = $logEntry->getAssociatedRevId();
+                                       $update = [ 'log_params' => LogEntryBase::makeParamBlob( $logParams ) ];
+                                       if ( $updateLogPage ) {
+                                               # Also log page, in case where we just created it above
+                                               $update['log_page'] = $updateLogPage;
+                                       }
+                                       $this->getRepo()->getMasterDB()->update(
+                                               'logging',
+                                               $update,
+                                               [ 'log_id' => $logId ],
+                                               __METHOD__
+                                       );
+                                       $this->getRepo()->getMasterDB()->insert(
+                                               'log_search',
+                                               [
+                                                       'ls_field' => 'associated_rev_id',
+                                                       'ls_value' => $logEntry->getAssociatedRevId(),
+                                                       'ls_log_id' => $logId,
+                                               ],
+                                               __METHOD__
+                                       );
+
+                                       # Add change tags, if any
+                                       if ( $tags ) {
+                                               $logEntry->setTags( $tags );
+                                       }
 
-                       # Uploads can be patrolled
-                       $logEntry->setIsPatrollable( true );
+                                       # Uploads can be patrolled
+                                       $logEntry->setIsPatrollable( true );
 
-                       # Now that the log entry is up-to-date, make an RC entry.
-                       $logEntry->publish( $logId );
+                                       # Now that the log entry is up-to-date, make an RC entry.
+                                       $logEntry->publish( $logId );
 
-                       # Run hook for other updates (typically more cache purging)
-                       Hooks::run( 'FileUpload', [ $that, $reupload, !$newPageContent ] );
+                                       # Run hook for other updates (typically more cache purging)
+                                       Hooks::run( 'FileUpload', [ $this, $reupload, !$newPageContent ] );
 
-                       if ( $reupload ) {
-                               # Delete old thumbnails
-                               $that->purgeThumbnails();
-                               # Remove the old file from the CDN cache
-                               DeferredUpdates::addUpdate(
-                                       new CdnCacheUpdate( [ $that->getUrl() ] ),
-                                       DeferredUpdates::PRESEND
-                               );
-                       } else {
-                               # Update backlink pages pointing to this title if created
-                               LinksUpdate::queueRecursiveJobsForTable( $that->getTitle(), 'imagelinks' );
-                       }
-               } );
+                                       if ( $reupload ) {
+                                               # Delete old thumbnails
+                                               $this->purgeThumbnails();
+                                               # Remove the old file from the CDN cache
+                                               DeferredUpdates::addUpdate(
+                                                       new CdnCacheUpdate( [ $this->getUrl() ] ),
+                                                       DeferredUpdates::PRESEND
+                                               );
+                                       } else {
+                                               # Update backlink pages pointing to this title if created
+                                               LinksUpdate::queueRecursiveJobsForTable( $this->getTitle(), 'imagelinks' );
+                                       }
+                               }
+                       )
+               );
 
                if ( !$reupload ) {
                        # This is a new file, so update the image count
@@ -1633,16 +1643,20 @@ class LocalFile extends File {
                // Purge the source and target files...
                $oldTitleFile = wfLocalFile( $this->title );
                $newTitleFile = wfLocalFile( $target );
-               // Hack: the lock()/unlock() pair is nested in a transaction so the locking is not
-               // tied to BEGIN/COMMIT. To avoid slow purges in the transaction, move them outside.
-               $this->getRepo()->getMasterDB()->onTransactionIdle(
-                       function () use ( $oldTitleFile, $newTitleFile, $archiveNames ) {
-                               $oldTitleFile->purgeEverything();
-                               foreach ( $archiveNames as $archiveName ) {
-                                       $oldTitleFile->purgeOldThumbnails( $archiveName );
+               // To avoid slow purges in the transaction, move them outside...
+               DeferredUpdates::addUpdate(
+                       new AutoCommitUpdate(
+                               $this->getRepo()->getMasterDB(),
+                               __METHOD__,
+                               function () use ( $oldTitleFile, $newTitleFile, $archiveNames ) {
+                                       $oldTitleFile->purgeEverything();
+                                       foreach ( $archiveNames as $archiveName ) {
+                                               $oldTitleFile->purgeOldThumbnails( $archiveName );
+                                       }
+                                       $newTitleFile->purgeEverything();
                                }
-                               $newTitleFile->purgeEverything();
-                       }
+                       ),
+                       DeferredUpdates::PRESEND
                );
 
                if ( $status->isOK() ) {
@@ -1678,7 +1692,7 @@ class LocalFile extends File {
 
                $this->lock(); // begin
                $batch->addCurrent();
-               # Get old version relative paths
+               // Get old version relative paths
                $archiveNames = $batch->addOlds();
                $status = $batch->execute();
                $this->unlock(); // done
@@ -1687,16 +1701,19 @@ class LocalFile extends File {
                        DeferredUpdates::addUpdate( SiteStatsUpdate::factory( [ 'images' => -1 ] ) );
                }
 
-               // Hack: the lock()/unlock() pair is nested in a transaction so the locking is not
-               // tied to BEGIN/COMMIT. To avoid slow purges in the transaction, move them outside.
-               $that = $this;
-               $this->getRepo()->getMasterDB()->onTransactionIdle(
-                       function () use ( $that, $archiveNames ) {
-                               $that->purgeEverything();
-                               foreach ( $archiveNames as $archiveName ) {
-                                       $that->purgeOldThumbnails( $archiveName );
+               // To avoid slow purges in the transaction, move them outside...
+               DeferredUpdates::addUpdate(
+                       new AutoCommitUpdate(
+                               $this->getRepo()->getMasterDB(),
+                               __METHOD__,
+                               function () use ( $archiveNames ) {
+                                       $this->purgeEverything();
+                                       foreach ( $archiveNames as $archiveName ) {
+                                               $this->purgeOldThumbnails( $archiveName );
+                                       }
                                }
-                       }
+                       ),
+                       DeferredUpdates::PRESEND
                );
 
                // Purge the CDN
@@ -1903,70 +1920,87 @@ class LocalFile extends File {
        }
 
        /**
-        * Start a transaction and lock the image for update
-        * Increments a reference counter if the lock is already held
+        * @return Status
+        * @since 1.28
+        */
+       public function acquireFileLock() {
+               return $this->getRepo()->getBackend()->lockFiles(
+                       [ $this->getPath() ], LockManager::LOCK_EX, 10
+               );
+       }
+
+       /**
+        * @return Status
+        * @since 1.28
+        */
+       public function releaseFileLock() {
+               return $this->getRepo()->getBackend()->unlockFiles(
+                       [ $this->getPath() ], LockManager::LOCK_EX
+               );
+       }
+
+       /**
+        * Start an atomic DB section and lock the image for update
+        * or increments a reference counter if the lock is already held
+        *
+        * This method should not be used outside of LocalFile/LocalFile*Batch
+        *
         * @throws LocalFileLockError Throws an error if the lock was not acquired
         * @return bool Whether the file lock owns/spawned the DB transaction
         */
-       function lock() {
+       public function lock() {
                if ( !$this->locked ) {
+                       $logger = LoggerFactory::getInstance( 'LocalFile' );
+
                        $dbw = $this->repo->getMasterDB();
-                       if ( !$dbw->trxLevel() ) {
-                               $dbw->begin( __METHOD__ );
-                               $this->lockedOwnTrx = true;
-                       }
+                       $makesTransaction = !$dbw->trxLevel();
+                       $dbw->startAtomic( self::ATOMIC_SECTION_LOCK );
                        // Bug 54736: use simple lock to handle when the file does not exist.
                        // SELECT FOR UPDATE prevents changes, not other SELECTs with FOR UPDATE.
                        // Also, that would cause contention on INSERT of similarly named rows.
-                       $backend = $this->getRepo()->getBackend();
-                       $lockPaths = [ $this->getPath() ]; // represents all versions of the file
-                       $start = microtime( true );
-                       $status = $backend->lockFiles( $lockPaths, LockManager::LOCK_EX, 10 );
-                       $waited = microtime( true ) - $start;
+                       $status = $this->acquireFileLock(); // represents all versions of the file
                        if ( !$status->isGood() ) {
-                               if ( $this->lockedOwnTrx ) {
-                                       $dbw->rollback( __METHOD__ );
-                               }
-                               throw new LocalFileLockError(
-                                       "Could not acquire lock for '{$this->getName()}' ($waited sec): " .
-                                       $status->getWikiText( false, false, 'en' )
-                               );
+                               $dbw->endAtomic( self::ATOMIC_SECTION_LOCK );
+                               $logger->warning( "Failed to lock '{file}'", [ 'file' => $this->name ] );
+
+                               throw new LocalFileLockError( $status );
                        }
-                       // Release the lock *after* commit to avoid row-level contention
-                       $this->locked++;
-                       $dbw->onTransactionIdle( function () use ( $backend, $lockPaths ) {
-                               $backend->unlockFiles( $lockPaths, LockManager::LOCK_EX );
+                       // Release the lock *after* commit to avoid row-level contention.
+                       // Make sure it triggers on rollback() as well as commit() (T132921).
+                       $dbw->onTransactionResolution( function () use ( $logger ) {
+                               $status = $this->releaseFileLock();
+                               if ( !$status->isGood() ) {
+                                       $logger->error( "Failed to unlock '{file}'", [ 'file' => $this->name ] );
+                               }
                        } );
+                       // Callers might care if the SELECT snapshot is safely fresh
+                       $this->lockedOwnTrx = $makesTransaction;
                }
 
+               $this->locked++;
+
                return $this->lockedOwnTrx;
        }
 
        /**
-        * Decrement the lock reference count. If the reference count is reduced to zero, commits
-        * the transaction and thereby releases the image lock.
+        * Decrement the lock reference count and end the atomic section if it reaches zero
+        *
+        * This method should not be used outside of LocalFile/LocalFile*Batch
+        *
+        * The commit and loc release will happen when no atomic sections are active, which
+        * may happen immediately or at some point after calling this
         */
-       function unlock() {
+       public function unlock() {
                if ( $this->locked ) {
                        --$this->locked;
-                       if ( !$this->locked && $this->lockedOwnTrx ) {
+                       if ( !$this->locked ) {
                                $dbw = $this->repo->getMasterDB();
-                               $dbw->commit( __METHOD__ );
+                               $dbw->endAtomic( self::ATOMIC_SECTION_LOCK );
                                $this->lockedOwnTrx = false;
                        }
                }
        }
 
-       /**
-        * Roll back the DB transaction and mark the image unlocked
-        */
-       function unlockAndRollback() {
-               $this->locked = false;
-               $dbw = $this->repo->getMasterDB();
-               $dbw->rollback( __METHOD__ );
-               $this->lockedOwnTrx = false;
-       }
-
        /**
         * @return Status
         */
@@ -2277,13 +2311,6 @@ class LocalFileDeleteBatch {
                        }
                }
 
-               // Lock the filearchive rows so that the files don't get deleted by a cleanup operation
-               // We acquire this lock by running the inserts now, before the file operations.
-               // This potentially has poor lock contention characteristics -- an alternative
-               // scheme would be to insert stub filearchive entries with no fa_name and commit
-               // them in a separate transaction, then run the file ops, then update the fa_name fields.
-               $this->doDBInserts();
-
                if ( !$repo->hasSha1Storage() ) {
                        // Removes non-existent file from the batch, so we don't get errors.
                        // This also handles files in the 'deleted' zone deleted via revision deletion.
@@ -2296,21 +2323,20 @@ class LocalFileDeleteBatch {
 
                        // Execute the file deletion batch
                        $status = $this->file->repo->deleteBatch( $this->deletionBatch );
-
                        if ( !$status->isGood() ) {
                                $this->status->merge( $status );
                        }
                }
 
                if ( !$this->status->isOK() ) {
-                       // Critical file deletion error
-                       // Roll back inserts, release lock and abort
-                       // TODO: delete the defunct filearchive rows if we are using a non-transactional DB
-                       $this->file->unlockAndRollback();
+                       // Critical file deletion error; abort
+                       $this->file->unlock();
 
                        return $this->status;
                }
 
+               // Copy the image/oldimage rows to filearchive
+               $this->doDBInserts();
                // Delete image/oldimage rows
                $this->doDBDeletes();
 
@@ -2850,33 +2876,30 @@ class LocalFileMoveBatch {
        public function execute() {
                $repo = $this->file->repo;
                $status = $repo->newGood();
+               $destFile = wfLocalFile( $this->target );
+
+               $this->file->lock(); // begin
+               $destFile->lock(); // quickly fail if destination is not available
 
                $triplets = $this->getMoveTriplets();
                $checkStatus = $this->removeNonexistentFiles( $triplets );
                if ( !$checkStatus->isGood() ) {
-                       $status->merge( $checkStatus );
+                       $destFile->unlock();
+                       $this->file->unlock();
+                       $status->merge( $checkStatus ); // couldn't talk to file backend
                        return $status;
                }
                $triplets = $checkStatus->value;
-               $destFile = wfLocalFile( $this->target );
 
-               $this->file->lock(); // begin
-               $destFile->lock(); // quickly fail if destination is not available
-               // Rename the file versions metadata in the DB.
-               // This implicitly locks the destination file, which avoids race conditions.
-               // If we moved the files from A -> C before DB updates, another process could
-               // move files from B -> C at this point, causing storeBatch() to fail and thus
-               // cleanupTarget() to trigger. It would delete the C files and cause data loss.
-               $statusDb = $this->doDBUpdates();
+               // Verify the file versions metadata in the DB.
+               $statusDb = $this->verifyDBUpdates();
                if ( !$statusDb->isGood() ) {
                        $destFile->unlock();
-                       $this->file->unlockAndRollback();
+                       $this->file->unlock();
                        $statusDb->ok = false;
 
                        return $statusDb;
                }
-               wfDebugLog( 'imagemove', "Renamed {$this->file->getName()} in database: " .
-                       "{$statusDb->successCount} successes, {$statusDb->failCount} failures" );
 
                if ( !$repo->hasSha1Storage() ) {
                        // Copy the files into their new location.
@@ -2889,7 +2912,7 @@ class LocalFileMoveBatch {
                                // Delete any files copied over (while the destination is still locked)
                                $this->cleanupTarget( $triplets );
                                $destFile->unlock();
-                               $this->file->unlockAndRollback(); // unlocks the destination
+                               $this->file->unlock();
                                wfDebugLog( 'imagemove', "Error in moving files: "
                                        . $statusMove->getWikiText( false, false, 'en' ) );
                                $statusMove->ok = false;
@@ -2899,6 +2922,12 @@ class LocalFileMoveBatch {
                        $status->merge( $statusMove );
                }
 
+               // Rename the file versions metadata in the DB.
+               $this->doDBUpdates();
+
+               wfDebugLog( 'imagemove', "Renamed {$this->file->getName()} in database: " .
+                       "{$statusDb->successCount} successes, {$statusDb->failCount} failures" );
+
                $destFile->unlock();
                $this->file->unlock(); // done
 
@@ -2911,33 +2940,62 @@ class LocalFileMoveBatch {
        }
 
        /**
-        * Do the database updates and return a new FileRepoStatus indicating how
-        * many rows where updated.
+        * Verify the database updates and return a new FileRepoStatus indicating how
+        * many rows would be updated.
         *
         * @return FileRepoStatus
         */
-       protected function doDBUpdates() {
+       protected function verifyDBUpdates() {
                $repo = $this->file->repo;
                $status = $repo->newGood();
                $dbw = $this->db;
 
-               // Update current image
-               $dbw->update(
+               $hasCurrent = $dbw->selectField(
                        'image',
-                       [ 'img_name' => $this->newName ],
+                       '1',
                        [ 'img_name' => $this->oldName ],
-                       __METHOD__
+                       __METHOD__,
+                       [ 'FOR UPDATE' ]
+               );
+               $oldRowCount = $dbw->selectField(
+                       'oldimage',
+                       'COUNT(*)',
+                       [ 'oi_name' => $this->oldName ],
+                       __METHOD__,
+                       [ 'FOR UPDATE' ]
                );
 
-               if ( $dbw->affectedRows() ) {
+               if ( $hasCurrent ) {
                        $status->successCount++;
                } else {
                        $status->failCount++;
-                       $status->fatal( 'imageinvalidfilename' );
-
-                       return $status;
                }
+               $status->successCount += $oldRowCount;
+               // Bug 34934: oldCount is based on files that actually exist.
+               // There may be more DB rows than such files, in which case $affected
+               // can be greater than $total. We use max() to avoid negatives here.
+               $status->failCount += max( 0, $this->oldCount - $oldRowCount );
+               if ( $status->failCount ) {
+                       $status->error( 'imageinvalidfilename' );
+               }
+
+               return $status;
+       }
 
+       /**
+        * Do the database updates and return a new FileRepoStatus indicating how
+        * many rows where updated.
+        */
+       protected function doDBUpdates() {
+               $dbw = $this->db;
+
+               // Update current image
+               $dbw->update(
+                       'image',
+                       [ 'img_name' => $this->newName ],
+                       [ 'img_name' => $this->oldName ],
+                       __METHOD__
+               );
                // Update old images
                $dbw->update(
                        'oldimage',
@@ -2949,19 +3007,6 @@ class LocalFileMoveBatch {
                        [ 'oi_name' => $this->oldName ],
                        __METHOD__
                );
-
-               $affected = $dbw->affectedRows();
-               $total = $this->oldCount;
-               $status->successCount += $affected;
-               // Bug 34934: $total is based on files that actually exist.
-               // There may be more DB rows than such files, in which case $affected
-               // can be greater than $total. We use max() to avoid negatives here.
-               $status->failCount += max( 0, $total - $affected );
-               if ( $status->failCount ) {
-                       $status->error( 'imageinvalidfilename' );
-               }
-
-               return $status;
        }
 
        /**
@@ -3047,6 +3092,17 @@ class LocalFileMoveBatch {
        }
 }
 
-class LocalFileLockError extends Exception {
+class LocalFileLockError extends ErrorPageError {
+       public function __construct( Status $status ) {
+               parent::__construct(
+                       'actionfailed',
+                       $status->getMessage()
+               );
+       }
 
+       public function report() {
+               global $wgOut;
+               $wgOut->setStatusCode( 429 );
+               parent::report();
+       }
 }
index c8a25f0..6884f65 100644 (file)
@@ -113,6 +113,7 @@ abstract class ImageGalleryBase extends ContextSource {
                                'packed' => 'PackedImageGallery',
                                'packed-hover' => 'PackedHoverImageGallery',
                                'packed-overlay' => 'PackedOverlayImageGallery',
+                               'slideshow' => 'SlideshowImageGallery',
                        ];
                        // Allow extensions to make a new gallery format.
                        Hooks::run( 'GalleryGetModes', [ &self::$modeMapping ] );
diff --git a/includes/gallery/SlideshowImageGallery.php b/includes/gallery/SlideshowImageGallery.php
new file mode 100644 (file)
index 0000000..3f0c932
--- /dev/null
@@ -0,0 +1,37 @@
+<?php
+/**
+ * A slideshow gallery shows one image at a time with controls to move around.
+ *
+ * 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
+ */
+
+class SlideshowImageGallery extends TraditionalImageGallery {
+       function __construct( $mode = 'traditional', IContextSource $context = null ) {
+               parent::__construct( $mode, $context );
+               // Does not support per row option.
+               $this->mPerRow = 0;
+       }
+
+       /**
+        * Add javascript adds interface elements
+        * @return array
+        */
+       protected function getModules() {
+               return [ 'mediawiki.page.gallery.slideshow' ];
+       }
+}
index 2fb2281..f6527b8 100644 (file)
@@ -189,8 +189,16 @@ class TraditionalImageGallery extends ImageGalleryBase {
                                // Preloaded into LinkCache above
                                Linker::linkKnown(
                                        $nt,
-                                       htmlspecialchars( $lang->truncate( $nt->getText(), $this->mCaptionLength ) )
-                               ) . "<br />\n" :
+                                       htmlspecialchars(
+                                               $this->mCaptionLength !== true ?
+                                                       $lang->truncate( $nt->getText(), $this->mCaptionLength ) :
+                                                       $nt->getText()
+                                       ),
+                                       [
+                                               'class' => 'galleryfilename' .
+                                                       ( $this->mCaptionLength === true ? ' galleryfilename-truncate' : '' )
+                                       ]
+                               ) . "\n" :
                                '';
 
                        $galleryText = $textlink . $text . $fileSize;
index 4a6b804..a553839 100644 (file)
@@ -118,9 +118,9 @@ class HTMLCheckField extends HTMLFormField {
 
                // GetCheck won't work like we want for checks.
                // Fetch the value in either one of the two following case:
-               // - we have a valid token (form got posted or GET forged by the user)
+               // - we have a valid submit attempt (form was just submitted, or a GET URL forged by the user)
                // - checkbox name has a value (false or true), ie is not null
-               if ( $request->getCheck( 'wpEditToken' ) || $request->getVal( $this->mName ) !== null ) {
+               if ( $this->isSubmitAttempt( $request ) || $request->getVal( $this->mName ) !== null ) {
                        return $invert
                                ? !$request->getBool( $this->mName )
                                : $request->getBool( $this->mName );
index 9f67233..b324fb6 100644 (file)
@@ -225,22 +225,13 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
         * @return array
         */
        function loadDataFromRequest( $request ) {
-               if ( $this->mParent->getMethod() == 'post' ) {
-                       if ( $request->wasPosted() ) {
-                               // Checkboxes are not added to the request arrays if they're not checked,
-                               // so it's perfectly possible for there not to be an entry at all
-                               return $request->getArray( $this->mName, [] );
-                       } else {
-                               // That's ok, the user has not yet submitted the form, so show the defaults
-                               return $this->getDefault();
-                       }
-               } else {
-                       // This is the impossible case: if we look at $_GET and see no data for our
-                       // field, is it because the user has not yet submitted the form, or that they
-                       // have submitted it with all the options unchecked. We will have to assume the
-                       // latter, which basically means that you can't specify 'positive' defaults
-                       // for GET forms.
+               if ( $this->isSubmitAttempt( $request ) ) {
+                       // Checkboxes are just not added to the request arrays if they're not checked,
+                       // so it's perfectly possible for there not to be an entry at all
                        return $request->getArray( $this->mName, [] );
+               } else {
+                       // That's ok, the user has not yet submitted the form, so show the defaults
+                       return $this->getDefault();
                }
        }
 
index 8ac4cf2..a7acd8b 100644 (file)
  *    'help-messages'       -- array of message keys/objects. As above, each item can
  *                             be an array of msg key and then parameters.
  *                             Overwrites 'help'.
+ *    'notice'              -- message text for a message to use as a notice in the field.
+ *                             Currently used by OOUI form fields only.
+ *    'notice-messages'     -- array of message keys/objects to use for notice.
+ *                             Overrides 'notice'.
+ *    'notice-message'      -- message key or object to use as a notice.
  *    'required'            -- passed through to the object, indicating that it
  *                             is a required field.
  *    'size'                -- the length of text fields
@@ -190,6 +195,7 @@ class HTMLForm extends ContextSource {
        protected $mSubmitText;
        protected $mSubmitTooltip;
 
+       protected $mFormIdentifier;
        protected $mTitle;
        protected $mMethod = 'post';
        protected $mWasSubmitted = false;
@@ -480,7 +486,14 @@ class HTMLForm extends ContextSource {
                }
 
                # Load data from the request.
-               $this->loadData();
+               if (
+                       $this->mFormIdentifier === null ||
+                       $this->getRequest()->getVal( 'wpFormIdentifier' ) === $this->mFormIdentifier
+               ) {
+                       $this->loadData();
+               } else {
+                       $this->mFieldData = [];
+               }
 
                return $this;
        }
@@ -492,22 +505,29 @@ class HTMLForm extends ContextSource {
        public function tryAuthorizedSubmit() {
                $result = false;
 
-               $submit = false;
+               $identOkay = false;
+               if ( $this->mFormIdentifier === null ) {
+                       $identOkay = true;
+               } else {
+                       $identOkay = $this->getRequest()->getVal( 'wpFormIdentifier' ) === $this->mFormIdentifier;
+               }
+
+               $tokenOkay = false;
                if ( $this->getMethod() !== 'post' ) {
-                       $submit = true; // no session check needed
+                       $tokenOkay = true; // no session check needed
                } elseif ( $this->getRequest()->wasPosted() ) {
                        $editToken = $this->getRequest()->getVal( 'wpEditToken' );
                        if ( $this->getUser()->isLoggedIn() || $editToken !== null ) {
                                // Session tokens for logged-out users have no security value.
                                // However, if the user gave one, check it in order to give a nice
                                // "session expired" error instead of "permission denied" or such.
-                               $submit = $this->getUser()->matchEditToken( $editToken, $this->mTokenSalt );
+                               $tokenOkay = $this->getUser()->matchEditToken( $editToken, $this->mTokenSalt );
                        } else {
-                               $submit = true;
+                               $tokenOkay = true;
                        }
                }
 
-               if ( $submit ) {
+               if ( $tokenOkay && $identOkay ) {
                        $this->mWasSubmitted = true;
                        $result = $this->trySubmit();
                }
@@ -1042,6 +1062,12 @@ class HTMLForm extends ContextSource {
         */
        public function getHiddenFields() {
                $html = '';
+               if ( $this->mFormIdentifier !== null ) {
+                       $html .= Html::hidden(
+                               'wpFormIdentifier',
+                               $this->mFormIdentifier
+                       ) . "\n";
+               }
                if ( $this->getMethod() === 'post' ) {
                        $html .= Html::hidden(
                                'wpEditToken',
@@ -1327,6 +1353,27 @@ class HTMLForm extends ContextSource {
                return $this;
        }
 
+       /**
+        * Set an internal identifier for this form. It will be submitted as a hidden form field, allowing
+        * HTMLForm to determine whether the form was submitted (or merely viewed). Setting this serves
+        * two purposes:
+        *
+        * - If you use two or more forms on one page, it allows HTMLForm to identify which of the forms
+        *   was submitted, and not attempt to validate the other ones.
+        * - If you use checkbox or multiselect fields inside a form using the GET method, it allows
+        *   HTMLForm to distinguish between the initial page view and a form submission with all
+        *   checkboxes or select options unchecked.
+        *
+        * @since 1.28
+        * @param string $ident
+        * @return $this
+        */
+       public function setFormIdentifier( $ident ) {
+               $this->mFormIdentifier = $ident;
+
+               return $this;
+       }
+
        /**
         * Stop a default submit button being shown for this form. This implies that an
         * alternate submit method must be provided manually.
index 9f5e728..5f6460d 100644 (file)
@@ -349,6 +349,20 @@ abstract class HTMLFormField {
                $this->mShowEmptyLabels = $show;
        }
 
+       /**
+        * Can we assume that the request is an attempt to submit a HTMLForm, as opposed to an attempt to
+        * just view it? This can't normally be distinguished for e.g. checkboxes.
+        *
+        * Returns true if the request has a field for a CSRF token (wpEditToken) or a form identifier
+        * (wpFormIdentifier).
+        *
+        * @param WebRequest $request
+        * @return boolean
+        */
+       protected function isSubmitAttempt( WebRequest $request ) {
+               return $request->getCheck( 'wpEditToken' ) || $request->getCheck( 'wpFormIdentifier' );
+       }
+
        /**
         * Get the value that this input has been set to from a posted form,
         * or the input's default value if it has not been set.
@@ -598,11 +612,17 @@ abstract class HTMLFormField {
                        $error = new OOUI\HtmlSnippet( $error );
                }
 
+               $notices = $this->getNotices();
+               foreach ( $notices as &$notice ) {
+                       $notice = new OOUI\HtmlSnippet( $notice );
+               }
+
                $config = [
                        'classes' => [ "mw-htmlform-field-$fieldType", $this->mClass ],
                        'align' => $this->getLabelAlignOOUI(),
                        'help' => $helpText !== null ? new OOUI\HtmlSnippet( $helpText ) : null,
                        'errors' => $errors,
+                       'notices' => $notices,
                        'infusable' => $infusable,
                ];
 
@@ -840,6 +860,30 @@ abstract class HTMLFormField {
                return $errors;
        }
 
+       /**
+        * Determine notices to display for the field.
+        *
+        * @since 1.28
+        * @return string[]
+        */
+       function getNotices() {
+               $notices = [];
+
+               if ( isset( $this->mParams['notice-message'] ) ) {
+                       $notices[] = $this->getMessage( $this->mParams['notice-message'] )->parse();
+               }
+
+               if ( isset( $this->mParams['notice-messages'] ) ) {
+                       foreach ( $this->mParams['notice-messages'] as $msg ) {
+                               $notices[] = $this->getMessage( $msg )->parse();
+                       }
+               } elseif ( isset( $this->mParams['notice'] ) ) {
+                       $notices[] = $this->mParams['notice'];
+               }
+
+               return $notices;
+       }
+
        /**
         * @return string HTML
         */
index 23125bd..a231b2f 100644 (file)
@@ -123,23 +123,13 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
         * @return string
         */
        function loadDataFromRequest( $request ) {
-               if ( $this->mParent->getMethod() == 'post' ) {
-                       if ( $request->wasPosted() ) {
-                               # Checkboxes are just not added to the request arrays if they're not checked,
-                               # so it's perfectly possible for there not to be an entry at all
-                               return $request->getArray( $this->mName, [] );
-                       } else {
-                               # That's ok, the user has not yet submitted the form, so show the defaults
-                               return $this->getDefault();
-                       }
-               } else {
-                       # This is the impossible case: if we look at $_GET and see no data for our
-                       # field, is it because the user has not yet submitted the form, or that they
-                       # have submitted it with all the options unchecked? We will have to assume the
-                       # latter, which basically means that you can't specify 'positive' defaults
-                       # for GET forms.
-                       # @todo FIXME...
+               if ( $this->isSubmitAttempt( $request ) ) {
+                       // Checkboxes are just not added to the request arrays if they're not checked,
+                       // so it's perfectly possible for there not to be an entry at all
                        return $request->getArray( $this->mName, [] );
+               } else {
+                       // That's ok, the user has not yet submitted the form, so show the defaults
+                       return $this->getDefault();
                }
        }
 
index 24b15bd..5225983 100644 (file)
@@ -3,7 +3,7 @@
  * Creates a Html::namespaceSelector input field with a button assigned to the input field.
  */
 class HTMLSelectNamespaceWithButton extends HTMLSelectNamespace {
-       /** @var HTMLFormClassWithButton $mClassWithButton */
+       /** @var HTMLFormFieldWithButton $mClassWithButton */
        protected $mClassWithButton = null;
 
        public function __construct( $info ) {
index c6dac32..7c1c673 100644 (file)
@@ -3,7 +3,7 @@
  * Creates a text input field with a button assigned to the input field.
  */
 class HTMLTextFieldWithButton extends HTMLTextField {
-       /** @var HTMLFormClassWithButton $mClassWithButton */
+       /** @var HTMLFormFieldWithButton $mClassWithButton */
        protected $mClassWithButton = null;
 
        public function __construct( $info ) {
index 259d514..406667e 100644 (file)
@@ -332,8 +332,7 @@ class WikiImporter {
                }
 
                try {
-                       $dbw = wfGetDB( DB_MASTER );
-                       return $dbw->deadlockLoop( [ $revision, 'importOldRevision' ] );
+                       return $revision->importOldRevision();
                } catch ( MWContentSerializationException $ex ) {
                        $this->notice( 'import-error-unserialize',
                                $revision->getTitle()->getPrefixedText(),
@@ -351,8 +350,7 @@ class WikiImporter {
         * @return bool
         */
        public function importLogItem( $revision ) {
-               $dbw = wfGetDB( DB_MASTER );
-               return $dbw->deadlockLoop( [ $revision, 'importLogItem' ] );
+               return $revision->importLogItem();
        }
 
        /**
@@ -361,8 +359,7 @@ class WikiImporter {
         * @return bool
         */
        public function importUpload( $revision ) {
-               $dbw = wfGetDB( DB_MASTER );
-               return $dbw->deadlockLoop( [ $revision, 'importUpload' ] );
+               return $revision->importUpload();
        }
 
        /**
@@ -840,7 +837,7 @@ class WikiImporter {
                                'text',
                                ''
                        ] ) ) &&
-                       (int)( strlen( $revisionInfo['text'] ) / 1024 ) > $wgMaxArticleSize
+                       strlen( $revisionInfo['text'] ) > $wgMaxArticleSize * 1024
                ) {
                        throw new MWException( 'The text of ' .
                                ( isset( $revisionInfo['id'] ) ?
index 356a79f..d78d61a 100644 (file)
@@ -574,7 +574,7 @@ class WikiRevision {
                if ( !$this->getTitle() ) {
                        wfDebug( __METHOD__ . ": skipping invalid {$this->type}/{$this->action} log time, timestamp " .
                                $this->timestamp . "\n" );
-                       return;
+                       return false;
                }
                # Check if it exists already
                // @todo FIXME: Use original log ID (better for backups)
@@ -594,7 +594,7 @@ class WikiRevision {
                        wfDebug( __METHOD__
                                . ": skipping existing item for Log:{$this->type}/{$this->action}, timestamp "
                                . $this->timestamp . "\n" );
-                       return;
+                       return false;
                }
                $log_id = $dbw->nextSequenceValue( 'logging_log_id_seq' );
                $data = [
@@ -610,6 +610,8 @@ class WikiRevision {
                        'log_params' => $this->params
                ];
                $dbw->insert( 'logging', $data, __METHOD__ );
+
+               return true;
        }
 
        /**
index 6a20abc..86b2f3b 100644 (file)
@@ -75,6 +75,7 @@ abstract class DatabaseUpdater {
                PopulateFilearchiveSha1::class,
                PopulateBacklinkNamespace::class,
                FixDefaultJsonContentPages::class,
+               CleanupEmptyCategories::class,
        ];
 
        /**
@@ -409,7 +410,6 @@ abstract class DatabaseUpdater {
        public function doUpdates( $what = [ 'core', 'extensions', 'stats' ] ) {
                global $wgVersion;
 
-               $this->db->begin( __METHOD__ );
                $what = array_flip( $what );
                $this->skipSchema = isset( $what['noschema'] ) || $this->fileHandle !== null;
                if ( isset( $what['core'] ) ) {
@@ -431,8 +431,6 @@ abstract class DatabaseUpdater {
                        $this->writeSchemaUpdateFile();
                        $this->setAppliedUpdates( "$wgVersion-schema", $this->updatesSkipped );
                }
-
-               $this->db->commit( __METHOD__ );
        }
 
        /**
index ae1a2a7..5e3758d 100644 (file)
@@ -2,6 +2,9 @@
 /**
  * Base code for MediaWiki installer.
  *
+ * DO NOT PATCH THIS FILE IF YOU NEED TO CHANGE INSTALLER BEHAVIOR IN YOUR PACKAGE!
+ * See mw-config/overrides/README for details.
+ *
  * 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
@@ -118,8 +121,6 @@ abstract class Installer {
        protected $envChecks = [
                'envCheckDB',
                'envCheckBrokenXML',
-               'envCheckMbstring',
-               'envCheckXML',
                'envCheckPCRE',
                'envCheckMemory',
                'envCheckCache',
@@ -133,9 +134,6 @@ abstract class Installer {
                'envCheckUploadsDirectory',
                'envCheckLibicu',
                'envCheckSuhosinMaxValueLength',
-               'envCheckCtype',
-               'envCheckIconv',
-               'envCheckJSON',
        ];
 
        /**
@@ -182,6 +180,7 @@ abstract class Installer {
                'wgUseInstantCommons',
                'wgUpgradeKey',
                'wgDefaultSkin',
+               'wgPingback',
        ];
 
        /**
@@ -788,40 +787,6 @@ abstract class Installer {
                return true;
        }
 
-       /**
-        * Environment check for mbstring.func_overload.
-        * @return bool
-        */
-       protected function envCheckMbstring() {
-               if ( wfIniGetBool( 'mbstring.func_overload' ) ) {
-                       $this->showError( 'config-mbstring' );
-
-                       return false;
-               }
-
-               if ( !function_exists( 'mb_substr' ) ) {
-                       $this->showError( 'config-mbstring-absent' );
-
-                       return false;
-               }
-
-               return true;
-       }
-
-       /**
-        * Environment check for the XML module.
-        * @return bool
-        */
-       protected function envCheckXML() {
-               if ( !function_exists( "utf8_encode" ) ) {
-                       $this->showError( 'config-xml-bad' );
-
-                       return false;
-               }
-
-               return true;
-       }
-
        /**
         * Environment check for the PCRE module.
         *
@@ -1174,45 +1139,6 @@ abstract class Installer {
                }
        }
 
-       /**
-        * @return bool
-        */
-       protected function envCheckCtype() {
-               if ( !function_exists( 'ctype_digit' ) ) {
-                       $this->showError( 'config-ctype' );
-
-                       return false;
-               }
-
-               return true;
-       }
-
-       /**
-        * @return bool
-        */
-       protected function envCheckIconv() {
-               if ( !function_exists( 'iconv' ) ) {
-                       $this->showError( 'config-iconv' );
-
-                       return false;
-               }
-
-               return true;
-       }
-
-       /**
-        * @return bool
-        */
-       protected function envCheckJSON() {
-               if ( !function_exists( 'json_decode' ) ) {
-                       $this->showError( 'config-json' );
-
-                       return false;
-               }
-
-               return true;
-       }
-
        /**
         * Environment prep for the server hostname.
         */
diff --git a/includes/installer/InstallerOverrides.php b/includes/installer/InstallerOverrides.php
new file mode 100644 (file)
index 0000000..eba3a20
--- /dev/null
@@ -0,0 +1,76 @@
+<?php
+/**
+ * MediaWiki installer overrides. See mw-config/overrides/README for details.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @since 1.20
+ */
+class InstallerOverrides {
+       private static function getOverrides() {
+               global $IP;
+               static $overrides;
+
+               if ( !$overrides ) {
+                       $overrides = [
+                               'LocalSettingsGenerator' => 'LocalSettingsGenerator',
+                               'WebInstaller' => 'WebInstaller',
+                               'CliInstaller' => 'CliInstaller',
+                       ];
+                       foreach ( glob( "$IP/mw-config/overrides/*.php" ) as $file ) {
+                               require $file;
+                       }
+               }
+
+               return $overrides;
+       }
+
+       /**
+        * Instantiates and returns an instance of LocalSettingsGenerator or its descendant classes
+        * @param Installer $installer
+        * @return LocalSettingsGenerator
+        */
+       public static function getLocalSettingsGenerator( Installer $installer ) {
+               $className = self::getOverrides()['LocalSettingsGenerator'];
+               return new $className( $installer );
+       }
+
+       /**
+        * Instantiates and returns an instance of WebInstaller or its descendant classes
+        * @param WebRequest $request
+        * @return WebInstaller
+        */
+       public static function getWebInstaller( WebRequest $request ) {
+               $className = self::getOverrides()['WebInstaller'];
+               return new $className( $request );
+       }
+
+       /**
+        * Instantiates and returns an instance of CliInstaller or its descendant classes
+        * @param string $siteName
+        * @param string|null $admin
+        * @param array $options
+        * @return CliInstaller
+        */
+       public static function getCliInstaller( $siteName, $admin = null, array $options = [] ) {
+               $className = self::getOverrides()['CliInstaller'];
+               return new $className( $siteName, $admin, $options );
+       }
+}
index ced7b93..1d7c7f2 100644 (file)
@@ -64,7 +64,7 @@ class LocalSettingsGenerator {
                                'wgRightsText', '_MainCacheType', 'wgEnableUploads',
                                '_MemCachedServers', 'wgDBserver', 'wgDBuser',
                                'wgDBpassword', 'wgUseInstantCommons', 'wgUpgradeKey', 'wgDefaultSkin',
-                               'wgMetaNamespace', 'wgLogo', 'wgAuthenticationTokenVersion',
+                               'wgMetaNamespace', 'wgLogo', 'wgAuthenticationTokenVersion', 'wgPingback',
                        ],
                        $db->getGlobalNames()
                );
@@ -72,7 +72,8 @@ class LocalSettingsGenerator {
                $unescaped = [ 'wgRightsIcon', 'wgLogo' ];
                $boolItems = [
                        'wgEnableEmail', 'wgEnableUserEmail', 'wgEnotifUserTalk',
-                       'wgEnotifWatchlist', 'wgEmailAuthentication', 'wgEnableUploads', 'wgUseInstantCommons'
+                       'wgEnotifWatchlist', 'wgEmailAuthentication', 'wgEnableUploads', 'wgUseInstantCommons',
+                       'wgPingback',
                ];
 
                foreach ( $confItems as $c ) {
@@ -372,6 +373,11 @@ ${serverSetting}
 # InstantCommons allows wiki to use images from https://commons.wikimedia.org
 \$wgUseInstantCommons = {$this->values['wgUseInstantCommons']};
 
+# Periodically send a pingback to https://www.mediawiki.org/ with basic data
+# about this MediaWiki instance. The Wikimedia Foundation shares this data
+# with MediaWiki developers to help guide future development efforts.
+\$wgPingback = {$this->values['wgPingback']};
+
 ## If you use ImageMagick (or any other shell command) on a
 ## Linux server, this will need to be set to the name of an
 ## available UTF-8 locale
index 4c4e6b7..c08212e 100644 (file)
@@ -1156,6 +1156,20 @@ class WebInstaller extends Installer {
                return Html::rawElement( 'div', [ 'class' => 'config-download-link' ], $anchor );
        }
 
+       /**
+        * If the software package wants the LocalSettings.php file
+        * to be placed in a specific location, override this function
+        * (see mw-config/overrides/README) to return the path of
+        * where the file should be saved, or false for a generic
+        * "in the base of your install"
+        *
+        * @since 1.27
+        * @return string|bool
+        */
+       public function getLocalSettingsLocation() {
+               return false;
+       }
+
        /**
         * @return bool
         */
index 11a1833..456058e 100644 (file)
@@ -37,13 +37,20 @@ class WebInstallerComplete extends WebInstallerPage {
 
                $this->startForm();
                $this->parent->disableLinkPopups();
+               $location = $this->parent->getLocalSettingsLocation();
+               $msg = 'config-install-done';
+               if ( $location !== false ) {
+                       // config-install-done-path
+                       $msg .= '-path';
+               }
                $this->addHTML(
                        $this->parent->getInfoBox(
-                               wfMessage( 'config-install-done',
+                               wfMessage( $msg,
                                        $lsUrl,
                                        $this->getVar( 'wgServer' ) .
                                        $this->getVar( 'wgScriptPath' ) . '/index.php',
-                                       '<downloadlink/>'
+                                       '<downloadlink/>',
+                                       $location ?: ''
                                )->plain(), 'tick-32.png'
                        )
                );
index dcd30cf..e6deed5 100644 (file)
@@ -50,6 +50,11 @@ class WebInstallerName extends WebInstallerPage {
                        wfMessage( 'config-ns-other-default' )->inContentLanguage()->text()
                );
 
+               $pingbackInfo = ( new Pingback() )->getSystemInfo();
+               // Database isn't available in config yet, so take it
+               // from the installer
+               $pingbackInfo['database'] = $this->getVar( 'wgDBtype' );
+
                $this->addHTML(
                        $this->parent->getTextBox( [
                                'var' => 'wgSitename',
@@ -100,6 +105,15 @@ class WebInstallerName extends WebInstallerPage {
                                'label' => 'config-subscribe',
                                'help' => $this->parent->getHelpBox( 'config-subscribe-help' )
                        ] ) .
+                       $this->parent->getCheckBox( [
+                               'var' => 'wgPingback',
+                               'label' => 'config-pingback',
+                               'help' => $this->parent->getHelpBox(
+                                       'config-pingback-help',
+                                       FormatJson::encode( $pingbackInfo, true )
+                               ),
+                               'value' => true,
+                       ] ) .
                        $this->getFieldsetEnd() .
                        $this->parent->getInfoBox( wfMessage( 'config-almost-done' )->text() ) .
                        // getRadioSet() builds a set of labeled radio buttons.
@@ -129,7 +143,7 @@ class WebInstallerName extends WebInstallerPage {
                $retVal = true;
                $this->parent->setVarsFromRequest( [ 'wgSitename', '_NamespaceType',
                        '_AdminName', '_AdminPassword', '_AdminPasswordConfirm', '_AdminEmail',
-                       '_Subscribe', '_SkipOptional', 'wgMetaNamespace' ] );
+                       '_Subscribe', '_SkipOptional', 'wgMetaNamespace', 'wgPingback' ] );
 
                // Validate site name
                if ( strval( $this->getVar( 'wgSitename' ) ) === '' ) {
index f8dc8ee..62fe785 100644 (file)
@@ -267,6 +267,7 @@ class WebInstallerOutput {
                }
 ?>
 <?php echo Html::htmlHeader( $this->getHeadAttribs() ); ?>
+
 <head>
        <meta name="robots" content="noindex, nofollow" />
        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
index 085bf12..239ad7e 100644 (file)
@@ -20,7 +20,7 @@
        "config-localsettings-badkey": "مفتاح الترقية الذي قدمته غير صحيح.",
        "config-upgrade-key-missing": "تنصيب موجود للميدياويكي قد تم اكتشافه.\nلترقية هذا التنصيب، الرجاء وضع السطر أسفل <code>LocalSettings.php</code> الخاصة بك:\n\n$1",
        "config-localsettings-incomplete": "صفحة <code>LocalSettings.php</code> يبدو أنها ناقصة.\nالمتغير $1 لم يتم تعيينه.\nالرجاء تغيير <code>LocalSettings.php</code> لكي يتم تعيين المتغير، ثم اضغط على \"{{int:Config-continue}}\".",
-       "config-localsettings-connection-error": "تمت مصادفة خطأ أثناء الاتصال بقاعدة البيانات باستخدام الإعدادات المحددة في <code>LocalSettings.php</code> أو <code>AdminSettings.php</code>. الرجاء إصلاح هذه الإعدادات وحاول مجددًا.\n\n$1",
+       "config-localsettings-connection-error": "تمت مصادفة خطأ أثناء الاتصال بقاعدة البيانات باستخدام الإعدادات المحددة في <code>LocalSettings.php</code> أو <code>LocalSettings.php</code>. الرجاء إصلاح هذه الإعدادات وحاول مجددًا.\n\n$1",
        "config-session-error": "خطأ في بدء الجلسة: $1",
        "config-session-expired": "يبدو أن بيانات جلستك قد انتهت صلاحيتها.\nالجلسات مكونة مدى الحياة من $1.\nيمكنك زيادة هذه بتعيين <code>session.gc_maxlifetime</code> في php.ini.\nأعد تشغيل عميل التثبيت.",
        "config-no-session": "بيانات جلستك قد ضاعت!\nتحقق من php.ini للتأكد أن <code>session.save_path</code> تم تعيينه كدليل مناسب.",
index aa4f1c9..ea96cfe 100644 (file)
@@ -55,8 +55,6 @@
        "config-no-db": "¡Nun pudo alcontrase un controlador de base de datos afayadizu! Necesites instalar un controlador de base de datos pa PHP.\n{{PLURAL:$2|Tien sofitu el tipu de base de datos siguiente|Tienen sofitu los tipos de base de datos siguientes}}: $1.\n\nSi compilasti PHP tu mesmu, reconfigúralu con un cliente de base de datos activáu, por exemplu, usando <code>./configure --with-mysqli</code>.\nSi instalasti PHP dende un paquete de Debian o Ubuntu, necesites instalar tamién,por exemplu, el paquete <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Avisu:''' tien SQLite $1, que ye inferior a la versión mínima necesaria $2. SQLite nun tará disponible.",
        "config-no-fts3": "'''Avisu:''' SQLite ta compiláu ensin el [//sqlite.org/fts3.html módulu FTS3]; les funciones de gueta nun tarán disponibles nesti sistema.",
-       "config-mbstring": "<strong>Fatal: ¡[@http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] ta activáu!</strong>\nEsta opción causa errores y pué corromper los datos de mou imprevisible.\nNun puedes instalar o utilizar MediaWiki nun siendo que esta opción tea desactivada.",
-       "config-xml-bad": "Falta'l módulu XML de PHP.\nMediaWiki rique funciones d'esti módulu y nun va funcionar con esta configuración.\nSeique precises instalar el paquete RPM llamáu php-xml.",
        "config-pcre-old": "<strong>Fatal:</strong> Ríquese PCRE $1 o posterior.\nEl binariu de PHP ta enllazáu con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Más información].",
        "config-apc": "[http://www.php.net/apc APC] ta instaláu",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] ta instaláu",
index c81aa66..606b97b 100644 (file)
@@ -23,7 +23,7 @@
        "config-localsettings-badkey": "Дөрөҫ булмаған асҡыс күрһәттегеҙ",
        "config-upgrade-key-missing": "Ҡуйылған MediaWiki копияһы булыуы асыҡланды. Яңыртыу өсөн файл аҙағында ҡуйығыҙ: <code>LocalSettings.php</code>:\n\n$1",
        "config-localsettings-incomplete": "Ғәмәлдәге <code>LocalSettings.php</code> файла тулған. $1 билдәләнмәгән. Зинһар өсөн <code>LocalSettings.php</code> кодын үҙгәртегеҙ. Һуңынан ошонда сиртегеҙ «{{int:Config-continue}}».",
-       "config-localsettings-connection-error": "<code>LocalSettings.php</code> көйләүҙәрендә хата китте йәки <code>AdminSettings.php</code> көйләүҙәрендә хата. Зинһар өсөн, көйләүҙәрҙе тәҙәтегеҙ, яңынан эшләп ҡарағыҙ\n$1",
+       "config-localsettings-connection-error": "<code>LocalSettings.php</code> көйләүҙәрендә хата китте йәки <code>LocalSettings.php</code> көйләүҙәрендә хата. Зинһар өсөн, көйләүҙәрҙе тәҙәтегеҙ, яңынан эшләп ҡарағыҙ\n$1",
        "config-session-error": "Эш башлағанда сыҡҡан хата: $1",
        "config-session-expired": "Һеҙҙең ваҡыт үтте. Сессия $1 оҙонлоғона көйләнгән. Уны оҙайтыу өсөн php.ini. эсендә <code>session.gc_maxlifetime</code> кодын үҙгәртегеҙ.\nУрынлаштырыу процессын яңынан башлағыҙ.",
        "config-no-session": "Был сессия юғалған!\nҮҙегеҙҙең php.ini тикшерегеҙ, \n<code>session.save_path</code> коды тейешле каталогҡа урынлаштырылған икәненә ышынғыҙ.",
@@ -45,7 +45,7 @@
        "config-page-restart": "Урынлаштырыуҙы яңынан башларға",
        "config-page-readme": "Мине уҡы",
        "config-page-releasenotes": "Өлгө тураһында мәғлүмәт",
-       "config-page-copying": "Рөхсәтнәмә",
+       "config-page-copying": "Рөхсәтнамә",
        "config-page-upgradedoc": "Яңыртыу",
        "config-page-existingwiki": "Ғәмәлдәге вики",
        "config-help-restart": "Һеҙ үҙегеҙ индергән һәм  һаҡланған әлеге мәғлүмәттәрҙе юйып, урынлаштырыуҙың яңы процессын ебәрергә теләйһегеҙме?",
        "config-no-db": "Мәғлүмәттәр базаһына тура килгән драйверҙарҙы табып булманы!Һеҙгә  PHP өсөн мәғлүмәттәр базаһының  драйверҙарын ҡуйырға кәрәк.{{PLURAL:$2|сираттағы төр ҡулланыла|сираттағы төрҙәр ҡулланыла}}мәғлүмәттәр базалары:$1.\nӘгәр һеҙ үҙегеҙ PHP -ға компиляция яһаған булһағыҙ,  мәғлүмәттәр базаһына клиентты индереп уны яңынан, мәҫәлән, <code>./configure --with-mysqli</code> ярҙамы менән көйләгеҙ. Әгәр ҙә һеҙ PHP -ны Debian йәки Ubuntu пакеттарынан ҡуйһағыҙ, һеҙгә, мәҫәлән,  <code>php5-mysql</code> пакетын да ҡуйырға кәрәк булыр.",
        "config-outdated-sqlite": "'''Киҫәтеү''': Һеҙҙә SQLite  $1 ҡуйылған, $2 тейешле өлгөнән түбән . SQLite асылмаясаҡ.",
        "config-no-fts3": "'''Иғтибар''': SQLite модулһыҙ йыйлған [//sqlite.org/fts3.html FTS3] — был мәғлүмәт базаһы өсөн эҙләү мөмкин булмаясаҡ.",
-       "config-mbstring": "\"Проблема\":  PHP опцияһы тоташтырылған\n[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]!'''\nБыл индерелгән мәғлүмәттәрҙең хаталарына һәм көтөлмәгән боҙолоуҙарға килтерә.\nОпцияны һүндермәйенсә MediaWikiны ҡуйыу һәм ҡулланыу мөмкин түгел.",
-       "config-xml-bad": "РНР өсөн XML-модуль юҡ. \nMediaWiki  бындай конфигурацияла эшләмәйәсәк, сөнки был модулдең функционалы талап ителә.\nБәлки, Һеҙгә RPM-пакет php-xml булдырырыға кәрәк булыр.",
        "config-pcre-old": "'''Фаталь хата:'''  PCRE версияһы йәки яңырағы талап ителә $1.\nБашҡарылыусы файл PHP менән бәйләнгән PCRE  $2версияһы.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Ентекләберәк].",
        "config-pcre-no-utf8": "'''Фаталь хата'''. PHP өсөн PCRE модуле  PCRE_UTF8 менән яраҡлыштырылмаған.\nMediaWiki дөрөҫ эшләһен өсөн UTF-8 талап ителә.",
        "config-memory-raised": "Хәтер сикләнгән PHP  (<code>memory_limit</code>)  $1  $2 тиклем арттырылған.",
        "config-memory-bad": "'''Иғтибар:''' PHP күләме <code>memory_limit</code> $1 тәшкил итә.\nБәлки, был саманан тыш аҙҙыр. \nҠуйылыштың уңышһыҙлыҡҡа осрауы бар!",
-       "config-ctype": "<strong>Фаталь хата:</strong> PHР тотороҡло эшләргә тейеш [http://www.php.net/manual/en/iconv.installation.php киңәйтеү iconv].",
-       "config-iconv": "<strong>Фаталь хата:</strong> PHР тотороҡло эшләргә тейеш [http://www.php.net/manual/en/iconv.installation.php киңәйтеү iconv].",
-       "config-json": "'''Фаталь хата:''' PHP JSON ярҙамынан тыш эшләнгән.\nҺеҙгә йә PHP JSON киңәйтеүен, йәки MediaWiki алдынан [http://pecl.php.net/package/jsonc PECL jsonc] киңәйтеүен ҡуйырға кәрәк.\n* PHP-киңәйтеүсе <code>/etc/php.ini</code> йәки  <code>/etc/php.d/json.ini</code> инергә тейеш булһа ла, Red Hat Enterprise Linux (CentOS) 5 һәм 6, составына инә.\n* 2013 йылдың майынан һуң сығарылған Linux-тың ҡайһы бер  дистрибутивтары  PECL киңәйтеүен <code>php5-json</code> или <code>php-pecl-jsonc</code> кеүек асыр урынға,  PHP киңәйтеүсеһен асмай.",
-       "config-mbstring-absent": "<strong>Фаталь хата:</strong> PHP [http://www.php.net/manual/en/mbstring.setup.php расширения mbstring] ярҙамында компиляция үтергә тейеш.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] урынлаштырылды",
        "config-apc": "[http://www.php.net/apc APC] урынлаштырылды",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] урынлыштырылды",
index a6b4bce..0f8bf2c 100644 (file)
@@ -27,7 +27,6 @@
        "config-page-upgradedoc": "Ipinagpapalangkaw",
        "config-page-existingwiki": "Eksistidong wiki",
        "config-restart": "Iyo, pakipoon kaini otro",
-       "config-xml-bad": "An XML kan PHP na modyul nawawara.\nAn Mediawiki minakaipo nin mga punksyon sa modyul na ini asin dae matrabaho sa laog kaining konpigurasyon.\nIka minakaipong magmuntar kan php-xml RPM package",
        "config-db-wiki-settings": "Bistohon ining wiki",
        "config-db-name": "Pangaran kan datos-sarayan:",
        "config-db-username": "Ngaran-paragamit nin datos-sarayan:",
index a51db82..77cd689 100644 (file)
        "config-env-php": "Усталяваны PHP $1.",
        "config-env-hhvm": "HHVM $1 усталяваная.",
        "config-unicode-using-intl": "Выкарыстоўваецца [http://pecl.php.net/intl intl пашырэньне з PECL] для Unicode-нармалізацыі",
-       "config-unicode-pure-php-warning": "'''Ð\9fапÑ\8fÑ\80Ñ\8dджанÑ\8cне''': [http://pecl.php.net/intl Ð\9fаÑ\88Ñ\8bÑ\80Ñ\8dнÑ\8cне intl Ð· PECL] â\80\94 Ð½Ñ\8f Ñ\81лÑ\83Ñ\88нае Ð´Ð»Ñ\8f Unicode-наÑ\80малÑ\96заÑ\86Ñ\8bÑ\96, Ñ\86Ñ\8fпеÑ\80 Ð²Ñ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваеÑ\86Ñ\86а Ð¼Ð°Ñ\80Ñ\83днаÑ\8f PHP-Ñ\80Ñ\8dалÑ\96заÑ\86Ñ\8bÑ\8f.\nÐ\9aалÑ\96 Ñ\9e Ð\92аÑ\81 Ñ\81айÑ\82 Ð· Ð²Ñ\8bÑ\81окай Ð½Ð°Ð²ÐµÐ´Ð²Ð°ÐµÐ¼асьцю, раім пачытаць пра [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-нармалізацыю].",
-       "config-unicode-update-warning": "'''Папярэджаньне''': усталяваная вэрсія бібліятэкі для Unicode-нармалізацыі выкарыстоўвае састарэлую вэрсію бібліятэкі з [http://site.icu-project.org/ праекту ICU].\nРаім [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations абнавіць], калі ваш сайт будзе працаваць зь Unicode.",
+       "config-unicode-pure-php-warning": "'''Ð\9fапÑ\8fÑ\80Ñ\8dджанÑ\8cне''': [http://pecl.php.net/intl Ð\9fаÑ\88Ñ\8bÑ\80Ñ\8dнÑ\8cне intl Ð· PECL] â\80\94 Ð½Ñ\8f Ñ\81лÑ\83Ñ\88нае Ð´Ð»Ñ\8f Unicode-наÑ\80малÑ\96заÑ\86Ñ\8bÑ\96, Ñ\86Ñ\8fпеÑ\80 Ð²Ñ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваеÑ\86Ñ\86а Ð¼Ð°Ñ\80Ñ\83днаÑ\8f PHP-Ñ\80Ñ\8dалÑ\96заÑ\86Ñ\8bÑ\8f.\nÐ\9aалÑ\96 Ñ\9e Ð\92аÑ\81 Ñ\81айÑ\82 Ð· Ð²Ñ\8bÑ\81окай Ð½Ð°Ð²ÐµÐ´Ð²Ð°Ð»Ñ\8cнасьцю, раім пачытаць пра [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-нармалізацыю].",
+       "config-unicode-update-warning": "'''Папярэджаньне''': усталяваная вэрсія бібліятэкі для Unicode-нармалізацыі выкарыстоўвае састарэлую вэрсію бібліятэкі з [http://site.icu-project.org/ праекту ICU].\nРаім [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations абнавіць], калі ваш сайт будзе працаваць з Unicode.",
        "config-no-db": "Немагчыма знайсьці адпаведны драйвэр базы зьвестак. Вам неабходна ўсталяваць драйвэр базы зьвестак для PHP.\n{{PLURAL:$2|Падтрымліваецца наступны тып базы|Падтрымліваюцца наступныя тыпы базаў}} зьвестак: $1.\n\nКалі вы скампілявалі PHP самастойна, зьмяніце канфігурацыю, каб уключыць кліента базы зьвестак, напрыклад, з дапамогай <code>./configure --with-mysqli</code>.\nКалі вы ўсталявалі PHP з пакунку Debian або Ubuntu, тады вам трэба дадаткова ўсталяваць, напрыклад, пакунак <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Папярэджаньне''': усталяваны SQLite $1, у той час, калі мінімальная сумяшчальная вэрсія — $2. SQLite ня будзе даступны.",
        "config-no-fts3": "'''Папярэджаньне''': SQLite створаны без модуля [//sqlite.org/fts3.html FTS3], для гэтага ўнутранага інтэрфэйсу ня будзе даступная магчымасьць пошуку.",
-       "config-mbstring": "'''Фатальная памылка: рэжым [http://www.php.net/manual/en/ref.info.php#mbstring.overload mbstring.func_overload] уключаны!'''\nГэты рэжым выклікае памылкі і можа шкодзіць зьвесткі непрадказальным чынам.\nПрацяг усталяваньня альбо выкарыстаньне MediaWiki немагчымыя, пакуль рэжым ня будзе выключаны.",
-       "config-xml-bad": "Ня знойдзены модуль XML для PHP.\nMediaWiki патрэбныя функцыі з гэтага модулю, таму MediaWiki ня будзе працаваць у гэтай канфігурацыі.\nМагчыма, вам трэба ўсталяваць RPM-пакет php-xml.",
        "config-pcre-old": "<strong>Крытычная памылка:</strong> патрэбны PCRE вэрсіі $1 або пазьнейшай.\nPHP-файл, які выконваецца, зьвязаны з PCRE вэрсіі $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Больш інфармацыі].",
        "config-pcre-no-utf8": "'''Фатальная памылка''': модуль PCRE для PHP скампіляваны без падтрымкі PCRE_UTF8.\nMediaWiki патрабуе падтрымкі UTF-8 для слушнай працы.",
        "config-memory-raised": "Абмежаваньне на даступную для PHP памяць <code>memory_limit</code> было падвышанае з $1 да $2.",
        "config-memory-bad": "'''Папярэджаньне:''' памер PHP <code>memory_limit</code> складае $1.\nВерагодна, гэта вельмі мала.\nУсталяваньне можа быць няўдалым!",
-       "config-ctype": "'''Фатальная памылка''': PHP мусіць быць скампіляваны з падтрымкай [http://www.php.net/manual/en/ctype.installation.php пашырэньня Ctype].",
-       "config-iconv": "<strong>Непапраўная памылка:</strong> PHP мусіць быць скампіляваны з падтрымкай [http://www.php.net/manual/en/iconv.installation.php пашырэньня iconv].",
-       "config-json": "<strong>Крытычная памылка:</strong> PHP быў скампіляваны без падтрымкі JSON.\nВы павінныя ўсталяваць або пашырэньне PHP JSON, або пашырэньне [http://pecl.php.net/package/jsonc PECL jsonc] перад усталёўкай MediaWiki.\n* Пашырэньне PHP уваходзіць у Red Hat Enterprise Linux (CentOS) 5 і 6, пры гэтым павінна быць падключана ў <code>/etc/php.ini</code> або <code>/etc/php.d/json.ini</code>.\n* Некаторыя дыстрыбутывы Linux, выдадзеныя пасьля траўня 2013 году, ня маюць пашырэньня PHP, замест яго пакуюць пашырэньне PECL як <code>php5-json</code> або <code>php-pecl-jsonc</code>.",
-       "config-mbstring-absent": "<strong>Непапраўная памылка:</strong> PHP мусіць быць скампіляваны з падтрымкай [http://www.php.net/manual/en/mbstring.setup.php пашырэньня mbstring].",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] усталяваны",
        "config-apc": "[http://www.php.net/apc APC] усталяваны",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] усталяваны",
        "config-subscribe": "Падпісацца на [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce сьпіс распаўсюджаньня навінаў пра зьяўленьне новых вэрсіяў].",
        "config-subscribe-help": "Гэта ня вельмі актыўны сьпіс распаўсюджаньня навінаў пра зьяўленьне новых вэрсіяў, які ўключаючы важныя навіны пра бясьпеку.\nВам неабходна падпісацца на яго і абнавіць Вашае ўсталяваньне MediaWiki, калі зьявяцца новыя вэрсіі.",
        "config-subscribe-noemail": "Вы спрабавалі падпісацца на рассылку паведамленьняў пра выхад новых вэрсіяў, не пазначыўшы адрас электроннай пошты.\nКалі ласка, падайце слушны адрас, калі Вы жадаеце падпісацца на рассылку.",
+       "config-pingback": "Дзяліцца зьвесткамі пра гэтую ўсталёўку з распрацоўнікамі MediaWiki.",
+       "config-pingback-help": "Калі вы абярэце гэтую наладу, MediaWiki будзе час ад часу дасылаць базавыя зьвесткі пра гэтую ўсталёўку на https://www.mediawiki.org. Гэтыя зьвесткі ўключаюць, напрыклад, тып сыстэмы, вэрсію PHP і абраную базу зьвестак. Фундацыя «Вікімэдыя» дзеліцца гэтымі зьвесткамі з распрацоўнікамі MediaWiki, каб скіраваць далейшыя шляхі распрацоўкі. Наступныя зьвесткі будуць дасланыя для вашай сыстэмы:\n<pre>$1</pre>",
        "config-almost-done": "Вы амаль што скончылі!\nАстатнія налады можна прапусьціць і пачаць усталяваньне вікі.",
        "config-optional-continue": "Задаць болей пытаньняў.",
        "config-optional-skip": "Хопіць, проста ўсталяваць вікі.",
        "config-email-sender-help": "Увядзіце адрас электроннай пошты для вяртаньня ў якасьці адрасу дасылаемых электронных лістоў.\nСюды будуць дасылацца неатрыманыя электронныя лісты.\nШматлікія паштовыя сэрвэры патрабуюць, каб хаця б назва дамэну была слушнай.",
        "config-upload-settings": "Загрузкі выяваў і файлаў",
        "config-upload-enable": "Дазволіць загрузку файлаў",
-       "config-upload-help": "Дазвол загрузкі файлаў можа патэнцыйна пагражаць бясьпекі сэрвэра.\nДадатковую інфармацыю можна атрымаць ў [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security разьдзеле бясьпекі].\n\nКаб дазволіць загрузку файлаў, зьмяніце рэжым падкаталёга <code>images</code> у карэннай дырэкторыі MediaWiki так, каб ўэб-сэрвэр меў доступ на запіс.\nПотым дазвольце гэтую магчымасьць.",
+       "config-upload-help": "Дазвол загрузкі файлаў можа патэнцыйна пагражаць бясьпецы сэрвэра.\nДадатковую інфармацыю можна атрымаць ў [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security разьдзеле бясьпекі].\n\nКаб дазволіць загрузку файлаў, зьмяніце рэжым падкаталёгу <code>images</code> у карэннай дырэкторыі MediaWiki так, каб вэб-сэрвэр меў доступ на запіс.\nПотым дазвольце гэтую магчымасьць.",
        "config-upload-deleted": "Дырэкторыя для выдаленых файлаў:",
        "config-upload-deleted-help": "Выберыце дырэкторыю, у якой будуць захоўвацца выдаленыя файлы.\nУ ідэальным выпадку, яна не павінна мець доступу з Інтэрнэту.",
        "config-logo": "URL-адрас лягатыпу:",
        "config-logo-help": "Афармленьне MediaWiki па змоўчваньні ўключае прастору для лягатыпу памерам 135×160 піксэляў у верхнім левым куце.\nЗагрузіце выяву адпаведнага памеру і ўвядзіце тут URL-адрас.\n\nВы можаце ўжыць <code>$wgStylePath</code> або <code>$wgScriptPath</code>, калі ваш лягатып знаходзіцца адносна гэтых шляхоў.\n\nКалі Вы не жадаеце мець ніякага лягатыпу, пакіньце поле пустым.",
        "config-instantcommons": "Дазволіць Instant Commons",
-       "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] — магчымасьць, якая дазваляе вікі выкарыстоўваць выявы, гукі і іншыя мэдыя, якія знаходзяцца на сайце [https://commons.wikimedia.org/ Wikimedia Commons].\nКаб гэта зрабіць, MediaWiki патрабуе доступу да Інтэрнэту.\n\nКаб даведацца болей пра гэтую магчымасьць, уключаючы інструкцыю пра тое, як яе ўстанавіць ў любой вікі, акрамя Wikimedia Commons, глядзіце [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos дакумэнтацыю].",
+       "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] — магчымасьць, якая дазваляе вікі выкарыстоўваць выявы, гукі і іншыя мэдыя, якія знаходзяцца на сайце [https://commons.wikimedia.org/ Wikimedia Commons].\nКаб гэта зрабіць, MediaWiki патрабуе доступу да Інтэрнэту.\n\nКаб даведацца болей пра гэтую магчымасьць, у тым ліку пра інструкцыю, як яе ўсталяваць для іншых вікі, акрамя Wikimedia Commons, глядзіце [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos дакумэнтацыю].",
        "config-cc-error": "Выбар ліцэнзіі Creative Commons ня даў вынікаў.\nУвядзіце назву ліцэнзіі ўручную.",
        "config-cc-again": "Выберыце яшчэ раз…",
        "config-cc-not-chosen": "Выберыце, якую ліцэнзію Creative Commons Вы жадаеце выкарыстоўваць і націсьніце «proceed».",
        "config-install-extension-tables": "Стварэньне табліцаў для ўключаных пашырэньняў",
        "config-install-mainpage-failed": "Немагчыма ўставіць галоўную старонку: $1",
        "config-install-done": "<strong>Віншуем!</strong>\nВы ўсталявалі MediaWiki.\n\nПраграма ўсталяваньня стварыла файл <code>LocalSettings.php</code>.\nЁн утрымлівае ўсе Вашыя налады.\n\nВам неабходна загрузіць яго і захаваць у карэнную дырэкторыю Вашай вікі (у тую ж самую дырэкторыю, дзе знаходзіцца index.php). Загрузка павінна пачацца аўтаматычна.\n\nКалі загрузка не пачалася, ці Вы яе адмянілі, Вы можаце перазапусьціць яе націснуўшы на спасылку ніжэй:\n\n$3\n\n<strong>Заўвага</strong>: калі Вы гэтага ня зробіце зараз, то створаны файл ня будзе даступны Вам потым, калі Вы выйдзеце з праграмы ўсталяваньня безь яго загрузкі.\n\nКалі Вы гэта зробіце, Вы можаце <strong>[$2 ўвайсьці ў Вашую вікі]</strong>.",
+       "config-install-done-path": "<strong>Віншуем!</strong>\nВы ўсталявалі MediaWiki.\n\nПраграма ўсталёўкі стварыла файл <code>LocalSettings.php</code>. Ён утрымлівае ўсе вашыя налады.\n\nВам трэба спампаваць яго і пакласьці ў <code>$4</code>. Спампоўка павінна пачацца аўтаматычна.\n\nКалі спампоўка не пачалася або вы адмянілі яе, вы можаце пачаць яе наноў, калі націсьніце на наступную спасылку:\n\n$3\n\n<strong>Заўвага:</strong> Калі вы ня зробіце гэта зараз, то створаны файл ня будзе даступны вам па выхадзе з праграмы безь яго спампоўкі.\n\nКалі вы зробіце гэта, вы можаце <strong>[$2 ўвайсьці ў вашую вікі]</strong>.",
        "config-download-localsettings": "Загрузіць <code>LocalSettings.php</code>",
        "config-help": "дапамога",
        "config-help-tooltip": "націсьніце, каб разгарнуць",
        "config-nofile": "Файл «$1» ня знойдзены. Ці быў ён выдалены?",
-       "config-extension-link": "Ці ведаеце вы, што вашая вікі падтрымлівае [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions пашырэньні]?\n\nВы можаце праглядзець [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category пашырэньні паводле катэгорыяў].",
+       "config-extension-link": "Ці ведаеце вы, што вашая вікі падтрымлівае [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions пашырэньні]?\n\nВы можаце праглядзець [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category пашырэньні паводле катэгорыяў] або [https://www.mediawiki.org/wiki/Extension_Matrix матрыцу пашырэньняў], каб пабачыць поўны сьпіс.",
        "mainpagetext": "<strong>MediaWiki была ўсталяваная.</strong>",
        "mainpagedocfooter": "Глядзіце [https://meta.wikimedia.org/wiki/Help:Contents дапаможнік карыстальніка] для атрыманьня інфармацыі па карыстаньні вікі-праграмамі.\n\n== З чаго пачаць ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Сьпіс парамэтраў канфігурацыі]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Частыя пытаньні MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка паведамленьняў пра зьяўленьне новых вэрсіяў MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Пераклад MediaWiki на вашую мову]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Даведайцеся, як змагацца з спамам у вашай вікі]"
 }
index 7905589..cc31402 100644 (file)
        "config-no-db": "Не може да бъде открит подходящ драйвер за база данни! Необходимо е да инсталирате драйвер за база данни за PHP.\n{{PLURAL:$2|Поддържа се следния тип|Поддържат се следните типове}} бази от данни: $1.\n\nАко сами сте компилирали PHP, преконфигурирайте го с включен клиент за база данни, например чрез използване на <code>./configure --with-mysql</code>.\nАко сте инсталирали PHP от пакет за Debian или Ubuntu, необходимо е също така да инсталирате и модула <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Предупреждение:</strong> имате инсталиран SQLite  $1, а минималната допустима версия е $2. SQLite ще бъде недостъпна за ползване.",
        "config-no-fts3": "'''Предупреждение''': SQLite е компилирана без [//sqlite.org/fts3.html модула FTS3], затова възможностите за търсене няма да са достъпни.",
-       "config-mbstring": "'''Фатално: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] е активирана!'''\nТова може да повреди непредвидимо въвеждането на данните.\nИнсталацията на МедияУики е невъзможна докато тази настройка не бъде изключена.",
-       "config-xml-bad": "За PHP липсва XML модул.\nМедияуики няма да работи в тази конфигурация, тъй като се изисква функционалност на този модул.\nМоже би ще трябва да инсталирате RPM-пакет php-xml.",
        "config-pcre-old": "<strong>Фатална грешка:</strong> Изисква се PCRE версия $1 или по-нова.\nИзпълнимият файл на PHP е свързан с PCRE версия $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/Повече информация за PCRE].",
        "config-pcre-no-utf8": "'''Фатално''': Модулът PCRE на PHP изглежда е компилиран без поддръжка на PCRE_UTF8.\nЗа да функционира правилно, МедияУики изисква поддръжка на UTF-8.",
        "config-memory-raised": "<code>memory_limit</code> на PHP е $1, увеличаване до $2.",
        "config-memory-bad": "'''Предупреждение:''' <code>memory_limit</code> на PHP е $1.\nСтойността вероятно е твърде ниска.\nВъзможно е инсталацията да се провали!",
-       "config-ctype": "'''Фатално''': Необходимо е PHP да бъде компилиран с поддръжка на [http://www.php.net/manual/en/ctype.installation.php разширението Ctype].",
-       "config-iconv": "<strong>Фатална грешка:</strong> PHP трябва да бъде компилиран с поддръжка на разширението [http://www.php.net/manual/bg/iconv.installation.php iconv].",
-       "config-json": "<strong>Фатална грешка:</strong> PHP е компилирано без поддръжка на JSON.\nТрябва да инсталирате JSON разширението за PHP или разширението [http://pecl.php.net/package/jsonc PECL jsonc] преди да продължите с инсталацията на МедияУики.\n* Разширението за PHP е включено Red Hat Enterprise Linux (CentOS) 5 и 6, но трябва да се включи в <code>/etc/php.ini</code> или <code>/etc/php.d/json.ini</code>.\n* Някои Линукс дистрибуции излезли след май 2013 не включват това PHP разширение, като вместо него в дистрибуцията е включено PECL разширение като <code>php5-json</code> или <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] е инсталиран",
        "config-apc": "[http://www.php.net/apc APC] е инсталиран",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] е инсталиран",
index dacc300..3c6d530 100644 (file)
@@ -14,7 +14,8 @@
        "config-information": "তথ্য",
        "config-localsettings-upgrade": "<code>LocalSettings.php</code> ফাইলটি মুছে ফেলা হয়েছে। এই ইন্সটলেশনটি আরো উন্নত করতে দয়া করে <code>$wgUpgradeKey</code> কোডটি বক্সে দিন। আপনি এটি <code>LocalSettings.php</code> -এ পাবেন।",
        "config-localsettings-key": "হালনাগাদ কি",
-       "config-localsettings-badkey": "আপনি যেই চাবিটি দিয়েছেন তা সঠিক নয়।",
+       "config-localsettings-badkey": "আপনি হালনাগাদের যেই চাবিটি দিয়েছেন তা সঠিক নয়।",
+       "config-upgrade-key-missing": "মিডিয়াউইকির একটি বিদ্যমান ইনস্টলেশন সনাক্ত করা হয়েছে। \nএই ইনস্টলেশন হালনাগাদ করার জন্য, দয়া করে নিম্নলিখিত লাইন আপনার <code>LocalSettings.php</code> -এর নিচে স্থাপন করুন:\n\n$1",
        "config-session-error": "সেশন শুরুতে ত্রুটি: $1",
        "config-your-language": "আপনার ভাষা:",
        "config-your-language-help": "ইন্সটল করা সময় ব্যবহারের জন্য ভাষা নির্বাচন করুন।",
@@ -94,6 +95,7 @@
        "config-admin-password-blank": "প্রশাসক অ্যাকাউন্টের জন্য পাসওয়ার্ড প্রবেশ করান।",
        "config-admin-password-mismatch": "আপনি যে দুটি পাসওয়ার্ড দিয়েছেন তারা পরস্পর মেলেনি।",
        "config-admin-email": "ইমেইল ঠিকানা:",
+       "config-admin-error-bademail": "আপনি একটি অবৈধ ইমেল ঠিকানা দিয়েছেন।",
        "config-optional-continue": "আরও প্রশ্ন জিজ্ঞেস করুন।",
        "config-optional-skip": "আমি ইতিমধ্যেই বিরক্ত হয়ে গেছি, উইকিটি ইন্সটল করো।",
        "config-profile": "ব্যবহারকারী অধিকার প্রোফাইল:",
index 219b53f..1211929 100644 (file)
        "config-unicode-update-warning": "'''Diwallit''': ober a ra stumm staliet endalc'her skoueriekaat Unicode gant ur stumm kozh eus [http://site.icu-project.org/ levraoueg meziantoù ar raktres ICU].\nDleout a rafec'h [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations hizivaat] ma seblant deoc'h bezañ pouezus ober gant Unicode.",
        "config-no-db": "N'eus ket bet gallet kavout ur sturier diazoù roadennoù a zere ! Ret eo deoc'h staliañ ur sturier diazoù roadennoù evit PHP.\nSkoret eo an diazoù roadennoù da-heul : $1.\n\nMa rit gant un herberc'hiañ kenrannet, goulennit digant ho herberc'hier staliañ ur sturier diaz roadennoù azas.\nMa kempunit PHP c'hwi hoc'h-unan, adkeflugnit-eñ en ur weredekaat un arval diaz roadennoù, da skouer en ur ober gant <code>./configure --mysql</code>.\nM'hoc'h eus staliet PHP adalek ur pakad Debian pe Ubuntu, eo ret deoc'h staliañ ar vodulenn php5-mysql ivez.",
        "config-no-fts3": "'''Diwallit ''': Kempunet eo SQLite hep ar [//sqlite.org/fts3.html vodulenn FTS3]; ne vo ket posupl ober gant an arc'hwelioù klask er staliadur-mañ",
-       "config-mbstring": "'''Fazi groñs : gweredekaet eo [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] !'''\nDegas a ra an dibarzh-mañ fazioù ha gallout a ra breinañ ar roadennoù en ur mod dic'hortoz.\nN'hallit ket staliañ pe ober gant MediaWiki e-keit ha m'eo gweredekaet an dibarzh-se.",
-       "config-xml-bad": "Mankout a ra modulenn XML PHP.\nEzhomm en deus MediaWiki eus arc'hwelioù zo eus ar vodulenn-se ha ne'z aio ket en-dro gant ar c'hefluniadur zo.\nM'emaoc'h gant Mandrake, stailhit pakad php-xml.",
        "config-pcre-no-utf8": "'''Fazi groñs ''': evit doare eo bet kempunet modulenn PCRE PHP hep ar skor PCRE_UTF8.\nEzhomm en deus MediaWiki eus UTF-8 evit mont plaen en-dro.",
        "config-memory-raised": "<code>memory_limit</code> ar PHP zo $1, kemmet e $2.",
        "config-memory-bad": "'''Diwallit :''' Da $1 emañ arventenn <code>memory_limit</code> PHP.\nRe izel eo moarvat.\nMarteze e c'hwito ar staliadenn !",
-       "config-ctype": "<strong>Fazi grevus :</strong> PHP a rank bezañ kempunet gant ar skor evit an [http://www.php.net/manual/en/ctype.installation.php astenn Ctype].",
        "config-xcache": "Staliet eo [http://xcache.lighttpd.net/ XCache]",
        "config-apc": "Staliet eo [http://www.php.net/apc APC]",
        "config-wincache": "Staliet eo [http://www.iis.net/download/WinCacheForPhp WinCache]",
index 5307aed..68497c5 100644 (file)
        "config-no-db": "Nepodařilo se nalézt vhodný databázový ovladač! Musíte nainstalovat databázový ovladač pro PHP.\n{{PLURAL:$2|Je podporován následující typ databáze|Jsou podporovány následující typy databází}}: $1.\n\nPokud jste si PHP přeložili sami, překonfigurujte ho se zapnutým databázovým klientem, například pomocí <code>./configure --with-mysql</code>.\nPokud jste PHP nainstalovali z balíčku Debian či Ubuntu, potřebujete nainstalovat také modul <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Upozornění:</strong> Máte SQLite $1, které je starší než minimálně vyžadovaná verze $2. SQLite nebude dostupné.",
        "config-no-fts3": "<strong>Upozornění:</strong> SQLite bylo přeloženo bez [//sqlite.org/fts3.html modulu FTS3], funkce pro vyhledávání zde nebudou dostupné.",
-       "config-mbstring": "<strong>Kritická chyba: Je zapnuto [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]!</strong>\nToto nastavení způsobuje chyby a může nepředvídatelně poškozovat vstupní data.\nMediaWiki nelze nainstalovat ani používat, dokud není toto nastavení vypnuto.",
-       "config-xml-bad": "Chybí XML modul pro PHP.\nMediaWiki potřebuje funkce v tomto modulu a v této konfiguraci nebude fungovat.\nMožná si budete muset nainstalovat RPM balíček php-xml.",
        "config-pcre-old": "<strong>Kritická chyba:</strong> Je vyžadováno PCRE verze $1 nebo novější.\nVaše binárka PHP obsahuje PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Více informací.]",
        "config-pcre-no-utf8": "<strong>Kritická chyba:</strong> PHP modul PCRE byl zřejmě přeložen bez podpory PCRE_UTF8.\nMediaWiki vyžaduje ke správné funkci podporu UTF-8.",
        "config-memory-raised": "<code>memory_limit</code> v PHP byl nastaven na $1, zvýšen na $2.",
        "config-memory-bad": "<strong>Upozornění:</strong> <code>memory_limit</code> je v PHP nastaven na $1.\nTo je pravděpodobně příliš málo.\nInstalace může selhat!",
-       "config-ctype": "<strong>Kritická chyba:</strong> PHP musí být přeloženo s podporou pro [http://www.php.net/manual/en/ctype.installation.php rozšíření Ctype].",
-       "config-iconv": "<strong>Kritická chyba:</strong> PHP musí být přeloženo s podporou pro [http://www.php.net/manual/en/iconv.installation.php rozšíření iconv].",
-       "config-json": "<strong>Kritická chyba:</strong> PHP bylo přeloženo bez podpory JSON.\nPřed instalací MediaWiki musíte buď nainstalovat rozšíření PHP JSON nebo rozšíření [http://pecl.php.net/package/jsonc PECL jsonc].\n* Rozšíření PHP je součástí Red Hat Enterprise Linux (CentOS) 5 a 6, avšak musí se povolit v <code>/etc/php.ini</code> nebo <code>/etc/php.d/json.ini</code>.\n* V některých linuxových distribucích vydaných po květnu 2013 může toto rozšíření PHP chybět a místo toho mohou používat rozšíření PECL jako <code>php5-json</code> nebo <code>php-pecl-jsonc</code>.",
-       "config-mbstring-absent": "<strong>Kritická chyba:</strong> PHP musí být přeloženo s podporou pro [http://www.php.net/manual/en/mbstring.setup.php rozšíření mbstring].",
        "config-xcache": "Je nainstalována [http://xcache.lighttpd.net/ XCache]",
        "config-apc": "Je nainstalováno [http://www.php.net/apc APC]",
        "config-wincache": "Je nainstalována [http://www.iis.net/download/WinCacheForPhp WinCache]",
        "config-subscribe": "Přihlásit se k odběru [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce e-mailové konference pro oznamování nových verzí].",
        "config-subscribe-help": "Tohle je e-mailová konference s nízkým provozem, na které se oznamují nové verze, včetně důležitých bezpečnostních oznámení.\nMěli byste se do ní přihlásit a při vydání nových verzí aktualizovat svou instalaci MediaWiki.",
        "config-subscribe-noemail": "Pokusili jste se přihlásit k odběru e-mailové konference pro oznamování nových verzí, aniž byste poskytli e-mailovou adresu.\nPokud se chcete přihlásit k odběru, zadejte e-mailovou adresu.",
+       "config-pingback": "Sdílet údaje o této instalaci s vývojáři MediaWiki.",
+       "config-pingback-help": "Pokud zaškrtnete tuto volbu, bude MediaWiki pravidelně zasílat základní údaje této instance MediaWiki na https://www.mediawiki.org. Tyto údaje zahrnují například typ systému, verzi PHP a zvolené databázové úložiště. Nadace Wikimedia sdílí tato data s vývojáři MediaWiki, aby pomohla směrovat budoucí rozvoj. Pro váš systém budou zaslány tyto údaje:\n<pre>$1</pre>",
        "config-almost-done": "Už jsme skoro hotovi!\nZbývající konfiguraci už můžete přeskočit a nainstalovat wiki hned teď.",
        "config-optional-continue": "Ptejte se mě dál.",
        "config-optional-skip": "Už mě to nudí, prostě nainstalujte wiki.",
        "config-install-extension-tables": "Vytvářejí se tabulky pro zapnutá rozšíření",
        "config-install-mainpage-failed": "Nepodařilo se vložit hlavní stranu: $1",
        "config-install-done": "<strong>Gratulujeme!</strong>\nNainstalovali jste MediaWiki.\n\nInstalátor vytvořil soubor <code>LocalSettings.php</code>.\nTen obsahuje veškerou vaši konfiguraci.\n\nBudete si ho muset stáhnout a uložit do základního adresáře vaší instalace wiki (do stejného adresáře jako soubor index.php). Stažení souboru se mělo spustit automaticky.\n\nPokud se vám stažení nenabídlo nebo jste ho zrušili, můžete ho spustit znovu kliknutím na následující odkaz:\n\n$3\n\n<strong>Poznámka</strong>: Pokud to neuděláte hned, tento vygenerovaný konfigurační soubor nebude později dostupný, pokud instalaci opustíte, aniž byste si ho stáhli.\n\nAž to dokončíte, můžete <strong>[$2 vstoupit do své wiki]</strong>.",
+       "config-install-done-path": "<strong>Gratulujeme!</strong>\nNainstalovali jste MediaWiki.\n\nInstalátor vytvořil soubor <code>LocalSettings.php</code>.\nTen obsahuje veškerou vaši konfiguraci.\n\nBudete si ho muset stáhnout a uložit do <code>$4</code>. Stažení souboru se mělo spustit automaticky.\n\nPokud se vám stažení nenabídlo nebo jste ho zrušili, můžete ho spustit znovu kliknutím na následující odkaz:\n\n$3\n\n<strong>Poznámka:</strong> Pokud to neuděláte hned, tento vygenerovaný konfigurační soubor nebude později dostupný, pokud instalaci opustíte, aniž byste si ho stáhli.\n\nAž to dokončíte, můžete <strong>[$2 vstoupit do své wiki]</strong>.",
        "config-download-localsettings": "Stáhnout <code>LocalSettings.php</code>",
        "config-help": "nápověda",
        "config-help-tooltip": "rozbalíte kliknutím",
index 6f35340..b55b3c7 100644 (file)
@@ -15,7 +15,8 @@
                        "Suriyaa Kudo",
                        "Das Schäfchen",
                        "Florian",
-                       "Macofe"
+                       "Macofe",
+                       "ThePiscin"
                ]
        },
        "config-desc": "Das MediaWiki-Installationsprogramm",
        "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>php5-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-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-mbstring": "'''Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]</code> von PHP ist aktiviert!'''\nDiese Einstellung verursacht Fehler und führt zu unvorhersehbaren Problemen bei der Dateneingabe.\nMediaWiki kann nicht installiert werden, solange dieser Parameter nicht deaktiviert wurde.",
-       "config-xml-bad": "Das XML-Modul von PHP fehlt.\nMediaWiki benötigt Funktionen, die dieses Modul bereitstellt und wird in der bestehenden Konfiguration nicht funktionieren.\nDu musst vielleicht das „php-xml“-RPM-Paket installieren.",
        "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.",
        "config-memory-raised": "Der PHP-Parameter <code>memory_limit</code> betrug $1 und wurde auf $2 erhöht.",
        "config-memory-bad": "'''Warnung:''' Der PHP-Parameter <code>memory_limit</code> beträgt $1.\nDieser Wert ist wahrscheinlich zu niedrig.\nDer Installationsvorgang könnte eventuell scheitern!",
-       "config-ctype": "'''Fataler Fehler:''' PHP muss mit Unterstützung für das [http://www.php.net/manual/de/ctype.installation.php Modul ctype] kompiliert werden.",
-       "config-iconv": "<strong>Fatal:</strong> PHP muss mit Support für die [http://www.php.net/manual/en/iconv.installation.php iconv-Erweiterung] kompiliert werden.",
-       "config-json": "<strong>Fataler Fehler:</strong> PHP wurde ohne Unterstützung für JSON kompiliert.\nVor der Installation von MediaWiki muss entweder die PHP-JSON- oder die [http://pecl.php.net/package/jsonc PECL-jsonc]-Erweiterung installieren werden.\n* Die PHP-Erweiterung ist in Red Hat Enterprise Linux (CentOS) 5 und 6 enthalten, muss jedoch in <code>/etc/php.ini</code> oder <code>/etc/php.d/json.ini</code> aktiviert werden.\n* Einige Linux-Distributionen, die nach Mai 2013 veröffentlicht wurden, nutzen nicht mehr die PHP-Erweiterung, sondern stattdessen die PECL-Erweiterung als <code>php5-json</code> oder <code>php-pecl-jsonc</code>.",
-       "config-mbstring-absent": "<strong>Fatal:</strong> PHP muss mit Unterstützung für die [http://www.php.net/manual/de/mbstring.setup.php mbstring-Erweiterung] kompiliert werden.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] ist installiert",
        "config-apc": "[http://www.php.net/apc APC] ist installiert",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] ist installiert",
        "config-db-web-account-same": "Dasselbe Datenbankkonto wie während des Installationsvorgangs verwenden",
        "config-db-web-create": "Sofern nicht bereits vorhanden, muss nun das Konto erstellt werden",
        "config-db-web-no-create-privs": "Das angegebene und für den Installationsvorgang vorgesehene Datenbankkonto verfügt nicht über ausreichend Berechtigungen, um ein weiteres Datenbankkonto zu erstellen.\nDas hier angegebene Datenbankkonto muss daher bereits vorhanden sein.",
-       "config-mysql-engine": "Speicher-Engine:",
+       "config-mysql-engine": "Datenbanksystem:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "'''Warnung:''' Es wurde MyISAM als Speicher-Engine für MySQL ausgewählt, die aus folgenden Gründen nicht für den Einsatz mit MediaWiki empfohlen ist:\n* Sie unterstützt aufgrund von Tabellensperrungen kaum die nebenläufige Ausführung von Aktionen.\n* Sie ist anfälliger für Datenprobleme.\n* Sie wird von MediaWiki nicht immer adäquat unterstützt.\n\nSofern die vorhandene MySQL-Installation die Speicher-Engine InnoDB unterstützt, wird deren Verwendung eindringlich empfohlen.\nSofern sie sie nicht unterstützt, sollte eine entsprechende Aktualisierung nunmehr Erwägung gezogen werden.",
-       "config-mysql-only-myisam-dep": "'''Warnung:''' MyISAM ist die einzige verfügbare Speicher-Engine für MySQL auf diesem Rechner, und dies wird nicht für die Verwendung mit MediaWiki empfohlen, da sie\n* aufgrund von Tabellensperrungen kaum die nebenläufige Ausführung von Aktionen unterstützt,\n* anfälliger für Datenprobleme ist und\n* von MediaWiki nicht immer adäquat unterstützt wird.\n\nDeine MySQL-Installation unterstützt nicht InnoDB. Eventuell muss eine Aktualisierung durchgeführt werden.",
+       "config-mysql-myisam-dep": "<strong>Warnung:</strong> Es wurde MyISAM als Speichersubsystem für das Datenbanksystem MySQL ausgewählt. Aus folgenden Gründen wird es nicht für den Einsatz mit MediaWiki empfohlen:\n* Es unterstützt aufgrund von Tabellensperrungen kaum die nebenläufige Ausführung von Aktionen.\n* Es ist anfälliger für Datenprobleme.\n* Es wird von MediaWiki nicht immer adäquat unterstützt.\n\nSofern die vorhandene MySQL-Installation das Speichersubsystem InnoDB unterstützt, wird deren Verwendung eindringlich empfohlen.\nSofern sie es nicht unterstützt, sollte nunmehr eine entsprechende Aktualisierung in Erwägung gezogen werden.",
+       "config-mysql-only-myisam-dep": "<strong>Warnung:</strong> MyISAM ist das einzige verfügbare Speichersubsystem für das Datenbanksystem MySQL auf diesem Server. Es wird nicht für die Verwendung mit MediaWiki empfohlen, da es\n* aufgrund von Tabellensperrungen kaum die nebenläufige Ausführung von Aktionen unterstützt,\n* anfälliger für Datenprobleme ist und\n* von MediaWiki nicht immer adäquat unterstützt wird.\n\nDeine MySQL-Installation unterstützt nicht das Speichersubsystem InnoDB. Eine Aktualisierung wird nunmehr empfohlen.",
        "config-mysql-engine-help": "'''InnoDB''' ist fast immer die bessere Wahl, da es gleichzeitige Zugriffe gut unterstützt.\n\n'''MyISAM''' ist in Einzelnutzerumgebungen sowie bei schreibgeschützten Wikis schneller.\nBei MyISAM-Datenbanken treten tendenziell häufiger Fehler auf als bei InnoDB-Datenbanken.",
        "config-mysql-charset": "Datenbankzeichensatz:",
        "config-mysql-binary": "binär",
        "config-subscribe": "Bitte die Mailingliste [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mitteilungen zu Versionsveröffentlichungen] abonnieren.",
        "config-subscribe-help": "Es handelt sich hierbei um eine Mailingliste mit wenigen Aussendungen, die für Mitteilungen zu Versionsveröffentlichungen, einschließlich wichtiger Sicherheitsveröffentlichungen, genutzt wird.\nDiese Mailingliste sollte abonniert werden. Zudem sollte die MediaWiki-Installation stets aktualisiert werden, sobald eine neue Programmversion veröffentlicht wurde.",
        "config-subscribe-noemail": "Beim Abonnieren der Mailingliste mit Mitteilungen zu Versionsveröffentlichungen wurde keine E-Mail-Adresse angegeben.\nBitte eine E-Mail-Adresse angeben, sofern die Mailingliste abonniert werden soll.",
+       "config-pingback": "Daten über diese Installation mit den MediaWiki-Entwicklern teilen.",
+       "config-pingback-help": "Sofern diese Option ausgewählt wird, meldet MediaWiki regelmäßig die Basisdaten dieser MediaWiki-Installation an https://www.mediawiki.org. Diese Daten enthalten beispielsweise den Betriebssystemtyp, die PHP-Version sowie das genutzte Datenbanksystem. Die Wikimedia Foundation teilt diese Daten mit den MediaWiki-Entwicklern, um Entscheidungen zur künftigen Softwareentwicklung zu verbessern. Die folgenden Daten werden für diese Installation gesendet:\n<pre>$1</pre>",
        "config-almost-done": "Der Vorgang ist fast abgeschlossen!\nDie verbleibenden Konfigurationseinstellungen können übersprungen und das Wiki umgehend installiert werden.",
        "config-optional-continue": "Ja, es sollen weitere Konfigurationseinstellungen vorgenommen werden.",
        "config-optional-skip": "Nein, das Wiki soll nun installiert werden.",
        "config-install-extension-tables": "Erstellung der Tabellen für die aktivierten Erweiterungen",
        "config-install-mainpage-failed": "Die Hauptseite konnte nicht erstellt werden: $1",
        "config-install-done": "'''Herzlichen Glückwunsch!'''\nMediaWiki wurde erfolgreich installiert.\n\nDas Installationsprogramm hat die Datei <code>LocalSettings.php</code> erzeugt.\nSie enthält alle vorgenommenen Konfigurationseinstellungen.\n\nDiese Datei muss nun heruntergeladen und anschließend in das Stammverzeichnis der MediaWiki-Installation hochgeladen werden. Dies ist dasselbe Verzeichnis, in dem sich auch die Datei <code>index.php</code> befindet. Das Herunterladen sollte inzwischen automatisch gestartet worden sein.\n\nSofern dies nicht der Fall war, oder das Herunterladen unterbrochen wurde, kann der Vorgang durch einen Klick auf den folgenden Link erneut gestartet werden:\n\n$3\n\n'''Hinweis:''' Die Konfigurationsdatei sollte jetzt unbedingt heruntergeladen werden. Sie wird nach Beenden des Installationsprogramms, nicht mehr zur Verfügung stehen.\n\nSobald alles erledigt wurde, kann auf das '''[$2 Wiki zugegriffen werden]'''. Wir wünschen viel Spaß und Erfolg mit dem Wiki.",
+       "config-install-done-path": "<strong>Herzlichen Glückwunsch!</strong>\nDu hast MediaWiki installiert.\n\nDas Installationsprogramm hat eine Datei „<code>LocalSettings.php</code>“ erzeugt.\nSie enthält deine gesamte Konfiguration.\n\nDu musst sie herunterladen und unter <code>$4</code> ablegen. Der Download sollte automatisch gestartet sein.\n\nFalls der Download nicht angeboten wird oder du ihn abgebrochen hast, kannst du ihn durch Anklicken des folgenden Links neu starten:\n\n$3\n\n<strong>Hinweis:</strong> Falls du dies jetzt nicht tust, wird die erzeugte Konfigurationsdatei später nicht verfügbar sein, wenn du die Installation ohne Herunterladen verlässt.\n\nBei Fertigstellung kannst du <strong>[$2 dein Wiki aufrufen]</strong>.",
        "config-download-localsettings": "<code>LocalSettings.php</code> herunterladen",
        "config-help": "Hilfe",
        "config-help-tooltip": "Zum Expandieren klicken",
        "config-nofile": "Die Datei „$1“ konnte nicht gefunden werden. Wurde sie gelöscht?",
-       "config-extension-link": "Wusstest du, dass dein Wiki die Nutzung von [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions Erweiterungen] unterstützt?\n\nDu kannst [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category Erweiterungen nach Kategorie] durchsuchen.",
+       "config-extension-link": "Wusstest du, dass dein Wiki die Nutzung von [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions Erweiterungen] unterstützt?\n\nDu kannst die [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category Erweiterungen nach Kategorie] anzeigen oder die [https://www.mediawiki.org/wiki/Extension_Matrix Erweiterungs-Matrix] aufrufen, um eine vollständige Liste der Erweiterungen zu sehen.",
        "mainpagetext": "<strong>MediaWiki wurde installiert.</strong>",
-       "mainpagedocfooter": "Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [https://meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].\n\n== Starthilfen ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste der Konfigurationsvariablen]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokalisiere MediaWiki für deine Sprache]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Erfahre, wie du Spam auf deinem Wiki bekämpfen kannst]"
+       "mainpagedocfooter": "Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [https://meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].\n\n== Starthilfen ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste der Konfigurationsvariablen]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Übersetze MediaWiki für deine Sprache]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Erfahre, wie du Spam auf deinem Wiki bekämpfen kannst]"
 }
index 3ebac78..f8d26a7 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Erdemaslancan",
                        "Mirzali",
-                       "Marmase"
+                       "Marmase",
+                       "Kumkumuk"
                ]
        },
        "config-desc": "Qandé MediaWiki sazi",
        "config-restart": "E, fına dest pekê",
        "config-sidebar": "* [https://www.mediawiki.org MediaWiki keye]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Şınasiya Karberi]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Şınasiya İdarekaran]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Peşti]\n----\n* <doclink href=Readme>Mı buwanê</doclink>\n* <doclink href=ReleaseNotes>Notê elaqeyıni</doclink>\n* <doclink href=Copying>Kopyakerdış</doclink>\n* <doclink href=UpgradeDoc>Zêdekerdış</doclink>",
        "config-env-php": "PHP $1 i biyo saz.",
+       "config-db-type": "Database tipe:",
+       "config-db-host": "Database host:",
+       "config-db-name": "Database name:",
        "config-db-port": "Portê database:",
+       "config-type-mssql": "Microsoft SQL Server",
        "config-header-mysql": "Eyarê MySQL",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-email-settings": "Sazê e-posta",
        "config-logo": "URL'ey Logoy:",
        "config-extensions": "Olekeni",
+       "config-skins": "Temey",
        "config-install-step-done": "qeyd ke",
        "config-install-step-failed": "nêbı",
        "config-install-schema": "Şema dek",
        "config-install-pg-commit": "Vırnayışa cemaati",
        "config-install-tables": "Tabloy dek",
        "config-help": "peşti",
-       "mainpagetext": "'''MediaWiki vıst ra ser, vıraziya.'''",
+       "mainpagetext": "<strong >MediaWiki vıst ra ser, vıraziya.</strong >",
        "mainpagedocfooter": "Qandé ğebtiyayışi u sazkerdeışi Wiki-Softwarey [https://meta.wikimedia.org/wiki/Help:Contents İdarê karberi] de mıracaet ke.\n\n== Destega sergendi ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista eyaranê vıraştışi]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki de ÇZP]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki ra lista serbest-dayışê postey]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Zıwandé şıma de Lokal MediaWiki]"
 }
index aa27624..a11c301 100644 (file)
@@ -59,7 +59,6 @@
        "config-unicode-pure-php-warning": "<strong>Προειδοποίηση:</strong> Η [http://pecl.php.net/intl επέκταση intl PECL] δεν είναι διαθέσιμη για να χειριστεί την κανονικοποίηση Unicode, επιστρέφουμε στην αργή αμιγώς PHP εφαρμογή.\nΕάν λειτουργείτε έναν ιστότοπο υψηλής επισκεψιμότητας, θα πρέπει να ρίξετε μια ματιά στην [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations κανονικοποίηση Unicode].",
        "config-no-db": "Δεν βρέθηκε κάποιο κατάλληλο πρόγραμμα οδήγησης βάσης δεδομένων! Θα πρέπει να εγκαταστήσετε ένα πρόγραμμα οδήγησης βάσης δεδομένων για  PHP.\nΟ παρακάτω {{PLURAL:$2|τύπος βάσης δεδομένων|τύποι βάσεων δεδομένων}} υποστηρίζονται: $1.\n\nΑν κάνετε compile την PHP μόνοι σας, ρυθμίστε ξανά τις παραμέτρους με κάποιον ενεργοποιημένο εξυπηρετητή βάσεων  δεδομένων, για παράδειγμα, χρησιμοποιώντας την εντολή <code>./configure --with-mysqli</code>.\nΕάν έχετε εγκαταστήσει την PHP από κάποιο πακέτο στο Debian ή στο Ubuntu, τότε θα πρέπει να εγκαταστήσετε επίσης, για παράδειγμα, το πακέτο <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Προειδοποίηση:</strong> έχετε την SQLite έκδοση $1, που είναι χαμηλότερη από την ελάχιστη απαιτούμενη έκδοση $2. Η SQLite δεν θα είναι διαθέσιμη.",
-       "config-xml-bad": "Το PHP XML module λείπει.\nΤο MediaWiki απαιτεί συναρτήσεις που περιλαμβάνονται σε αυτό το module και δεν θα λειτουργήσει με αυτή την παραμετροποίηση. \nΊσως χρειάζεται να εγκαταστήσετε το πακέτο RPM php-xml.",
        "config-pcre-no-utf8": "<strong>Κρίσιμο:</strong> Το PCRE module της PHP  φαίνεται να έχει μεταγλωττιστεί χωρίς υποστήριξη  PCRE_UTF8.\nΓια τη σωστή λειτουργία του MediaWiki απαιτείται υποστήριξη UTF-8.",
        "config-memory-raised": "Το  <code>memory_limit</code> της PHP είναι  $1 και αυξήθηκε σε  $2.",
        "config-memory-bad": "<strong>Προειδοποίηση:</strong> το <code>memory_limit</code> της PHP είναι $1.\nΑυτή η τιμή είναι πιθανώς πολύ χαμηλή.\n\nΗ εγκατάσταση ενδέχεται να αποτύχει!",
index 9077082..3f3032b 100644 (file)
        "config-no-db": "Could not find a suitable database driver! You need to install a database driver for PHP.\nThe following database {{PLURAL:$2|type is|types are}} supported: $1.\n\nIf you compiled PHP yourself, reconfigure it with a database client enabled, for example, using <code>./configure --with-mysqli</code>.\nIf you installed PHP from a Debian or Ubuntu package, then you also need to install, for example, the <code>php5-mysql</code> package.",
        "config-outdated-sqlite": "<strong>Warning:</strong> you have SQLite $1, which is lower than minimum required version $2. SQLite will be unavailable.",
        "config-no-fts3": "<strong>Warning:</strong> SQLite is compiled without the [//sqlite.org/fts3.html FTS3 module], search features will be unavailable on this backend.",
-       "config-mbstring": "<strong>Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is active!</strong>\nThis option causes errors and may corrupt data unpredictably.\nYou cannot install or use MediaWiki unless this option is disabled.",
-       "config-xml-bad": "PHP's XML module is missing.\nMediaWiki requires functions in this module and will not work in this configuration.\nYou may need to install the php-xml RPM package.",
        "config-pcre-old": "<strong>Fatal:</strong> PCRE $1 or later is required.\nYour PHP binary is linked with PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE More information].",
        "config-pcre-no-utf8": "<strong>Fatal:</strong> PHP's PCRE module seems to be compiled without PCRE_UTF8 support.\nMediaWiki requires UTF-8 support to function correctly.",
        "config-memory-raised": "PHP's <code>memory_limit</code> is $1, raised to $2.",
        "config-memory-bad": "<strong>Warning:</strong> PHP's <code>memory_limit</code> is $1.\nThis is probably too low.\nThe installation may fail!",
-       "config-ctype": "<strong>Fatal:</strong> PHP must be compiled with support for the [http://www.php.net/manual/en/ctype.installation.php Ctype extension].",
-       "config-iconv": "<strong>Fatal:</strong> PHP must be compiled with support for the [http://www.php.net/manual/en/iconv.installation.php iconv extension].",
-       "config-json": "<strong>Fatal:</strong> PHP was compiled without JSON support.\nYou must install either the PHP JSON extension or the [http://pecl.php.net/package/jsonc PECL jsonc] extension before installing MediaWiki.\n* The PHP extension is included in Red Hat Enterprise Linux (CentOS) 5 and 6, though must be enabled in <code>/etc/php.ini</code> or <code>/etc/php.d/json.ini</code>.\n* Some Linux distributions released after May 2013 omit the PHP extension, instead packaging the PECL extension as <code>php5-json</code> or <code>php-pecl-jsonc</code>.",
-       "config-mbstring-absent": "<strong>Fatal:</strong> PHP must be compiled with support for the [http://www.php.net/manual/en/mbstring.setup.php mbstring extension].",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] is installed",
        "config-apc": "[http://www.php.net/apc APC] is installed",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] is installed",
        "config-subscribe": "Subscribe to the [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce release announcements mailing list].",
        "config-subscribe-help": "This is a low-volume mailing list used for release announcements, including important security announcements.\nYou should subscribe to it and update your MediaWiki installation when new versions come out.",
        "config-subscribe-noemail": "You tried to subscribe to the release announcements mailing list without providing an email address.\nPlease provide an email address if you wish to subscribe to the mailing list.",
+       "config-pingback": "Share data about this installation with MediaWiki developers.",
+       "config-pingback-help": "If you select this option, MediaWiki will periodically ping https://www.mediawiki.org with basic data about this MediaWiki instance. This data includes, for example, the type of system, PHP version, and chosen database backend. The Wikimedia Foundation shares this data with MediaWiki developers to help guide future development efforts. The following data will be sent for your system:\n<pre>$1</pre>",
        "config-almost-done": "You are almost done!\nYou can now skip the remaining configuration and install the wiki right now.",
        "config-optional-continue": "Ask me more questions.",
        "config-optional-skip": "I'm bored already, just install the wiki.",
        "config-install-extension-tables": "Creating tables for enabled extensions",
        "config-install-mainpage-failed": "Could not insert main page: $1",
        "config-install-done": "<strong>Congratulations!</strong>\nYou have installed MediaWiki.\n\nThe installer has generated a <code>LocalSettings.php</code> file.\nIt contains all your configuration.\n\nYou will need to download it and put it in the base of your wiki installation (the same directory as index.php). The download should have started automatically.\n\nIf the download was not offered, or if you cancelled it, you can restart the download by clicking the link below:\n\n$3\n\n<strong>Note:</strong> If you do not do this now, this generated configuration file will not be available to you later if you exit the installation without downloading it.\n\nWhen that has been done, you can <strong>[$2 enter your wiki]</strong>.",
+       "config-install-done-path": "<strong>Congratulations!</strong>\nYou have installed MediaWiki.\n\nThe installer has generated a <code>LocalSettings.php</code> file.\nIt contains all your configuration.\n\nYou will need to download it and put it at <code>$4</code>. The download should have started automatically.\n\nIf the download was not offered, or if you cancelled it, you can restart the download by clicking the link below:\n\n$3\n\n<strong>Note:</strong> If you do not do this now, this generated configuration file will not be available to you later if you exit the installation without downloading it.\n\nWhen that has been done, you can <strong>[$2 enter your wiki]</strong>.",
        "config-download-localsettings": "Download <code>LocalSettings.php</code>",
        "config-help": "help",
        "config-help-tooltip": "click to expand",
index 032490b..b1c3d48 100644 (file)
        "config-no-db": "No se encontró un controlador adecuado para la base de datos. Necesitas instalar un controlador de base de datos para PHP.\n{{PLURAL:$2|El siguiente gestor de bases de datos está soportado|Los siguientes gestores de bases de datos están soportados}}: $1.\n\nSi compilaste PHP tú mismo, debes reconfigurarlo habilitando un cliente de base de datos, por ejemplo, usando <code>./configure --with-mysqli</code>.\nSi instalaste PHP desde un paquete Debian o Ubuntu, entonces también necesitas instalar, por ejemplo, el paquete <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Advertencia:</strong> tienes SQLite $1, que es inferior a la mínima versión requerida: $2. SQLite no estará disponible.",
        "config-no-fts3": "<strong>Advertencia:</strong> SQLite está compilado sin el [//sqlite.org/fts3.html módulo FTS3]. Las funcionalidades de búsqueda no estarán disponibles en esta instalación.",
-       "config-mbstring": "'''Fatal: La opción [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está activada!'''\nEsta opción causa errores y puede corromper los datos de una forma imprevisible.\nNo se puede instalar o usar MediaWiki a menos que esta opción sea desactivada.",
-       "config-xml-bad": "Falta el módulo XML de PHP.\nMediaWiki requiere funciones de este módulo y no funcionará en esta configuración.\nPuede que necesites instalar el el paquete RPM llamado php-xml.",
        "config-pcre-old": "'''Fatal:''' Se requiere PCRE $1 o posterior.\nSu PHP binario está enlazado con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Más información].",
        "config-pcre-no-utf8": "'''Error fatal ''': Parece que el módulo PCRE de PHP fue compilado sin el soporte PCRE_UTF8.\nMediaWiki requiere compatibilidad con UTF-8 para funcionar correctamente.",
        "config-memory-raised": "El parámetro <code>memory_limit</code> de PHP es $1. Se aumenta a $2.",
        "config-memory-bad": "<strong>Advertencia:</strong> el parámetro <code>memory_limit</code> de PHP es $1.\nProbablemente sea demasiado bajo.\n¡La instalación puede fallar!",
-       "config-ctype": "'''Fatal''': Se necesita compilar PHP con compatibilidad para la [http://www.php.net/manual/en/ctype.installation.php extensión Ctype].",
-       "config-iconv": "<strong>Fatal:</strong> PHP debe ser compilado con soporte para la [http://www.php.net/manual/en/iconv.installation.php extensión iconv].",
-       "config-json": "'''Fatal:''' PHP fue compilado sin soporte para JSON.\nDebes instalar la extensión JSON o la extensión [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar MediaWiki.\n* La extensión PHP se incluye en Red Hat Enterprise Linux (CentOS) 5 y 6, aunque debe habilitarse en <code>/etc/php.ini</code> o <code>/etc/php.d/json.ini</code>.\n* Algunas distribuciones Linux liberadas después de mayo del 2013 omiten la extensión PHP, y en su lugar disponen de la extensión PECL en el paquete <code>php5-json</code> o <code>php-pecl-jsonc</code>.",
-       "config-mbstring-absent": "'''Fatal''': Se necesita compilar PHP con compatibilidad para la [http://www.php.net/manual/en/ctype.installation.php extensión Ctype].",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] está instalado",
        "config-apc": "[http://www.php.net/apc APC] está instalado",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] está instalado",
        "config-mysql-charset": "Conjunto de caracteres de la base de datos:",
        "config-mysql-binary": "Binario",
        "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "En <strong>modo binario</strong>, MediaWiki almacena texto UTF-8 para la base de datos en campos binarios.\nEsto es más eficiente que el modo UTF-8 de MySQL y le permite utilizar la gama completa de caracteres Unicode.\n\nEn <strong>modo UTF-8</strong>, MySQL sabrá qué conjunto de caracteres emplean sus datos y puede presentarlos y convertirlos adecuadamente, pero no le permitirá almacenar caracteres por encima del [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plano multilingüe básico].",
+       "config-mysql-charset-help": "En <strong>modo binario</strong>, MediaWiki almacena texto UTF-8 para la base de datos en campos binarios.\nEsto es más eficiente que el modo UTF-8 de MySQL y permite utilizar la gama completa de caracteres Unicode.\n\nEn <strong>modo UTF-8</strong>, MySQL sabrá qué conjunto de caracteres emplean sus datos y puede presentarlos y convertirlos adecuadamente, pero no permitirá almacenar caracteres por encima del [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plano multilingüe básico].",
        "config-mssql-auth": "Tipo de autenticación:",
        "config-mssql-install-auth": "Selecciona el tipo de autenticación que se utilizará para conectarse a la base de datos durante el proceso de instalación.\nSi seleccionas \"{{int:config-mssql-windowsauth}}\", se usarán las credenciales del usuario con el que se ejecuta el servidor web.",
        "config-mssql-web-auth": "Selecciona el tipo de autenticación que utilizará el servidor web para conectarse al servidor de base de datos, durante el funcionamiento normal de la wiki.\nSi seleccionas \"{{int:config-mssql-windowsauth}}\", se usarán las credenciales del usuario con el cual se ejecuta el servidor web.",
        "config-email-sender-help": "Escribe la dirección de correo electrónico que se usará como dirección de retorno en los mensajes electrónicos de salida.\nAquí llegarán los correos electrónicos que no lleguen a su destino.\nMuchos servidores de correo electrónico exigen que por lo menos la parte del nombre del dominio sea válida.",
        "config-upload-settings": "Subidas de imágenes y archivos",
        "config-upload-enable": "Habilitar la subida de archivos",
-       "config-upload-help": "La carga de archivos expone potencialmente su servidor a riesgos de seguridad.\nPara obtener más información, lea la [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security sección de seguridad] en el manual.\n\nPara habilitar la carga de archivos, cambie el modo en el subdirectorio <code>images</code> bajo el directorio raíz de MediaWiki para que el servidor web pueda escribir en él.\nA continuación, habilite esta opción.",
+       "config-upload-help": "La subida de archivos potencialmente expone tu servidor a riesgos de seguridad.\nPara obtener más información, consulta la [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security sección de seguridad] en el manual.\n\nPara activar la subida de archivos, cambia el modo en el subdirectorio <code>images</code> bajo el directorio raíz de MediaWiki para que el servidor web pueda escribir en él.\nLuego, activa esta opción.",
        "config-upload-deleted": "Directorio para los archivos eliminados:",
        "config-upload-deleted-help": "Elige un directorio en el que guardar los archivos eliminados.\nLo ideal es una carpeta no accesible desde la red.",
        "config-logo": "URL del logo :",
        "config-install-mainpage": "Creando página principal con contenido predeterminado",
        "config-install-extension-tables": "Creando las tablas para las extensiones habilitadas",
        "config-install-mainpage-failed": "No se pudo insertar la página principal: $1",
-       "config-install-done": "<strong>¡Felicidades!</strong>\nHas instalado MediaWiki.\n\nEl instalador ha generado un archivo <code>LocalSettings.php</code>.\nEste contiene toda su configuración.\n\nDeberás descargarlo y ponerlo en la base de la instalación de wiki (el mismo directorio que index.php). La descarga debería haber comenzado automáticamente.\n\nSi no comenzó la descarga, o si se ha cancelado, puedes reiniciar la descarga haciendo clic en el siguiente enlace:\n\n$3\n\n<strong>Nota</strong>: si no haces esto ahora, este archivo de configuración generado no estará disponible más tarde si sales de la instalación sin descargarlo.\n\nCuando lo hayas hecho, podrás <strong>[$2  entrar en tu wiki]</strong>.",
+       "config-install-done": "<strong>¡Felicidades!</strong>\nHas instalado MediaWiki.\n\nEl instalador ha generado un archivo <code>LocalSettings.php</code>.\nEste contiene toda su configuración.\n\nDeberás descargarlo y ponerlo en la base de la instalación de wiki (el mismo directorio que index.php). La descarga debería haber comenzado automáticamente.\n\nSi no comenzó la descarga, o si se ha cancelado, puedes reiniciar la descarga haciendo clic en el siguiente enlace:\n\n$3\n\n<strong>Nota</strong>: si no haces esto ahora, este archivo de configuración generado no estará disponible más tarde si sales de la instalación sin descargarlo.\n\nCuando lo hayas hecho, podrás <strong>[$2 entrar en tu wiki]</strong>.",
+       "config-install-done-path": "<strong>¡Felicidades!</strong>\nHas instalado MediaWiki.\n\nEl instalador ha generado un archivo <code>LocalSettings.php</code>.\nEste contiene toda su configuración.\n\nDeberás descargarlo y ponerlo en <code>$4</code>. La descarga debería haber comenzado automáticamente.\n\nSi no comenzó la descarga, o si se ha cancelado, puedes reiniciar la descarga haciendo clic en el siguiente enlace:\n\n$3\n\n<strong>Nota</strong>: si no haces esto ahora, este archivo de configuración generado no estará disponible más tarde si sales de la instalación sin descargarlo.\n\nCuando lo hayas hecho, podrás <strong>[$2 entrar en tu wiki]</strong>.",
        "config-download-localsettings": "Descargar <code>LocalSettings.php</code>",
        "config-help": "ayuda",
        "config-help-tooltip": "haz clic para ampliar",
index b9d5086..dfcf1d3 100644 (file)
@@ -78,6 +78,6 @@
        "config-install-user-alreadyexists": "Kasutaja \"$1\" on juba olemas",
        "config-install-tables": "Tabelite loomine",
        "config-help": "abi",
-       "mainpagetext": "'''MediaWiki tarkvara on edukalt paigaldatud.'''",
+       "mainpagetext": "<strong>MediaWiki tarkvara on paigaldatud.</strong>",
        "mainpagedocfooter": "Vikitarkvara kasutamise kohta leiad lisateavet [https://meta.wikimedia.org/wiki/Help:Contents juhendist].\n\n== Alustamine ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Häälestussätete loend]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki KKK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki versiooniuuenduste postiloend]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources MediaWiki lokaliseerimine]"
 }
index 9813257..e22317c 100644 (file)
@@ -13,7 +13,8 @@
                        "Huji",
                        "Macofe",
                        "درفش کاویانی",
-                       "Hamisun"
+                       "Hamisun",
+                       "Alifakoor"
                ]
        },
        "config-desc": "نصب کنندهٔ ویکی‌مدیا",
        "config-env-php": "پی‌اچ‌پی $1 نصب شده‌است.",
        "config-env-hhvm": "HHVM $1 نصب شده‌است.",
        "config-unicode-using-intl": "برای یونیکد عادی از [http://pecl.php.net/intl intl PECL extension] استفاده کنید.",
-       "config-unicode-pure-php-warning": "'''هشدار:''' [http://pecl.php.net/intl intl PECL extension] برای کنترل یونیکد عادی در دسترس نیست،اجرای کاملاً آهسته به تعویق می‌افتد.\nاگر شما یک سایت پر‌ ترافیک را اجرا می‌کنید، باید کمی [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization] را بخوانید.",
-       "config-unicode-update-warning": "'''هشدار:''' نسخهٔ نصب شدهٔ پوشهٔ یونیکد عادی از ورژن قدیمی‌تر کتابخانه [http://site.icu-project.org/ the ICU project's] استفاده می‌کند.\nاگر کلاً علاقه‌مند به استفاده از یونیکد هستید باید [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations upgrade].",
+       "config-unicode-pure-php-warning": "'''هشدار:''' [http://pecl.php.net/intl intl PECL extension] برای کنترل یونیکد عادی در دسترس نیست،اجرای کاملاً آهسته به تعویق می‌افتد.\n\nاگر شما یک سایت پر‌ ترافیک را اجرا می‌کنید، باید کمی [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization] را بخوانید.",
+       "config-unicode-update-warning": "'''هشدار:''' نسخهٔ نصب شدهٔ پوشهٔ یونیکد عادی از ورژن قدیمی‌تر کتابخانه [http://site.icu-project.org/ the ICU project's] استفاده می‌کند.\n\nاگر کلاً علاقه‌مند به استفاده از یونیکد هستید باید [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations upgrade].",
        "config-no-db": "درایور پایگاه اطلاعاتی مناسب پیدا نشد! شما لازم دارید یک درایور پایگاه اطلاعاتی  برای پی‌اچ‌پی نصب کنید.انواع پایگاه اطلاعاتی زیر پشتیبانی شده‌اند:$1.\nاگر شما در گروه اشتراک‌گذاری هستید، از تهیه کنندهٔ گروه خود برای نصب یک درایور پایگاه اطلاعاتی مناسب {{PLURAL:$2|سوأل کنید.|سوأل کنید.}}\nاگر خود، پی‌اچ‌پی را تهیه کرده‌اید، با یک پردازشگر فعال دوباره پیکربندی کنید، برای مثال از <code>./configure --with-mysql</code> استفاده کنید.\nاگر پی‌اچ‌پی را از یک بستهٔ دبیان یا آبونتو نصب کرده‌اید، بنابراین لازم دارید بخش php5-mysql را نصب کنید.",
        "config-outdated-sqlite": "''' هشدار:''' شما اس‌کیولایت $1 دارید، که پایین‌تر از حداقل نسخهٔ $2 مورد نیاز است.اس‌کیولایت در دسترس نخواهد بود.",
        "config-no-fts3": "'''هشدار:''' اس‌کیولایت بدون [//sqlite.org/fts3.html FTS3 module] تهیه شده‌است ، جستجوی ویژگی‌ها در این بخش پیشین در دسترس نخواهد‌بود.",
-       "config-mbstring": "''' مخرب:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] فعال است.\nاین گزینه باعث ایجاد خطا می‌شود و ممکن است اطلاعات را به طور غیر‌قابل پیش‌بینی از بین ببرد.\nشما نمی‌توانید مدیاویکی را نصب یا استفاده کنید مگر اینکه این گزینه غیر‌فعال باشد.",
-       "config-xml-bad": "ماژول اکس‌ام‌ال پی‌اچ‌پی کار نمی‌کند.\nمدیاویکی نیازمند عملیاتی در این ماژول است و در این پیکربندی کار نخواهد‌کرد.\nشاید نیاز باشد که بستهٔ نرم افزاریِ آرپی‌ام پی‌اچ‌پی-ایکس‌ام‌ال را نصب کنید.",
        "config-pcre-old": "''' خطای اساسی:'' ' PCRE  $1  یا بعدا مورد نیاز است.\nکد باینری پی‌اچ‌پی‌تان با PCRE  $2 پیوند دارد.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE اطلاعات بیشتر].",
        "config-pcre-no-utf8": "'''مخرب:''' به‌ نظر می‌رسد ماژول پی‌سی‌آرایی پی‌اچ‌پی بدون پشتیبانی پی‌سی‌آرایی_یو‌تی‌اف۸ تهیه شده‌است.\nمدیاویکی برای درست عمل کردن نیازمند پشتیبانی یوتی‌اف-۸ است.",
        "config-memory-raised": "PHP's <code>memory_limit</code>, نسخهٔ $1 است، به نسخهٔ $2 ارتقاء داده شده‌است.",
        "config-memory-bad": "'''هشدار:''' PHP's <code>memory_limit</code> نسخهٔ $1 است.\nاین ممکن است خیلی پایین باشد.\nممکن است نصب با مشکل رو‌به‌رو شود.",
-       "config-ctype": "'''مخرب:''' پی‌اچ‌پی باید با پشتیبانی برای [http://www.php.net/manual/en/ctype.installation.php Ctype extension] تهیه شده‌باشد.",
-       "config-iconv": "<strong>خطای اساسی:</strong> پی‌اچ‌پی باید کامپایل‌شده باشد برای پشتیبانی از [http://www.php.net/manual/en/iconv.installation.php افزونهٔ iconv].",
-       "config-json": "'''مخرب:''' پی‌اچ‌پی بدون پشتیبانی جِی‌اس‌اُ‌ان تهیه شده‌بود.\nشما باید قبل از نصب مدیاویکی یا بسط  جِی‌اس‌اُ‌ان پی‌اچ‌پی یا بسط [http://pecl.php.net/package/jsonc PECL jsonc] را نصب کنید.\n* بسط پی‌اچ‌پی شامل لینوکس اینترپرایز رد هت (سِنت‌اُاِس) 5 یا 6 است، هرچند باید در <code>/etc/php.ini</code> یا <code>/etc/php.d/json.ini</code> فعال باشد.\n*  به‌جای بسته‌بندی کردن بسط پی‌ایی‌سی‌اِل مانند <code>php5-json</code> یا <code>php-pecl-jsonc</code>، توزیع‌های برخی لینوکس پس از ماه می ۲۰۱۳ با حذف بسط پی‌اچ‌پی افزایش پیدا کرد.",
-       "config-mbstring-absent": "<strong>خطای اساسی:</strong> پی‌اچ‌پی باید با پشتیبانی [http://www.php.net/manual/en/mbstring.setup.php mbstring extension] تهیه شده باشد.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] نصب شده‌است.",
        "config-apc": "[http://www.php.net/apc APC] نصب شده‌است.",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] نصب شده‌است.",
        "config-install-extension-tables": "ایجاد جداول برای افزونه‌های فعال",
        "config-install-mainpage-failed": "قادر به درج صفحهٔ اصلی نمی‌باشد:$1",
        "config-install-done": "'''تبریک!'''\nبا موفقیت مدیاویکی را نصب کردید.\nبرنامه نصب‌کننده پرونده <code>LocalSettings.php</code> را درست کرد.\nکه شامل تمام تنظیمات می‌باشد.\n\nشما نیاز به دریافت آن دارید و آن را در پایهٔ نصب ویکی قرار دهید (همان پوشهٔ index.php). دریافت باید به صورت خودکار شروع شده‌باشد.\n\nاگر دریافت شروع نشد یا اگر آن را لغو کردید با کلیک روی پیوند زیر می‌توانید آن را دریافت کنید:\n\n$3\n\n'''توجه داشته باشید:''' اگر این را الآن انجام ندهید، این پرونده تولیدشده در صورتی که نصب را بدون دریافت آن تمام کردید بعداً در اختیار شما قرار نخواهد گرفت.\n\nوقتی انجام شد شما می‌توانید '''[$2 وارد ویکی شوید]'''.",
+       "config-install-done-path": "<strong>تبریک!</strong>\nمدیاویکی با موفقیت نصب گردید.\nبرنامه نصب‌کننده یک پرونده <code>LocalSettings.php</code> ایجاد کرده است که شامل تمام تنظیمات می‌باشد.\n\nلازم است شما آن را دریافت کرده و در <code>$4</code> قرار دهید. اِن دریافت می باِست به صورت خودکار شروع شده‌باشد.\n\nاگر دریافت شروع نشده بود و یا آن را لغو کرده اید با کلیک روی پیوند زیر می‌توانید آن را دریافت کنید:\n\n$3\n\n<strong>توجه:</strong> اگر این کار را هم اکنون انجام ندهید و بدون دریافت آن از برنامه نصب خارج شويد، این پرونده تنظیمات تولیدشده در آینده در اختیار شما قرار نخواهد داشت.\n\nوقتی که آن کار را انجام داديد، می‌توانید <strong>[$2 وارد ويکی خودتان شويد]</strong>.",
        "config-download-localsettings": "دریافت <code>LocalSettings.php</code>",
        "config-help": "راهنما",
        "config-help-tooltip": "برای گسترش کلیک کنید",
index 33b2532..7dbca51 100644 (file)
@@ -67,9 +67,9 @@
        "config-env-php": "PHP $1 on asennettu.",
        "config-env-hhvm": "HHVM $1 on asennettu.",
        "config-unicode-using-intl": "Käyttää [http://pecl.php.net/intl intl PECL-laajennusta] Unicode-normalisaatioon.",
-       "config-no-db": "Sopivaa tietokanta-ajuria ei löytynyt! Sinun täytyy asentaa tietokanta-ajurit PHP:lle.\nSeuraavat tietokantatyypit ovat tuettuja: $1.",
+       "config-no-db": "Sopivaa tietokanta-ajuria ei löytynyt! Sinun täytyy asentaa tietokanta-ajuri PHP:lle.\n{{PLURAL:$2|Seuraava tietokantatyyppi on tuettu|Seuraavat tietokantatyypit ovat tuettuja}}: $1.\n\nJos koostit PHP:n itse, määritä se uudelleen tietokanta-asiakkaan ollessa käytössä, esimerkiksi koodilla <code>./configure --with-mysqli</code>.\nJos asensit PHP:n Debian- tai Ubuntu-pakkauksesta, sinun on myös asennettava esimerkiksi <code>php5-mysql</code>-pakkaus.",
        "config-outdated-sqlite": "<strong>Varoitus:</strong> sinulla on käytössä SQLite $1, joke on vanhempi kuin vähintään vaadittava versio $2. SQLite ei ole saatavilla.",
-       "config-xml-bad": "PHP:n XML-moduulia ei löydy.\nMediaWiki käyttää tämän moduulin funktioita, eikä toimi tässä kokoonpanossa.\nJos käytät Mandrakea, asenna php-xml paketti.",
+       "config-no-fts3": "<strong>Varoitus:</strong> SQLite on koostettu ilman [//sqlite.org/fts3.html FTS3-moduulia], hakuominaisuudet eivät ole käytössä tässä taustajärjestelmässä.",
        "config-pcre-old": "<strong>Tärkeää:</strong> PCRE $1 tai uudempi versio tarvitaan.\nPHP-binäärisi on linkitetty versiolla PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Lisätietoja].",
        "config-memory-raised": "PHP:n <code>memory_limit</code> on $1, nostetaan arvoon $2.",
        "config-memory-bad": "'''Varoitus:''' PHP:n <code>memory_limit</code> on $1.\nTämä on luultavasti liian alhainen.\nAsennus saattaa epäonnistua!",
        "config-connection-error": "$1.\n\nTarkista isäntä, käyttäjänimi, salasana ja yritä uudestaan.",
        "config-invalid-schema": "Virheellinen skeema MediaWikille \"$1\".\nKäytä pelkkiä ASCII-kirjaimia (a-z, A-Z), numeroita (0-9) ja alaviivoja (_).",
        "config-db-sys-create-oracle": "Asennusohjelma tukee ainoastaan SYSDBA-tunnuksen käyttämistä uuden tunnuksen luonnissa.",
+       "config-db-sys-user-exists-oracle": "Käyttäjätunnus \"$1\" on jo olemassa. SYSDBA:ta voidaan käyttää vain uuden tunnuksen luontiin!",
        "config-postgres-old": "MediaWiki tarvitsee PostgreSQL:n version $1 tai uudemman. Nykyinen versio on $2.",
        "config-mssql-old": "Vaaditaan Microsoft SQL Server $1 tai uudempi. Sinulla on käytössä $2.",
        "config-sqlite-name-help": "Valitse nimi, joka yksilöi tämän wikin.\nÄlä käytä välilyöntejä tai viivoja.\nNimeä käytetään SQLite-tietokannan tiedostonimessä.",
        "config-sqlite-dir-unwritable": "Hakemistoon ”$1” kirjoittaminen epäonnistui.\nMuuta hakemiston käyttöoikeuksia siten, että palvelinohjelmisto voi kirjoittaa siihen ja yritä uudelleen.",
        "config-sqlite-readonly": "Tiedostoon <code>$1</code> ei voi kirjoittaa.",
+       "config-sqlite-cant-create-db": "Tietokantatiedostoa <code>$1</code> ei voitu luoda.",
        "config-sqlite-fts3-downgrade": "PHP:stä puuttuu FTS3-tuki. Poistetaan ominaisuus käytöstä tietokantatauluista.",
        "config-can-upgrade": "Tietokanta sisältää jo MediaWiki tauluja.\nPäivitä ne MediaWiki-versioon $1 painamalla <strong>Jatka</strong>.",
        "config-upgrade-done": "Päivitys valmis.\n\nVoit [$1 aloittaa wikin käytön].\n\nNapsauta alla olevaa painiketta, jos haluat luoda uudelleen <code>LocalSettings.php</code>-tiedoston.\nTämä '''ei ole suositeltavaa''', jos wikissäsi ei ole ongelmia.",
        "config-upgrade-done-no-regenerate": "Päivitys valmis.\n\nVoit [$1 aloittaa wikin käytön].",
        "config-regenerate": "Luo LocalSettings.php uudelleen →",
        "config-show-table-status": "Kysely <code>SHOW TABLE STATUS</code> epäonnistui!",
+       "config-unknown-collation": "<strong>Varoitus:</strong> Tietokanta käyttää tunnistamatonta lajittelua.",
        "config-db-web-help": "Valitse käyttäjänimi ja salasana joita palvelin käyttää muodostaessaan yhteyttä tietokantapalvelimeen wikin normaalin toiminnan aikana.",
        "config-db-web-account-same": "Käytä samaa tiliä kuin asennuksessa",
        "config-db-web-create": "Lisää tili, jos sitä ei ole jo olemassa",
        "config-mysql-charset": "Tietokannan merkistökoodaus:",
        "config-mysql-binary": "Binääri",
        "config-mysql-utf8": "UTF-8",
+       "config-mssql-auth": "Varmennuksen tyyppi:",
+       "config-mssql-install-auth": "Valitse varmennuksen tyyppi, jota käytetään yhdistäessä tietokantaan asennuksen aikana.\nJos valitset \"{{int:config-mssql-windowsauth}}\", käytetään verkkopalvelimen käyttäjän kirjautumistietoja.",
+       "config-mssql-web-auth": "Valitse varmennuksen tyyppi, jota verkkopalvelin käyttää yhdistäessään tietokantapalvelimeen wikin tavallisen toiminnan aikana.\nJos valitset \"{{int:config-mssql-windowsauth}}\", käytetään verkkopalvelimen käyttäjän kirjautumistietoja.",
+       "config-mssql-windowsauth": "Windows-varmennus",
        "config-site-name": "Wikin nimi",
        "config-site-name-help": "Tämä näkyy selaimen otsikkona ja muissa kohdissa.",
        "config-site-name-blank": "Kirjoita sivuston nimi.",
        "config-ns-site-name": "Sama kuin wikin nimi: $1",
        "config-ns-other": "Muu (määritä)",
        "config-ns-other-default": "MinunWiki",
+       "config-project-namespace-help": "Wikipedian esimerkkiä seuraten monien wikien käytäntösivut ovat erillään sisältösivuista '''projektinimiavaruudessa'''.\nTämän nimiavaruuden kaikki sivujen nimet alkavat etuliitteellä, jonka voit määrittää tässä.\nYleensä tämä etuliite pohjautuu wikin nimeen, mutta siinä ei saa olla välimerkkejä kuten \"#\" tai \":\".",
        "config-ns-invalid": "Määritelty nimiavaruus \"<nowiki>$1</nowiki>\" on virheellinen.\nSyötä joku muu nimiavaruus.",
        "config-ns-conflict": "Määritelty nimiavaruus \"<nowiki>$1</nowiki>\" on ristiriidassa MediaWikin oletusnimiavaruuksien kanssa.\nSyötä joku muu nimiavaruus.",
        "config-admin-box": "Ylläpitäjän tili",
        "config-upload-deleted": "Poistettujen tiedostojen hakemisto:",
        "config-upload-deleted-help": "Valitse hakemisto johon poistetut tiedostot arkistoidaan.\nHakemiston ei tulisi olla käytettävissä internetverkosta.",
        "config-logo": "Logon URL-osoite",
+       "config-logo-help": "MediaWikin oletusulkoasussa on paikka 135x160 pikselin kokoiselle logolle sivupalkin yläpuolella.\nTallenna sopivan kokoinen kuva ja lisää URL tähän.\n\nVoit käyttää muuttujia <code>$wgStylePath</code> tai <code>$wgScriptPath</code>, jos logosi on määritelty suhteessa näihin polkuihin.\n\nJos et halua logoa, jätä tämä kenttä tyhjäksi.",
        "config-instantcommons": "Aktivoi Instant Commons",
        "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] on ominaisuus, joka antaa wikien käyttää kuvia, ääniä ja muuta mediaa [https://commons.wikimedia.org/ Wikimedia Commons] -sivustolta.\nTehdäkseen tämän MediaWiki tarvitsee Internet-yhteyden.\n\nLisätietoja tästä ominaisuudesta, mukaan lukien ohjeet, kuinka sen voi asettaa muille wikeille kuin Wikimedia Commons, löytyy [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos ohjeista].",
        "config-cc-error": "Creative Commons -lisenssinvalitsija ei antanut tulosta.\nSyötä lisenssin nimi manuaalisesti.",
        "config-install-interwiki-exists": "<strong>Varoitus:</strong> interwiki-taulussa on jo tietueita, ohitetaan oletuslista.",
        "config-install-stats": "Alustetaan tilastoja",
        "config-install-keys": "Muodostetaan salausavaimia",
+       "config-insecure-keys": "<strong>Varoitus:</strong> Asennuksen aikana {{PLURAL:$2|luotu turva-avain|luodut turva-avaimet}} ($1) {{PLURAL:$2|ei|eivät}} ole täysin {{PLURAL:$2|turvallinen|turvallisia}}. Harkitse {{PLURAL:$2|sen|niiden}} muuttamista manuaalisesti.",
        "config-install-updates": "Estä tarpeettomien päivitysten asennus",
        "config-install-sysop": "Luodaan ylläpitäjän tiliä",
        "config-install-subscribe-fail": "Liittyminen mediawiki-announce listalle epäonnistui: $1",
        "config-install-extension-tables": "Luodaan tauluja käyttöönotetuille laajuennuksille",
        "config-install-mainpage-failed": "Etusivun lisääminen ei onnistunut: $1",
        "config-install-done": "<strong>Onnittelut!</strong>\nOlet asentanut MediaWikin.\n\nAsennusohjelma on luonut <code>LocalSettings.php</code> -tiedoston.\nSiinä on kaikki MediaWikin asetukset.\n\nLataa tiedosto ja laita se MediaWikin asennushakemistoon (sama kuin missä on index.php). Lataamisen olisi pitänyt alkaa automaattisesti.\n\nMikäli latausta ei tarjottu tai keskeytit latauksen, käynnistä se uudestaan tästä linkistä:\n\n$3\n\n<strong>Huom:</strong> Mikäli et nyt lataa tiedostoa, luotu tiedosto ei ole saatavissa myöhemmin, jos poistut asennuksesta lataamatta sitä.\n\nKun olet laittanut tiedoston oikeaan paikkaan, voit <strong>[$2 mennä wikiisi]</strong>.",
+       "config-install-done-path": "<strong>Onnittelut!</strong>\nOlet asentanut MediaWikin.\n\nAsennusohjelma on luonut <code>LocalSettings.php</code> -tiedoston.\nSiinä on kaikki MediaWikin asetukset.\n\nLataa tiedosto ja laita se sijaintiin <code>$4</code>. Lataamisen olisi pitänyt alkaa automaattisesti.\n\nMikäli latausta ei tarjottu tai keskeytit latauksen, käynnistä se uudestaan tästä linkistä:\n\n$3\n\n<strong>Huom:</strong> Mikäli et nyt lataa tiedostoa, luotu tiedosto ei ole saatavissa myöhemmin, jos poistut asennuksesta lataamatta sitä.\n\nKun olet laittanut tiedoston oikeaan paikkaan, voit <strong>[$2 mennä wikiisi]</strong>.",
        "config-download-localsettings": "Lataa <code>LocalSettings.php</code>",
        "config-help": "ohje",
        "config-help-tooltip": "Klikkaa laajentaaksesi",
index 4bee62f..1d230b2 100644 (file)
        "config-env-hhvm": "HHVM $1 est installé.",
        "config-unicode-using-intl": "Utilisation de [http://pecl.php.net/intl l'extension PECL intl] pour la normalisation Unicode.",
        "config-unicode-pure-php-warning": "<strong>Attention :</strong> L’[http://pecl.php.net/intl extension PECL intl] n’est pas disponible pour la normalisation d’Unicode, retour à la version lente implémentée en PHP.\nSi votre site web sera très fréquenté, vous devriez lire ceci : [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations ''Unicode normalization''] (en anglais).",
-       "config-unicode-update-warning": "'''Attention''': La version installée du ''wrapper'' de normalisation Unicode utilise une vieille version de la [http://site.icu-project.org/ bibliothèque logicielle ''ICU Project''].\nVous devriez faire une [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations mise à jour] si vous êtes tout à fait concerné par l'usage d'Unicode.",
+       "config-unicode-update-warning": "<strong>Attention</strong>: La version installée du normalisateur Unicode utilise une ancienne version de la [http://site.icu-project.org/ bibliothèque logicielle ''ICU Project''].\nVous devriez faire une [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations mise à jour] si vous êtes concerné par l'usage d'Unicode.",
        "config-no-db": "Impossible de trouver un pilote de base de données approprié ! Vous devez installer un pilote de base de données pour PHP. {{PLURAL:$2|Le type suivant|Les types suivants}} de bases de données {{PLURAL:$2|est reconnu|sont reconnus}} : $1.\n\nSi vous avez compilé PHP vous-même, reconfigurez-le avec un client de base de données actif, par exemple en utilisant <code>./configure --with-mysqli</code>. Si vous avez installé PHP depuis un paquet Debian ou Ubuntu, alors vous devrez aussi installer, par exemple, le paquet <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Attention''': vous avez SQLite $1, qui est inférieur à la version minimale requise $2. SQLite sera indisponible.",
        "config-no-fts3": "'''Attention :''' SQLite est compilé sans le module [//sqlite.org/fts3.html FTS3] ; les fonctions de recherche ne seront pas disponibles sur ce moteur.",
-       "config-mbstring": "'''Erreur fatale : [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] est activé !'''\nCette option provoque des erreurs et peut corrompre les données de manière imprévisible.\nVous ne pouvez pas installer ou utiliser MediaWiki tant que cette option est activée.",
-       "config-xml-bad": "Le module XML de PHP est manquant.\nMediaWiki requiert des fonctions de ce module et ne fonctionnera pas avec cette configuration.\nVous pourrez avoir besoin d’installer le paquet RPM php-xml.",
        "config-pcre-old": "'''Fatal :''' PCRE $1 ou ultérieur est nécessaire.\nVotre binaire PHP est lié avec PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/Plus d’information sur PCRE].",
        "config-pcre-no-utf8": "'''Erreur fatale''': Le module PCRE de PHP semble être compilé sans le support PCRE_UTF8.\nMédiaWiki nécessite la gestion d’UTF-8 pour fonctionner correctement.",
        "config-memory-raised": "Le paramètre <code>memory_limit</code> de PHP était à $1, porté à $2.",
        "config-memory-bad": "'''Attention :''' Le paramètre <code>memory_limit</code> de PHP est à $1.\nCette valeur est probablement trop faible.\nIl est possible que l’installation échoue !",
-       "config-ctype": "'''Fatal ''': PHP doit être compilé avec le support pour l'[http://www.php.net/manual/en/ctype.installation.php extension Ctype].",
-       "config-iconv": "<strong>Erreur critique :</strong> PHP doit être compilé avec le support de l’[http://www.php.net/manual/en/iconv.installation.php extension iconv].",
-       "config-json": "'''Erreur fatale :''' PHP a été compilé sans le support de JSON.\nVous devez soit installez l’extension JSON de PHP ou l’extension [http://pecl.php.net/package/jsonc PECL jsonc] avant d’installer MediaWiki.\n* L’extension PHP est comprise dans Red Hat Enterprise Linux (CentOS) 5 et 6, mais doit être activée dans <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.\n* Certaines distributions Linux après mai 2013 ne comprennent pas l’extension PHP, mais ont mis à la place l’extension PECL sous la forme <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
-       "config-mbstring-absent": "<strong>Fatal :</strong> PHP doit être compilé avec la prise en charge de [http://www.php.net/manual/en/mbstring.setup.php l’extension mbstring].",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] est installé",
        "config-apc": "[http://www.php.net/apc APC] est installé",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] est installé",
        "config-subscribe": "Abonnez-vous à la [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce liste d'annonce des nouvelles versions]",
        "config-subscribe-help": "Il s'agit d'une liste de diffusion à faible volume utilisée servant à annoncer les nouvelles versions, y compris les versions améliorant la sécurité du logiciel.\nVous devriez y souscrire et mettre à jour votre version de MediaWiki lorsque de nouvelles versions sont publiées.",
        "config-subscribe-noemail": "Vous avez essayé de vous abonner à la liste de diffusion des communiqués, sans fournir une adresse courriel ! S'il vous plaît, fournir une adresse électronique si vous souhaitez vous abonner à la liste de diffusion.",
+       "config-pingback": "Partager des données au sujet de cette installation avec les développeurs de MediaWiki.",
+       "config-pingback-help": "Si vous sélectionnez cette option, MediaWiki fera périodiquement un ping de https://www.mediawiki.org avec les données de base sur cette instance de MediaWiki. Ces données incluent, par exemple, le type de système, la version de PHP, ainsi que la base de données arrière choisie. La Fondation Wikimedia partage ces données avec les développeurs de MediaWiki pour aider à orienter les futurs efforts de développement. Les données suivantes concernant votre système seront envoyées : <pre>$1</pre>",
        "config-almost-done": "Vous avez presque fini !\nVous pouvez passer la configuration restante et installer immédiatement le wiki.",
        "config-optional-continue": "Me poser davantage de questions.",
        "config-optional-skip": "J’en ai assez, installer simplement le wiki.",
        "config-profile-no-anon": "Création de compte requise",
        "config-profile-fishbowl": "Éditeurs autorisés seulement",
        "config-profile-private": "Wiki privé",
-       "config-profile-help": "Les wikis fonctionnent mieux lorsque vous laissez le plus de personnes possible les modifier.\nAvec MediaWiki, il est facile de vérifier les modifications récentes et de révoquer tout dommage créé par des utilisateurs débutants ou mal intentionnés.\n\nCependant, de nombreuses autres utilisations ont été trouvées au logiciel et il n’est pas toujours facile de convaincre tout le monde des bénéfices de l’esprit wiki.\nVous avez donc le choix.\n\nLe modèle '''{{int:config-profile-wiki}}''' autorise toute personne à modifier, y compris sans s’identifier.\n'''{{int:config-profile-no-anon}}''' fournit plus de contrôle, mais peut rebuter les contributeurs occasionnels.\n\n'''{{int:config-profile-fishbowl}}''' autorise la modification par les utilisateurs approuvés, mais le public peut toujours lire les pages et leur historique.\n'''{{int:config-profile-private}}''' n’autorise que les utilisateurs approuvés à voir les pages dans le même groupe que les utilisateurs autorisés à y écrire.\n\nDes configurations de droits d’utilisateurs plus complexes sont disponibles après l'installation, voir la [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights page correspondante du manuel].",
+       "config-profile-help": "Les wikis fonctionnent au mieux lorsque vous laissez un maximum de personnes les modifier.\nAvec MediaWiki, il est facile de vérifier les modifications récentes et de révoquer tout dommage créé par des utilisateurs débutants ou mal intentionnés.\n\nCependant, MediaWiki est utilisé dans bien d'autres cas et il n’est pas toujours facile de convaincre chacun des bénéfices de l’esprit wiki.\nVous avez donc le choix.\n\nLe modèle <strong>{{int:config-profile-wiki}}</strong> autorise toute personne à modifier, y compris sans s’identifier.\n<strong>{{int:config-profile-no-anon}}</strong> fournit plus de contrôle, mais peut rebuter les contributeurs occasionnels.\n\n<strong>{{int:config-profile-fishbowl}}</strong> autorise la modification par les utilisateurs approuvés mais le public peut toujours consulter les pages et leur historique.\n<strong>{{int:config-profile-private}}</strong> n’autorise que les utilisateurs approuvés à voir et éditer les pages.\n\nDes configurations de droits d’utilisateurs plus complexes sont disponibles après l'installation, voir la [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights page correspondante du manuel].",
        "config-license": "Droits d'auteur et licence :",
        "config-license-none": "Aucune licence en bas de page",
        "config-license-cc-by-sa": "Creative Commons attribution partage à l'identique",
        "config-install-extension-tables": "Création de tables pour les extensions activées",
        "config-install-mainpage-failed": "Impossible d’insérer la page principale : $1",
        "config-install-done": "<strong>Félicitations!</strong>\nVous avez installé MediaWiki.\n\nLe programme d'installation a généré un fichier <code>LocalSettings.php</code>. Il contient tous les paramètres de votre configuration.\n\nVous devrez le télécharger et le mettre à la racine de votre installation wiki (dans le même répertoire que index.php). Le téléchargement devrait démarrer automatiquement.\n\nSi le téléchargement n'a pas été proposé, ou que vous l'avez annulé, vous pouvez redémarrer le téléchargement en cliquant ce lien :\n\n$3\n\n<strong>Note :</strong> Si vous ne le faites pas maintenant, ce fichier de configuration généré ne sera pas disponible plus tard si vous quittez l'installation sans le télécharger.\n\nLorsque c'est fait, vous pouvez <strong>[$2 accéder à votre wiki]</strong> .",
+       "config-install-done-path": "<strong>Félicitations !</strong>\nVous avez installé MédiaWiki.\n\nL’installeur a généré un fichier <code>LocalSettings.php</code>.\nIl contient toute votre configuration.\n\nVous devez le télécharger et le mettre dans <code>$4</code>. Le téléchargement devrait avoir démarré automatiquement.\n\nSi le téléchargement n’a pas été proposé ou si vous l’avez annulé, vous pouvez le redémarrer en cliquant sur le lien ci-dessous :\n\n$3\n\n<strong>Note :</strong> Si vous ne le faites pas maintenant, ce fichier de configuration généré ne sera plus disponible ultérieurement si vous quittez l’installation sans le télécharger.\n\nUne fois ceci fait, vous pouvez <strong>[$2 entrer dans votre wiki]</strong>.",
        "config-download-localsettings": "Télécharger <code>LocalSettings.php</code>",
        "config-help": "aide",
        "config-help-tooltip": "cliquer pour agrandir",
index 69ce0a1..326f947 100644 (file)
@@ -5,7 +5,8 @@
                        "Toliño",
                        "아라",
                        "Vivaelcelta",
-                       "Macofe"
+                       "Macofe",
+                       "Banjo"
                ]
        },
        "config-desc": "O programa de instalación de MediaWiki",
        "config-no-db": "Non se puido atopar un controlador axeitado para a base de datos! Necesita instalar un controlador de base de datos para PHP.\n{{PLURAL:$2|Acéptase o seguinte tipo|Acéptanse os seguintes tipos}} de base de datos: $1.\n\nSe compilou o PHP vostede mesmo, reconfigúreo activando un cliente de base de datos, por exemplo, usando <code>./configure --with-mysql</code>.\nSe instalou o PHP desde un paquete Debian ou Ubuntu, entón tamén necesita instalar, por exemplo, o módulo <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Atención:</strong> Ten o SQLite $1, que é inferior á versión mínima necesaria: $2. O SQLite non estará dispoñible.",
        "config-no-fts3": "<strong>Atención:</strong> O SQLite está compilado sen o [//sqlite.org/fts3.html módulo FTS3]; as características de procura non estarán dispoñibles nesta instalación.",
-       "config-mbstring": "<strong>Erro fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está activado!</strong>\nEsta opción causa erros e pode corromper os datos de xeito imprevisible.\nNon pode instalar ou empregar MediaWiki a menos que esta opción estea desactivada.",
-       "config-xml-bad": "Falta o módulo XML do PHP.\nMediaWiki necesita funcións neste módulo e non funcionará con esta configuración.\nPode que necesite instalar o php-xml no paquete RPM.",
        "config-pcre-old": "<strong>Erro fatal:</strong> Necesítase PCRE $1 ou posterior.\nO seu PHP binario está ligado con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Máis información].",
        "config-pcre-no-utf8": "<strong>Erro fatal:</strong> Semella que o módulo PCRE do PHP foi compilado sen o soporte PCRE_UTF8.\nMediaWiki necesita soporte UTF-8 para funcionar correctamente.",
        "config-memory-raised": "O parámetro <code>memory_limit</code> do PHP é $1. Aumentado a $2.",
        "config-memory-bad": "<strong>Atención:<strong> O parámetro <code>memory_limit</code> do PHP é $1.\nProbablemente é un valor baixo de máis.\nA instalación pode fallar!",
-       "config-ctype": "<strong>Erro fatal:</strong> O PHP debe compilarse co soporte para a [http://www.php.net/manual/en/ctype.installation.php extensión Ctype].",
-       "config-iconv": "<strong>Erro fatal:</strong> O PHP debe compilarse co soporte para a [http://www.php.net/manual/en/iconv.installation.php extensión iconv].",
-       "config-json": "<strong>Erro fatal:</strong> O PHP compilouse sen o soporte de JSON.\nDebe instalar ben a extensión JSON do PHP ou a extensión [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar MediaWiki.\n* A extensión do PHP está incluída en Red Hat Enterprise Linux (CentOS) 5 e 6, mais debe activarse <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.\n* Algunhas distribucións do Linux lanzadas despois de maio de 2013 omiten a extensión do PHP, pero inclúen a extensión PECL como <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
-       "config-mbstring-absent": "<strong>Erro fatal:</strong> O PHP debe compilarse co soporte para a [http://www.php.net/manual/en/mbstring.setup.php extensión mbstring].",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] está instalado",
        "config-apc": "[http://www.php.net/apc APC] está instalado",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] está instalado",
        "config-subscribe": "Subscríbase á [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce lista de correo de anuncios sobre lanzamentos].",
        "config-subscribe-help": "Esta é unha lista de correos de baixo volume usada para anuncios sobre lanzamentos de novas versións, incluíndo avisos de seguridade importantes.\nDebería subscribirse a ela e actualizar a súa instalación MediaWiki cando saian as novas versións.",
        "config-subscribe-noemail": "Intentou subscribirse á lista de correo dos anuncios de novos lanzamentos sen proporcionar o enderezo de correo electrónico.\nDea un enderezo de correo electrónico se quere efectuar a subscrición á lista de correo.",
+       "config-pingback": "Compartir datos de esta instalación cos desenvolvedores de MediaWiki",
+       "config-pingback-help": "Se seleccionas esta opción, MediaWiki enviará periodicamente unha mensaxe a https://www.mediawiki.org con datos básicos sobre esta instancia Mediawiki. Estos datos inclúen, por exemplo, o tipo de sistema, versión de PHP e a base de datos escollida. A Fundación Wikimedia comparte estos datos cos desenvolvedores de MediaWiki para axudar a guiar o traballo futuro de desenvolvemento.",
        "config-almost-done": "Xa case rematou!\nNeste paso pode saltar o resto da configuración e instalar o wiki agora mesmo.",
        "config-optional-continue": "Facédeme máis preguntas.",
        "config-optional-skip": "Xa estou canso. Instalade o wiki.",
        "config-install-extension-tables": "Creando as táboas para as extensións activadas",
        "config-install-mainpage-failed": "Non se puido inserir a páxina principal: $1",
        "config-install-done": "<strong>Parabéns!</strong>\nInstalou MediaWiki.\n\nO programa de instalación xerou un ficheiro <code>LocalSettings.php</code>.\nEste ficheiro contén toda a súa configuración.\n\nTerá que descargalo e poñelo na base da instalación do seu wiki (no mesmo directorio ca index.php). A descarga debería comezar automaticamente.\n\nSe non comezou a descarga ou se a cancelou, pode facer que comece de novo premendo na ligazón que aparece a continuación:\n\n$3\n\n<strong>Nota:</strong> Se non fai iso agora, este ficheiro de configuración xerado non estará dispoñible máis adiante se sae da instalación sen descargalo.\n\nCando faga todo isto, xa poderá <strong>[$2 entrar no seu wiki]</strong>.",
+       "config-install-done-path": "<strong>Parabéns!</strong>\nInstalou MediaWiki.\n\nO instalador xerou un ficheiro <code>LocalSettings.php</code>.\nEste contén toda a súa configuración.\n\nDeberá descargalo e poñerlo en <code>$4</code>. A descarga debería ter comezado automaticamente.\n\nSe non comenzou a descarga, ou se a cancelou, podes reiniciala descarga premendo na seguinte ligazón:\n\n$3\n\n<strong>Nota</strong>: se non fai isto agora, este ficheiro de configuración xerado non estará dispoñible máis tarde se sae da instalación sen descargarlo.\n\nCando o teña feito, poderá <strong>[$2 entrar na súa wiki]</strong>.",
        "config-download-localsettings": "Descargar o <code>LocalSettings.php</code>",
        "config-help": "axuda",
        "config-help-tooltip": "prema para expandir",
index b2dfdb5..73331d9 100644 (file)
@@ -46,8 +46,6 @@
        "config-unicode-update-warning": "'''Warnig:''' Di inschtalliert Version vum Unicode-Normalisierigswrapper verwändet e elteri Version vu dr Bibliothek vum [http://site.icu-project.org/ ICU-Projäkt].\nDu sottsch si [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations aktualisiere], wänn Dor d Verwändig vu Unicode wichtig isch.",
        "config-no-db": "S isch kei adäquate Datebanktryyber gfunde wore!",
        "config-no-fts3": "'''Warnig:''' SQLite isch ohni s [//sqlite.org/fts3.html FTS3-Modul] kumpiliert wore, s stehn kei Suechfunktione z Verfiegig.",
-       "config-mbstring": "'''Fatal: Dr Parameter <code>[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]</code> vu PHP isch aktiviert!'''\nDie Yystellig verursacht Fähler un fiert zue nit vorhärsähbare Probläm bi dr Datenyygab.\nMediaWiki cha nit inschtalliert wäre, solang dää Parameter nit deaktiviert woren isch.",
-       "config-xml-bad": "S XML-Modul vu PHP fählt.\nMediaWiki brucht Funktione, wu au des Modul z Verfiegig stellt, un funktioniert in däre Konfiguration nit.\nWänn Mandriva brucht wird, mueß no s „php-xml“-Paket inschtalliert wäre.",
        "config-pcre-no-utf8": "'''Fatale Fähler: S PHP-Modul PCRE isch schyns ohni PCRE_UTF8-Unterstitzig kompiliert wore.'''\nMediaWiki brucht d UTF-8-Unterstitzi zum fählerfrej lauffähig syy.",
        "config-memory-raised": "Dr PHP-Parameter <code>memory_limit</code> lyt bi $1 un isch uf $2 uffegsetzt wore.",
        "config-memory-bad": "'''Warnig:''' Dr PHP-Parameter <code>memory_limit</code> lyt bi $1.\nDää Wärt isch wahrschyns z nider.\nDr Inschtallationsvorgang chennt wäge däm fählschlaa!",
index 97bc642..f156a00 100644 (file)
@@ -8,7 +8,8 @@
                        "Inkbug",
                        "Yona b",
                        "Rotemliss",
-                       "Macofe"
+                       "Macofe",
+                       "Guycn2"
                ]
        },
        "config-desc": "תכנית ההתקנה של מדיה־ויקי",
        "config-env-php": "מותקנת <span dir=\"ltr\">PHP $1</span>.",
        "config-env-hhvm": "מותקנת <span dir=\"ltr\">HHVM $1</span>.",
        "config-unicode-using-intl": "משתמש ב[http://pecl.php.net/intl הרחבת intl PECL] לנרמול יוניקוד.",
-       "config-unicode-pure-php-warning": "'''אזהרה''': [http://pecl.php.net/intl הרחבת intl PECL] אינה זמינה לטיפול בנרמול יוניקוד. משתמש ביישום PHP טהור ואטי יותר.\nאם זהו אתר בעל תעבורה גבוהה, כדאי לקרוא את המסמך הבא: [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization].",
+       "config-unicode-pure-php-warning": "<strong>אזהרה:</strong> [http://pecl.php.net/intl הרחבת intl PECL] אינה זמינה לטיפול בנרמול יוניקוד. משתמש ביישום PHP טהור ואטי יותר.\nאם זהו אתר בעל תעבורה גבוהה, כדאי לקרוא את המסמך הבא: [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization].",
        "config-unicode-update-warning": "'''אזהרה''': הגרסה המותקנת של מעטפת נרמול יוניקוד משתמשת בגרסה ישנה של הספרייה של [http://site.icu-project.org/ פרויקט ICU].\nכדאי [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations לעדכן] אם הטיפול ביוניקוד חשוב לך.",
        "config-no-db": "לא נמצא דרייבר מסד נתונים מתאים. יש להתקין דרייבר מסד נתונים ל־PHP.\n{{PLURAL:$2|נתמך הסוג הבא של מסד נתונים|נתמכים הסוגים הבאים של מסדי נתונים}}: $1.\n\nאם קִמפלת את PHP בעצמך, יש להגדיר אותו מחדש ולהפעיל את לקוח מסד נתונים, למשל באמצעות <code dir=\"ltr\">./configure --with-mysqli</code>.\nאם התקנת את PHP מחבילה של דביאן או של אובונטו, יש להתקין, למשל, גם את המודול <code dir=\"ltr\">php5-mysql</code>.",
        "config-outdated-sqlite": "'''אזהרה''': במערכת מתוקן SQLite $1. גרסה זו לא נתמכת ולשימוש ב־SQLite נדרשת גרסה $2 לפחות. SQLlite לא יהיה זמין.",
        "config-no-fts3": "'''אזהרה''': SQLite מהודר ללא [//sqlite.org/fts3.html מודול FTS]. יכולות חיפוש לא יהיו זמינות בהתקנה הזאת.",
-       "config-mbstring": "'''שגיאה סופנית''': האפשרות [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] פעילה!'''\nהאפשרות הזאת גורמת לשגיאות ומעוותת את נתוני הקלט באופן בלתי־צפוי.\nלא ניתן להתקין את מדיה־ויקי או להשתמש בה אלא אם האפשרות הזאת תכובה.",
-       "config-xml-bad": "מודול XML של PHP חסר.\nמדיה־ויקי דורשת פונקציות של המודול ולא תעבוד עם הגדרות כאלו.\nייתכן שצריך להתקין באמצעות RPM את חבילת php-xml.",
        "config-pcre-old": "<strong>שגיאה סופנית:</strong> חובה להתקין PCRE מגרסה $1 או גרסה חדשה יותר.\nקובץ הרצת ה־PHP שלך מקושר עם PCRE מגרסה $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE מידע נוסף].",
        "config-pcre-no-utf8": "<strong>שגיאה סופנית</strong>: נראה שמודול PCRE של PHP מהודר ללא תמיכה ב־PCRE_UTF8.\nמדיה־ויקי דורשת תמיכה ב־UTF-8 לפעילות נכונה.",
        "config-memory-raised": "ערך האפשרות <code>memory_limit</code> של PHP הוא $1, הועלה ל־$2.",
        "config-memory-bad": "'''אזהרה:''' ערך האפשרות <code>memory_limit</code> של PHP הוא $1.\nזה כנראה נמוך מדי.\nההתקנה עשויה להיכשל!",
-       "config-ctype": "<strong>שגיאה סופנית</strong>: נדרשת גרסת PHP שתומכת בהרחבה [http://www.php.net/manual/en/ctype.installation.php Ctype].",
-       "config-iconv": "<strong>סופני:</strong> חובה להדר את PHP עם תמיכה ב[הרחבה http://www.php.net/manual/en/iconv.installation.php iconv].",
-       "config-json": "'''שגיאה סופנית:''' PHP קומפל ללא תמיכה ב־JSON.\nיש להתקין את ההרחהב JSON ב־PHP או את ההרחבה [http://pecl.php.net/package/jsonc PECL jsonc] לפני התקנת מדיה־ויקי.\n* ההרחבה ל־PHP כלולה ב־Red Hat Enterprise Linux (ו־CentOS), אך יש להפעיל אותה ב־<code dir=\"ltr\">/etc/php.ini</code> או ב־<code dir=\"ltr\">/etc/php.d/json.ini</code>.",
-       "config-mbstring-absent": "<strong>סופני:</strong> חובה להדר את PHP עם תמיכה ב[הרחבה http://www.php.net/manual/en/mbstring.setup.php mbstring].",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] מותקן",
        "config-apc": "[http://www.php.net/apc APC] מותקן",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] מותקן",
        "config-subscribe": "להירשם ל[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה עם הודעות על גרסאות חדשות].",
        "config-subscribe-help": "זוהי רשימת תפוצה עם הודעות מעטות שמשמשת להודעות על הוצאת גרסאות, כולל עדכוני אבטחה חשובים.\nמומלץ להירשם אליה ולעדכן את מדיה־ויקי כאשר יוצאות גרסאות חדשות.",
        "config-subscribe-noemail": "ניסית להירשם לרשימת תפוצה של הודעות בלי לתת כתובת דוא\"ל.\nנא לתת כתובת דוא\"ל אם ברצונך להירשם לרשימת התפוצה.",
+       "config-pingback": "לשתף נתונים אודות ההתקנה הזו עם מפתחי מדיה־ויקי.",
        "config-almost-done": "כמעט סיימת!\nאפשר לדלג על שאר ההגדרות ולהתקין את הוויקי כבר עכשיו.",
        "config-optional-continue": "הצגת שאלות נוספות.",
        "config-optional-skip": "משעמם לי, תתקינו לי כבר את הוויקי הזה.",
        "config-email-sender-help": "הכניסו את כתובת הדוא״ל שתשמש ככתובת לתשובה לכל הדואר היוצא.\nלשם יישלחו תגובות שגיאה (bounce).\nשרתי דוא״ל רבים דורשים שלפחות החלק של המתחם יהיה תקין.",
        "config-upload-settings": "העלאת קבצים ותמונות",
        "config-upload-enable": "להפעיל העלאת קבצים",
-       "config-upload-help": "×\94×¢×\9c×\90×\95ת ×§×\91צ×\99×\9d ×\97×\95שפ×\95ת ×\90ת ×\94שרת ×©×\9c×\9b×\9d ×\9cס×\99×\9b×\95× ×\99 ×\90×\91×\98×\97×\94.\n×\9c×\9e×\99×\93×¢ × ×\95סף, ×§Ö´×¨×\90×\95 ×\90ת [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security ×\97×\9cק ×\94×\90×\91×\98×\97×\94] ×\91ספר ×\94×\94×\93ר×\9b×\94.\n\n×\9b×\93×\99 ×\9c×\94פע×\99×\9c ×\94×¢×\9c×\90ת ×§×\91צ×\99×\9d ×©× ×\95 ×\90ת ×\94×\94רש×\90×\95ת ×©×\9c ×\94ת×\99ק×\99×\99×\94 <code>images</code> ×ª×\97ת ×ª×\99ק×\99×\99ת ×\94ש×\95רש ×©×\9c ×\9e×\93×\99×\94Ö¾×\95×\99ק×\99 ×\9b×\9a ×©×©×¨×ª ×\94×\95×\95×\91 ×\99×\95×\9b×\9c ×\9c×\9bת×\95×\91 ×\90×\9c×\99×\94.\n×\96×\94 ×\9eפעיל את האפשרות הזאת.",
+       "config-upload-help": "×\94×¢×\9c×\90ת ×§×\91צ×\99×\9d ×\97×\95שפת ×\90ת ×\94שרת ×©×\9c×\9a ×\9cס×\99×\9b×\95× ×\99 ×\90×\91×\98×\97×\94.\n×\9c×\9e×\99×\93×¢ × ×\95סף, ×\90פשר ×\9cקר×\95×\90 ×\90ת [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security ×\94×\9e×\93ר×\99×\9a ×\94×\96×\94].\n\n×\9b×\93×\99 ×\9c×\90פשר ×\94×¢×\9c×\90×\95ת ×©×\9c ×§×\91צ×\99×\9d, ×\99ש ×\9cשנ×\95ת ×\90ת ×\94×\94רש×\90×\95ת ×©×\9c ×\94ת×\99ק×\99×\99×\94 <code>images</code> ×ª×\97ת ×ª×\99ק×\99×\99ת ×\94ש×\95רש ×©×\9c ×\9e×\93×\99×\94Ö¾×\95×\99ק×\99 ×\9b×\93×\99 ×©×©×¨×ª ×\94Ö¾web ×\99×\95×\9b×\9c ×\9c×\9bת×\95×\91 ×\90×\9c×\99×\94.\n×\9c×\90×\97ר ×\9e×\9b×\9f ×\99ש ×\9c×\94פעיל את האפשרות הזאת.",
        "config-upload-deleted": "תיקיית לקבצים שנמחקו:",
        "config-upload-deleted-help": "בחרו את התיקייה לארכוב קבצים מחוקים.\nכדאי שזה לא יהיה נגיש לכל העולם דרך הרשת.",
        "config-logo": "כתובת הסמל:",
        "config-install-mainpage": "יצירת דף ראשי עם תוכן התחלתי",
        "config-install-extension-tables": "יצירת טבלאות להרחבות מופעלות",
        "config-install-mainpage-failed": "לא הצליחה הכנסת דף ראשי: $1.",
-       "config-install-done": "</strong>מזל טוב!</strong>\nהתקנתם בהצלחה את מדיה־ויקי.\n\nתוכנת ההתקנה יצרה את הקובץ <code>LocalSettings.php</code>.\nהוא מכיל את כל ההגדרות שלכם.\n\nתצטרכו להוריד אותו ולשים אותו בבסיס ההתקנה של הוויקי שלכם (אותה התיקייה שבה נמצא הקובץ index.php). ההורדה הייתה אמורה להתחיל באופן אוטומטי.\n\nאם ההורדה לא התחילה, או אם ביטלתם אותה, אפשר להתחיל אותה מחדש בלחיצה על הקישור הבא:\n\n$3\n\n</strong>שימו לב</strong>: אם לא תעשו זאת עכשיו, קובץ ההגדרות המחוּלל לא יהיה זמין לכם שוב.\n\nאחרי שתעשו את זה, תוכלו </strong>[$2 להיכנס לוויקי שלכם]</strong>.",
+       "config-install-done": "<strong>מזל טוב!</strong>\nהתקנת את תוכנת מדיה־ויקי.\n\nתוכנת ההתקנה יצרה את הקובץ <code>LocalSettings.php</code>.\nהוא מכיל את כל ההגדרות שלך.\n\nיש להוריד אותו ולהכניס אותו לתיקיית הבסיס שבה הותקן הוויקי שלך (אותה התיקייה שבה נמצא הקובץ index.php). ההורדה אמורה להתחיל באופן אוטומטי.\n\nאם ההורדה לא התחילה, או אם ביטלת אותה, אפשר להתחיל אותה מחדש באמצעות לחיצה על הקישור הבא:\n\n$3\n\n<strong>לתשומת לבך:</strong> אם ההורדה לא תבוצע כעת, קובץ ההגדרות <strong>לא</strong> יהיה זמין מאוחר יותר אם תוכנת ההתקנה תיסגר לפני שהקובץ יורד.\n\nלאחר שביצעת את הפעולות שלהלן, באפשרותך <strong>[$2 להיכנס לאתר הוויקי שלך]</strong>.",
+       "config-install-done-path": "<strong>מזל טוב!</strong>\nהתקנת את תוכנת מדיה־ויקי.\n\nתוכנת ההתקנה יצרה את הקובץ <code>LocalSettings.php</code>.\nהוא מכיל את כל ההגדרות שלך.\n\nיש להוריד אותו ולהכניס אותו לתיקייה <code>$4</code>. ההורדה אמורה להתחיל באופן אוטומטי.\n\nאם ההורדה לא התחילה, או אם ביטלת אותה, אפשר להתחיל אותה מחדש באמצעות לחיצה על הקישור הבא:\n\n$3\n\n<strong>לתשומת לבך:</strong> אם ההורדה לא תבוצע כעת, קובץ ההגדרות <strong>לא</strong> יהיה זמין מאוחר יותר אם תוכנת ההתקנה תיסגר לפני שהקובץ יורד.\n\nלאחר שביצעת את הפעולות שלהלן, באפשרותך <strong>[$2 להיכנס לאתר הוויקי שלך]</strong>.",
        "config-download-localsettings": "הורדת <code>LocalSettings.php</code>",
        "config-help": "עזרה",
        "config-help-tooltip": "להרחיב",
index bb3b58f..6bee175 100644 (file)
        "config-no-db": "Es konnt ken adäquater Datenbanktreiwer gefund sin. Es muss doher en Datenbanktreiwer für PHP installiert sin.\nDie folchende Datebanksysteme werre unnerstützt: $1\n\nWenn du PHP sellebst kompiliert host, konfigurier es erneit mit en aktiviert Datebankclient, zum Beispiel dorrich Verwennung von <code>./configure --with-mysqli</code>.\nWenn du PHP von en Debian- orrer Ubuntu-Paket installiert host, dann musst du ooch beispielsweis das <code>php5-mysql</code>-Paket installiere.",
        "config-outdated-sqlite": "'''Warnung:''' SQLite $1 ist installiert. Allerdings benöticht MediaWiki SQLite $2 orrer höcher. SQLite weard doher net verfüchbar sin.",
        "config-no-fts3": "'''Warnung:''' SQLite woard ohne das [//sqlite.org/fts3.html FTS3-Modul] kompiliert, so dass ken Suchfunktione für das Datenbanksystem zur Verfüchung stehn werre.",
-       "config-mbstring": "'''Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]</code> von PHP ist aktiviert!'''\nDie Instellung veruarsacht Fehler und führt zu unvoarhearsehbare Probleme bei der Dateingäb.\nMediaWiki kann net installiert sin, solang der Parameter net deaktiviert woard.",
-       "config-xml-bad": "Das XML-Modul von PHP fehlt.\nMediaWiki benöticht Funktione, die das Modul bereitstellt und weard in der bestehende Konfiguration net funktioniere.\nSofern Mandriva benutzt weard, muss noch das „php-xml“-Paket installiert sin.",
        "config-pcre-old": "<strong>Fataler Fehler:</strong> PCRE $1 orrer neier ist notwendich!\nDie vorhandne PHP-Binärdatei ist mit PCRE $2 verknüpft.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Weitre Informatione].",
        "config-pcre-no-utf8": "'''Fataler Fehler:''' Das PHP-Modul PCRE scheint ohne PCRE_UTF8-Unterstützung kompiliert worre sin.\nMediaWiki benöticht die UTF-8-Unnerstützung, um fehlerfrei looffähich zu sin.",
        "config-memory-raised": "Der PHP-Parameter <code>memory_limit</code> betruch $1 und woard uff $2 erhöcht.",
        "config-memory-bad": "'''Warnung:''' Der PHP-Parameter <code>memory_limit</code> beträcht $1.\nDer Weart ist wahrscheinlich zu niedrich.\nDer Installationsvoargang könnt doher scheitre!",
-       "config-ctype": "'''Fataler Fehler:''' PHP muss mit Unnerstützung für das [http://www.php.net/manual/de/ctype.installation.php Modul ctype] kompiliert sin.",
-       "config-json": "<strong>Fataler Fehler:</strong> PHP woard ohne Unnerstützung für JSON kompiliert.\nVoar der Installation von MediaWiki muss entweder die PHP-JSON- orrer die [http://pecl.php.net/package/jsonc PECL-jsonc]-Erweiterung installieren sin.\n* Die PHP-Erweiterung ist in Red Hat Enterprise Linux (CentOS) 5 und 6 enthalten, muss jedoch in <code>/etc/php.ini</code> oder <code>/etc/php.d/json.ini</code> aktiviert sin.\n* Eniche Linux-Distributione, die nach Mai 2013 veröffentlicht woor, nutze net meh die PHP-Erweitrung, sondscht stattder die PECL-Erweitrung als <code>php5-json</code> orrer <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] ist installiert",
        "config-apc": "[http://www.php.net/apc APC] ist installiert",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] ist installiert",
index f2aa6de..e875961 100644 (file)
        "config-no-db": "Njeda so přihódny ćěrjak datoweje banki namakać! Dyrbiš ćěrjak datoweje banki za PHP instalować.\nSlědowace typy datoweje banki so podpěruja: $1.\n\nJeli sy PHP sam kompilował, konfiguruj jón znowa z aktiwizowanym programom datoweje banki, na přikład z pomocu <code>./configure --with-mysqli</code>.\nJeli sy PHP z Debianoweho abo Ubuntuoweho paketa instalował, dyrbiš tež paket <code>php5-mysql</code> instalować.",
        "config-outdated-sqlite": "'''Warnowanje''': maš SQLite $1, kotryž je starši hač minimalna trěbna wersija $2. SQLite njebudźe k dispoziciji stać.",
        "config-no-fts3": "'''Warnowanje''': SQLite je so bjez [//sqlite.org/fts3.html FTS3-modula] kompilował, pytanske funkcije njebudu k dispoziciji stać.",
-       "config-xml-bad": "XML-modul za PHP faluje.\nMediaWiki trjeba funkcije w tutym modulu a njebudźe w tutej konfiguraciji fungować.\nJeli wužiwaš Mandrake, instaluj paket php-xml.",
        "config-pcre-no-utf8": "'''Ćežki zmylk''': Zda so, zo PCRE-modul za PHP ma so bjez PCRE_UTF8-podpěry kompilować.\nMediaWiki trjeba UTF-8-podpěru, zo by korektnje fungował.",
        "config-memory-raised": "PHP-parameter <code>memory_limit</code> je $1, je so na hódnotu $2 zwyšił.",
        "config-memory-bad": "'''Warnowanje:''' PHP-parameter <code>memory_limit</code> ma hódnotu $1,\nTo je najskerje přeniske.\nInstalacija móhła so njeporadźić!",
-       "config-ctype": "'''Ćežki zmylk''': PHP dyrbi so z podpěru za [http://www.php.net/manual/en/ctype.installation.php rozšěrjenje Ctype] kompilować.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] je instalowany",
        "config-apc": "[http://www.php.net/apc APC] je instalowany",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] je instalowany",
index 109b442..f97b6dc 100644 (file)
        "config-no-db": "Nem sikerült egyetlen használható adatbázis-illesztőprogramot sem találni. Telepítened kell egyet a PHP-hez.\nA következő {{PLURAL:$2|adatbázistípus támogatott|adatbázistípusok támogatottak}}: $1.\n\nHa a PHP-t magad fordítottad, konfiguráld újra úgy, hogy engedélyezve legyen egy adatbáziskliens, pl. a <code>./configure --with-mysql</code> parancs használatával.\nHa a PHP-t Debian vagy Ubuntu csomaggal telepítetted, akkor szükséged lesz például a php5-mysql csomagra is.",
        "config-outdated-sqlite": "<strong>Figyelmeztetés:</strong> SQLite $1 verziód van, ami alacsonyabb a legalább szükséges $2 verziónál. Az SQLite nem lesz elérhető.",
        "config-no-fts3": "'''Figyelmeztetés''': Az SQLite [//sqlite.org/fts3.html FTS3 modul] nélkül lett fordítva, a keresési funkciók nem fognak működni ezen a rendszeren.",
-       "config-mbstring": "'''Kritikus hiba: az [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime mbstring.func_overload] aktív!'''\nEz a beállítás hibákat okoz és kiszámíthatatlanul károsíthatja bevitt adatokat.\nA MediaWiki csak akkor telepíthető, ha ki van kapcsolva.",
-       "config-xml-bad": "A PHP XML-modulja hiányzik.\nEgyes MediaWiki-funkciók, melyek ezt a modult igénylik, nem fognak működni ilyen konfigurációban.\nSzükséges lehet a php-xml RPM-csomag telepítése.",
        "config-pcre-old": "<strong>Kritikus hiba:</strong> PCRE $1 vagy későbbi szükséges.\nA Te PHP binárisod PCRE $2-vel lett linkelve.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE További információ].",
        "config-pcre-no-utf8": "'''Kritikus hiba''': Úgy tűnik, hogy a PHP PRCE modulja PRCE_UTF8 támogatás nélkül lett fordítva.\nA MediaWikinek UTF-8-támogatásra van szüksége a helyes működéshez.",
        "config-memory-raised": "A PHP <code>memory_limit</code> beállításának értéke: $1. Meg lett növelve a következő értékre: $2.",
        "config-memory-bad": "'''Figyelmeztetés:''' A PHP <code>memory_limit</code> beállításának értéke $1.\nEz az érték valószínűleg túl kevés, a telepítés sikertelen lehet.",
-       "config-ctype": "<strong>Kritikus hiba:</strong> A PHP-t [http://www.php.net/manual/en/ctype.installation.php Ctype kiterjesztés] támogatással kell fordítani.",
-       "config-iconv": "<strong>Kritikus hiba:</strong> a PHP-t az [http://www.php.net/manual/en/iconv.installation.php iconv kiterjesztést] támogatva kell fordítani.",
        "config-xcache": "Az [http://xcache.lighttpd.net/ XCache] telepítve van",
        "config-apc": "Az [http://www.php.net/apc APC] telepítve van",
        "config-wincache": "A [http://www.iis.net/download/WinCacheForPhp WinCache] telepítve van",
index b1cebd2..2ebd0b3 100644 (file)
        "config-no-db": "Non poteva trovar un driver appropriate pro le base de datos! Es necessari installar un driver de base de datos pro PHP.\nLe sequente {{PLURAL:$2|typo|typos}} de base de datos es supportate: $1.\n\nSi tu compilava PHP tu mesme, reconfigura lo con un cliente de base de datos activate, per exemplo, usante <code>./configure --with-mysqli</code>.\nSi tu installava PHP ex un pacchetto Debian o Ubuntu, tu debe etiam installar, per exemplo, le modulo <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Attention''': tu ha SQLite $1, que es inferior al version minimal requirite, $2. SQLite essera indisponibile.",
        "config-no-fts3": "'''Attention''': SQLite es compilate sin [//sqlite.org/fts3.html modulo FTS3]; functionalitate de recerca non essera disponibile in iste back-end.",
-       "config-mbstring": "'''Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] es active!'''\nIste option causa errores e pote corrumper datos imprevisibilemente.\nTu non pote installar o usar MediaWiki si iste option non es disactivate.",
-       "config-xml-bad": "Le modulo XML de PHP es mancante.\nMediaWiki require functiones de iste modulo e non functionara in iste configuration.\nEs possibile que tu debe installar le pacchetto RPM php-xml.",
        "config-pcre-old": "<strong>Fatal:</strong> PCRE $1 o plus tarde es necessari.\nTu binario de PHP binary es ligate con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Plus information].",
        "config-pcre-no-utf8": "'''Fatal''': Le modulo PCRE de PHP pare haber essite compilate sin supporto de PCRE_UTF8.\nMediaWiki require supporto de UTF-8 pro functionar correctemente.",
        "config-memory-raised": "Le <code>memory_limit</code> de PHP es $1, elevate a $2.",
        "config-memory-bad": "'''Aviso:''' Le <code>memory_limit</code> de PHP es $1.\nIsto es probabilemente troppo basse.\nLe installation pote faller!",
-       "config-ctype": "'''Fatal''': PHP debe esser compilate con supporto pro le [http://www.php.net/manual/en/ctype.installation.php extension Ctype].",
-       "config-iconv": "<strong>Fatal:</strong> PHP debe esser compilate con supporto pro le [http://www.php.net/manual/en/iconv.installation.php extension iconv].",
-       "config-json": "'''Fatal:''' PHP ha essite compilate sin supporto de JSON.\nTu debe installar le extension JSON de PHP o le extension [http://pecl.php.net/package/jsonc PECL jsonc] extension ante de installar MediaWiki.\n* Le extension de PHP es includite in Red Hat Enterprise Linux (CentOS) 5 e 6, ma debe esser activate in <code>/etc/php.ini</code> o <code>/etc/php.d/json.ini</code>.\n* Alcun distributiones de Linux liberate post maio 2013 omitte iste extension de PHP, forniente in su loco le extension PECL como <code>php5-json</code> o <code>php-pecl-jsonc</code>.",
-       "config-mbstring-absent": "<strong>Fatal:</strong> PHP debe esser compilate con supporto pro le [http://www.php.net/manual/en/mbstring.setup.php extension mbstring].",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] es installate",
        "config-apc": "[http://www.php.net/apc APC] es installate",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] es installate",
        "config-logo": "URL del logotypo:",
        "config-logo-help": "Le apparentia predefinite de MediaWiki include spatio pro un logotypo de 135×160 pixels supra le menu del barra lateral.\nIncarga un imagine con le dimensiones appropriate, e entra le URL hic.\n\nTu pote usar <code>$wgStylePath</code> o <code>$wgScriptPath</code> si le loco de tu logotypo es relative a iste camminos.\n\nSi tu non vole un logotypo, lassa iste quadro vacue.",
        "config-instantcommons": "Activar \"Instant Commons\"",
-       "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] es un function que permitte a wikis de usar imagines, sonos e altere multimedia trovate in le sito [https://commons.wikimedia.org/ Wikimedia Commons].\nPro poter facer isto, MediaWiki require accesso a Internet.\n\nPro plus information super iste function, includente instructiones super como configurar lo pro wikis altere que Wikimedia Commons, consulta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos le manual].",
+       "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] es un function que permitte a wikis de usar imagines, sonos e altere multimedia trovate in le sito [https://commons.wikimedia.org/ Wikimedia Commons].\nPro poter facer isto, MediaWiki require accesso a Internet.\n\nPro saper plus, p.ex. como configurar lo pro wikis altere que Wikimedia Commons, consulta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos le manual].",
        "config-cc-error": "Le selector de licentia Creative Commons non dava un resultato.\nEntra le nomine del licentia manualmente.",
        "config-cc-again": "Selige de novo…",
        "config-cc-not-chosen": "Selige le licentia Creative Commons que tu prefere e clicca \"proceed\".",
        "config-install-extension-tables": "Creation de tabellas pro le extensiones activate",
        "config-install-mainpage-failed": "Non poteva inserer le pagina principal: $1",
        "config-install-done": "<strong>Felicitationes!</strong>\nTu ha installate MediaWiki.\n\nLe installator ha generate un file <code>LocalSettings.php</code>.\nIste contine tote le configuration.\n\nEs necessari discargar lo e poner lo in le base del installation wiki (le mesme directorio que index.php).\nLe discargamento debe haber comenciate automaticamente.\n\nSi le discargamento non ha comenciate, o si illo esseva cancellate, recomencia le discargamento con un clic sur le ligamine sequente:\n\n$3\n\n<strong>Nota:</strong> Si tu non discarga iste file de configuration ora, illo non essera disponibile plus tarde.\n\nPost facer isto, tu pote <strong>[$2 entrar in tu wiki]</strong>.",
+       "config-install-done-path": "<strong>Felicitationes!</strong>\nTu ha installate MediaWiki.\n\nLe installator ha generate un file <code>LocalSettings.php</code>.\nIste contine tote le configuration.\n\nEs necessari discargar lo e poner lo in <code>$4</code>.\nLe discargamento debe haber comenciate automaticamente.\n\nSi le discargamento non ha comenciate, o si illo esseva cancellate, recomencia le discargamento con un clic sur le ligamine sequente:\n\n$3\n\n<strong>Nota:</strong> Si tu non discarga iste file de configuration ora, illo non essera disponibile plus tarde.\n\nPost facer isto, tu pote <strong>[$2 entrar in tu wiki]</strong>.",
        "config-download-localsettings": "Discargar <code>LocalSettings.php</code>",
        "config-help": "adjuta",
        "config-help-tooltip": "clicca pro displicar",
index bba2913..296ddbd 100644 (file)
        "config-no-db": "Pengandar basis data yang sesuai tidak ditemukan! Anda perlu menginstal pengandar basis data untuk PHP.\n{{PLURAL:$2|Jenis|Jenis}} basis data yang didukung: $1.\n\nJika Anda mengompilasi PHP sendiri, ubahlah konfigurasinya dengan mengaktifkan klien basis data, misalnya menggunakan <code>./configure --with-mysql</code>.\nJika Anda menginstal PHP dari paket Debian atau Ubuntu, maka Anda juga perlu menginstal seperti paket <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Peringatan:</strong> Anda menggunakan SQLite $1, yang lebih rendah dari versi minimum yang diperlukan $2. SQLite akan tidak tersedia.",
        "config-no-fts3": "'''Peringatan''': SQLite dikompilasi tanpa [//sqlite.org/fts3.html modul FTS3], fitur pencarian tidak akan tersedia pada konfigurasi ini.",
-       "config-mbstring": "'''Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] aktif!'' '\nPilihan ini dapat menyebabkan kesalahan dan kerusakan data yang tidak terduga.\nAnda tidak dapat menginstal atau menggunakan MediaWiki kecuali pilihan ini dinonaktifkan.",
-       "config-xml-bad": "Modul XML PHP hilang.\nMediaWiki membutuhkan fungsi dalam modul ini dan tidak akan bekerja dalam konfigurasi ini.\nAnda mungkin perlu memasang paket RPM php-xml.",
        "config-pcre-old": "<strong>Fatal:</strong> PCRE $1 atau kemudian diperlukan.\nBiner PHP Anda dihubungkan dengan PCRE $2. [https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Selengkapnya].",
        "config-pcre-no-utf8": "'''Fatal''': Modul PCRE PHP tampaknya dikompilasi tanpa dukungan PCRE_UTF8.\nMediaWiki memerlukan dukungan UTF-8 untuk berfungsi dengan benar.",
        "config-memory-raised": "<code>memory_limit</code> PHP adalah $1, dinaikkan ke $2.",
        "config-memory-bad": "'''Peringatan:''' <code>memory_limit</code> PHP adalah $1.\nIni terlalu rendah.\nInstalasi terancam gagal!",
-       "config-ctype": "<strong>Fatal:</strong> PHP harus disusun dengan dukungan untuk [http://www.php.net/manual/en/ctype.installation.php ekstensi Ctype].",
-       "config-iconv": "<strong>Fatal:</strong> PHP harus disusun dengan dukungan untuk [http://www.php.net/manual/en/iconv.installation.php ekstensi iconv].",
-       "config-json": "<strong>Fatal:</strong> PHP dikompilasi tanpa dukungan JSON.\nAnda harus menginstal salah satu pengaya PHP JSON atau pengaya [http://pecl.php.net/package/jsonc PECL jsonc] sebelum menginstal MediaWiki.\n* Pengaya PHP termasuk dalam Red Hat Enterprise Linux (CentOS) 5 dan 6, meskipun harus diaktifkan pada <code>/etc/php.ini</code> atau <code>/etc/php.d/json.ini</code>.\n* Beberapa distribusi Linux dirilis setelah Mei 2013 menghilangkan pengaya PHP, bukan kemasan pengaya PECL sebagai <code>php5-json</code> atau <code>php-pecl-jsonc</code>.",
-       "config-mbstring-absent": "<strong>Fatal:</strong> PHP harus disusun dengan dukungan untuk [http://www.php.net/manual/en/mbstring.installation.php ekstensi mbstring].",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] telah diinstal",
        "config-apc": "[http://www.php.net/apc APC] telah diinstal",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] telah diinstal",
index abc7fbf..d6ba2fe 100644 (file)
@@ -1,8 +1,9 @@
 {
        "@metadata": {
                "authors": [
-                       "Умар"
+                       "Умар",
+                       "ElizaMag"
                ]
        },
-       "config-help": "гÓ\80о"
+       "config-help": "новкÑ\8a\81Ñ\82ал"
 }
index 1c1d143..6ed2722 100644 (file)
@@ -16,7 +16,9 @@
                        "The Polish",
                        "Sannita",
                        "C.R.",
-                       "Macofe"
+                       "Macofe",
+                       "Matteocng",
+                       "Einreiher"
                ]
        },
        "config-desc": "Programma di installazione per MediaWiki",
        "config-env-php": "PHP $1 è installato.",
        "config-env-hhvm": "HHVM $1 è installato.",
        "config-unicode-using-intl": "Usa [http://pecl.php.net/intl l'estensione PECL intl] per la normalizzazione Unicode.",
-       "config-unicode-pure-php-warning": "'''Attenzione:''' [http://pecl.php.net/intl l'estensione PECL intl] non è disponibile per gestire la normalizzazione Unicode, così si usa la lenta implementazione in puro PHP.\nSe esegui un sito ad alto traffico, dovresti leggere alcune considerazioni sulla [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalizzazione Unicode].",
-       "config-unicode-update-warning": "'''Attenzione:''' La versione installata del gestore per la normalizzazione Unicode usa una vecchia versione della libreria [http://site.icu-project.org/ del progetto ICU].\nDovresti [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations aggiornare] se ti interessa usare l'Unicode.",
+       "config-unicode-pure-php-warning": "'''Attenzione:''' [http://pecl.php.net/intl l'estensione PECL intl] non è disponibile per gestire la normalizzazione Unicode, quindi si torna alla lenta implementazione in PHP puro.\nSe esegui un sito ad alto traffico, dovresti leggere alcune considerazioni sulla [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalizzazione Unicode].",
+       "config-unicode-update-warning": "'''Attenzione:''' la versione installata del gestore per la normalizzazione Unicode usa una vecchia versione della libreria [http://site.icu-project.org/ del progetto ICU].\nDovresti [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations aggiornare] se vuoi usare l'Unicode.",
        "config-no-db": "Impossibile trovare un driver adatto per il database! È necessario installare un driver per PHP.\n{{PLURAL:$2|Il seguente formato di database è supportato|I seguenti formati di database sono supportati}}: $1.\n\nSe compili PHP autonomamente, riconfiguralo attivando un client database, per esempio utilizzando <code>./configure --with-mysqli</code>.\nQualora avessi installato PHP per mezzo di un pacchetto Debian o Ubuntu, allora devi installare anche il pacchetto <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Attenzione''': è presente SQLite $1 mentre è richiesta la versione $2, SQLite non sarà disponibile.",
        "config-no-fts3": "'''Attenzione''': SQLite è compilato senza il [//sqlite.org/fts3.html modulo FTS3], le funzionalità di ricerca non saranno disponibili su questo backend.",
-       "config-mbstring": "'''Errore: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] è attivato!''' Questa opzione causa errori e può interferire in modo imprevedibile coi dati. Non è possibile installare o utilizzare MediaWiki a meno che questa opzione non sia disabilitata.",
-       "config-xml-bad": "Manca il modulo XML di PHP.\nMediaWIki ha bisogno di funzionalità presenti in questo modulo e non funzionerà con la configurazione corrente.\nSe stai eseguendo Mandrake, installa il paccketto php-xml.",
        "config-pcre-old": "<strong>Errore fatale:</strong> si richiede PCRE  $1 o successivo.\nIl tuo file binario PHP è collegato con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/Maggiori informazioni su PCRE].",
        "config-pcre-no-utf8": "'''Errore''': Il modulo PCRE di PHP sembra essere stato compilato senza il supporto PCRE_UTF8, ma MediaWiki lo richiede per funzionare correttamente.",
        "config-memory-raised": "Il valore <code>memory_limit</code> di PHP è $1, aumentato a $2.",
        "config-memory-bad": "''Attenzione:''' Il valore di <code>memory_limit</code> di PHP è $1.\nProbabilmente è troppo basso.\nL'installazione potrebbe non riuscire!",
-       "config-ctype": "<strong>Fatale:</strong> PHP deve essere compilato con il supporto per l'[http://www.php.net/manual/it/ctype.installation.php estensione Ctype].",
-       "config-iconv": "<strong>Fatale:</strong> PHP deve essere compilato con il supporto per l'[http://www.php.net/manual/en/iconv.installation.php estensione iconv].",
-       "config-json": "'''Errore:''' PHP è stato compilato senza il supporto per JSON. E' necessario installare l'estensione PHP per JSON o l'estensione [http://pecl.php.net/package/jsonc PECL jsonc] prima di installare MediaWiki.\n* L'estensione PHP è inclusa in Red Hat Enterprise Linux (CentOS) 5 e 6, ma deve essere abilitata in <code>/etc/php.ini</code> o <code>/etc/php.d/json.ini</code>.\n* Alcune distribuzioni di Linux pubblicate dopo il maggio 2013 omettono l'estensione PHP, e al posto utilizzano l'estensione PECL come <code>php5-json</code> o <code>php-pecl-jsonc</code>",
-       "config-mbstring-absent": "<strong>Fatale:</strong> PHP deve essere compilato con il supporto per l'[http://www.php.net/manual/en/mbstring.setup.php estensione mbstring].",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] è installato",
        "config-apc": "[http://www.php.net/apc APC] è installato",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] è installato",
@@ -93,7 +89,7 @@
        "config-no-cli-uri": "'''Attenzione''': <code>--scriptpath</code> non specificato, si utilizza il valore predefinito: <code>$1</code>.",
        "config-using-server": "Nome server in uso \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "URL del server in uso \"<nowiki>$1$2</nowiki>\".",
-       "config-uploads-not-safe": "<strong>Attenzione:</strong> la directory predefinita per i caricamenti <code>$1</code> è vulnerabile all'esecuzione arbitraria di script.\nAnche se MediaWiki controlla tutti i file caricati per rischi alla sicurezza, è fortemente raccomandato di [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security chiudere questa vulnerabilità di sicurezza] prima di abilitare i caricamenti.",
+       "config-uploads-not-safe": "<strong>Attenzione:</strong> la directory predefinita per i caricamenti <code>$1</code> è vulnerabile all'esecuzione arbitraria di script.\nAnche se, a difesa della sicurezza, MediaWiki controlla tutti i file caricati, è fortemente raccomandato di [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security chiudere questa minaccia] prima di abilitare i caricamenti.",
        "config-no-cli-uploads-check": "<strong>Attenzione:</strong> la directory predefinita per i caricamenti (<code>$1</code>) non è stata verificata per la vulnerabilità sull'esecuzione arbitraria di script durante l'installazione da linea di comando.",
        "config-brokenlibxml": "Il tuo sistema ha una combinazione di versioni di PHP e libxml2 che è difettosa e che può provocare un danneggiamento non visibile di dati in MediaWiki ed in altre applicazioni per il web.\nAggiorna a libxml2 2.7.3 o successivo ([https://bugs.php.net/bug.php?id=45996 il bug è studiato dal lato PHP]).\nInstallazione interrotta.",
        "config-suhosin-max-value-length": "Suhosin è installato e limita il parametro GET <code>length</code> a $1 byte.\nIl componente MediaWiki ResourceLoader funzionerà aggirando questo limite, ma riducendo le prestazioni.\nSe possibile, dovresti impostare <code>suhosin.get.max_value_length</code> a 1024 o superiore in <code>php.ini</code>, ed impostare <code>$wgResourceLoaderMaxQueryLength</code> allo stesso valore in <code>LocalSettings.php</code>.",
        "config-mysql-charset": "Set di caratteri del database:",
        "config-mysql-binary": "Binario",
        "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "In <strong>modalità binaria</strong>, MediaWiki archivia il testo UTF-8 nel database in campi binari.\nQuesto è più efficiente rispetto alla modalità UTF-8 di MySQL, e consente di utilizzare la gamma completa di caratteri Unicode.\n\nIn <strong>modalità UTF-8</strong>, MySQL conoscerà in quale set di caratteri sono i tuoi dati, e può presentarli e convertirli in modo appropriato, ma non ti permetterà di memorizzare i caratteri al di sopra del [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
+       "config-mysql-charset-help": "In <strong>modalità binaria</strong>, MediaWiki archivia il testo UTF-8 nel database in campi binari.\nCiò è più efficiente rispetto alla modalità UTF-8 di MySQL, e consente di utilizzare la gamma completa di caratteri Unicode.\n\nIn <strong>modalità UTF-8</strong>, MySQL saprà in quale set di caratteri sono i tuoi dati, e potrà presentarli e convertirli in modo appropriato, ma non ti permetterà di memorizzare i caratteri al di sopra del [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Piano di base multilinguistico].",
        "config-mssql-auth": "Tipo di autenticazione:",
        "config-mssql-install-auth": "Seleziona il tipo di autenticazione che verrà utilizzato per connettersi al database durante il processo di installazione.\nSe si seleziona \"{{int:config-mssql-windowsauth}}\", saranno utilizzate le credenziali dell'utente con cui viene eseguito il server web, qualunque esso sia.",
        "config-mssql-web-auth": "Seleziona il tipo di autenticazione che il server web utilizzerà per connettersi al database, durante il normale funzionamento del wiki.\nSe si seleziona \"{{int:config-mssql-windowsauth}}\", saranno utilizzate le credenziali dell'utente con cui viene eseguito il server web, qualunque esso sia.",
        "config-subscribe": "Sottoscrivi la [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce mailing list degli annunci di rilasci].",
        "config-subscribe-help": "Si tratta di una mailing list a basso traffico dedicata agli annunci di nuove versioni, compresi importanti segnalazioni riguardanti la sicurezza.\nÈ consigliato iscriversi e aggiornare la propria installazione di MediaWiki quando una nuova versione viene resa pubblica.",
        "config-subscribe-noemail": "Hai provato ad iscriverti alla mailing list dedicata agli annunci delle nuove versioni senza fornire un indirizzo email.\nInserire un indirizzo email se si desidera effettuare l'iscrizione alla mailing list.",
+       "config-pingback": "Condividi i dati su questa installazione con gli sviluppatori di MediaWiki.",
        "config-almost-done": "Hai quasi finito!\nAdesso puoi saltare la rimanente parte della configurazione e semplicemente installare la wiki.",
        "config-optional-continue": "Fammi altre domande.",
        "config-optional-skip": "Sono già stanco, installa solo il wiki.",
        "config-profile-no-anon": "Creazione utenza obbligatoria",
        "config-profile-fishbowl": "Solo editori autorizzati",
        "config-profile-private": "Wiki privato",
-       "config-profile-help": "I wiki funzionano meglio se si lascia che molte persone li possano modificare.\nIn MediaWiki, è semplice rivedere le ultime modifiche, e ripristinare i danni causati da utenti ingenui o malintenzionati.\n\nTuttavia, molti hanno trovato MediaWiki essere utile in un'ampia varietà di ruoli, e a volte non è facile convincere tutti i vantaggi della modalità wiki.\nPerciò, fai la tua scelta.\n\nIl modello <strong>{{int:config-profile-wiki}}</strong> consente a chiunque di modificare, anche senza effettuare l'accesso.\nUn wiki con <strong>{{int:config-profile-no-anon}}</strong> offre una maggiore responsabilità, ma potrebbe scoraggiare i contributori occasionali.\n\nLo scenario <strong>{{int:config-profile-fishbowl}}</strong> consente agli utenti autorizzati di modificare, ma il pubblico può visualizzare le pagine, compresa la cronologia.\nUn <strong>{{int:config-profile-private}}</strong> consente solo agli utenti autorizzati di visualizzare le pagine, lo stesso gruppo può modificarle.\n\nConfigurazioni di diritti utente più complesse sono disponibili dopo l'installazione, vedi la  [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights parte relativa del manuale].",
+       "config-profile-help": "I wiki funzionano meglio se si permette a molte persone di poterli modificare.\nIn MediaWiki, è semplice controllare le ultime modifiche, e ripristinare i danni causati da utenti inesperti o malintenzionati.\n\nTuttavia, molti hanno trovato MediaWiki essere utile in un'ampia varietà di ruoli, e a volte non è facile convincere tutti dei vantaggi della modalità wiki.\nPerciò, fa' la tua scelta.\n\nIl modello <strong>{{int:config-profile-wiki}}</strong> consente a chiunque di modificare, anche senza effettuare l'accesso.\nUn wiki con <strong>{{int:config-profile-no-anon}}</strong> offre una maggiore responsabilità, ma potrebbe scoraggiare i contributori occasionali.\n\nLo scenario <strong>{{int:config-profile-fishbowl}}</strong> consente agli utenti autorizzati di modificare, ma il pubblico può visualizzare le pagine, compresa la cronologia.\nUn <strong>{{int:config-profile-private}}</strong> consente solo agli utenti autorizzati di visualizzare le pagine, lo stesso gruppo può modificarle.\n\nConfigurazioni di diritti utente più complesse sono disponibili dopo l'installazione, vedi la  [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights parte relativa del manuale].",
        "config-license": "Copyright e licenza:",
        "config-license-none": "Nessun piè di pagina per la licenza",
        "config-license-cc-by-sa": "Creative Commons Attribuzione-Condividi allo stesso modo",
        "config-email-sender-help": "Inserisci l'indirizzo email da utilizzare come indirizzo di ritorno per la posta in uscita.\nQuesto è dove verranno inviati gli eventuali errori.\nMolti server di posta richiedono che almeno la parte del nome di dominio sia valido.",
        "config-upload-settings": "Caricamenti di immagini e file",
        "config-upload-enable": "Consentire il caricamento di file",
-       "config-upload-help": "Il caricamento di file può potenzialmente esporre il tuo server a rischi di sicurezza.\nPer ulteriori informazioni, leggi la  [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security sezione sulla sicurezza] nel manuale.\n\nPer consentire il caricamento di file, modificare la modalità nella sottodirectory <code>images</code> della directory principale di MediaWiki affinché il server web possa scriverci.\nPoi attivare questa opzione.",
+       "config-upload-help": "Il caricamento di file potrebbe esporre il tuo server a rischi di sicurezza.\nPer ulteriori informazioni, leggi la  [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security sezione sulla sicurezza] nel manuale.\n\nPer consentire il caricamento di file, modifica la modalità nella sottodirectory <code>images</code> della directory principale di MediaWiki affinché il server web possa scrivere lì.\nPoi attiva questa opzione.",
        "config-upload-deleted": "Directory per i file cancellati:",
        "config-upload-deleted-help": "Scegli una directory in cui archiviare i file cancellati.\nIdealmente, questa non dovrebbe essere accessibile dal web.",
        "config-logo": "URL del logo:",
        "config-nofile": "Il file \"$1\" non può essere trovato. È stato eliminato?",
        "config-extension-link": "Sapevi che il tuo wiki supporta le  [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions estensioni]?\n\nPuoi navigare tra le [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category estensioni per categoria].",
        "mainpagetext": "<strong>MediaWiki è stato installato.</strong>",
-       "mainpagedocfooter": "Consulta la [https://meta.wikimedia.org/wiki/Special:MyLanguage/Help:Contents Guida utente] per maggiori informazioni sull'uso di questo software wiki.\n\n== Per iniziare ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Impostazioni di configurazione]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Domande frequenti su MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annunci MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizza MediaWiki nella tua lingua]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Imparare a combattere lo spam sul tuo wiki]"
+       "mainpagedocfooter": "Consulta la [https://meta.wikimedia.org/wiki/Special:MyLanguage/Help:Contents Guida utente] per maggiori informazioni sull'uso di questo software wiki.\n\n== Per iniziare ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Impostazioni di configurazione]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Domande frequenti su MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annunci MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Trova MediaWiki nella tua lingua]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Imparare a combattere lo spam sul tuo wiki]"
 }
index 13f01a8..5406be1 100644 (file)
        "config-no-db": "適切なデータベース ドライバーが見つかりませんでした! PHP にデータベース ドライバーをインストールする必要があります。\n以下の種類のデータベース{{PLURAL:$2|のタイプ}}に対応しています: $1\n\nPHP を自分でコンパイルした場合は、例えば <code>./configure --with-mysqli</code> を実行して、データベース クライアントを使用できるように再設定してください。\nDebian または Ubuntu のパッケージから PHP をインストールした場合は、モジュール (例: <code>php5-mysql</code>) もインストールする必要があります。",
        "config-outdated-sqlite": "<strong>警告:</strong> あなたは SQLite $1 を使用していますが、最低限必要なバージョン $2 より古いバージョンです。SQLite は利用できません。",
        "config-no-fts3": "<strong>警告:</strong> SQLite は [//sqlite.org/fts3.html FTS3] モジュールなしでコンパイルされており、このバックエンドでは検索機能は利用できなくなります。",
-       "config-mbstring": "<strong>致命的エラー: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] が動作しています!</strong>\nこのオプションは、エラーを引き起こし、予期せずデータを破壊するおそれがあります。\nこのオプションを無効化しない限り、MediaWiki のインストールや使用はできません。",
-       "config-xml-bad": "PHPのXMLモジュールが不足しています。\nMediaWikiは、このモジュールの関数を必要としているため、この構成では動作しません。\nphp-xml RPM パッケージをインストールする必要があります。",
        "config-pcre-old": "<strong>致命的エラー:</strong> PCRE $1 以降が必要です。\nご使用中の PHP のバイナリは PCRE $2 とリンクされています。\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE 詳細情報]",
        "config-pcre-no-utf8": "<strong>致命的エラー:</strong> PHP の PCRE が PCRE_UTF8 対応なしでコンパイルされているようです。\nMediaWiki を正しく動作させるには、UTF-8 対応が必要です。",
        "config-memory-raised": "PHPの<code>memory_limit</code>は$1で、$2に引き上げられました。",
        "config-memory-bad": "<strong>警告:</strong> PHPの<code>memory_limit</code>に$1に設定されています。\nこの値はおそらく小さすぎます。\nインストールが失敗するおそれがあります!",
-       "config-ctype": "<strong>致命的エラー:</strong> PHP は [http://www.php.net/manual/en/ctype.installation.php Ctype 拡張モジュール]のサポート付きでコンパイルされている必要があります。",
-       "config-iconv": "<strong>致命的なエラー:</strong> PHPは[http://www.php.net/manual/en/iconv.installation.php iconv 拡張機能]のサポートを有効にしてコンパイルされている必要があります。",
-       "config-json": "<strong>致命的エラー:</strong> PHP は JSON サポートなしでコンパイルされています。\nPHP に JSON 拡張モジュールまたは [http://pecl.php.net/package/jsonc PECL jsonc] 拡張モジュールをインストールしてから、MediaWiki をインストールしてください。\n* Red Hat Enterprise Linux (CentOS) 5 および 6には PHP の拡張機能が含まれているため、<code>/etc/php.ini</code> または <code>/etc/php.d/json.ini</code> から有効にしてください。\n* 2013年5月以降にリリースされた一部の Linux ディストリビューションでは、PHP 拡張モジュールの代わりに、<code>php5-json</code> または <code>php-pecl-jsonc</code> として PECL が同梱されています。",
-       "config-mbstring-absent": "<strong>致命的エラー:</strong> PHP は [http://www.php.net/manual/en/mbstring.setup.php mbstring 拡張モジュール]のサポートを有効にしてコンパイルされている必要があります。",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] がインストール済み",
        "config-apc": "[http://www.php.net/apc APC] がインストール済み",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] がインストール済み",
        "config-install-extension-tables": "有効にした拡張機能のためのテーブルを作成しています",
        "config-install-mainpage-failed": "メインページを挿入できませんでした: $1",
        "config-install-done": "<strong>おめでとうございます!</strong>\nMediaWikiのインストールに成功しました。\n\n<code>LocalSettings.php</code>ファイルが生成されました。\nこのファイルはすべての設定を含んでいます。\n\nこれをダウンロードして、ウィキをインストールした基準ディレクトリ (index.phpと同じディレクトリ) に設置する必要があります。ダウンロードは自動的に開始されるはずです。\n\nダウンロードが開始されていない場合、またはダウンロードをキャンセルした場合は、下記のリンクをクリックしてダウンロードを再開できます:\n\n$3\n\n<strong>注意:</strong> この生成された設定ファイルをダウンロードせずにインストールを終了すると、このファイルは利用できなくなります。\n\n上記の作業が完了すると、<strong>[$2 ウィキに入る]</strong>ことができます。",
+       "config-install-done-path": "<strong>おめでとうございます!</strong>\nMediaWikiのインストールに成功しました。\n\n<code>LocalSettings.php</code>ファイルが生成されました。\nこのファイルはすべての設定を含んでいます。\n\nこれをダウンロードして、<code>$4</code> に設置する必要があります。ダウンロードは自動的に開始されるはずです。\n\nダウンロードが開始されていない場合、またはダウンロードをキャンセルした場合は、下記のリンクをクリックしてダウンロードを再開できます:\n\n$3\n\n<strong>注意:</strong> この生成された設定ファイルをダウンロードせずにインストールを終了すると、このファイルは利用できなくなります。\n\n上記の作業が完了すると、<strong>[$2 ウィキに入る]</strong>ことができます。",
        "config-download-localsettings": "<code>LocalSettings.php</code> をダウンロード",
        "config-help": "ヘルプ",
        "config-help-tooltip": "クリックで展開",
index 53cb99c..c9ae2c8 100644 (file)
        "config-unicode-pure-php-warning": "<strong>경고:</strong> 유니코드 정규화를 처리할 [http://pecl.php.net/intl intl PECL 확장 기능]을 사용할 수 없기 때문에 느린 pure-PHP 구현을 대신 사용합니다.\n트래픽이 높은 사이트에서 실행하시려면 [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 유니코드 정규화]를 읽어보셔야 합니다.",
        "config-unicode-update-warning": "<strong>경고:</strong> 유니코드 정규화 래퍼의 설치된 버전은 [http://site.icu-project.org/ ICU 프로젝트]의 라이브러리의 이전 버전을 사용합니다.\n만약 유니코드를 사용하는 것에 대해 우려가 된다면 [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 업그레이드]해야합니다.",
        "config-no-db": "적절한 데이터베이스 드라이버를 찾을 수 없습니다! PHP용 데이터베이스 드라이버를 설치해야 합니다.\n다음 데이터베이스 {{PLURAL:$2|유형을 지원합니다}}: $1.\n\nPHP를 직접 컴파일했다면, 예를 들어 <code>./configure --with-mysql</code>을 사용하여, 데이터베이스 클라이언트를 활성화하도록 다시 설정하세요.\n데비안이나 우분투 패키지에서 PHP를 설치했다면 <code>php5-mysql</code> 모듈도 설치해야 합니다.",
-       "config-outdated-sqlite": "<strong>경고:</strong> 최소인 $2 버전보다 낮은 SQLite $1(이)가 있습니다. SQLite를 사용할 수 없습니다.",
+       "config-outdated-sqlite": "<strong>경고:</strong> 최소 요구 버전 $2 보다 낮은 SQLite $1이(가) 있습니다. SQLite를 사용할 수 없습니다.",
        "config-no-fts3": "<strong>경고:</strong> SQLite를 [//sqlite.org/fts3.html FTS3 모듈] 없이 컴파일하며, 검색 기능은 백엔드에 사용할 수 없습니다.",
-       "config-mbstring": "<strong>치명: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]이 활성화되어 있습니다!</strong>\n이 옵션은 오류가 발생하고 데이터를 입력하는 데 예기치 않는 손상을 일으킬 수 있습니다.\n이 옵션을 비활성화하지 않는 한 미디어위키를 설치하고 사용할 수 없습니다.",
-       "config-xml-bad": "PHP의 XML 모듈이 없습니다.\n미디어위키는 이 모듈의 기능이 필요하며 이 설정에서는 작동하지 않습니다.\nphp-xml 패키지를 설치해야할 수도 있습니다.",
        "config-pcre-old": "<strong>치명:</strong> PCRE $1 또는 그 이상이 필요합니다.\nPHP 바이너리는 PCRE $2에 연결되어 있습니다. [https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE 자세한 정보].",
        "config-pcre-no-utf8": "<strong>치명:</strong> PHP의 PCRE 모듈은 RCRE_UTF8 지원 없이 컴파일된 것 같습니다.\n미디어위키가 올바르게 작동하려면 UTF-8을 지원해야 합니다.",
        "config-memory-raised": "PHP의 <code>memory_limit</code>는 $1이며 $2(으)로 늘렸습니다.",
        "config-memory-bad": "<strong>경고:</strong> PHP의 <code>memory_limit</code>는 $1입니다.\n아마도 너무 낮은 것 같습니다.\n설치가 실패할 수 있습니다!",
-       "config-ctype": "<strong>치명</strong>: PHP는 [http://www.php.net/manual/en/ctype.installation.php Ctype 확장 기능]을 지원하도록 하여 컴파일해야 합니다.",
-       "config-iconv": "<strong>치명</strong>: PHP는 [http://www.php.net/manual/en/iconv.installation.php iconv 확장 기능]을 지원하도록 하여 컴파일해야 합니다.",
-       "config-json": "<strong>치명:</strong> PHP가 JSON 지원이 없이 컴파일되었습니다.\n미디어위키를 설치하기 전에 PHP JSON 확장 기능이나 [http://pecl.php.net/package/jsonc PECL jsonc] 확장 기능 중 하나를 설치해야 합니다.\n* PHP 확장 기능은 Red Hat Enterprise Linux (CentOS) 5와 6에 포함되어 있지만, <code>/etc/php.ini</code>나 <code>/etc/php.d/json.ini</code>에서 활성화해야 합니다.\n* 2013년 5월 이후에 출시된 일부 리눅스 배포판은 PHP 확장 기능이 생략된 대신, <code>php5-json</code>이나 <code>php-pecl-jsonc</code>로 PECL 확장 기능이 포장되어 있습니다.",
-       "config-mbstring-absent": "<strong>치명적 오류:</strong> PHP는 [http://www.php.net/manual/en/mbstring.setup.php mbstring 확장]을 지원하도록 컴파일되어야 합니다.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache]가 설치되었습니다",
        "config-apc": "[http://www.php.net/apc APC]가 설치되었습니다",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache]가 설치되었습니다",
        "config-no-scaling": "GD 라이브러리나 ImageMagick를 찾을 수 없습니다.\n그림 섬네일이 비활성화됩니다.",
        "config-no-uri": "<strong>오류:</strong> 현재 URI를 확인할 수 없습니다.\n설치가 중단되었습니다.",
        "config-no-cli-uri": "<strong>경고:</strong> 기본값을 사용하여 <code>--scriptpath</code>를 지정하지 않았습니다: <code>$1</code>.",
-       "config-using-server": "\"<nowiki>$1</nowiki>\"(을)를 서버 이름으로 사용합니다.",
-       "config-using-uri": "\"<nowiki>$1$2</nowiki>\"(을)를 서버 URL로 사용합니다.",
+       "config-using-server": "\"<nowiki>$1</nowiki>\" 서버 이름을 사용 중입니다.",
+       "config-using-uri": "\"<nowiki>$1$2</nowiki>\" 서버 URL을 사용 중입니다.",
        "config-uploads-not-safe": "<strong>경고:</strong> 올리기에 대한 기본 디렉터리(<code>$1</code>)는 임의의 스크립트 실행에 취약합니다.\n미디어위키는 보안 위협 때문에 모든 올려진 파일을 검사하지만, 올리기를 활성화하기 전에 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security 이 보안 취약점을 해결할 것]을 매우 권장합니다.",
        "config-no-cli-uploads-check": "<strong>경고:</strong> 올리기를 위한 기본 디렉터리(<code>$1</code>)는 CLI를 설치하는 동안 임의의 스크립트 실행에 대한 취약점에 대해 검사되지 않습니다.",
-       "config-brokenlibxml": "ì\8b\9cì\8a¤í\85\9cì\97\90 ë²\84ê·¸ê°\80 ì\9e\88ë\8a\94 PHPì\99\80 libxml2ì\9d\98 ì¡°í\95©ì\9d´ ì\9e\88ì\9c¼ë©° ë¯¸ë\94\94ì\96´ì\9c\84í\82¤ë\82\98 ë\8b¤ë¥¸ ì\9b¹ ì\96´플리케이션에 숨겨진 데이터 손상을 일으킬 수 있습니다.\nlibxml2 2.7.3 이후 버전으로 업그레이드하세요. ([https://bugs.php.net/bug.php?id=45996 PHP에 제기한 버그])\n설치가 중단되었습니다.",
+       "config-brokenlibxml": "ì\8b\9cì\8a¤í\85\9cì\97\90 ë²\84ê·¸ê°\80 ì\9e\88ë\8a\94 PHPì\99\80 libxml2ì\9d\98 ì¡°í\95©ì\9d´ ì\9e\88ì\9c¼ë©° ë¯¸ë\94\94ì\96´ì\9c\84í\82¤ë\82\98 ë\8b¤ë¥¸ ì\9b¹ ì\95 플리케이션에 숨겨진 데이터 손상을 일으킬 수 있습니다.\nlibxml2 2.7.3 이후 버전으로 업그레이드하세요. ([https://bugs.php.net/bug.php?id=45996 PHP에 제기한 버그])\n설치가 중단되었습니다.",
        "config-suhosin-max-value-length": "수호신(Suhosin)이 설치되고 $1 바이트로 GET 매개 변수 <code>length</code>를 제한하고 있습니다.\n미디어위키의 ResourceLoader 구성 요소는 이 제한을 회피하지만 성능이 저하됩니다.\n가능하면 <code>php.ini</code>의 <code>suhosin.get.max_value_length</code>를 1024 이상으로 설정하고 <code>LocalSettings.php</code>의 <code>$wgResourceLoaderMaxQueryLength</code>를 같은 값으로 설정해야 합니다.",
        "config-db-type": "데이터베이스 종류:",
        "config-db-host": "데이터베이스 호스트:",
        "config-db-wiki-help": "정상적인 위키 작업 동안 데이터베이스에 연결하는 데 사용할 사용자 이름과 비밀번호를 입력하세요.\n계정이 존재하지 않고 설치 계정에 충분한 권한이 있는 경우 이 사용자 계정은 위키를 작동하는 데 필요한 최소 권한으로 만들어집니다.",
        "config-db-prefix": "데이터베이스 테이블 접두어:",
        "config-db-prefix-help": "여러 위키 사이 또는 미디어위키와 다른 웹 애플리케이션 사이에 하나의 데이터베이스를 공유해야 하는 경우, 충돌을 피하기 위해 모든 테이블 이름에 접두어를 추가하도록 선택할 수 있습니다.\n공백을 사용하지 마세요.\n\n이 필드는 일반적으로 비어 있습니다.",
-       "config-mysql-old": "MySQL $1 ì\9d´ì\83\81ì\9d´ í\95\84ì\9a\94í\95\98ë\82\98 $2(ì\9d´)ê°\80 있습니다.",
+       "config-mysql-old": "MySQL $1 ì\9d´ì\83\81ì\9d´ í\95\84ì\9a\94í\95©ë\8b\88ë\8b¤. $2ì\9d´(ê°\80) 있습니다.",
        "config-db-port": "데이터베이스 포트:",
        "config-db-schema": "미디어위키에 대한 스키마:",
        "config-db-schema-help": "보통 이 스키마는 문제가 없습니다.\n필요한 경우에만 바꾸세요.",
        "config-invalid-schema": "미디어위키 \"$1\"에 대한 스키마가 잘못됐습니다.\nASCII 글자 (a-z, A-Z), 숫자 (0-9), 밑줄 (_)과 하이픈 (-)만 사용하세요.",
        "config-db-sys-create-oracle": "설치 관리자는 새 계정을 만들기 위한 SYSDBA 계정만을 지원합니다.",
        "config-db-sys-user-exists-oracle": "\"$1\" 사용자 계정이 이미 존재합니다. SYSDBA는 새 계정을 만드는 데에만 사용할 수 있습니다!",
-       "config-postgres-old": "PostgreSQL $1 ì\9d´ì\83\81ì\9d´ í\95\84ì\9a\94í\95\98ë\82\98 $2(ì\9d´)ê°\80 있습니다.",
+       "config-postgres-old": "PostgreSQL $1 ì\9d´ì\83\81ì\9d´ í\95\84ì\9a\94í\95©ë\8b\88ë\8b¤. $2ì\9d´(ê°\80) 있습니다.",
        "config-mssql-old": "Microsoft SQL 서버 $1 이상의 버전이 필요합니다. 현재 버전은 $2입니다.",
        "config-sqlite-name-help": "위키를 식별하기 위한 이름을 선택하세요.\n공백이나 하이픈을 사용하지 마십시오.\nSQLite 데이터 파일 이름에 사용됩니다.",
        "config-sqlite-parent-unwritable-group": "<code><nowiki>$1</nowiki></code> 데이터 디렉토리를 만들 수 없으며, 이는 웹 서버는 상위 디렉토리인 <code><nowiki>$2</nowiki></code>에 쓸 수 없기 때문입니다.\n\n설치 관리자는 웹 서버로 실행 중인 사용자를 지정할 수 없습니다.\n계속하려면 웹 서버가 쓸 수 있는 <code><nowiki>$3</nowiki></code> 디렉토리를 만드세요.\n유닉스/리눅스 시스템에서의 수행:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
        "config-subscribe": "[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 릴리스 발표 메일링 리스트]를 구독합니다.",
        "config-subscribe-help": "중요한 보안 발표를 포함한 배포판 발표에 사용되는 저용량 메일링 리스트입니다.\n이 리스트를 구독하고 새 버전이 나올 때 미디어위키 설치를 업데이트해야 합니다.",
        "config-subscribe-noemail": "이메일 주소를 입력하지 않고 릴리스 발표 메일링 리스트에 가입하려 합니다.\n메일링 리스트에 가입하고자 할 경우 이메일 주소를 입력하세요.",
+       "config-pingback": "본 설치에 관한 데이터를 미디어위키 개발자와 공유합니다.",
+       "config-pingback-help": "이 옵션을 선택하면 미디어위키는 주기적으로 이 미디어위키 인스턴스에 대한 기본 데이터를 가지고 https://www.mediawiki.org에 핑을 합니다. 이 데이터에는 이를테면 시스템의 종류, PHP 버전, 선택한 데이터베이스 백엔드를 포함합니다. 위키미디어 재단은 이 데이터를 미디어위키 개발자들과 공유하여 향후 개발 활동의 길잡이에 도움을 줍니다. 시스템에 대해 다음의 데이터가 전송될 것입니다:\n<pre>$1</pre>",
        "config-almost-done": "거의 다 완료했습니다!\n이제 남은 설정을 생략하고 지금 바로 위키를 설치할 수 있습니다.",
        "config-optional-continue": "더 많은 질문을 물어보세요.",
        "config-optional-skip": "지겨워요, 그냥 위키를 설치할래요.",
        "config-logo": "로고 URL:",
        "config-logo-help": "미디어위키의 기본 스킨은 사이드바 메뉴 위에 135×160 픽셀의 로고의 공간을 포함하고 있습니다.\n적당한 크기로 그림을 올리고 여기에 URL을 입력하세요.\n\n로고가 상대적인 경로에 있으면 <code>$wgStylePath</code>나 <code>$wgScriptPath</code>를 사용할 수 있습니다.\n\n로고 사용을 원하지 않으면 이 상자를 비우세요.",
        "config-instantcommons": "인스턴트 공용 기능 활성화",
-       "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons 인스턴트 공용]은 [https://commons.wikimedia.org/ 위키미디어 공용] 사이트에서 찾을 수 있는 그림, 소리 및 다른 미디어를 위키에서 사용할 수 있도록 하는 기능입니다.\n이렇게 하려면 미디어위키가 인터넷에 접근해야합니다.\n\n위키미디어 공용 외에 기타 위키를 설정하는 방법에 대한 지침을 포함한, 기능에 대한 자세한 내용은 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos 매뉴얼]을 참조하세요.",
+       "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons 인스턴트 공용]은 [https://commons.wikimedia.org/ 위키미디어 공용] 사이트에서 찾을 수 있는 그림, 소리 및 다른 미디어를 위키에서 사용할 수 있도록 하는 기능입니다.\n이렇게 하려면 미디어위키가 인터넷 연결을 필요로 합니다.\n\n위키미디어 공용 이외에 다른 위키에서 이를 설정하는 방법에 대한 지침을 포함한, 기능에 대한 자세한 내용은 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos 매뉴얼]을 참조하세요.",
        "config-cc-error": "크리에이티브 커먼즈 라이선스 선택기에 결과가 없습니다.\n수동으로 라이선스 이름을 입력하세요.",
        "config-cc-again": "다시 선택...",
        "config-cc-not-chosen": "원하는 크리에이티브 커먼즈 라이선스를 선택하고 \"proceed\"을 클릭하세요.",
        "config-memcache-needservers": "캐시 종류로 Memcached를 선택했지만 어떠한 서버도 지정하지 않았습니다.",
        "config-memcache-badip": "Memcached에 대해 잘못된 IP 주소를 입력했습니다: $1.",
        "config-memcache-noport": "Memcached 서버에 사용할 포트를 지정하지 않았습니다: $1.\n포트를 모를 경우 기본 값은 11211입니다.",
-       "config-memcache-badport": "Memcached 포트 번호는 $1(와)과 $2 사이여야 합니다.",
+       "config-memcache-badport": "Memcached 포트 번호는 $1와(과) $2 사이여야 합니다.",
        "config-extensions": "확장 기능",
        "config-extensions-help": "위에 나열된 확장 기능이 <code>./extensions</code>에서 발견되었습니다.\n\n추가적인 설정이 필요할 수 있습니다만 지금 활성화시킬 수 있습니다.",
        "config-skins": "스킨",
        "config-install-extension-tables": "활성화된 확장 기능을 위한 테이블을 만드는 중",
        "config-install-mainpage-failed": "대문을 삽입할 수 없습니다: $1",
        "config-install-done": "<strong>축하합니다!</strong>\n미디어위키를 설치했습니다.\n\n설치 관리자가 <code>LocalSettings.php</code> 파일을 만들었습니다.\n여기에 모든 설정이 포함되어 있습니다.\n\n파일을 다운로드하여 위키 설치의 거점에 넣어야 합니다. (index.php와 같은 디렉터리) 다운로드가 자동으로 시작됩니다.\n\n다운로드가 제공되지 않을 경우나 그것을 취소한 경우에는 아래의 링크를 클릭하여 다운로드를 다시 시작할 수 있습니다:\n\n$3\n\n<strong>참고:</strong> 이 생성한 설정 파일을 다운로드하지 않고 설치를 끝내면 이 파일은 나중에 사용할 수 없습니다.\n\n완료되었으면 <strong>[$2 위키에 들어갈 수 있습니다]</strong>.",
+       "config-install-done-path": "<strong>축하합니다!</strong>\n미디어위키가 설치되었습니다.\n\n설치 관리자가 <code>LocalSettings.php</code> 파일을 생성했습니다.\n이 파일에 모든 설정이 포함되어 있습니다.\n\n이 파일을 다운로드하여 <code>$4</code> 위치에 넣으세요. 다운로드가 자동으로 시작되었을 것입니다.\n\n다운로드가 시작되지 않았거나 취소했다면, 아래 링크를 클릭하여 다운로드를 재시작할 수 있습니다.\n\n$3\n\n<strong>알림:</strong> 지금 다운로드하지 않는다면, 이후에는 이 설정 파일을 다운로드할 수 없습니다.\n\n모든 작업이 완료되었다면, <strong>[$2 위키에 들어갈 수 있습니다]</strong>.",
        "config-download-localsettings": "<code>LocalSettings.php</code> 다운로드",
        "config-help": "도움말",
        "config-help-tooltip": "확장하려면 클릭",
index 7e1540e..3343db7 100644 (file)
        "config-no-db": "Mer kunnte kei zopaß Daatebangk-Driiverprojamm fenge.\nMer bruche e Daatebangk-Driiverprojamm för PHP. Dat moß enjeresht wääde.\nMer künne met heh dä {{PLURAL:$2|Daatebangk|Daatebangke|Daatebangk}} ömjonn: $1.\n\nWann De nit om eijene Rääshner bes, moß De Dinge <i lang=\"en\">provider</i> bedde, dat hä Der ene zopaß Driiver enresht.\nWann de PHP sellver övversaz häs, donn e Zohjangsprojramm för en Daatebangk enbenge, för e Beishpell met: <code  lang=\"en\">./configure --with-mysql</code>.\nWann De PHP uss enem <i lang=\"en\">Debian</i> udder <i lang=\"en\">Ubuntu</i> Pakätt enjeresht häs, moß De dann och noch et <code lang=\"en\">php5-mysql</code> op Dinge Räschner bränge.",
        "config-outdated-sqlite": "'''Opjepaß:''' <i lang=\"en\">SQLite</i> $1 es enschtaleert. Avver MediaWiki bruch <i lang=\"en\">SQLite</i> $2 udder hühter. <i lang=\"en\">SQLite</i> kann dröm nit enjesaz wääde.",
        "config-no-fts3": "'''Opjepaß:''' De Projramme vum <i lang=\"en\">SQLite</i> sin der ohne et [//sqlite.org/fts3.html FTS3-Modul] övversaz, dröm wääde de Funxjohne för et Söhke fähle.",
-       "config-mbstring": "<strong>Dä!</strong> Dem PHP singe Schallder <code lang=\"en\">[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]</code> es enjeschalldt.\nDat sorresch för Fähler un kann enjejovve Daate esu kapott maach, dat doh draan nix mih ze repareere es.\nDomet kam_mer MediaWiki nit ennreeshte un och nit loufe lohße.\nDat heiß, mer moß en affschallde, söns jeiht nix.",
-       "config-xml-bad": "Dem <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"PHP Hypertext Preprocessor\">PHP</i> sing <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Extensible Markup Language\">XML</i>-Moduhl es nit ze fenge.\nMediaWiki bruch Funxjohne en däm Moduhl un deiht et esu nit.\nDe künns et nühdesch han, dat Pakätt \n„<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">php-xml</code>“ ze enschtallehre.",
        "config-pcre-old": "<strong>Fähler:</strong> PCRE $1 udder neuer es nüüdesch.\nPHP es jäz ävver met PCRE $2 zesamme jebonge.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mieh dohzoh].",
        "config-pcre-no-utf8": "'''Dä:''' Et PHP-Modul <i lang=\"en\">PCRE</i> schingk ohne de <i lang=\"en\">PCRE_UTF8</i>-Aandeile övversaz ze sin.\nMediaWiki bruch dä UTF-8-Krohm ävver, öm ohne Fähler loufe ze künne.",
        "config-memory-raised": "Der jrühzte zohjelasse Shpeisherbedarf vum PHP, et <code lang=\"en\">memory_limit</code>, shtund op $1 un es op $2 erop jesaz woode.",
        "config-memory-bad": "'''Opjepaß:''' Dem PHP singe Parameeter <code lang=\"en\">memory_limit</code> es $1.\nDat es wall ze winnisch.\nEt Enreeschte kunnt doh draan kappott jon!",
-       "config-ctype": "'''Fähler:''' <i lang=\"en\">PHP</i> moß met dä Ongerschtözong för der [http://www.php.net/manual/en/ctype.installation.php <code lang=\"en\">Ctype</code> Zohsaz] övversaz woode sin.",
-       "config-iconv": "'''Fähler:''' <i lang=\"en\">PHP</i> moß met dä Ongerschtözong för der [http://www.php.net/manual/en/iconv.installation.php <code lang=\"en\">iconv</code> Zohsaz] övversaz woode sin.",
-       "config-json": "'''Dä!:''' PHP wood der ohne <i lang=\"en\" xml:lang=\"en\">JSON</i> övversaz.\nJäz moß de äntweeder dä PHP-<i lang=\"en\" xml:lang=\"en\">JSON</i>-Zohsaz enschtallere udder der <i lang=\"en\" xml:lang=\"en\">[http://pecl.php.net/package/jsonc PECL jsonc]</i>-Zohsaz, ih dat de MedijaWikki enschtallere kanns.\n* Dä PHP-Zohsaz es em <i lang=\"en\" xml:lang=\"en\">Red Hat Enterprise Linux (CentOS)</i> 5 un 6 änthallde, moß ävver en de <code lang=\"en\" xml:lang=\"en\">/etc/php.ini</code> udder <code lang=\"en\" xml:lang=\"en\">/etc/php.d/json.ini</code> enjeschalldt wääde.\n* E paa Linux Destrebuzjohne lohß zigg_em Mai 2013 dä PHP-Zohsaz fott un packe doför der PECL-Zohsaz als <code lang=\"en\" xml:lang=\"en\">php5-json</code> udder <code lang=\"en\" xml:lang=\"en\">php-pecl-jsonc</code> med ein.",
-       "config-mbstring-absent": "'''Fähler:''' <i lang=\"en\">PHP</i> moß met dä Ongerschtözong för singe Zohsaz [http://www.php.net/manual/en/mbstring.setup.php <code lang=\"en\">mbstring </code>] övversaz woode sin.",
        "config-xcache": "Dä <code lang=\"en\">[http://xcache.lighttpd.net/ XCache]</code> es ennjeresht.",
        "config-apc": "Dä <code lang=\"en\">[http://www.php.net/apc APC]</code> es ennjeresht.",
        "config-wincache": "Dä <code lang=\"en\">[http://www.iis.net/download/WinCacheForPhp WinCache]</code> es ennjeresht.",
        "config-subscribe": "Donn de [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce \n<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Leß met de Aanköndijonge vum MehdijaWikki] abonnehre.",
        "config-subscribe-help": "Do kumme bloß winnish Meddeilunge un di jonn övver neu Versiohne vom MediaWiki un weeshtejje Saache vun däm sing Sesherheit.\nDo sullts se abbonneere, un Ding MediWiki_Projramme op der neue Shtand bränge, wann neu Version eruß kumme.",
        "config-subscribe-noemail": "Do has versöhk, der ohne en Addräß för Ding <i lang=\"en\">e-mail<i> aanzejävve, de Aanköndijonge för Aanköndijunge för neue Versione ze abboneere. Jivv en Addräß aan, wann De di Aanköndijonge hann wells.",
+       "config-pingback": "Jivv Dahte övver heh di Enschtallazjuhn vum Mehdijawikki aan de Äntwerkere.",
        "config-almost-done": "Do bes beinah dorsch!\nDo künnts jez der Räß vun de einzel Enschtällonge övverjonn, un et Wiki tiräktemang fähdesch opsäze.",
        "config-optional-continue": "De wells noch mih Frohre jeschtallt krijje un noch mih Enschtällonge maache?",
        "config-optional-skip": "Nä, lohß dä Ömshtand, donn eifarr_et Wiki opsäze.",
        "config-email-sender-help": "Jiff de Adräß för de <i lang=\"en\">e-mail</i> en, woh Antwoote ob em Wiki singe <i lang=\"en\">e-mails</i> hen jonn sulle.\nDat es och de Adräß, woh de <i lang=\"en\">e-mails</i> met Fählermäldonge hen jon.\nVill ẞöövere för de <i lang=\"en\">e-mail</i> welle winnischßdens ene jöltijje Domain en dä Adräß han.",
        "config-upload-settings": "Belder un Datteie huh laade",
        "config-upload-enable": "Et Belder un Datteie Huhlahde zohlohße",
-       "config-upload-help": "Datteije huh ze laade künnt e Risiko för dem ẞööver singe Sescherheit sin.\nMieh doh drövver kam_mer em [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security Kapitel övver de Sescherheit] em Handbooch lässe.\n\nÖm et Huhlaade zohzelohße donn de Rääschde för der Zohjreff op dat Ongerverzeischneß <code lang=\"en\">images</code> em MediaWiki singem Houpverzeischneß esu enshtälle, dat et Webßööverprojramm doh Datteije un Verzeischneße eren schrieve kann.\nDonoh donn heh di Saach zohlohße.",
+       "config-upload-help": "Datteije huh ze lahde künnd e Rissiko för dem ẞööver sing Sescherheit sin.\nMih doh drövver kam_mer em [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security Kapitel övver de Sescherheit] em Handbohch lässe.\n\nÖm et Huhlahde zohzelohße donn de Rääschde för der Zohjreff op dat Ongerverzeischneß <code lang=\"en\" xml:lang=\"en\" title=\"„Bellder“\">images</code> em MehdijaWikki singem Houpverzeischneß esu enschtälle, dat et Webßööverprojramm doh Datteije un Verzeijschneße eren schrihve kann.\nDonoh donn heh di Enschtällong dann zohlohße.",
        "config-upload-deleted": "Dat Verzeishneß för fottjeschmeße Datteije:",
        "config-upload-deleted-help": "Söhk e Verzeijschneß uß för de fottjeschmeße Datteije vum Wiki dren afzelääje.\nEt bäß es, wam_mer vum <i lang=\"en\">world wide web</i> doh nit drahn kumme kann.",
        "config-logo": "Dem Wiki singem Logo sing <i lang=\"en\">URL</i>:",
        "config-install-extension-tables": "Ben Datebangk-Tabälle för de Zohsazprojramme aam ennreschte",
        "config-install-mainpage-failed": "Kunnt de Houpsigg nit afshpeishere: $1",
        "config-install-done": "<strong>Jlöckwonsch!</strong>\nMediaWiki es jetz enstalleet.\n\nEt Projramm zom Enreeschte hät en Dattei <code lang=\"en\">LocalSettings.php</code> aanjelaat.\nDoh sin de Enstellunge vum Wiki dren.\n\nDo weeß se eronge laade möße un dann en dem Wiki sing Aanfangsverzeishnes donn möße, et sellve Verzeisneß, woh di Dattei <code lang=\"en\">index.php</code> dren litt. Dat Erongerlaade sullt automattesch aanjefange han.\n\nWann domet jet nit jeflupp hät, udder De di Dattei norr_ens han wells, donn op dä Lengk heh dronger klecke:\n\n$3\n\n<strong>Opjepaß:</strong> Wann De dat jez nit deihß, es alles verschött, wat De bes jöz enjejovve häs, weil di Dattei fott es en däm Momang, woh heh dat Projamm aam Engk es.\n\nWann De mem Ronger- un widder Huhlaade fäädesh bes, kanns De <strong>[$2 en Ding Wiki jonn]</strong>.",
+       "config-install-done-path": "<strong>Jlöckwonsch!</strong>\nEt MehdijaWiki es jäz enschtallehrt.\n\nDat Projramm zom Enreeschte hädd en Dattei <code lang=\"en\" xml:lang=\"en\" dir=\"rtl\">LocalSettings.php</code> aanjelaat.\nDoh sin alle Enschtällonge vum Wikki dren.\n\nDo weeß se eronge lahde möße, un dann en dem Wikki sing Aanfangsverzeischneß <code>$4</code> donn möße. Dat Erongerlahde sullt automattesch aanjefange han.\n\nWann domet jät nit jeflupp hät, udder De di Dattei norr_ens han wells, donn op dä Lengk heh dronger klecke:\n\n$3\n\n<strong>Opjepaß:</strong> Wann De dat jäz nit deihß, es alles verschött, wat De bes jäz enjejovve häs, weil di Dattei fott es en däm Momang, woh heh dat Projamm aam Engk es.\n\nWann De mem Ronger- un widder Huhlaade fähdesch bes, kanns De <strong>[$2 en Ding Wikki jonn]</strong>.",
        "config-download-localsettings": "Donn di Dattei <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">LocalSettings.php</code> eronger lahde",
        "config-help": "Hölp",
        "config-help-tooltip": "Donn Hölp heh aan däm Plaaz enblände.",
        "config-nofile": "De Dattei „$1“ ham_mer nit jefonge. Es di fottjeschmeße?",
        "config-extension-link": "Häs De jewoß, dat et Wiki [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions Zohsazprojramme] hann kann?\n\nDo kanns [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category Zohsazprojramme noh Saachjroppe] söhke udder en de [https://www.mediawiki.org/wiki/Extension_Matrix Tabäll met de Zohsazprojramme] kike, öm de kumplätte Leß met de Zohsazprojramme ze krijje.",
        "mainpagetext": "<strong>MehdijaWikki es jäz enschtalleht.</strong>",
-       "mainpagedocfooter": "Luur en et (änglesche) [https://meta.wikimedia.org/wiki/Help:Contents Handbohch] wann De weße wells wi de Wikki-ẞoffwähr jebruch un bedehnt wähde moß.\n\n== För der Aanfang ==\nDat es och all op Änglesch:\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings En leß met müjjelesche Enschtällonge för et MehdijaWikki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Öff jefrooch övver et Mehdijawikki&nbsp;&hellip;]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce De Meilengleß met Annköndijonge övver neuje Ußjahbe vum MehdijaWikki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Donn MediaWiki op Ding Schprohch aanpaße]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Loor, wi der der <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„för jewöhnlesch angmaß övverdrahre Nohreeschte udder Meddeijlonge, di wä se kritt jaa nit han well,“\">SPAM</i> em Wikki klein hälls]\n\n=== Jrammatek ===\nJeh nohdämm, ovv_et „di {{SITENAME}}“, „dä {{SITENAME}}“ udder „dat {{SITENAME}}“ heiß, moß mer velleijsch en Datteij änndere. Wann „{{SITENAME}}“ med „wikki“ ov „wiki“ ophürt, moß mer nix donn. Bei „dä {{SITENAME}}“ och nit. Söns kütt en di Datteij <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">languages/classes/LanguageKsh.php</code> vör udder henger dä Reihj met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">No need add neuter wikis having names ending in -wiki.</code>“ en neuje Reihj eren:\n* för „di {{SITENAME}}“ heijß di:\n*: <code>'{{SITENAME}}' => 'f',</code>\n* för „dat {{SITENAME}}“ heijs et:\n*: <code>'{{SITENAME}}' => 'n',</code>\n\n== Un dann ==\nDonn heh di Sigg ömbenänne un/udder jähje en ääschte Aanfangssigg för heh dat Wikki ußtuusche!\n\nAlles Johde!"
+       "mainpagedocfooter": "Luuer en et (änglesche) [https://meta.wikimedia.org/wiki/Help:Contents Handbohch] wann De weße wells, wi de Wikki-ẞoffwähr jebruch un bedehnt wähde moß.\n\n== För der Aanfang ==\nDat es och all op Änglesch:\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings En Leß met müjjelesche Enschtällonge för et MehdijaWikki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Öff jefrooch övver et Mehdijawikki&nbsp;&hellip;]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce De Meilengleß met Annköndejonge övver neuje Ußjahbe vum MehdijaWikki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Donn Mehdijawikki op Ding Schprohch aanpaße]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Loor, wi der der <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„för jewöhnlesch angmaß övverdrahre Nohreeschte udder Meddeijlonge, di wä se kritt jaa nit han well,“\">SPAM</i> em Wikki klein hälls]\n\n=== Jrammatek ===\nJeh nohdämm, ovv_et „di {{SITENAME}}“, „dä {{SITENAME}}“ udder „dat {{SITENAME}}“ heiß, moß mer velleijsch en Datteij änndere. Wann „{{SITENAME}}“ med „wikki“ ov „wiki“ ophürt, moß mer nix donn. Bei „dä {{SITENAME}}“ och nit. Söns kütt en di Datteij <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">languages/classes/LanguageKsh.php</code> vör udder henger dä Reihj met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">No need add neuter wikis having names ending in -wiki.</code>“ en neuje Reihj eren:\n* för „di {{SITENAME}}“ heijß di:\n*: <code>'{{SITENAME}}' => 'f',</code>\n* för „dat {{SITENAME}}“ heijs et:\n*: <code>'{{SITENAME}}' => 'n',</code>\n\n== Un dann ==\nDonn heh di Sigg ömbenänne un/udder jähje en ääschte Aanfangssigg för heh dat Wikki ußtuusche!\n\nAlles Johde!"
 }
index 7124496..3f20c07 100644 (file)
@@ -36,6 +36,7 @@
        "config-db-install-account": "Hesabê bikarhêner bo avakirinê",
        "config-db-username": "Navê bikarhêner bo danagehê:",
        "config-db-password": "Şîfreya danegehê:",
+       "config-invalid-db-type": "Cureya danegehê ya nederbasdar",
        "config-db-web-account": "Hesabê danegehê bô têgihiştina tora înternetê",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-utf8": "UTF-8",
index f3ff702..91df060 100644 (file)
@@ -48,7 +48,6 @@
        "config-no-db": "Et konnt kee passenden Datebank-Driver fonnt ginn! Dir musst een Datebank-Driver fir PHP installéieren.\n{{PLURAL:$2|Dësn Datebank-Typ gëtt|Dës Datebank-Type ginn}} ënnerstëtzt: $1.\n\nWann Dir PHP selwer compiléiert hutt, da rekonfiguréiert en mat dem ageschalten Datebank-Client, zum Beispill an deem Dir <code>./configure --with-mysql</code> benotzt.\nWann Dir PHP vun engem Debian oder Ubuntu Package aus installéiert hutt, da musst Dir och den php5-mysql Modul installéieren.",
        "config-outdated-sqlite": "'''Warnung:''' SQLite $1 ass installéiert. Allerdengs brauch MediaWiki SQLite $2 oder méi nei. SQLite ass dofir net disponibel.",
        "config-memory-bad": "'''Opgepasst:''' De Parameter <code>memory_limit</code> vu PHP ass $1.\nDat ass wahrscheinlech ze niddreg.\nD'Installatioun kéint net funktionéieren.",
-       "config-iconv": "<strong>Fatal:</strong> PHP muss mat Support fir d'[http://www.php.net/manual/en/iconv.installation.php iconv-Erweiderung] kompiléiert ginn.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] ass installéiert",
        "config-apc": "[http://www.php.net/apc APC] ass installéiert",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] ass installéiert",
        "config-admin-error-password": "Interne Feeler beim Setze vum Passwuert fir den Admin \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
        "config-admin-error-bademail": "Dir hutt eng E-Mail-Adress aginn déi net valabel ass",
        "config-subscribe": "Sech op d'[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ukënnegunge vun neie Versiounen] abonnéieren.",
+       "config-pingback-help": "Wann Dir dës Optioun auswielt schéckt MediaWiki regelméisseg https://www.mediawiki.org Basisdaten iwwer dës MediaWiki-Instanz. An dësen Daten sinn zum Beispill de Systemtyp, d'PHP-Versioun an déi erausgesicht Datebank-Backend. D'Wikimedia Foundation gëtt dës Daten un d'MediaWiki-Entwéckler, fir ze hëllefen d'Entwécklung an der Zukunft efficace z'organiséieren. Dës Date gi fir Äre System geschéckt:\n<pre>$1</pre>",
        "config-almost-done": "Dir sidd bal fäerdeg!\nDir kënnt elo déi Astellungen déi nach iwwreg sinn iwwersprangen an d'Wiki elo direkt installéieren.",
        "config-optional-continue": "Stellt mir méi Froen.",
        "config-optional-skip": "Ech hunn es genuch, installéier just d'Wiki.",
index 15a5c7d..1df843a 100644 (file)
        "config-no-db": "درایور پایگاه اطلاعاتی مناسب پیدا نشد! شما لازم دارید یک درایور پایگاه اطلاعاتی  برای پی‌اچ‌پی نصب کنید.انواع پایگاه اطلاعاتی زیر پشتیبانی شده‌اند:$1.\nاگر شما در گروه اشتراک‌گذاری هستید، از تهیه کنندهٔ گروه خود برای نصب یک درایور پایگاه اطلاعاتی مناسب {{PLURAL:$2|سوأل کنید.|پرسش کنید.}}\nاگر خود، پی‌اچ‌پی را تهیه کرده‌اید، با یک پردازشگر فعال دوباره پیکربندی کنید، برای مثال از <code>./configure --with-mysql</code> استفاده کنید.\nاگر پی‌اچ‌پی را از یک بستهٔ دبیان یا آبونتو نصب کرده‌اید، بنابراین لازم دارید بخش php5-mysql را نصب کنید.",
        "config-outdated-sqlite": "''' هشدار:''' شما اس‌کیولایت $1 دارید، که پایین‌تر از حداقل نسخهٔ $2 مورد نیاز است.اس‌کیولایت در دسترس نخواهد بود.",
        "config-no-fts3": "'''هشدار:''' اس‌کیولایت بدون [//sqlite.org/fts3.html FTS3 module] تهیه شده‌است ، جستجوی ویژگی‌ها در این بخش پیشین در دسترس نخواهد‌بود.",
-       "config-mbstring": "''' مخرب:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] فعال است.\nاین گزینه باعث ایجاد خطا می‌شود و ممکن است اطلاعات را به طور غیر‌قابل پیش‌بینی از بین ببرد.\nشما نمی‌توانید مدیاویکی را نصب یا استفاده کنید مگر اینکه این گزینه غیر‌فعال باشد.",
-       "config-xml-bad": "ماژول اکس‌ام‌ال پی‌اچ‌پی کار نمی‌کند.\nمدیاویکی نیازمند عملیاتی در این ماژول است و در این پیکربندی کار نخواهد‌کرد.\nشاید نیاز باشد که بستهٔ نرم افزاریِ آرپی‌ام پی‌اچ‌پی-ایکس‌ام‌ال را نصب کنید.",
        "config-pcre-old": "''' خطای اساسی:'' ' PCRE  $1  یا بعدا مورد نیاز است.\nکد باینری پی‌اچ‌پی‌تان با PCRE  $2 پیوند دارد.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE اطلاعات بیشتر].",
        "config-pcre-no-utf8": "'''مخرب:''' به‌ نظر می‌رسد ماژول پی‌سی‌آرایی پی‌اچ‌پی بدون پشتیبانی پی‌سی‌آرایی_یو‌تی‌اف۸ تهیه شده‌است.\nمدیاویکی برای درست عمل کردن نیازمند پشتیبانی یوتی‌اف-۸ است.",
        "config-memory-raised": "PHP's <code>memory_limit</code>, نسخهٔ $1 است، به نسخهٔ $2 ارتقاء داده شده‌است.",
        "config-memory-bad": "'''هشدار:''' PHP's <code>memory_limit</code> نسخهٔ $1 است.\nاین ممکن است خیلی پایین باشد.\nممکن است نصب با مشکل رو‌به‌رو شود.",
-       "config-ctype": "'''مخرب:''' پی‌اچ‌پی باید با پشتیبانی برای [http://www.php.net/manual/en/ctype.installation.php Ctype extension] تهیه شده‌باشد.",
        "config-db-type": "نوع پایگاه اطلاعات:",
        "config-db-host": "میزبان پایگاه اطلاعات:",
        "config-db-host-oracle": "ای ویکیۀ  شناسایی کۀ.",
index e421a21..8b8e0fb 100644 (file)
@@ -35,5 +35,5 @@
        "config-env-bad": "पर्यावरण क जाँच कएल गेल अछि।\nआहाँ मीडियाविकि स्थापित नै कर सकै चिए।",
        "config-env-php": "PHP $1 स्थापित कएल ग्याल अछि।",
        "mainpagetext": "<strong>मेडियाविकी नीक जकाँ प्रस्थापित भेल।</strong>",
-       "mainpagedocfooter": "समà¥\8dपरà¥\8dà¤\95 à¤\95रà¥\82 [https://meta.wikimedia.org/wiki/Help:Contents User's Guide] à¤µà¤¿à¤\95ि à¤¤à¤\82तà¥\8dराà¤\82शà¤\95 प्रयोगक जानकारी लेल।\n\n==प्रारम्भ कोना करी==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
+       "mainpagedocfooter": "समà¥\8dपरà¥\8dà¤\95 à¤\95रà¥\80 [https://meta.wikimedia.org/wiki/Help:Contents User's Guide] à¤µà¤¿à¤\95ि à¤¸à¤«à¥\8dà¤\9fवà¥\87यर प्रयोगक जानकारी लेल।\n\n==प्रारम्भ कोना करी==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
 }
index 322c4b3..f8b66c1 100644 (file)
        "config-no-db": "Не можев да најдам соодветен двигател за базата на податоци! Ќе треба да воспоставите двигател за PHP-база.\n{{PLURAL:$2|Поддржан се следниов вид|Поддржани се следниве видови}} бази: $1.\n\nДоколку самите го срочивте овој PHP, овозможете го базниот клиент во поставките — на пр. со <code>./configure --with-mysqli</code>.\nАко овој PHP го воспоставите од пакет на Debian или Ubuntu, тогаш ќе треба исто така да го воспоставите, на пр., пакетот <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Предупредување''': имате SQLite $1. Најстарата допуштена верзија е $2. Затоа, SQLite ќе биде недостапен.",
        "config-no-fts3": "'''Предупредување''': SQLite iе составен без модулот [//sqlite.org/fts3.html FTS3] - за оваа база нема да има можност за пребарување.",
-       "config-mbstring": "'''Кобно: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] е активно!'''\nОваа можност предизвикува грешки и може непредвидиво да го расипува вносот на податоци.\nОваа можност мора да е исклучена. Во спротивно нема да можете да го воспоставите и користите МедијаВики.",
-       "config-xml-bad": "XML-модулот за PHP недостасува.\nМедијаВики има потреба од функции во овој модул и нема да работи со овие поставки.\nМоже да треба да го воспоставите RPM-пакетот „php-xml“.",
        "config-pcre-old": "'''Кобно:''' Се бара PCRE $1 или понова верзија.\nВашиот PHP-бинарен е сврзан со PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Повеќе информации].",
        "config-pcre-no-utf8": "<strong>Кобно</strong>: PCRE-модулот на PHP е срочен без поддршка за PCRE_UTF8.\nМедијаВики бара поддршка за UTF-8 за да може да работи правилно.",
        "config-memory-raised": "<code>memory_limit</code> за PHP изнесува $1, зголемен на $2.",
        "config-memory-bad": "'''Предупредување:''' <code>memory_limit</code> за PHP изнесува $1.\nОва е веројатно премалку.\nВоспоставката може да не успее!",
-       "config-ctype": "<strong>Кобно:</strong> PHP мора да се срочи со поддршка за додатокот [http://www.php.net/manual/en/ctype.installation.php Ctype].",
-       "config-iconv": "<strong>Кобно:</strong> PHP мора да се срочува со поддршка за [http://www.php.net/manual/en/iconv.installation.php додатокот iconv].",
-       "config-json": "'''Кобно:''' PHP беше срочен без поддршка од JSON.\nЌе мора да го воспоставите додатокот за JSON во PHP, или додатокот [http://pecl.php.net/package/jsonc PECL jsonc] пред да го воспоставите МедијаВики.\n* Додатокот за PHP е вклучен во верзиите 5 и 6 на Linux (од Red Hat Enterprise) (CentOS), но мора да се активира во <code>/etc/php.ini</code> или <code>/etc/php.d/json.ini</code>.\n* Некои варијанти на Linux излезени по мај 2013 г. не го содржат додатокот за PHP, туку го пакуваат додатокот PECL како <code>php5-json</code> или <code>php-pecl-jsonc</code>.",
-       "config-mbstring-absent": "<strong>Кобно:</strong> PHP мора да се срочува со поддршка за додатокот [http://www.php.net/manual/en/mbstring.setup.php mbstring].",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] е воспоставен",
        "config-apc": "[http://www.php.net/apc APC] е воспоставен",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] е воспоставен",
        "config-subscribe": "Претплатете се на [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce release поштенскиот список за известувања].",
        "config-subscribe-help": "Ова е нископрометен поштенски список кој се користи за соопштувања во врска со изданија, вклучувајќи важни безбедносни соопштенија.\nТреба да се претплатите и да ја надградувате вашата воспоставка на МедијаВики кога излегуваат нови верзии.",
        "config-subscribe-noemail": "Се обидовте да се претплатите на поштенскиот список со известувања за нови изданија без да наведете е-пошта.\nНаведете е-поштенска адреса ако сакате да се претплатите на списокот.",
+       "config-pingback": "Споделувај податоци за воспоставката со разработувачите на МедијаВики.",
+       "config-pingback-help": "Ако ја изберете оваа можност, МедијаВики повремено ќе му испраќа на https://www.mediawiki.org основни податоци за овој примерок на МедијаВики. Тука спаѓаат видот на системот, PHP-верзијата и избраната базна заднина. Фондацијата Викимедија ги споделува овие податоци со разработувачите на МедијаВики со цел да им даде насоки за разработка во идните верзии. За вашиот систем ќе се испратат следниве податоци:\n<pre>$1</pre>",
        "config-almost-done": "Уште малку сте готови!\nСега можете да ги прескокнете преостанатите поставувања и веднаш да го воспоставите викито.",
        "config-optional-continue": "Постави ми повеќе прашања.",
        "config-optional-skip": "Веќе ми здосади, дај само воспостави го викито.",
        "config-install-extension-tables": "Изработка на табели за овозможени додатоци",
        "config-install-mainpage-failed": "Не можев да вметнам главна страница: $1",
        "config-install-done": "<strong>Честитаме!</strong>\nУспешно го воспоставивте МедијаВики.\n\nВоспоставувачот создаде податотека <code>LocalSettings.php</code>.\nТаму се содржат сите ваши нагодувања.\n\nЌе треба да ја преземете и да ја ставите во основата на воспоставката (истата папка во која се наоѓа index.php). Преземањето треба да е започнато автоматски.\n\nАко не ви е понудено преземање, или пак ако сте го откажале, можете да го почнете одново стискајќи на следнава врска:\n\n$3\n\n<strong>Напомена</strong>: Ако ова не го направите сега, податотеката со поставки повеќе нема да биде на достапна.\n\nОткога ќе завршите со тоа, можете да <strong>[$2 влезете на вашето вики]</strong>.",
+       "config-install-done-path": "<strong>Честитаме!</strong>\nГо воспоставивте МедијаВики.\n\nВоспоставувачот создаде податотека <code>LocalSettings.php</code>.\nТаму се содржат сите ваши нагодувања.\n\nЌе треба да ја преземете и да ја ставите во <code>$4</code>. Преземањето треба да е започнато автоматски.\n\nАко не ви е понудено преземање, или пак ако сте го откажале, можете да го почнете одново стискајќи на следнава врска:\n\n$3\n\n<strong>Напомена</strong>: Ако ова не го направите сега, создадената податотека со поставки повеќе нема да биде на достапна, освен ако не ја преземете пред да излезете.\n\nОткога ќе завршите со тоа, можете да <strong>[$2 влезете на вашето вики]</strong>.",
        "config-download-localsettings": "Преземи го <code>LocalSettings.php</code>",
        "config-help": "помош",
        "config-help-tooltip": "стиснете да расклопите",
index 6982ffd..d3e0e17 100644 (file)
@@ -43,7 +43,7 @@
        "config-restart": "होय, परत चालू करा",
        "config-welcome": "=== पारिसरीक तपासण्या ===\nमिडियाविकिच्या उभारणीस हा परिसर योग्य आहे काय याच्या मूळ तपासण्या आता केल्या जातील.\nजर आपणास पुढे याची उभारणी करण्याबद्दल साहाय्य लागल्यास, याचा अंतर्भाव करणे लक्षात ठेवा.",
        "config-copyright": "=== प्रताधिकार व अटी ===\n\n$1\nहा कार्यसंच,हे एक मुक्त संचेतन आहे;आपण त्यास पुनर्वितरीत व/किंवा त्यास फ्री सॉफ्टवेअर फाऊंडेशन द्वारे प्रकाशित, GNU जनरल पब्लिक लायसन्स अंतर्गत बदलु शकता;या परवान्याची आवृत्ती २ किंवा (आपल्या इच्छेनुसार)त्यानंतरची आवृत्ती.\n\nहा कार्यसंचाचे वितरण,पण, <strong>कोणत्याही हमीशिवाय</strong>; याशिवाय <strong>व्यापारीकरणाच्या</strong> कोणत्याही अभिप्रेत आश्वासनाशिवाय किंवा <strong>एखाद्या विशिष्ट कार्यासाठीच्या अर्हतेशिवाय</strong>ही आशा ठेऊन केले आहे कि, तो उपयोगी असेल.\nअधिक माहितीसाठी GNU जनरल पब्लिक लायसन्स बघा.\nआपणास या कार्यसंचासमवेत <doclink href=Copying>GNU जनरल पब्लिक लायसन्सची प्रत मिळाली असेल,</doclink>नसल्यास,फ्री सॉफ्टवेअर फाऊंडेशनला या पत्त्यावर लिहा.Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. किंवा त्यास [http://www.gnu.org/copyleft/gpl.html ऑनलाईन वाचा].",
-       "config-sidebar": "* [https://www.mediawiki.org मिडियाविकि गृह]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents सदस्य मार्गदर्शिका]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents प्रशासकाची मार्गदर्शिका]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Read me</doclink>\n* <doclink href=ReleaseNotes>विमोचन टिप्पण्या</doclink>\n* <doclink href=Copying>नकलविणे</doclink>\n* <doclink href=UpgradeDoc>दर्जोन्नती करणे</doclink>",
+       "config-sidebar": "* [https://www.mediawiki.org मिडियाविकि गृह]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents सदस्य मार्गदर्शिका]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents प्रशासकाची मार्गदर्शिका]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ एफएक्यू]\n----\n* <doclink href=Readme>रीड मी</doclink>\n* <doclink href=ReleaseNotes>विमोचन टिप्पण्या</doclink>\n* <doclink href=Copying>नकलविणे</doclink>\n* <doclink href=UpgradeDoc>दर्जोन्नती करणे</doclink>",
        "config-env-good": "पारिसरीक तपासणी झाली आहे.\nआपण मिडियाविकि उभारू शकता.",
        "config-env-bad": "पारिसरीक तपासणी झाली आहे.\nआपण मिडियाविकि उभारू शकत नाही.",
        "config-env-php": "PHP $1 उभारल्या गेली.",
@@ -52,8 +52,6 @@
        "config-outdated-sqlite": "<strong>इशारा:</strong> आपणापाशी SQLite $1 आहे, जी किमान आवश्यक आवृत्ती $2 पेक्षा, निम्न आहे. SQLite अनुपलब्ध राहील.",
        "config-memory-raised": "पीएचपीची <code>memory_limit</code> ही $1 आहे, त्यास $2 ला वाढविली.",
        "config-memory-bad": "पीएचपीची <code>memory_limit</code> ही $1 आहे.\nही बरीच खालच्या स्तरावरची आहे.\nउभारणी अयशस्वी होऊ शकते!",
-       "config-ctype": "<strong>घातक:</strong> पीएचपीचे [http://www.php.net/manual/en/ctype.installation.php Ctype या विस्तारकाशी] साहाय्य करण्यास संकलन करावे लागेल.",
-       "config-iconv": "<strong>घातक:</strong> पीएचपीचे [http://www.php.net/manual/en/iconv.installation.php iconv या विस्तारकाशी]साहाय्य करण्यास संकलन करावे लागेल.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] उभारली",
        "config-apc": "[http://www.php.net/apc APC] उभारली आहे",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] उभारली आहे",
        "config-install-tables-failed": "<strong>त्रुटी:</strong>खालील त्रुटीमुळे सारणी बनविणे अयशस्वी:$1",
        "config-help": "साहाय्य",
        "mainpagetext": "'''मीडियाविकीचे इन्स्टॉलेशन पूर्ण.'''",
-       "mainpagedocfooter": "विà¤\95à¥\80 à¤¸à¥\89फà¥\8dà¤\9fवà¥\87à¤\85र à¤µà¤¾à¤ªà¤°à¤£à¥\8dयाà¤\95रिता [https://meta.wikimedia.org/wiki/Help:Contents à¤µà¤¾à¤ªà¤°à¤\95रà¥\8dता à¤®à¤¾à¤°à¥\8dà¤\97दरà¥\8dशिà¤\95ा] à¤ªà¤¹à¤¾.\n\n== à¤¸à¥\81रà¥\81वात à¤\95रा ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings à¤°à¤\9aित à¤®à¤¾à¤\82डणà¥\8dयाà¤\9aà¥\80 à¤¯à¤¾à¤¦à¥\80]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ à¤®à¤¿à¤¡à¤¿à¤¯à¤¾à¤µà¤¿à¤\95ि FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-मिडियाविà¤\95िà¤\9aà¥\80 à¤®à¥\87लिà¤\82à¤\97 à¤¯à¤¾à¤¦à¥\80à¤\9aà¥\87 विमोचनाची उद्घोषणा]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources आपल्या भाषेसाठी मिडियाविकिचे स्थानिकिकरण करा]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam आपल्या विकिवर स्पॅमशी दोन हात कसे करावे ते शिका]"
+       "mainpagedocfooter": "विà¤\95à¥\80 à¤¸à¤\82à¤\9aà¥\87तन à¤µà¤¾à¤ªà¤°à¤£à¥\8dयाà¤\95रिता [https://meta.wikimedia.org/wiki/Help:Contents à¤µà¤¾à¤ªà¤°à¤\95रà¥\8dता à¤®à¤¾à¤°à¥\8dà¤\97दरà¥\8dशिà¤\95ा] à¤ªà¤¹à¤¾.\n\n== à¤¸à¥\81रà¥\81वात à¤\95रा ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings à¤°à¤\9aित à¤®à¤¾à¤\82डणà¥\8dयाà¤\82à¤\9aà¥\80 à¤¯à¤¾à¤¦à¥\80]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ à¤®à¤¿à¤¡à¤¿à¤¯à¤¾à¤µà¤¿à¤\95ि à¤\8fफà¤\8fà¤\95à¥\8dयà¥\82]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-मिडियाविà¤\95िà¤\9aà¥\8dया à¤®à¥\87लिà¤\82à¤\97 à¤¯à¤¾à¤¦à¥\80à¤\9aà¥\8dया विमोचनाची उद्घोषणा]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources आपल्या भाषेसाठी मिडियाविकिचे स्थानिकिकरण करा]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam आपल्या विकिवर स्पॅमशी दोन हात कसे करावे ते शिका]"
 }
index 5b4eff4..71b50de 100644 (file)
        "config-unicode-update-warning": "<strong>Amaran:</strong> Versi pembalut penormalan Unicode yang terpasang menggunakan perpustakaan [http://site.icu-project.org/ projek ICU] dalam versi yang lampau.\nAnda harus [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations menaik taraf] jika Unicode penting bagi anda.",
        "config-outdated-sqlite": "<strong>Amaran:</strong> anda mempunyai SQLite $1 yang lebih rendah daripada versi keperluan minimum $1. SQLite tidak akan disediakan.",
        "config-no-fts3": "<strong>Amaran:</strong> SQLite disusun tanpa [//sqlite.org/fts3.html modil FTS3], maka ciri-ciri pencarian tidak akan disediakan pada backend ini.",
-       "config-mbstring": "<strong>Amaran keras: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] sedang aktif!</strong>\nOpsyen ini menyebabkan ralat dan mungkin mencemari data secara tanpa diduga.\nAnda tidak boleh memasang atau menggunakan MediaWiki melainkan opsyen ini dinyahdayakan.",
        "config-pcre-old": "<strong>Amaran keras:</strong> PCRE $1 ke atas diperlukan.\nBinari PHP anda berpaut dengan PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Keterangan lanjut].",
        "config-memory-bad": "<strong>Amaran:</strong> <code>memory_limit</code> (Had memori) PHP adalah $1.\nIni mungkin terlalu rendah.\nPemasangan mungkin akan gagal!",
-       "config-ctype": "<strong>Amaran keras:</strong> PHP mesti disusun dengan sokongan untuk [http://www.php.net/manual/en/ctype.installation.php sambungan Ctype].",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] dipasang",
        "config-apc": "[http://www.php.net/apc APC] dipasang",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] dipasang",
index f9044c3..84fb9a3 100644 (file)
        "config-no-db": "Nun se può truvà nu driver adatto p' 'o database! È necessario installare nu driver p' 'o PHP.\n{{PLURAL:$2|'O furmato suppurtato|'E furmate suppurtate}} 'e database ccà annanze: $1.\n\nSi cumpilate PHP autonomamente, riaccunciatevello attivando nu client database, p'esempio ausannoo <code>./configure --with-mysqli</code>.\nQuanno fosse installato PHP pe' bbìa 'e nu pacchetto Debian o Ubuntu, allora avite 'a installà pure 'o pacchetto <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Attenziò''': tenite 'o SQLite $1 pe' tramente ca ce vulesse 'a verziona $2, SQLite nun sarrà a disposizione.",
        "config-no-fts3": "'''Attenziò''': SQLite è cumpilato senza 'o [//sqlite.org/fts3.html modulo FTS3], 'e funziune 'e p'ascià dinto nun sarranno a disposizione ncopp'a stu backend.",
-       "config-mbstring": "<strong>Fatale: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] è attivo!'</strong>\nSt'opzione scassa 'e date 'e na manera scanusciuta.\nNun se può installà o ausà MediaWiki si nun se stuta st'opzione.",
-       "config-xml-bad": "'O modulo XML 'e PHP è mancante.\nA MediaWiki servessero 'e funziune prisente dint'a stu modulo e nun faticarrà c' 'a configurazione 'e mò.\nSi se sta eseguenno Mandrake, installare 'o pacco php-xml RPM.",
        "config-pcre-old": "<strong>Errore fatale:</strong> s'addimanna PCRE  $1 o succiessivo.\n'O file vuosto binario PHP è acucchiato c' 'o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Cchiù nfurmaziune].",
        "config-pcre-no-utf8": "<strong>Fatale:</strong> 'E module PCRE d' 'o PHP pare ca se so' compilate senza PCRE_UTF8 supporto.\nA MediaWiki serve nu supporto UTF-8 pe' putè funziunà apposto.",
        "config-memory-raised": "'O valore 'e PHP <code>memory_limit</code> è $1, aumentato a $2.",
        "config-memory-bad": "<strong>Attenziò:</strong> 'o valore 'e PHP <code>memory_limit</code> è $1.\nProbabbilmente troppo basso.\n'A installazione se putesse scassà!",
-       "config-ctype": "'''Errore''': 'o PHP s'adda ghienchere c' 'o supporto pe' l'[http://www.php.net/manual/it/ctype.installation.php estensione Ctype].",
-       "config-iconv": "<strong>Fatale:</strong> PHP s'adda ghienchere c' 'o supporto pe' l'[http://www.php.net/manual/en/iconv.installation.php estensione iconv].",
-       "config-json": "'''Errore:''' PHP è stato compilato senza 'o supporto pe' JSON. E' necessario installà l'estensione PHP pe' JSON o l'estensione [http://pecl.php.net/package/jsonc PECL jsonc] apprimm' 'e installà MediaWiki.\n* L'estensione PHP sta dint'a Red Hat Enterprise Linux (CentOS) 5 e 6, ma s'avess'abbià 'n <code>/etc/php.ini</code> o <code>/etc/php.d/json.ini</code>.\n* Cocche distribuzione 'e Linux pubblicata aropp'a majo 'e 2013 lèvano l'estensione PHP, e a pizzo sujo aúsano l'estensione PECL comme <code>php5-json</code> o <code>php-pecl-jsonc</code>",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] è installato",
        "config-apc": "[http://www.php.net/apc APC] è installato",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] è installato",
index 27faecb..29bbb71 100644 (file)
@@ -19,7 +19,7 @@
        "config-localsettings-badkey": "Oppgraderingsnøkkelen du oppga er feil.",
        "config-upgrade-key-missing": "En eksisterende installasjon av MediaWiki er funnet.\nFor å oppgradere denne installasjonen, vær vennlig å legge til følgende linje helt til slutt i din ''<code>LocalSettings.php</code>''-fil:\n\n$1",
        "config-localsettings-incomplete": "Den eksisterende ''<code>LocalSettings.php</code>'' ser ut til å være ufullstendig.\nVariabelen $1 har ingen verdi.\nVær vennlig å endre ''<code>LocalSettings.php</code>'' slik at variabelen får en verdi, og klikk ''{{int:Config-continue}}''.",
-       "config-localsettings-connection-error": "Det ble funnet en feil ved tilknytning av databasen med innstillingene i ''<code>LocalSettings.php</code>'' eller ''<code>AdminSettings.php</code>''. Vær vennlig å rette opp disse innstillingene og prøv igjen.\n\n$1",
+       "config-localsettings-connection-error": "Det ble funnet en feil ved tilknytning av databasen med innstillingene i ''<code>LocalSettings.php</code>'' eller ''<code>LocalSettings.php</code>''. Vær vennlig å rette opp disse innstillingene og prøv igjen.\n\n$1",
        "config-session-error": "Feil under oppstart av økt: $1",
        "config-session-expired": "Dine øktdata ser ut til å ha utløpt.\nØkter er konfigurert for en levetid på $1.\nDu kan øke dette ved å sette <code>session.gc_maxlifetime</code> i php.ini.\nStart installasjonsprosessen på nytt.",
        "config-no-session": "Dine øktdata ble tapt!\nSjekk din php.ini og sørg for at <code>session.save_path</code> er satt til en passende mappe.",
        "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-mysql</code>.\nOm du installerte PHP fra en Debian- eller Ubuntu-pakke, må du også installere for eksempel <code>php5-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-no-fts3": "'''Advarsel''': SQLite er kompilert uten [//sqlite.org/fts3.html FTS3-modulen], søkefunksjoner vil ikke være tilgjengelig på dette bakstykket.",
-       "config-mbstring": "'''Kritisk: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] er aktiv!'''\nDette alternativet fører til feil og kan ødelegge data på en uforutsigbar måte.\nDu kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
-       "config-xml-bad": "PHPs XML-modul mangler.\nMediaWiki krever funksjonene i denne modulen og vil ikke virke i denne konfigurasjonen.\nDu må kanskje laste ned php-xml RPM pakken.",
        "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.",
        "config-memory-raised": "PHPs <code>memory_limit</code> er $1, økt til $2.",
        "config-memory-bad": "'''Advarsel:''' PHPs <code>memory_limit</code> er $1.\nDette er sannsynligvis for lavt.\nInstallasjonen kan mislykkes!",
-       "config-ctype": "'''Fatal feil''': PHP må kompileres med støtte for [http://www.php.net/manual/en/ctype.installation.php Ctype-utvidelsen].",
-       "config-iconv": "<strong>Kritisk:</strong> PHP må kompileres med støtte for [http://www.php.net/manual/en/iconv.installation.php iconv-utvidelsen].",
-       "config-json": "'''Alvorlig:''' PHP ble kompilert uten JSON-støtte.\nDu må installere enten PHP JSON-utvidelsen eller [http://pecl.php.net/package/jsonc PECL jsonc]-utvidelsen før du installere MediaWiki.\n* PHP-utvidelsen inngår i Red Hat Enterprise Linux (CentOS) 5 and 6, men må aktiveres i <code>/etc/php.ini</code> eller <code>/etc/php.d/json.ini</code>.\n* Noen Linux-distribusjoner sluppet etter mai 2013 har ikke med PHP-utvidelsen, men har i stedet med PECL-utvidelsen <code>php5-json</code> eller <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] er innstallert",
        "config-apc": "[http://www.php.net/apc APC] er innstallert",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] er installert",
index d52a3bb..299b3b1 100644 (file)
@@ -20,8 +20,6 @@
        "config-unicode-update-warning": "'''Waarschuwing''': de geïnstalleerde versie van de Unicodenormalisatiewrapper maakt gebruik van een oudere versie van [http://site.icu-project.org/ de bibliotheek van het ICU-project].\nJe moet [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations bijwerken] als Unicode voor jou van belang is.",
        "config-no-db": "Het was niet mogelijk een geschikte databasedriver te vinden voor PHP.\nJe moet een databasedriver installeren voor PHP.\nDe volgende databases worden ondersteund: $1.\n\nAls je op een gedeelde omgeving zit, vraag dan aan je hostingprovider een geschikte databasedriver te installeren.\nAls je PHP zelf hebt gecompileerd, wijzig dan je instellingen zodat een databasedriver wordt geactiveerd, bijvoorbeeld via <code>./configure --with-mysql</code>.\nAls je PHP hebt geïnstalleerd via een Debian- of Ubuntu-package, installeer dan ook de module php5-mysql.",
        "config-outdated-sqlite": "''' Waarschuwing:''' je gebruikt SQLite $1. SQLite is niet beschikbaar omdat de minimaal vereiste versie $2 is.",
-       "config-mbstring": "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is actief!'''\nDeze instelling zorgt voor gegevenscorruptie.\nJe kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
-       "config-xml-bad": "De XML-module van PHP ontbreekt.\nMediaWiki heeft de functies van deze module nodig en werkt niet zonder deze module.\nAls je gebruik maakt van Mandrake, installeer dan het package php-xml.",
        "config-mod-security": "'''Waarschuwing:''' je webserver heeft de module [http://modsecurity.org/ mod_security] ingeschakeld. Als deze onjuist is ingesteld, kan dit problemen geven in combinatie met MediaWiki of andere software die gebruikers in staat stelt willekeurige inhoud te posten.\nLees de [http://modsecurity.org/documentation/ documentatie over mod_security] of neem contact op met de helpdesk van je provider als je tegen problemen aanloopt.",
        "config-imagemagick": "ImageMagick aangetroffen: <code>$1</code>.\nHet aanmaken van miniaturen van afbeeldingen wordt ingeschakeld als je uploaden inschakelt.",
        "config-gd": "Ingebouwde GD grafische bibliotheek aangetroffen.\nHet aanmaken van miniaturen van afbeeldingen wordt ingeschakeld als je uploaden inschakelt.",
index 32893c6..78649ce 100644 (file)
        "config-no-db": "Het was niet mogelijk een geschikte databasedriver te vinden voor PHP! U moet een databasedriver installeren voor PHP.\n{{PLURAL:$2|Het volgende databasetype wordt|De volgende databasetypes worden}} ondersteund: $1.\n\nAls u PHP zelf hebt gecompileerd, wijzig dan uw instellingen zodat een databasedriver wordt geactiveerd, bijvoorbeeld via <code>./configure --with-mysqli</code>.\nAls u PHP hebt geïnstalleerd via een Debian- of Ubuntu-package, installeer dan ook bijvoorbeeld de module <code>php5-mysql</code>.",
        "config-outdated-sqlite": "''' Waarschuwing:''' u gebruikt SQLite $1. SQLite is niet beschikbaar omdat de minimaal vereiste versie $2 is.",
        "config-no-fts3": "<strong>Waarschuwing:</strong> SQLite is gecompileerd zonder de module [//sqlite.org/fts3.html FTS3]; zoekfuncties zijn niet beschikbaar.",
-       "config-mbstring": "<strong>Onherstelbare fout: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is actief!</strong>\nDeze instelling zorgt voor onvoorspelbare gegevenscorruptie.\nU kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
-       "config-xml-bad": "De XML-module van PHP ontbreekt.\nMediaWiki vereist functies in deze module en werkt niet in deze configuratie.\nMogelijk moet u het RPM-pakket php-xml installeren.",
        "config-pcre-old": "'''Onherstelbare fout:''' PCRE $1 of een latere versie is vereist.\nUw uitvoerbare versie van PHP is gekoppeld met PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Meer informatie].",
        "config-pcre-no-utf8": "'''Fataal:''' de module PRCE van PHP lijkt te zijn gecompileerd zonder ondersteuning voor PCRE_UTF8.\nMediaWiki heeft ondersteuning voor UTF-8 nodig om correct te kunnen werken.",
        "config-memory-raised": "PHP's <code>memory_limit</code> is $1 en is verhoogd tot $2.",
        "config-memory-bad": "'''Waarschuwing:''' PHP's <code>memory_limit</code> is $1.\nDit is waarschijnlijk te laag.\nDe installatie kan mislukken!",
-       "config-ctype": "'''Fataal:''' PHP moet gecompileerd zijn met ondersteuning voor de [http://www.php.net/manual/en/ctype.installation.php extensie Ctype].",
-       "config-iconv": "<strong>Onherstelbare fout:</strong> PHP moet gecompileerd zijn met ondersteuning voor de [http://www.php.net/manual/en/iconv.installation.php uitbreiding iconv].",
-       "config-json": "<strong>Fatale fout:</strong> PHP is gecompileerd zonder ondersteuning voor JSON.\nU moet de PHP-extensie JSON installeren of de extensie [http://pecl.php.net/package/jsonc PECL jsonc] voordat u MediaWiki installeert.\n* De PHP-extensie is beschikbaar in Red Hat Enterprise Linux (CentOS) 5 en 6, maar moet ingeschakeld worden <code>/etc/php.ini</code> or <code>/etc/php.d/json.ini</code>.\n* Sommige Linuxdistributies die zijn uitgebracht na mei 2013 hebben de PHP-extensie niet, maar hebben een package voor de PECL-extensie als <code>php5-json</code> of <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] is op dit moment geïnstalleerd",
        "config-apc": "[http://www.php.net/apc APC] is op dit moment geïnstalleerd",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] is op dit moment geïnstalleerd",
        "config-install-mainpage": "Hoofdpagina aanmaken met standaard inhoud",
        "config-install-extension-tables": "Tabellen voor ingeschakelde uitbreidingen worden aangemaakt",
        "config-install-mainpage-failed": "Het was niet mogelijk de hoofdpagina in te voegen: $1",
-       "config-install-done": "<strong>Gefeliciteerd!</strong>\nU hebt MediaWiki met geïnstalleerd.\n\nHet installatieprogramma heeft het bestand <code>LocalSettings.php</code> aangemaakt.\nDit bevat al uw instellingen.\n\nU moet het bestand downloaden en in de hoofdmap van uw wiki-installatie plaatsten, in dezelfde map als index.php.\nDe download moet u automatisch zijn aangeboden.\n\nAls de download niet is aangeboden of als u de download hebt geannuleerd, dan kunt u de download opnieuw starten door op de onderstaande koppeling te klikken:\n\n$3\n\n<strong>Let op:</strong> als u dit niet nu doet, dan is het bestand als u later de installatieprocedure afsluit zonder het bestand te downloaden niet meer beschikbaar.\n\nNa het plaatsen van het bestand met instellingen kunt u <strong>[$2 uw wiki gebruiken]</strong>.",
+       "config-install-done": "<strong>Gefeliciteerd!</strong>\nU hebt MediaWiki geïnstalleerd.\n\nHet installatieprogramma heeft het bestand <code>LocalSettings.php</code> aangemaakt.\nDit bevat al uw instellingen.\n\nU moet het bestand downloaden en in de hoofdmap van uw wiki-installatie plaatsten, in dezelfde map als index.php.\nDe download moet u automatisch zijn aangeboden.\n\nAls de download niet is aangeboden of als u de download hebt geannuleerd, dan kunt u de download opnieuw starten door op de onderstaande koppeling te klikken:\n\n$3\n\n<strong>Let op:</strong> als u dit niet nu doet, dan is het bestand als u later de installatieprocedure afsluit zonder het bestand te downloaden niet meer beschikbaar.\n\nNa het plaatsen van het bestand met instellingen kunt u <strong>[$2 uw wiki gebruiken]</strong>.",
        "config-download-localsettings": "<code>LocalSettings.php</code> downloaden",
        "config-help": "hulp",
        "config-help-tooltip": "klik om uit te vouwen",
index ad6b526..e332690 100644 (file)
@@ -11,7 +11,7 @@
        "config-information": "Informacions",
        "config-localsettings-key": "Clau de mesa a jorn :",
        "config-localsettings-badkey": "La clau de mesa a jorn qu'avètz provesida es incorrècta",
-       "config-session-error": "Error al moment de l'aviada de la sesilha : $1",
+       "config-session-error": "Error al moment de l'aviada de la session : $1",
        "config-your-language": "Vòstra lenga :",
        "config-your-language-help": "Seleccionatz la lenga d'utilizar pendent lo processus d'installacion.",
        "config-wiki-language": "Lenga del wiki :",
        "config-extensions": "Extensions",
        "config-skins": "Abilhatges",
        "config-skins-use-as-default": "Utilizar aqueste abilhatge per defaut",
+       "config-skins-must-enable-some": "Vos cal seleccionar almens un tèma per activar.",
        "config-install-step-done": "fait",
        "config-install-step-failed": "fracàs",
        "config-install-extensions": "Inclusion de las extensions",
        "config-download-localsettings": "Telecargar <code>LocalSettings.php</code>",
        "config-help": "ajuda",
        "config-help-tooltip": "clicar per agrandir",
-       "mainpagetext": "'''MediaWiki es estat installat amb succès.'''",
+       "mainpagetext": "<strong>MediaWiki es estat installat amb succès.<strong>",
        "mainpagedocfooter": "Consultatz lo [https://meta.wikimedia.org/wiki/Help:Contents/fr Guida de l'utilizaire] per mai d'entresenhas sus l'utilizacion d'aqueste logicial de wiki.\n\n== Per començar ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista dels paramètres de configuracion]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/oc FAQ MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussions de las distribucions de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Adaptatz MediaWiki dins vòstra lenga]"
 }
index b705c85..423926b 100644 (file)
        "config-no-db": "Nie można odnaleźć właściwego sterownika bazy danych! Musisz zainstalować sterownik bazy danych dla PHP.\nMożna użyć {{PLURAL:$2|następującego typu bazy|następujących typów baz} danych: $1.\n\nJeśli skompilowałeś PHP samodzielnie, skonfiguruj je ponownie z włączonym klientem bazy danych, na przykład za pomocą polecenia <code>./configure --with-mysqli</code>.\nJeśli zainstalowałeś PHP jako pakiet Debiana lub Ubuntu, musisz również zainstalować np. moduł <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Ostrzeżenie''': masz SQLite  $1, która jest niższa od minimalnej wymaganej wersji  $2 . SQLite będzie niedostępne.",
        "config-no-fts3": "'''Uwaga''' – SQLite został skompilowany bez [//sqlite.org/fts3.html modułu FTS3] – funkcje wyszukiwania nie będą dostępne.",
-       "config-mbstring": "'''Błąd krytyczny – włączono [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]!'''\nTa opcja powoduje błędy i może wywołać nieprzewidywalne uszkodzenia wprowadzanych danych.\nZainstalować lub korzystać z MediaWiki można pod warunkiem, że ta opcja jest wyłączona.",
-       "config-xml-bad": "Brak modułu XML dla PHP.\nMediaWiki wymaga funkcji z tego modułu i nie może działać w tej konfiguracji.\nZainstaluj pakiet RPM php-xml.",
        "config-pcre-old": "<strong>Błąd krytyczny:</strong> Wymagany jest PCRE w wersji $1 lub nowszej.\nTwój plik wykonywalny PHP jest powiązany z wersją PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Więcej informacji].",
        "config-pcre-no-utf8": "'''Błąd krytyczny''' – wydaje się, że moduł PCRE w PHP został skompilowany bez wsparcia dla UTF‐8.\nMediaWiki wymaga wsparcia dla UTF‐8 do prawidłowego działania.",
        "config-memory-raised": "PHP <code>memory_limit</code> było ustawione na $1, zostanie zwiększone do $2.",
        "config-memory-bad": "'''Uwaga:''' PHP <code>memory_limit</code> jest ustawione na $1.\nTo jest prawdopodobnie zbyt mało.\nInstalacja może się nie udać!",
-       "config-ctype": "''' Krytyczny ''': PHP musi być skompilowany z obsługą [http://www.php.net/manual/en/ctype.installation.php rozszerzenia Ctype].",
-       "config-iconv": "<strong>Błąd krytyczny:</strong> PHP musi być skompilowane z obsługą [http://www.php.net/manual/en/iconv.installation.php rozszerzenia iconv].",
-       "config-json": "'''Błąd krytyczny:''' PHP skompilowano bez obsługa JSON.\nPrzed zainstalowaniem oprogramowania MediaWiki musisz zainstalować rozszerzenie PHP JSON albo rozszerzenie [http://pecl.php.net/package/jsonc PECL jsonc].\n* Rozszerzenie PHP jest zawarte w Red Hat Enterprise Linux (CentOS) 5 i 6, jednak musi zostać włączone w <code>/etc/php.ini</code> or <code>/etc/php.d/json.ini</code>.\n* Niektóre dystrybucje Linuksa, wydane po maju 2013, nie używają rozszerzenia PHP, lecz rozszerzenie PECL, jako <code>php5-json</code> lub <code>php-pecl-jsonc</code>.",
-       "config-mbstring-absent": "<strong>Błąd krytyczny:</strong> PHP musi być skompilowany z obsługą [http://www.php.net/manual/en/mbstring.setup.php rozszerzenia mbstring].",
        "config-xcache": "[Http://trac.lighttpd.net/xcache/ XCache] jest zainstalowany",
        "config-apc": "[Http://www.php.net/apc APC] jest zainstalowany",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] jest zainstalowany",
        "config-sqlite-readonly": "Plik <code>$1</code> nie jest zapisywalny.",
        "config-sqlite-cant-create-db": "Nie można utworzyć pliku bazy danych <code>$1</code>.",
        "config-sqlite-fts3-downgrade": "Brak wsparcia FTS3 dla PHP. Tabele zostały cofnięte",
-       "config-can-upgrade": "W bazie danych są już tabele MediaWiki.\nAby uaktualnić je do MediaWiki $1, kliknij '''Dalej'''.",
+       "config-can-upgrade": "W bazie danych są już tabele MediaWiki.\nAby uaktualnić je do MediaWiki $1, kliknij <strong>Dalej</strong>.",
        "config-upgrade-done": "Uaktualnienie kompletne.\n\nMożna teraz [$1 rozpocząć korzystanie z wiki].\n\nJeśli chcesz ponownie wygenerować plik <code>LocalSettings.php</code>, kliknij przycisk poniżej.\nJest to <strong>niezalecane</strong>, chyba że występują problemy z twoją wiki.",
        "config-upgrade-done-no-regenerate": "Aktualizacja zakończona.\n\nMożesz teraz [$1 zacząć korzystać ze swojej wiki].",
        "config-regenerate": "Ponowne generowanie LocalSettings.php →",
        "config-profile-no-anon": "Wymagane utworzenie konta",
        "config-profile-fishbowl": "Wyłącznie zatwierdzeni edytorzy",
        "config-profile-private": "Prywatna wiki",
-       "config-profile-help": "Strony typu wiki działają najlepiej, gdy umożliwisz ich edytować jak największej liczbie osób.\nW MediaWiki można łatwo sprawdzić ostatnie zmiany i wycofać szkody, spowodowane przez naiwnych lub złośliwych użytkowników.\n\nJednakże wielu uznało że MediaWiki jest użyteczne w różnych sytuacjach, ale czasami nie jest łatwo przekonać wszystkich do korzyści ze sposobu działania wiki. Masz więc wybór.\n\nUstawienie <strong>{{int:config-profile-wiki}}</strong> pozwala każdemu na edycję, nawet bez logowania się.\nWiki z  <strong>{{int:config-profile-no-anon}}</strong> zawiera dodatkowe możliwości, ale może zniechęcić przypadkowych edytorów.\n\nScenariusz <strong>{{int:config-profile-fishbowl}}</strong> umożliwia zatwierdzonym użytkownikom edycję, ale wyświetlanie stron jest powszechnie dostępne, włącznie z historią.\nUstawienie '''{{int:config-profile-private}}'' ' pozwala na wyświetlanie stron tylko zatwierdzonym użytkownikom, ta sama grupa może je edytować.\n\nBardziej skomplikowane konfiguracje uprawnień użytkowników są dostępne po zakończeniu instalacji, zobacz [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights odpowiednią część podręcznika].",
+       "config-profile-help": "Strony typu wiki działają najlepiej, gdy umożliwisz ich edytowanie jak największej liczbie osób.\nW MediaWiki można łatwo sprawdzić ostatnie zmiany i wycofać szkody, spowodowane przez naiwnych lub złośliwych użytkowników.\n\nPomimo, że wielu uznało MediaWiki jako przydatne do wielu zadań, nie jest łatwo przekonać wszystkich do korzyści ze sposobu działania wiki. Masz więc wybór.\n\nUstawienie <strong>{{int:config-profile-wiki}}</strong> pozwala każdemu na edycję, nawet bez logowania się.\nWiki z <strong>{{int:config-profile-no-anon}}</strong> dostarcza szersze możliwości związane z podziałem kont użytkowników, ale może zniechęcić okazjonalnych redaktorów.\n\nScenariusz <strong>{{int:config-profile-fishbowl}}</strong> umożliwia zatwierdzonym użytkownikom edycję, ale wyświetlanie stron jest powszechnie dostępne, włącznie z historią.\nUstawienie <strong>{{int:config-profile-private}}</strong> pozwala na wyświetlanie stron tylko zatwierdzonym użytkownikom, ta sama grupa może je edytować.\n\nBardziej złożone konfiguracje uprawnień użytkowników są dostępne po zakończeniu instalacji, zobacz [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights odpowiednią część podręcznika].",
        "config-license": "Prawa autorskie i licencja:",
        "config-license-none": "Brak stopki z licencją",
        "config-license-cc-by-sa": "Creative Commons – za uznaniem autora, na tych samych zasadach",
        "config-install-pg-plpgsql": "Sprawdzanie języka PL/pgSQL",
        "config-pg-no-plpgsql": "Musisz zainstalować język PL/pgSQL w bazie danych $1",
        "config-pg-no-create-privs": "Konto, które zostało określone dla instalacji nie ma wystarczających uprawnień, aby utworzyć konto.",
-       "config-pg-not-in-role": "Konto określone dla użytkownika sieci już istnieje.\nKonto określone dla instalacji nie ma uprawnień administratora ani nie jest przynależy do roli użytkownika sieci web, więc nie można utworzyć obiektów stanowiących własność użytkownika sieci.\n\nMediaWiki wymaga obecnie, by tabele były własnością konta zwykłego użytkownika. Podaj inną nazwę konta użytkownika, lub kliknij przycisk \"Wstecz\" i podaj nazwę konta użytkownika instalatora, które posiada odpowiednie uprawnienia.",
+       "config-pg-not-in-role": "Konto określone dla użytkownika sieci już istnieje.\nKonto określone dla instalacji nie ma uprawnień administratora, ani nie jest przynależy do roli użytkownika sieci web, więc nie można utworzyć obiektów stanowiących własność użytkownika sieci.\n\nMediaWiki obecnie wymaga, aby tabele były własnością konta zwykłego użytkownika. Podaj inną nazwę konta użytkownika albo kliknij przycisk „Wstecz” i podaj nazwę konta użytkownika instalatora, które posiada odpowiednie uprawnienia.",
        "config-install-user": "Tworzenie użytkownika bazy danych",
        "config-install-user-alreadyexists": "Konto użytkownika „$1” już istnieje",
        "config-install-user-create-failed": "Tworzenie użytkownika \"$1\" nie powiodło się: $2",
        "config-install-extension-tables": "Tworzenie tabel dla aktywnych rozszerzeń",
        "config-install-mainpage-failed": "Nie udało się wstawić strony głównej: $1",
        "config-install-done": "<strong>'''Gratulacje!</strong>\nUdało Ci się zainstalować MediaWiki.\n\nInstalator wygenerował plik konfiguracyjny <code>LocalSettings.php</code>.\n\nMusisz go pobrać i umieścić w katalogu głównym Twojej instalacji wiki (tym samym katalogu co index.php). Pobieranie powinno zacząć się automatycznie.\n\nJeżeli pobieranie nie zostało zaproponowane lub jeśli użytkownik je anulował, można ponownie uruchomić pobranie klikając poniższe łącze:\n\n$3\n\n<strong>Uwaga</strong>: Jeśli nie zrobisz tego teraz, wygenerowany plik konfiguracyjny nie będzie już dostępny po zakończeniu instalacji.\n\nPo załadowaniu pliku konfiguracyjnego możesz <strong>[$2 wejść na wiki]</strong>.",
+       "config-install-done-path": "<strong>Gratulacje!</strong>\nZainstalowałeś właśnie MediaWiki.\n\nInstalator wygenerował plik <code>LocalSettings.php</code>.\nZawiera całą Twoją konfigurację.\n\nMusisz go pobrać i umieścić w <code>$4</code>. Pobieranie powinno rozpocząć się automatycznie.\n\nJeżeli nie pojawiła się informacja o pobieraniu lub jeżeli ja anulowałeś, kliknij poniższy link:\n\n$3\n\n<strong>Uwaga:</strong> Jeżeli nie zrobisz tego teraz, wygenerowany plik konfiguracyjny nie będzie potem dostępny, jeżeli wyjdziesz z instalacji bez jego pobrania.\n\nGdy to będzie zrobione, możesz <strong>[$2 wejść na swoją wiki]</strong>.",
        "config-download-localsettings": "Pobierz <code>LocalSettings.php</code>",
        "config-help": "pomoc",
        "config-help-tooltip": "kliknij, aby rozwinąć",
index 07ec8d9..0747672 100644 (file)
        "config-no-db": "Impossìbil trové un pilòta ëd base ëd dàit bon! A dev instalé un pilòta ëd base ëd dàit për PHP.\n{{PLURAL:$2|La sòrt ëd base ëd dàit mantnùa a l'é costa|Le sòrt ëd base ëd dàit mantùe a son coste}} sì-dapress: $1.\n\nS'a l'é compilasse PHP chiel-midem, ch'a lo configura torna con un client ëd base ëd dàit abilità, për esempi an dovrand <code>./configure --with-mysql</code>.\nS'a l'ha instalà PHP dai pachèt Debian o Ubuntu, antlora a dev ëdcò anstalé, për esempi, ël mòdul <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Avis''': chiel a l'ha SQLite $1, che a l'é pi vej che la version mìnima dont a-i é damanca $2. SQLite a sarà pa disponìbil.",
        "config-no-fts3": "'''Avis''': SQLite a l'é compilà sensa ël mòdul [//sqlite.org/fts3.html FTS3], le funsion d'arserca a saran pa disponìbij su cost motor.",
-       "config-mbstring": "'''Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] a l'é ativ!'''\nCosta opsion a càusa d'eror e a peul danegié ij dat d'intrada an manera pa prevedìbil.\nA peul pa instalé o dovré MediaWiki se st'opsion a l'é pa disabilità.",
-       "config-xml-bad": "Ël mòdol XML ed PHP a l'é mancant.\nMediaWiki a l'ha da manca dle funsion ant ës mòdul e a marcërà pa an costa configurassion.\nA dev instalé ël pachet php-xml RPM.",
        "config-pcre-no-utf8": "'''Fatal''': ël mòdul PCRE ëd PHP a smija esse compilà sensa l'apògg PCRE_UTF8.\nMediaWiki a ciama l'apògg d'UTF8 për marcé për da bin.",
        "config-memory-raised": "<code>memory_limit</code> ëd PHP a l'é $1, aussà a $2.",
        "config-memory-bad": "'''Avis:''' <code>memory_limit</code> ëd PHP a l'é $1.\nSossì a l'é probabilment tròp bass.\nL'instalassion a peul falì!",
-       "config-ctype": "'''Fatal''': PHP a dev esse compilà con l'apògg për l'[http://www.php.net/manual/en/ctype.installation.php extension Ctype].",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] a l'é instalà",
        "config-apc": "[http://www.php.net/apc APC] a l'é instalà",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache]  a l'é instalà",
@@ -78,7 +75,7 @@
        "config-using-uri": "Utilisassion ëd l'anliura ëd servent «<nowiki>$1$2</nowiki>».",
        "config-uploads-not-safe": "'''Avis:''' Sò dossié stàndard për carié <code>$1</code> a l'é vulneràbil a l'esecussion ëd qualsëssìa senari.\nBele che MediaWiki a contròla j'aspet ëd sicurëssa ëd tùit j'archivi carià, a l'é motobin arcomandà ëd [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security saré ës përtus ëd sicurëssa] prima d'abilité ij cariament.",
        "config-no-cli-uploads-check": "'''Avis:''' Toa cartela predefinìa për j-amportassion (<code>$1</code>) a l'é nen controlà a propòsit ëd la vulnerabilità\nd'esecussion ëd senari arbitrari durant l'istalassion CLI.",
-       "config-brokenlibxml": "Sò sistema a l'ha na combinassion ëd version PHP e libxml2 che a l'ha dij bigat e a peul provoché la corussion ëd dat ëstërmà an MediaWiki e d'àutre aplicassion për l'aragnà.\nCh'a agiorna a PHP 5.2.9 o pi neuv e libxml2 2.7.3 o pi neuv ([https://bugs.php.net/bug.php?id=45996 bug filed with PHP]).\nIstalassion abortìa.",
+       "config-brokenlibxml": "Sò sistema a l'ha na combinassion ëd version PHP e libxml2 che a l'ha dij bigat e a peul provoché la corussion ëd dat ëstërmà an MediaWiki e d'àutre aplicassion për l'aragnà.\nCh'a agiorna a PHP 5.2.9 o pi neuv e libxml2 2.7.3 o pi neuv ([https://bugs.php.net/bug.php?id=45996 bigat archivià con PHP]).\nAnstalassion abortìa.",
        "config-suhosin-max-value-length": "Suhosin a l'é instalà e a lìmita la longheur dël paràmetr GET a $1 byte. Ël component ResourceLoader ëd MediaWiki a travajerà an rispetand ës lìmit, ma sòn a degraderà le prestassion. Se possìbil, a dovrìa amposté suhosin.get.max_value_lenght a 1024 o pi àut an <code>php.ini</code>, e amposté <code>$wgResourceLoaderMaxQueryLength</code> al midem valor an LocalSettings.php .",
        "config-db-type": "Sòrt ëd base ëd dàit:",
        "config-db-host": "Ospitant ëd la base ëd dàit:",
        "config-profile-no-anon": "A venta creé un cont",
        "config-profile-fishbowl": "Mach editor autorisà",
        "config-profile-private": "Wiki privà",
-       "config-profile-help": "Le wiki a marcio mej quand ch'a lassa che pì përsone possìbij a-j modìfico.\nAn MediaWiki, a l'é bel fé revisioné j'ùltime modìfiche, e buté andré qualsëssìa dann che a sia fàit da dj'utent noviss o malissios.\n\nAn tùit ij cas, an tanti a l'han trovà che MediaWiki a sia ùtil ant na gran varietà ëd manere, e dle vire a l'é pa bel fé convince cheidun dij vantagi dla wiki.\nParèj a l'ha doe possibilità.\n\nËl model '''{{int:config-profile-wiki}}''' a përmët a chicassìa ëd modifiché, bele sensa intré ant ël sistema.\nNa wiki con  '''{{int:config-profile-no-anon}}''' a dà pì 'd contròl, ma a peul slontané dij contributor ocasionaj.\n\nËl senari '''{{int:config-profile-fishbowl}}''' a përmët a j'utent aprovà ëd modifiché, ma ël pùblich a peul vëdde le pàgine, comprèisa la stòria.\nUn '''{{int:config-profile-private}}''' a përmët mach a j'utent aprovà ëd vëdde le pàgine, con la midema partìa ch'a peul modifiché.\n\nConfigurassion ëd drit d'utent pi complicà a son disponìbij apress l'instalassion, vëdde la [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights pàgina a pòsta dël manual].",
+       "config-profile-help": "Le wiki a marcio mej quand ch'a lassa che pì përsone possìbij a-j modìfico.\nAn MediaWiki, a l'é bel fé revisioné j'ùltime modìfiche, e buté andré qualsëssìa dann che a sia fàit da dj'utent noviss o malissios.\n\nAn tùit ij cas, an tanti a l'han trovà che MediaWiki a sia ùtil ant na gran varietà ëd manere, e dle vire a l'é pa bel fé convince cheidun dij vantagi dla wiki.\nParèj a l'ha doe possibilità.\n\nËl model '''{{int:config-profile-wiki}}''' a përmët a chicassìa ëd modifiché, bele sensa intré ant ël sistema.\nNa wiki con  '''{{int:config-profile-no-anon}}''' a dà pì 'd contròl, ma a peul slontané dij contributor ocasionaj.\n\nËl senari '''{{int:config-profile-fishbowl}}''' a përmët a j'utent aprovà ëd modifiché, ma ël pùblich a peul vëdde le pàgine, comprèisa la stòria.\nNa '''{{int:config-profile-private}}''' a përmët mach a j'utent aprovà ëd vëdde le pàgine, con la midema partìa ch'a peul modifiché.\n\nConfigurassion ëd drit d'utent pi complicà a son disponìbij apress l'instalassion, vëdde la [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights pàgina a pòsta dël manual].",
        "config-license": "Drit d'autor e licensa",
        "config-license-none": "Gnun-a licensa an nòta an bass",
        "config-license-cc-by-sa": "Creative Commons atribussion an part uguaj",
        "config-help": "agiut",
        "config-nofile": "L'archivi «$1» as treuva nen. A l'é stàit ëscancelà?",
        "mainpagetext": "'''MediaWiki a l'é staita anstalà a la përfession.'''",
-       "mainpagedocfooter": "Che a varda la [https://meta.wikimedia.org/wiki/Help:Contents User's Guide] për avèj dj'anformassion ant sël coma dovré ël programa dla wiki.\n\n== Për anandiesse a travajé ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista dij paràmeter ëd configurassion]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki Chestion frequente]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista ëd discussion an sla distribussion ëd MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localisa MediaWiki për toa lenga]"
+       "mainpagedocfooter": "Che a varda la [https://meta.wikimedia.org/wiki/Help:Contents User's Guide] për avèj dj'anformassion ant sël coma dovré ël programa dla wiki.\n\n== Për anandiesse a travajé ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista dij paràmeter ëd configurassion]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Chestion frequente su MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista ëd discussion an sla distribussion ëd MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Ch'a localisa MediaWiki për toa lenga]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Amprende coma combate contra la rumenta su soa wiki]"
 }
index c78bd2d..8cf22e2 100644 (file)
        "config-no-db": "Não foi possível encontrar um driver apropriado para a banco de dados! Você precisa instalar um driver de banco de dados para PHP. {{PLURAL:$2|É aceite o seguinte tipo|São aceites os seguintes tipos}} de banco de dados: $1.\n\nSe compilou o PHP você mesmo, reconfigure-o com um cliente de banco de dados ativado, por exemplo, usando <code>./configure --with-mysqli</code>.\nSe instalou o PHP a partir de um pacote Debian ou Ubuntu, então também precisa instalar, por exemplo, o pacote <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Aviso:</strong> você tem o SQLite versão $1, que é menor do que a versão mínima necessária $2. O SQLite não estará disponível.",
        "config-no-fts3": "<strong>Aviso</strong> O SQLite foi compilado sem o [//sqlite.org/fts3.html módulo FTS3], as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
-       "config-mbstring": "<strong>Erro fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está ativada!</strong>\nEsta opção causa erros e pode corromper os dados de forma imprevisível.\nVocê não pode instalar ou utilizar o MediaWiki a menos que esta opção seja desativada.",
-       "config-xml-bad": "Falta o módulo XML do PHP.\nO MediaWiki necessita de funções deste módulo e não funcionará com esta configuração.\nPode precisar de instalar o pacote RPM chamado php-xml.",
        "config-pcre-old": "<strong>Erro fatal:</strong> É necessário o PCRE $1 ou versão posterior.\nO binário do seu PHP foi vinculado com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].",
        "config-pcre-no-utf8": "<strong>Erro fatal:</strong> O módulo PCRE do PHP parece ser compilado sem suporte a PCRE_UTF8.\nO MediaWiki requer suporte a 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.\nIsso provavelmente é muito baixo.\nA instalação pode falhar!",
-       "config-ctype": "<strong>Erro fatal:</strong> O PHP deve ser compilado com suporte para a [http://www.php.net/manual/en/ctype.installation.php extensão Ctype].",
-       "config-iconv": "<strong>Fatal:</strong> O PHP deve ser compilado com suporte para a [http://www.php.net/manual/en/iconv.installation.php extensão iconv].",
-       "config-json": "<strong>Erro fatal:</strong> O PHP foi compilado sem suporte a JSON.\nVocê deve instalar a extensão PHP JSON ou a extensão [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar o MediaWiki.\n* A extensão JSON do PHP já está incluída no Red Hat Enterprise Linux (CentOS) 5 e 6, mas deve ser habilitado no <code>/etc/php.ini</code> ou no <code>/etc/php.d/json.ini</code>.\n* Algumas distribuições Linux lançadas após maio de 2013 omitem a extensão PHP, oferecendo em seu lugar a extensão PECL como parte do pacote <code>php5-json</code> ou do <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] está instalado",
        "config-apc": "[http://www.php.net/apc APC] está instalado",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] está instalado",
index 819e0f8..49f242a 100644 (file)
        "config-no-db": "Não foi possível encontrar um controlador apropriado da base de dados! Precisa de instalar um controlador da base de dados para o PHP. {{PLURAL:$2|É aceite o seguinte tipo|São aceites os seguintes tipos}} de base de dados: $1.\n\nSe fez a compilação do PHP, reconfigure-o com um cliente de base de dados ativado; por exemplo, usando <code>./configure --with-mysql</code>.\nSe instalou o PHP a partir de um pacote Debian ou Ubuntu, então precisa de instalar também, por exemplo, o pacote <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Aviso''': Tem a versão $1 do SQLite, que é anterior à versão mínima necessária, a $2. O SQLite não estará disponível.",
        "config-no-fts3": "'''Aviso''': O SQLite foi compilado sem o módulo [//sqlite.org/fts3.html FTS3]; as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
-       "config-mbstring": "'''Erro fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está ativa!'''\nEsta opção causa erros e pode corromper os dados de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
-       "config-xml-bad": "Falta o módulo XML do PHP.\nO MediaWiki necessita de funções deste módulo e não funcionará com esta configuração.\nPode precisar de instalar o pacote RPM chamado php-xml.",
        "config-pcre-old": "<strong>Erro fatal:</strong> É necessário o PCRE $1 ou versão posterior.\nO <i>link</i> do seu binário PHP foi feito 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": "'''Aviso:''' A configuração <code>memory_limit</code> do PHP é $1.\nIsto é provavelmente demasiado baixo.\nA instalação poderá falhar!",
-       "config-ctype": "'''Erro fatal''': O PHP tem de ser compilado com suporte para a [http://www.php.net/manual/en/ctype.installation.php extensão Ctype].",
-       "config-iconv": "<strong>Erro fatal:</strong> O PHP deve ser compilado com suporte à [http://www.php.net/manual/en/iconv.installation.php extensão iconv].",
-       "config-json": "<strong>Erro fatal:</strong> O PHP foi compilado sem suporte de JSON.\nTem de instalar a extensão JSON do PHP (incluída no PHP 5.2 ou posterior) ou a extensão [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar o MediaWiki.\n* A extensão JSON do PHP está incluída nas distribuções 5 e 6 do Red Hat Enterprise Linux (CentOS), mas tem de estar ativa nos ficheiros <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.\n* Algumas distribuições do Linux posteriores a maio de 2013 omitem a extensão JSON do PHP e substituem-na pela extensão PECL chamando-lhe <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] instalada",
        "config-apc": "[http://www.php.net/apc APC] instalada",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] instalada",
        "config-email-sender-help": "Introduza o endereço de correio electrónico que será usado como endereço de retorno nas mensagens electrónicas de saída.\nÉ para este endereço que serão enviadas as mensagens que não podem ser entregues.\nMuitos servidores de correio electrónico exigem que pelo menos a parte do nome do domínio seja válida. \\",
        "config-upload-settings": "Carregamento de imagens e ficheiros",
        "config-upload-enable": "Possibilitar o carregamento de ficheiros",
-       "config-upload-help": "O carregamento de ficheiros expõe o seu servidor a riscos de segurança.\nPara mais informações, leia a [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security seção sobre segurança] do Manual Técnico.\n\nPara permitir o carregamento de ficheiros, altere as permissões do subdiretório <code>images</code> no diretório de raiz do MediaWiki para que o servidor de internet possa escrever nele.\nDepois ative esta opção.",
+       "config-upload-help": "O carregamento de ficheiros expõe o seu servidor a riscos de segurança.\nPara mais informações, leia a [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security secção sobre segurança] do Manual Técnico.\n\nPara permitir o carregamento de ficheiros, altere as permissões do subdiretório <code>images</code> no diretório de raiz do MediaWiki para que o servidor de Internet possa escrever nele.\nDepois ative esta opção.",
        "config-upload-deleted": "Diretório para os ficheiros apagados:",
        "config-upload-deleted-help": "Escolha um diretório onde serão arquivados os ficheiros apagados.\nO ideal é que este diretório não possa ser diretamente acedido a partir da internet.",
        "config-logo": "URL do logótipo:",
        "config-logo-help": "O tema padrão do MediaWiki inclui espaço para um logótipo de 135x160 pixels acima do menu da barra lateral.\nColoque na wiki uma imagem com estas dimensões e introduza aqui a URL dessa imagem.\n\nSe não pretende usar um logótipo, deixe este campo em branco.",
        "config-instantcommons": "Ativar Instant Commons",
-       "config-instantcommons-help": "O [https://www.mediawiki.org/wiki/InstantCommons Instant Commons] é uma funcionalidade que permite que as wikis usem imagens, áudio e outros ficheiros multimédia disponíveis no site [https://commons.wikimedia.org/ Wikimedia Commons].\nPara poder usá-los, o MediaWiki necessita de acesso à internet.\n\nPara mais informações sobre esta funcionalidade, incluindo instruções sobre como configurá-la para usar outras wikis em vez da Wikimedia Commons, consulte o [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos Manual Técnico].",
+       "config-instantcommons-help": "O [https://www.mediawiki.org/wiki/InstantCommons Instant Commons] é uma funcionalidade que permite que as wikis usem imagens, áudio e outros ficheiros multimédia disponíveis no sítio [https://commons.wikimedia.org/ Wikimedia Commons].\nPara poder usá-los, o MediaWiki necessita de acesso à Internet.\n\nPara mais informações sobre esta funcionalidade, incluindo instruções sobre como configurá-la para usar outras wikis em vez da Wikimedia Commons, consulte o [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos Manual Técnico].",
        "config-cc-error": "O auxiliar de escolha de licenças da Creative Commons não produziu resultados.\nIntroduza o nome da licença manualmente.",
        "config-cc-again": "Escolha outra vez...",
        "config-cc-not-chosen": "Escolha a licença da Creative Commons que pretende e clique \"proceed\".",
        "config-install-extension-tables": "A criar as tabelas das extensões ativadas",
        "config-install-mainpage-failed": "Não foi possível inserir a página principal: $1",
        "config-install-done": "<strong>Parabéns!</strong>\nTerminou a instalação do MediaWiki.\n\nO instalador gerou um ficheiro <code>LocalSettings.php</code>.\nEste ficheiro contém todas as configurações.\n\nPrecisa de fazer a descarga do ficheiro e colocá-lo no diretório de raiz da sua instalação (o mesmo diretório onde está o ficheiro index.php). Esta descarga deverá ter sido iniciada automaticamente.\n\nSe a descarga não foi iniciada, ou se o cancelou, pode recomeçá-la ao clicar na ligação abaixo:\n\n$3\n\n<strong>Nota</strong>: Se não fizer isto agora, o ficheiro que foi gerado deixará de estar disponível quando sair do processo de instalação.\n\nDepois de terminar o passo anterior, pode <strong>[$2 entrar na wiki]</strong>.",
+       "config-install-done-path": "<strong>Parabéns!</strong>\nTerminou a instalação do MediaWiki.\n\nO instalador gerou um ficheiro <code>LocalSettings.php</code>.\nEste ficheiro contém todas as configurações.\n\nPrecisa de fazer a descarga do ficheiro e colocá-lo no diretório <code>$4</code>. Esta descarga deverá ter sido iniciada automaticamente.\n\nSe a descarga não foi iniciada, ou se o cancelou, pode recomeçá-la ao clicar na ligação abaixo:\n\n$3\n\n<strong>Nota</strong>: Se não fizer isto agora, o ficheiro que foi gerado deixará de estar disponível quando sair do processo de instalação.\n\nDepois de terminar o passo anterior, pode <strong>[$2 entrar na wiki]</strong>.",
        "config-download-localsettings": "Descarga do <code>LocalSettings.php</code>",
        "config-help": "ajuda",
        "config-help-tooltip": "clique para expandir",
index b2ff103..833e7d6 100644 (file)
        "config-no-db": "{{doc-important|Do not translate \"<code>./configure --with-mysqli</code>\" and \"<code>php5-mysql</code>\".}}\nParameters:\n* $1 is comma separated list of database types supported by MediaWiki.\n* $2 is the count of items in $1 - for use in plural.",
        "config-outdated-sqlite": "Used as warning. Parameters:\n* $1 - the version of SQLite that has been installed\n* $2 - minimum version",
        "config-no-fts3": "A \"[[:wikipedia:Front and back ends|backend]]\" is a system or component that ordinary users don't interact with directly and don't need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are \"system\" or \"service\", or (depending on context and language) even leave it untranslated.",
-       "config-mbstring": "{{Related|Config-fatal}}",
-       "config-xml-bad": "Status message in the MediaWiki installer environment checks.",
        "config-pcre-old": "Parameters:\n* $1 - minimum PCRE version number\n* $2 - the installed version of [[wikipedia:PCRE|PCRE]]\n{{Related|Config-fatal}}",
        "config-pcre-no-utf8": "PCRE is a name of a programmers' library for supporting regular expressions. It can probably be translated without change.\n{{Related|Config-fatal}}",
        "config-memory-raised": "Parameters:\n* $1 is the configured <code>memory_limit</code>.\n* $2 is the value to which <code>memory_limit</code> was raised.",
        "config-memory-bad": "Parameters:\n* $1 is the configured <code>memory_limit</code>.",
-       "config-ctype": "Message if support for [http://www.php.net/manual/en/ctype.installation.php Ctype] is missing from PHP.\n{{Related|Config-fatal}}",
-       "config-iconv": "Message if support for [http://www.php.net/manual/en/iconv.installation.php iconv] is missing from PHP.\n{{Related|Config-fatal}}",
-       "config-json": "Message if support for [[wikipedia:JSON|JSON]] is missing from PHP.\n* \"[[wikipedia:Red Hat Enterprise Linux|Red Hat Enterprise Linux]]\" (RHEL) and \"[[wikipedia:CentOS|CentOS]]\" refer to two almost-identical Linux distributions. \"5 and 6\" refers to version 5 or 6 of either distribution. Because RHEL 7 likely will not include the PHP extension, do not translate as \"5 or newer\".\n* \"The [http://www.php.net/json PHP extension]\" is the JSON extension included with PHP 5.2 and newer.\n* \"The [http://pecl.php.net/package/jsonc PECL extension]\" is based on the PHP extension, though excludes code some distributions have found unacceptable (see [[phab:T49431]]).\n{{Related|Config-fatal}}",
-       "config-mbstring-absent": "Message if support for [http://www.php.net/manual/en/mbstring.installation.php mbstring] is missing from PHP.\n{{Related|Config-fatal}}",
        "config-xcache": "Message indicates if this program is available",
        "config-apc": "Message indicates if this program is available",
        "config-wincache": "Message indicates if this program is available",
        "config-subscribe": "Used as label for the installer checkbox",
        "config-subscribe-help": "\"Low-volume\" in this context means that there will be few e-mails to that mailing list per time period.",
        "config-subscribe-noemail": "Error text in MediaWiki installer.",
+       "config-pingback": "Option in the MediaWiki installer to submit data about this installation to MediaWiki.org.",
+       "config-pingback-help": "Explains what data will be shared if the user chooses to submit data to MediaWiki.org. $1 is the JSON data that will be sent",
        "config-almost-done": "Status message in the MediaWiki installer.",
        "config-optional-continue": "Option in the MediaWiki installer to make a more fine-tuned installation.",
        "config-optional-skip": "Option in the MediaWiki installer to start executing the actual installation and stop asking questions.",
        "config-install-extension-tables": "Notice shown to the user during the install about progress.",
        "config-install-mainpage-failed": "Used as error message. Parameters:\n* $1 - detailed error message",
        "config-install-done": "Parameters:\n* $1 is the URL to LocalSettings download\n* $2 is a link to the wiki.\n* $3 is a download link with attached download icon. The config-download-localsettings message will be used as the link text.",
+       "config-install-done-path": "Parameters:\n* $1 is the URL to LocalSettings download\n* $2 is a link to the wiki.\n* $3 is a download link with attached download icon. The config-download-localsettings message will be used as the link text.\n* $4 is the filesystem location of where the LocalSettings.php file should be saved to.",
        "config-download-localsettings": "The link text used in the download link in config-install-done.",
        "config-help": "This is used in help boxes.\n{{Identical|Help}}",
        "config-help-tooltip": "Tooltip for the 'help' links ({{msg-mw|config-help}}), to make it clear they'll expand in place rather than open a new page",
index a7d4c63..418b4ff 100644 (file)
@@ -33,7 +33,7 @@
        "config-localsettings-badkey": "Вы указали неправильный ключ обновления",
        "config-upgrade-key-missing": "Обнаружена существующая установленная копия MediaWiki.\nЧтобы обновить обнаруженную установку, пожалуйста, добавьте следующую строку в конец вашего файла <code>LocalSettings.php</code>:\n\n$1",
        "config-localsettings-incomplete": "Похоже, что существующий файл <code>LocalSettings.php</code> неполон.\nНе установлена переменная $1.\nПожалуйста, измените <code>LocalSettings.php</code> так, чтобы значение этой переменной было задано, затем нажмите «{{int:Config-continue}}».",
-       "config-localsettings-connection-error": "Ð\9fÑ\80оизоÑ\88ла Ð¾Ñ\88ибка Ð¿Ñ\80и Ð¿Ð¾Ð´ÐºÐ»Ñ\8eÑ\87ении Ðº Ð±Ð°Ð·Ðµ Ð´Ð°Ð½Ð½Ñ\8bÑ\85 Ñ\81 Ð¿Ð¾Ð¼Ð¾Ñ\89Ñ\8cÑ\8e Ð½Ð°Ñ\81Ñ\82Ñ\80оек, Ñ\83казаннÑ\8bÑ\85 Ð² <code>LocalSettings.php</code> Ð¸Ð»Ð¸ <code>AdminSettings.php</code>. Пожалуйста, исправьте эти настройки и повторите попытку.\n\n$1",
+       "config-localsettings-connection-error": "Ð\9fÑ\80оизоÑ\88ла Ð¾Ñ\88ибка Ð¿Ñ\80и Ð¿Ð¾Ð´ÐºÐ»Ñ\8eÑ\87ении Ðº Ð±Ð°Ð·Ðµ Ð´Ð°Ð½Ð½Ñ\8bÑ\85 Ñ\81 Ð¸Ñ\81полÑ\8cзованием Ð½Ð°Ñ\81Ñ\82Ñ\80оек, Ñ\83казаннÑ\8bÑ\85 Ð² <code>LocalSettings.php</code>. Пожалуйста, исправьте эти настройки и повторите попытку.\n\n$1",
        "config-session-error": "Ошибка при запуске сессии: $1",
        "config-session-expired": "Ваша сессия истекла.\nСессии настроены на длительность $1.\nВы её можете увеличить, изменив <code>session.gc_maxlifetime</code> в php.ini.\nПерезапустите процесс установки.",
        "config-no-session": "Данные сессии потеряны!\nПроверьте ваш php.ini и убедитесь, что <code>session.save_path</code> установлен в соответствующий каталог.",
        "config-no-db": "Не удалось найти подходящие драйвера баз данных! Вам необходимо установить драйвера базы данных для PHP.\n{{PLURAL:$2|Поддерживается следующий тип|Поддерживаются следующие типы}} баз данных: $1.\n\nЕсли вы скомпилировали PHP сами, перенастройте его с включением клиента баз данных, например, с помощью <code>./configure --with-mysqli</code>.\nЕсли вы установили PHP из пакетов Debian или Ubuntu, то вам также необходимо установить, например, пакет <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Предупреждение''': у Вас установлен SQLite  $1, версия которого ниже требуемой $2 . SQLite будет недоступен.",
        "config-no-fts3": "'''Внимание''': SQLite собран без модуля [//sqlite.org/fts3.html FTS3] — поиск не будет работать для этой базы данных.",
-       "config-mbstring": "'''Проблема: включена опция PHP [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]!'''\nЭто приводит к ошибкам и непредсказуемой порче вводимых данных.\nУстановка и использование MediaWiki без выключения этой опции невозможно.",
-       "config-xml-bad": "Для РНР отсутствует XML-модуль.\nMediaWiki не будет работать в этой конфигурации, так как требуется функционал этого модуля.\nВозможно, вам понадобится установить RPM-пакет php-xml.",
        "config-pcre-old": "'''Фатальная ошибка:''' требуется PCRE версии $1 или более поздняя.\nВаш исполняемый файл PHP связан с PCRE версии $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Подробнее].",
        "config-pcre-no-utf8": "'''Фатальная ошибка'''. Модуль PCRE для PHP, похоже, собран без поддержки PCRE_UTF8.\nMediaWiki требует поддержки UTF-8 для корректной работы.",
        "config-memory-raised": "Ограничение на доступную PHP память (<code>memory_limit</code>) поднято с $1 до $2.",
        "config-memory-bad": "'''Внимание:''' размер PHP <code>memory_limit</code> составляет $1.\nВероятно, этого слишком мало.\nУстановка может потерпеть неудачу!",
-       "config-ctype": "'''Фатальная ошибка:''' PHP должен быть скомпилирован с поддержкой [http://www.php.net/manual/ru/ctype.installation.php расширения Ctype].",
-       "config-iconv": "<strong>Фатальная ошибка:</strong> PHP должен быть скомпилирован с поддержкой [http://www.php.net/manual/en/iconv.installation.php расширения iconv].",
-       "config-json": "'''Фатальная ошибка:''' PHP был скомпилирован без поддержка JSON.\nВам необходимо установить либо расширение PHP JSON, либо расширение [http://pecl.php.net/package/jsonc PECL jsonc] перед установкой MediaWiki.\n* PHP-расширение входит в состав Red Hat Enterprise Linux (CentOS) 5 и 6, хотя должна быть включено в <code>/etc/php.ini</code> или <code>/etc/php.d/json.ini</code>.\n* Некоторые дистрибутивы Linux, выпущенные после мая 2013 года, не включают расширение PHP, вместо того, чтобы упаковывать расширение PECL как <code>php5-json</code> или <code>php-pecl-jsonc</code>.",
-       "config-mbstring-absent": "<strong>Фатальная ошибка:</strong> PHP должен быть скомпилирован с поддержкой [http://www.php.net/manual/en/mbstring.setup.php расширения mbstring].",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] установлен",
        "config-apc": "[http://www.php.net/apc APC] установлен",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] установлен",
        "config-subscribe": "Подписаться на [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce рассылку новостей о появлении новых версий MediaWiki].",
        "config-subscribe-help": "Это список рассылки с малым числом сообщений, используется для анонса новых выпусков и сообщений о проблемах с безопасностью.\nВам следует подписаться на него и обновлять движок MediaWiki, по мере выхода новых версий.",
        "config-subscribe-noemail": "Вы попытались подписаться на список рассылки уведомлений о новых выпусках без указания адреса электронной почты.\nУкажите адрес электронной почты, если вы хотите подписаться на список рассылки.",
+       "config-pingback": "Поделиться сведениями об этой установке с разработчикам MediaWiki.",
+       "config-pingback-help": "Если вы выберите этот вариант, MediaWiki будет периодически отправлять на https://www.mediawiki.org основные сведения об этом экземпляре MediaWiki. К этим данным относятся, в частности, тип операционной системы, версия PHP и выбранная СУБД. Фонда Викимедиа делится этими данными с разработчиками MediaWiki, чтобы помочь им в проведении будущих разработок.",
        "config-almost-done": "Вы почти у цели!\nОстальные настройки можно пропустить и приступить к установке вики.",
        "config-optional-continue": "Произвести тонкую настройку",
        "config-optional-skip": "Хватит, установить вики",
        "config-install-extension-tables": "Создание таблиц для включённых расширений",
        "config-install-mainpage-failed": "Не удаётся вставить главную страницу: $1",
        "config-install-done": "<strong>Поздравляем!</strong>\nВы установили MediaWiki.\n\nВо время установки был создан файл <code>LocalSettings.php</code>.\nОн содержит все ваши настройки.\n\nВам необходимо скачать его и положить в корневую директорию вашей вики (ту же директорию, где находится файл index.php). Его загрузка должна начаться автоматически.\n\nЕсли автоматическая загрузка не началась или вы её отменили, вы можете скачать по ссылке ниже:\n\n$3\n\n<strong>Примечание</strong>: Если вы не сделаете этого сейчас, то сгенерированный файл конфигурации не будет доступен вам в дальнейшем, если вы выйдете из установки, не скачивая его.\n\nПо окончании действий, описанных выше, вы сможете <strong>[$2 войти в вашу вики]</strong>.",
+       "config-install-done-path": "<strong>Поздравляем!</strong>\nВы установили MediaWiki.\n\nВо время установки был создан файл <code>LocalSettings.php</code>.\nОн содержит все ваши настройки.\n\nВам необходимо скачать его и положить в <code>$4</code>. Его загрузка должна начаться автоматически.\n\nЕсли автоматическая загрузка не началась или вы её отменили, вы можете скачать по ссылке ниже:\n\n$3\n\n<strong>Примечание</strong>: Если вы не сделаете этого сейчас, то сгенерированный файл конфигурации не будет доступен вам в дальнейшем, если вы выйдете из установки, не скачивая его.\n\nПо окончании действий, описанных выше, вы сможете <strong>[$2 войти в вашу вики]</strong>.",
        "config-download-localsettings": "Загрузить <code>LocalSettings.php</code>",
        "config-help": "справка",
        "config-help-tooltip": "нажмите, чтобы развернуть",
index 6b3fae0..c79c22d 100644 (file)
@@ -14,7 +14,7 @@
        "config-localsettings-upgrade": "Ae <code>LocalSettings.php</code> file haes been detectit.\nTae upgrade this installation, please enter the vailyie o <code>$wgUpgradeKey</code> in the kist ablo.\nYe'll fynd it in <code>LocalSettings.php</code>.",
        "config-localsettings-cli-upgrade": "Ae <code>LocalSettings.php</code> file haes been detectit.\nTae upgrade this installation, please rin <code>update.php</code> insteid",
        "config-localsettings-key": "The Upgrade key:",
-       "config-localsettings-badkey": "The key that ye gave is fause.",
+       "config-localsettings-badkey": "The upgrade key ye providit is incorrect.",
        "config-upgrade-key-missing": "Aen exeestin installation o MediaWiki haes been detectit.\nTae upgrade this installation, please pit the follaein line at the bottom o yer <code>LocalSettings.php</code>:\n\n$1",
        "config-localsettings-incomplete": "The exeestin <code>LocalSettings.php</code> appears tae be oncompleate.\nThe $1 variable isna set.\nPlease chynge <code>LocalSettings.php</code> sae that this variable is set, n clap \"{{int:Config-continue}}\".",
        "config-localsettings-connection-error": "Ae mistak wis encountered whan connectin til the database uisin the settins specified in <code>LocalSettings.php</code>. Please fix thir settins n try again.\n\n$1",
        "config-env-hhvm": "HHVM $1 is instawed.",
        "config-unicode-using-intl": "Uising the [http://pecl.php.net/intl intl PECL extension] fer Unicode normalization.",
        "config-unicode-pure-php-warning": "<strong>Warnishment:</strong> The [http://pecl.php.net/intl intl PECL extension] is no available tae haunle Unicode normalisation, fawin back tae slaw pure-PHP implementation.\nGif ye rin ae hei-traffic steid, ye shid read ae wee bit oan [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization].",
-       "config-unicode-update-warning": "<strong>Warnishment:</strong> The instawed version o the Unicode normalization wrapper uises aen aulder version o [http://site.icu-project.org/ the ICU project's] librie.\nYe shid [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations upgrade] gif ye'r concerned aneat uisin Unicode.",
-       "config-no-db": "Coudna fynd ae suitable database driver! Ye need tae instaw ae database driver fer PHP.\nThe follaein database types ar supported: $1.\n\nGif ye compiled PHP yersel, reconfeegure it wi ae database client enabled, fer example, uising <code>./confeegure --wi-mysqli</code>.\nGif ye installed PHP fae ae Debian or Ubuntu package, than ye need tae instaw forby, fer example, the <code>php5-mysql</code> package.",
+       "config-unicode-update-warning": "<strong>Wairnin:</strong> The installed version o the Unicode normalisation wrapper uises an aulder version o [http://site.icu-project.org/ the ICU project's] library.\nYe shoud [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations upgrade] if ye are at aw concerned aboot uisin Unicode.",
+       "config-no-db": "Could nae find a suitable database driver! Ye need tae install a database driver for PHP.\nThe follaein database {{PLURAL:$2|type is|types are}} supportit: $1.\n\nIf you compiled PHP yersel, reconfigur it wi a database client enabled, for example, uisin <code>./configure --with-mysqli</code>.\nIf ye installed PHP frae a Debian or Ubuntu package, then ye an aa need tae install, for example, the <code>php5-mysql</code> package.",
        "config-outdated-sqlite": "<strong>Warnishment:</strong> ye have SQLite $1, this is lower than minimum required version $2. SQLite will be onavailable.",
        "config-no-fts3": "<strong>Warnishment:</strong> SQLite is compiled wioot the [//sqlite.org/fts3.html FTS3 module], rake features will be onavailable oan this backend.",
-       "config-mbstring": "<strong>Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is active!</strong>\nThis optie causes mistaks an can rot data onpredictably.\nYe canna install or uise MediaWiki onless this optie is disabled.",
-       "config-xml-bad": "PHP's XML module is missin.\nMediaWiki needs functions in this module n will naw wairk in this confeeguration.\nGif ye'r rinnin Mandrake, instaw the php-xml package.",
        "config-pcre-old": "<strong>Fatal:</strong> PCRE $1 or later is required.\nYer PHP binary is link't wi PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mair informâtion].",
        "config-pcre-no-utf8": "<strong>Fatal:</strong> PHP's PCRE module seems tae be compiled wioot PCRE_UTF8 support.\nMediaWiki requires UTF-8 support tae function correctly.",
        "config-memory-raised": "PHP's <code>memerie_limit</code> is $1, raised til $2.",
        "config-memory-bad": "<strong>Warnishment:</strong> PHP's <code>memerie_limit</code> is $1.\nThis is proably ower low.\nThe installation micht fail!",
-       "config-ctype": "<strong>Fatal:</strong> PHP maun be compiled wi support fer the [http://www.php.net/manual/en/ctype.installation.php Ctype extension].",
-       "config-iconv": "<strong>Fatal:</strong> PHP maun be compiled wi support fer the [http://www.php.net/manual/en/iconv.installation.php iconv extension].",
-       "config-json": "<strong>Fatal:</strong> PHP wis compiled wioot JSON support.\nYe maun instaw either the PHP JSON extension or the [http://pecl.php.net/package/jsonc PECL jsonc] extension afore instawin MediaWiki.\n* The PHP extension is incluided in Red Hat Enterprise Linux (CentOS) 5 n 6, thoogh it maun be enabled in <code>/etc/php.ini</code> or <code>/etc/php.d/json.ini</code>.\n* Some Linux distributions released efter Mey 2013 omit the PHP extension, instead packagin the PECL extension aes <code>php5-json</code> or <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] is installed.",
        "config-apc": "[http://www.php.net/apc APC] is installed.",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] is instawed.",
+       "config-no-cache-apcu": "<strong>Wairnin:</strong> Could nae find [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] or [http://www.iis.net/download/WinCacheForPhp WinCache].\nObject cachin isna enabled.",
        "config-mod-security": "<strong>Warnishment:</strong> Yer wab server haes [http://modsecurity.org/ mod_security] enabled. Gif misconfeegured, it can cause problems fer MediaWiki or ither saffware that allous uisers tae post arbitrie content.\nRefer til [http://modsecurity.org/documentation/ mod_security documentation] or contact yer host's support gif ye encounter random mistaks.",
        "config-diff3-bad": "GNU diff3 naw foond.",
        "config-git": "Foond the Git version control saffware: <code>$1</code>.",
        "config-ns-site-name": "Same aes the wiki name: $1",
        "config-ns-other": "Ither (speceefie)",
        "config-ns-other-default": "MaWiki",
-       "config-project-namespace-help": "Follaein Wikipedia's example, moni wikis keep their policy pages separate fae thair content pages, in ae \"'''project namespace'''\".\nAw page titles in this namespace stert wi ae certain prefix, that ye can speceefie here.\nUisuallie, this prefix is derived fae the name o the wiki, but it canna contain punctuation chairacters sic like \"#\" or \":\".",
+       "config-project-namespace-help": "Follaein Wikipaedia's example, mony wikis keep thair policy pages separate frae thair content pages, in a '''project namespace'''.\nAw page teetles in this namespace stairt wi a certain prefix, which ye can specify here.\nUisually, this prefix is derived frae the name o the wiki, but it canna conteen punctuation characters such as \"#\" or \":\".",
        "config-ns-invalid": "The speceefied namespace \"<nowiki>$1</nowiki>\" is onvalid.\nSpeceefie ae different project namespace.",
        "config-ns-conflict": "The speceefied namespace \"<nowiki>$1</nowiki>\" conflicts wi ae defaut MediaWiki namespace.\nSpeceefie ae different project namespace.",
        "config-admin-box": "Admeenistrater accoont",
        "config-logo": "Logo URL:",
        "config-logo-help": "MediaWiki's defaut skin inclædes space fer ae 135x160 pixel logo abuin the sidebaur menu.\nUplaid aen eemage o the appropriate size, n enter the URL here.\n\nYe can uise <code>$wgStylePath</code> or <code>$wgScriptPath</code> gif yer logo is relative til thae paths.\n\nGif ye dinna want ae logo, lea this kist blank.",
        "config-instantcommons": "Enable Instant Commyns",
-       "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commyns] is ae featur that allous wikis tae uise eemages, soonds n ither media foond oan the [https://commons.wikimedia.org/ Wikimedia Commons] steid.\nIn order tae dae this, MediaWiki needs access til the Internet.\n\nFer mair information oan this featur, incluidin instructions oan hou tae set it up fer wikis ither than the Wikimedia Commons, consult [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos the manual].",
+       "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] is a featur that allaes wikis tae uise images, soonds an ither media foond on the [https://commons.wikimedia.org/ Wikimedia Commons] steid.\nIn order tae dae this, MediaWiki requires access tae the Internet.\n\nFor mair information on this featur, includin instructions on hou tae set it up for wikis ither nir the Wikimedia Commons, consult [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos the manual].",
        "config-cc-error": "The Creative Commyns license chuiser gae naw result.\nEnter the license name manually.",
        "config-cc-again": "Pick again...",
        "config-cc-not-chosen": "Chuise whit Creative Commyns license ye want an clap oan \"proceed\".",
        "config-install-mainpage": "Cræftin main page wi defaut content",
        "config-install-extension-tables": "Makin buirds fer enabled extensions",
        "config-install-mainpage-failed": "Coudna insert main page: $1",
-       "config-install-done": "<strong>Congratulations!</strong>\nYe'v successfulie instawed MediaWiki.\n\nThe instawer haes generated ae <code>LocalSettings.php</code> file.\nIt contains aw yer confeeguration.\n\nYe'll need tae doonlaid it n pit it in the base o yer wiki instawation (the same directerie aes index.php). The doonlaid shid hae stairted autæmateeclie.\n\nGif the doonlaid wisna affered, or gif ye cancelled it, ye can restairt the doonlaid bi clapin oan the airtin ablo:\n\n$3\n\n<strong>Mynd:</strong> Gif ye dinna dae this the nou, this generated confeeguration file willna be available til ye laiter gif ye exit the instawation wioot doonlaidin it.\n\nWhan that haes been dun, ye can <strong>[$2 enter yer wiki]</strong>.",
+       "config-install-done": "<strong>Congratulations!</strong>\nYe hae installed MediaWiki.\n\nThe installer has generatit a <code>LocalSettings.php</code> file.\nIt conteens aw yer configuration.\n\nYe will need tae dounlaid it an put it in the base o yer wiki installation (the same directory as index.php). The dounlaid should hae stairtit automatically.\n\nIf the dounlaid wisna offered, or if ye cancelled it, ye can restairt the dounlaid bi clickin the airtin ablo:\n\n$3\n\n<strong>Note:</strong> If ye dinna dae this nou, this generatit configuration file will nae be available tae ye later if ye exit the installation wioot dounlaidin it.\n\nWhen that haes been duin, ye can <strong>[$2 enter yer wiki]</strong>.",
        "config-download-localsettings": "Dounlaid <code>LocalSettings.php</code>",
        "config-help": "heelp",
        "config-help-tooltip": "clap tae mak muckler",
        "config-nofile": "File \"$1\" coudna be foond. Haes it been delytit?",
        "config-extension-link": "Did ye ken that yer wiki supports [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions]?\n\nYe can brouse [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions bi categorie] or the [https://www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] tae see the full leet o extensions.",
-       "mainpagetext": "<strong>MediaWiki haes been installit wi speed.</strong>",
+       "mainpagetext": "<strong>MediaWiki haes been installed.</strong>",
        "mainpagedocfooter": "Consult the [https://meta.wikimedia.org/wiki/Help:Contents/sco Uiser's Guide] fer information oan uisin the wiki saffware.\n\n== Gettin stairtit ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Confeeguration settins leet]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailin leet]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki fer yer leid]"
 }
index 45586ef..1dcd2c1 100644 (file)
@@ -11,7 +11,7 @@
        "config-title": "Inštalácia MediaWiki $1",
        "config-information": "Informácie",
        "config-localsettings-key": "Aktualizačný kľúč:",
-       "config-localsettings-badkey": "Zadaný kľúč je nesprávny.",
+       "config-localsettings-badkey": "Zadaný aktualizačný kľúč je nesprávny.",
        "config-your-language": "Váš jazyk:",
        "config-your-language-help": "Vyberte jazyk, ktorý chcete použiť počas inštalácie.",
        "config-wiki-language": "Wiki jazyk:",
@@ -51,6 +51,8 @@
        "config-missing-db-name": "Musíte zadať hodnotu pre \"{{int:config-db-name}}\".",
        "config-missing-db-host": "Musíte zadať hodnotu pre \"{{int:config-db-host}}\".",
        "config-missing-db-server-oracle": "Musíte zadať hodnotu pre \"{{int:config-db-host-oracle}}\".",
+       "config-site-name": "Názov wiki:",
+       "config-site-name-blank": "Zadajte názov stránky.",
        "config-ns-generic": "Projekt",
        "config-admin-box": "Účet správcu",
        "config-admin-name": "Vaše používateľské meno:",
index 8f00d98..e1931dd 100644 (file)
        "config-env-hhvm": "HHVM $1 är installerat.",
        "config-unicode-using-intl": "Använder [http://pecl.php.net/intl intl PECL-tillägget] för Unicode-normalisering.",
        "config-unicode-pure-php-warning": "'''Varning:''' [http://pecl.php.net/intl intl PECL-tillägget] är inte tillgängligt för att hantera Unicode-normalisering, faller tillbaka till en långsamt implementering i ren PHP.\nOm du driver en högtrafikerad webbplats bör du läsa lite om [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-normalisering].",
-       "config-unicode-update-warning": "'''Varning:''' Den installerade versionen av Unicode-normaliserings \"wrappern\" använder en äldre version av [http://site.icu-project.org/ ICU projektets] bibliotek.\nDu bör [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations uppgradera] om är intresserad av att använda Unicode.",
+       "config-unicode-update-warning": "<strong>Varning:</strong> Den installerade versionen av Unicode-normaliserings \"wrappern\" använder en äldre version av [http://site.icu-project.org/ ICU projektets] bibliotek.\nDu bör [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations uppgradera] om är intresserad av att använda Unicode.",
        "config-no-db": "Kunde inte hitta en lämplig databasdrivrutin! Du måste installera en databasdrivrutin för PHP.\nFöljande databas{{PLURAL:$2|typ |typer}} stöds: $1.\n\nI du själv kompilerat din PHP, konfigurera den med en databasklient aktiverad genom att t.ex. använda <code>./configure --with-mysqli</code>.\nOm du installerade PHP från ett Debian- eller Ubuntupaket måste du även installera, t.ex. <code>php5-mysql</code>-paketet.",
        "config-outdated-sqlite": "'''Varning:''' du har SQLite $1, vilket är lägre än minimikravet version $2. SQLite kommer inte att vara tillgänglig.",
        "config-no-fts3": "'''Varning:''' SQLite kompileras utan [//sqlite.org/fts3.html FTS3-modulen], sökfunktioner kommer att vara otillgängliga på denna backend.",
-       "config-mbstring": "'''Kritiskt: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] är aktiv!'''\nDetta alternativ orsakar fel och kan korrumpera data oförutsägbart.\nDu kan inte installera eller använda MediaWiki om detta alternativ är aktiverat.",
-       "config-xml-bad": "PHP:s XML-modul saknas.\nMediaWiki kräver funktioner i denna modul och kommer inte att fungera i den här konfigurationen.\nDu kan behöva installera RPM-paketet för php-xml.",
        "config-pcre-old": "'''Kritiskt:''' PCRE $1 eller senare krävs.\nDin PHP-binär är länkad till PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mer information].",
        "config-pcre-no-utf8": "'''Kritiskt:''' PHP:s PCRE-modul verkar vara kompilerat utan PCRE_UTF8-stöd.\nMediaWiki kräver stöd för UTF-8 för att fungera korrekt.",
        "config-memory-raised": "PHPs <code>memory_limit</code> är $1, ökad till $2.",
        "config-memory-bad": "''' Varning:''' PHP:s <code>memory_limit</code> är $1.\nDetta är förmodligen för lågt.\nInstallationen kan misslyckas!",
-       "config-ctype": "'''Kritiskt:''' PHP måste kompileras med stöd för [http://www.php.net/manual/en/ctype.installation.php Ctype-tillägget].",
-       "config-iconv": "<strong>Kritiskt:</strong> PHP måste kompileras med stöd för [http://www.php.net/manual/en/iconv.installation.php iconv-tillägget].",
-       "config-json": "'''Varning:''' PHP kompilerades utan JSON-stöd.\nDu måste antingen installera PHP JSON-tillägget eller [http://pecl.php.net/package/jsonc PECL jsonc]-tillägget före installationen av MediaWiki.\n* PHP-tillägget är inkluderat i Red Hat Enterprise Linux (CentOS) 5 och 6, men måste aktiveras i <code>/etc/php.ini</code> eller <code>/etc/php.d/json.ini</code>.\n* Vissa Linux-distributioner släppta efter maj 2013 har utelämnat PHP-tillägget och har istället inkluderat PECL-tillägget som <code>php5-json</code> eller <code>php-pecl-jsonc</code>.",
-       "config-mbstring-absent": "'''Kritiskt:''' PHP måste kompileras med stöd för tillägget [http://www.php.net/manual/en/mbstring.setup.php mbstring mbstring].",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] är installerat",
        "config-apc": "[http://www.php.net/apc APC] är installerat",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] är installerat",
@@ -86,7 +80,7 @@
        "config-no-cli-uri": "'''Varning:''' Ingen <code>--scriptpath</code> är angiven, använder standarden: <code>$1</code> .",
        "config-using-server": "Använder servernamn \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Använder server-URL \"<nowiki>$1$2</nowiki>\".",
-       "config-uploads-not-safe": "'''Varning:''' Din standardkatalog för uppladdningar <code>$1</code> är sårbar för körning av godtyckliga skript.\nÄven om MediaWiki kontrollerar alla uppladdade filer för säkerhetshot är det ändå starkt rekommenderat att [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security stänga detta säkerhetshål] innan du aktiverar uppladdningar.",
+       "config-uploads-not-safe": "<strong>Varning:</strong> Din standardkatalog för uppladdningar <code>$1</code> är sårbar för körning av godtyckliga skript.\nÄven om MediaWiki kontrollerar alla uppladdade filer för säkerhetshot är det ändå starkt rekommenderat att [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security stänga detta säkerhetshål] innan du aktiverar uppladdningar.",
        "config-no-cli-uploads-check": "'''Varning:''' Din standardkatalog för uppladdningar (<code>$1</code>) har inte kontrollerats för sårbarhet från körning av godtyckliga skript under CLI-installationen.",
        "config-brokenlibxml": "Ditt system har en kombination av PHP och libxml2 som är buggigt och kan orsaka datakorruption i MediaWiki och andra webbprogram.\nUppgradera till libxml2 2.7.3 eller senare ([https//bugs.php.net/bug.php?id=45996 buggfil med PHP]).\nInstallationen avbröts.",
        "config-suhosin-max-value-length": "Suhosin är installerat och begränsar GET-parametern <code>length</code> till $1 bytes.\nMediaWikis ResourceLoader-komponent kommer att arbeta runt denna begränsning, men det kommer att försämra prestandan.\nOm möjligt bör du sätta <code>suhosin.get.max_value_length</code> till 1024 eller högre i <code>php.ini</code>, och sätta <code>$wgResourceLoaderMaxQueryLength</code> till samma värde som i <code>LocalSettings.php</code>.",
        "config-subscribe": "Prenumerera på [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce e-postlistan för kungörelser av nya versioner].",
        "config-subscribe-help": "Detta är en e-postlista med låg volym vilken används för meddelanden om nya versionssläpp, inklusive viktiga säkerhetsmeddelanden.\nDu bör prenumerera på den och uppdatera din MediaWiki-installation när nya versioner kommer ut.",
        "config-subscribe-noemail": "Du försökte att prenumerera på e-postlistan för versionssläppsmeddelanden utan att tillhandahålla en e-postadress.\nAnge en e-postadress om du vill prenumerera på e-postlistan.",
+       "config-pingback": "Dela data om denna installation med MediaWikis utvecklare.",
        "config-almost-done": "Du är nästan färdig!\nDu kan nu hoppa över återstående konfigurationer och installera wikin direkt.",
        "config-optional-continue": "Ställ fler frågor till mig.",
        "config-optional-skip": "Jag är redan uttråkad, bara installera wiki.",
        "config-install-extension-tables": "Skapar tabeller för aktiverade tillägg",
        "config-install-mainpage-failed": "Kunde inte infoga huvudsidan: $1",
        "config-install-done": "<strong>Grattis!</strong>\nDu har installerat MediaWiki.\n\nInstallationsprogrammet har genererat filen <code>LocalSettings.php</code>.\nDet innehåller alla dina konfigurationer.\n\nDu kommer att behöva ladda ner den och placera den i roten för din wiki-installation (samma katalog som index.php). Nedladdningen borde ha startats automatiskt.\n\nOm ingen nedladdning erbjöds, eller om du har avbrutit det kan du starta om nedladdningen genom att klicka på länken nedan:\n\n$3\n\n<strong>OBS</strong>: Om du inte gör detta nu, kommer denna genererade konfigurationsfil inte vara tillgänglig för dig senare om du avslutar installationen utan att ladda ned den.\n\nNär det är klart, kan du <strong>[$2 gå in på din wiki]</strong>",
+       "config-install-done-path": "<strong>Grattis!</strong>\nDu har installerat MediaWiki.\n\nInstallationsprogrammet har genererat filen <code>LocalSettings.php</code>.\nDet innehåller alla dina konfigurationer.\n\nDu kommer att behöva ladda ner den och placera den i <code>$4</code>. Nedladdningen borde ha startats automatiskt.\n\nOm ingen nedladdning erbjöds, eller om du har avbrutit det kan du starta om nedladdningen genom att klicka på länken nedan:\n\n$3\n\n<strong>OBS</strong>: Om du inte gör detta nu, kommer denna genererade konfigurationsfil inte vara tillgänglig för dig senare om du avslutar installationen utan att ladda ned den.\n\nNär det är klart, kan du <strong>[$2 gå in på din wiki]</strong>",
        "config-download-localsettings": "Ladda ner <code>LocalSettings.php</code>",
        "config-help": "hjälp",
        "config-help-tooltip": "klicka för att expandera",
index 6965a15..914618b 100644 (file)
@@ -1,18 +1,22 @@
 {
        "@metadata": {
                "authors": [
-                       "VASANTH S.N."
+                       "VASANTH S.N.",
+                       "Vishwanatha Badikana"
                ]
        },
-       "config-title": "ಮೀಡಿಯಾವಿಕಿ ಆವೃತ್ತಿ $1 ರ ಅನುಸ್ಥಾಪನೆ",
+       "config-desc": "ಮೀಡಿಯ ವಿಕಿದ ಪ್ರತಿಸ್ಟಾಪನೆ",
+       "config-title": "ಮೀಡಿಯಾವಿಕಿ ಆವೃತ್ತಿ $1 ರ ಪ್ರತಿಸ್ಟಾಪನೆ",
        "config-information": "ಮಾಹಿತಿ",
-       "config-localsettings-key": "ಉನ್ನತೀಕರಣ ಕೀಲಿ",
-       "config-session-error": "ಅವಧಿ ಪ್ರಾರಂಭದ ದೋಷ: $1",
+       "config-localsettings-upgrade": "ಒಂಜಿ<code>LocalSettings.php</code>ದ ಕಡತೊ ಪತ್ತೆ ಆತ್ಂಡ್.  ಈ ಪ್ರತಿಸ್ಟಾಪನೆನ್ ಪೊಸತ್ ಮಲ್ಪೆರೆ, ದಯದೀಡ್ದ್ ತಿರ್ತ್‌ದ ಪಟ್ಟಿಗೆದ <code>$wgUpgradeKey</code>ದ ಬಿಲೆನ್ ನಮೂದಿಸಲೆ.\nಈರ್ <code>LocalSettings.php</code>ನ್ ನಾಡೊಲಿ",
+       "config-localsettings-cli-upgrade": "ಒಂಜಿ<code>LocalSettings.php</code>ದ ಕಡತೊ ಪತ್ತೆ ಆತ್ಂಡ್.  ಈ ಪ್ರತಿಸ್ಟಾಪನೆನ್ ಪೊಸತ್ ಮಲ್ಪೆರೆ, ದಯದೀಡ್ದ್ ತಿರ್ತ್‌ದ ಪಟ್ಟಿಗೆದ <code>$wgUpgradeKey</code>ದ ಬಿಲೆನ್ ನಮೂದಿಸಲೆ.\nದಯಮಲ್ತ್ <code>LocalSettings.php</code>ಗ್ ಬದಲಾದ್  ಬಲಿಪಾಲೆ",
+       "config-localsettings-key": "ಏಲಿಗೆದ ಕೀ",
+       "config-session-error": "ಸಬೆ ಸುರುಮಲ್ಪುನ ದೋಸೊ: $1",
        "config-your-language": "ಇರೆನಾ ಬಾಸೆ",
-       "config-wiki-language": "ವಿà²\95ಿ à²­à²¾à²·ೆ:",
+       "config-wiki-language": "ವಿà²\95ಿ à²¬à²¾à²¸ೆ:",
        "config-back": "← ಪಿರ",
        "config-continue": "ಮುಂದುವರೆಸಾಲೆ →",
-       "config-page-language": "ಭಾಸೆ",
+       "config-page-language": "ಬಾಸೆ",
        "config-page-welcome": "ಮಾಧ್ಯಮವಿಕಿಗ್ ಸ್ವಾಗತ",
        "config-page-dbconnect": "ದತ್ತಾಂಶಸಂಚಯಗ್ ಸಂಪರ್ಕಕೊರ್ಲೆ",
        "config-page-name": "ಪುದರ್",
index f08994d..2ba2c27 100644 (file)
@@ -18,7 +18,7 @@
        "config-localsettings-badkey": "Hindi tama ang susing ibinigay mo.",
        "config-upgrade-key-missing": "Napansin ang isang umiiral na pagtatalaga ng MediaWiki.\nUpang isapanahon ang katalagahang ito, mangyaring ilagay ang sumusunod na guhit sa ilalim ng iyong <code>LocalSettings.php</code>:\n\n$1",
        "config-localsettings-incomplete": "Lumilitaw na hindi pa buo ang umiiral na <code>LocalSettings.php</code>.\nAng pabagu-bagong $1 ay hindi nakatakda.\nMangyaring baguhin ang  <code>LocalSettings.php</code> upang ang maitakda ang pagpapabagu-bagong ito, at pindutin ang \"{{int:Config-continue}}\".",
-       "config-localsettings-connection-error": "Isang kamalian ang nakatagpo noong kumakabit sa kalipunan ng dato na ginagamit ang tinukoy na mga katakdaan sa loob ng <code>LocalSettings.php</code> o\n<code>AdminSettings.php</code>. Paki kumpunihin ang mga katakdaang ito at subukang muli.\n\n$1",
+       "config-localsettings-connection-error": "Isang kamalian ang nakatagpo noong kumakabit sa kalipunan ng dato na ginagamit ang tinukoy na mga katakdaan sa loob ng <code>LocalSettings.php</code> o\n<code>LocalSettings.php</code>. Paki kumpunihin ang mga katakdaang ito at subukang muli.\n\n$1",
        "config-session-error": "Kamalian sa pagsisimula ng sesyon: $1",
        "config-session-expired": "Tila nagwakas na ang inilaan sa iyong panahon ng dato.\nAng inilaang mga panahon ay iniayos para sa isang panahon ng buhay na $1.\nMapapataas mo ito sa pamamagitan ng pagtatakda ng <code>session.gc_maxlifetime</code> sa loob ng php.ini.\nMuling simulan ang proseso ng pagluluklok.",
        "config-no-session": "Nawala ang iyong datos ng sesyon!\nSuriin ang iyong php.ini at tiyakin na ang <code>session.save_path</code> ay nakatakda sa angkop na direktoryo.",
        "config-no-db": "Hindi matagpuan ang isang angkop na tagapagmaneho ng kalipunan ng datos! Kailangan mong magluklok ng isang tagapagmaneho ng kalipunan ng dato para sa PHP.\nTinatangkilik ang sumusunod na mga uri ng kalipunan ng dato: $1.\n\nKung ikaw ay nasa isang pinagsasaluhang pagpapasinaya, hilingin sa iyong tagapagbigay ng pagpapasinaya na iluklok ang isang angkop na tagapagmaneho ng kalipunan ng dato.\nKung ikaw mismo ang nangalap ng PHP, muling isaayos ito na pinagagana ang isang kliyente ng kalipunan ng dato, halimbawa na ang paggamit ng <code>./configure --with-mysql</code>.\nKung iniluklok mo ang PHP mula sa isang pakete ng Debian o Ubuntu, kung gayon kailangan mo ring magluklok ng modyul na php5-mysql.",
        "config-outdated-sqlite": "'''Babala''': mayroong kang $1 ng SQLite, na mas mababa kaysa sa pinaka mababang kailangang bersiyon na $2. Magiging hindi makukuha ang SQLite.",
        "config-no-fts3": "'''Warning''': Ang SQLite ay hindi itinala at tinipon na wala ang [//sqlite.org/fts3.html modulong FTS3], ang mga tampok na panghanap ay magiging hindi makukuha sa ibabaw ng panlikod na dulong ito.",
-       "config-mbstring": "'''Malubha: Masigla ang [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]!'''\nAng napiling ito ay nagdurulot ng mga kamalian at maaaring sumira nang hindi nahuhulaan ang dato.\nHindi mo maaaring iluklok o gamitin ang MediaWiki maliban na lamang kung hindi na pinagagana ang napiling ito.",
-       "config-xml-bad": "Nawawala ang modulong XML ng PHP.\nNangangailangan ang MediaWiki ng mga tungkulin sa loob ng modulong ito at hindi aandar sa loob ng ganitong pagkakaayos.\nKung pinapatakbo mo ang Mandrake, iluklok ang pakete ng php-xml.",
        "config-pcre-no-utf8": "'''Malubha''': Tila tinipon ang modyul na PCRE ng PHP na wala ang suporta ng PCRE_UTF8.\nNangangailangan ang MediaWiki ng suporta ng UTF-8 upang maging tama ang pag-andar.",
        "config-memory-raised": "Ang <code>hangganan_ng_alaala</code> ng PHP ay $1, itinaas sa $2.",
        "config-memory-bad": "'''Babala:''' Ang <code>hangganan_ng_alaala</code> ng PHP ay $1.\nIto ay maaaring napakababa.\nMaaaring mabigo ang pagluluklok!",
-       "config-ctype": "'''Maluba''': Dapat na tipunin ang PHP na mayroong suporta para sa [http://www.php.net/manual/en/ctype.installation.php dugtong Ctype].",
        "config-xcache": "Ininstala na ang [http://xcache.lighttpd.net/ XCache]",
        "config-apc": "Ininstala na ang [http://www.php.net/apc APC]",
        "config-wincache": "Ininstala na ang [http://www.iis.net/download/WinCacheForPhp WinCache]",
index b76a483..823b1ba 100644 (file)
        "config-unicode-pure-php-warning": "<strong>Uyarı:</strong> [http://pecl.php.net/intl intl PECL uzantısı] Unicode normalizasyonunu kaldırabilecek şekilde müsait değil; bu yüzden sayfa saf PHP uygulamasına dönüyor. Yüksek trafik alan bir sayfa çalıştırıyorsanız, [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalizasyonu] ile ilgili biraz bilgi almalısınız.",
        "config-outdated-sqlite": "<strong>Uyarı:</strong> Elinizde SQLite $1 var. Gerekli minimum sürüm: $2. SQLite kullanılamayacaktır.",
        "config-no-fts3": "<strong>Uyarı:</strong> SQLite [//sqlite.org/fts3.html FTS3 modülü] olmadan derlendi, bu arkayüzde arama özellikleri kullanılamayacaktır.",
-       "config-xml-bad": "PHP 'nin XML modülü eksik.\nMediaWiki bu modüldeki fonksiyonlara ihtiyaç duyar ve şimdiki kurulumda çalışmayacaktır.\nPhp-xml RPM paketini yüklemeniz gerekebilir.",
        "config-pcre-old": "<strong>Ağır hata:</strong> PCRE $1 veya daha üst versiyon gerekli.\nSizin PHP kurulumunuz PCRE $2 ile bağlı.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Daha fazla bilgi].",
        "config-memory-raised": "PHP'nin <code>memory_limit</code> (hafıza sınırı) değeri $1, $2'ye yükseltildi.",
        "config-memory-bad": "<strong>Uyarı:</strong> PHP'nin <code>memory_limit</code> (hafıza sınırı) değeri $1.\nBu büyük ihtimalle çok düşük.\nKurulum başarısız olabilir!",
-       "config-ctype": "<strong>Ölümcül:</strong> PHP [http://www.php.net/manual/en/ctype.installation.php Ctype uzantısı] desteği ile beraber derlenmelidir.",
-       "config-iconv": "<strong>Ölümcül:</strong> PHP [http://www.php.net/manual/en/iconv.installation.php iconv uzantısı] desteği ile beraber derlenmelidir.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] kurulu",
        "config-apc": "[http://www.php.net/apc APC] kurulu",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] kurulu",
index 24f4588..8bc18b0 100644 (file)
        "config-no-db": "Не вдалося знайти потрібний драйвер бази даних! Вам необхідно встановити драйвер бази даних для PHP. Підтримуються {{PLURAL:$2|такий тип|такі типи}} баз даних: $1.\n\nЯкщо ви скомпілювали PHP самостійно, переналаштуйте його з увімкненим клієнтом бази даних, наприклад за допомогою <code>./configure --with-mysqli</code>.\n\nЯкщо установлено PHP з пакетів Debian або Ubuntu, тоді ви також повинні встановити, наприклад, пакунок <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Увага''': у Вас встановлена версія SQLite $1, а це нижче, ніж мінімально необхідна версія $2. SQLite буде недоступним.",
        "config-no-fts3": "'''Увага''': SQLite зібраний без [//sqlite.org/fts3.html модуля FTS3], функції пошуку не будуть працювати у цій системі.",
-       "config-mbstring": "'''Проблема: Опція PHP [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] увімкнена!'''\nЦя опція призводить до непередбачуваного пошкодження даних.\nВи не можете встановити і використовувати MediaWiki, поки не буде вимкнено цю опцію.",
-       "config-xml-bad": "XML-модуть PHP відсутній.\nMediaWiki необхідні його функції, без цього модуля вона працювати не буде.\nВам може знадобитися встановити php-xml RPM пакет.",
        "config-pcre-old": "'''Фатальна помилка:''' потрібно PCRE версії $1 або пізнішої.\nВаш виконуваний файл PHP пов'язаний з PCRE версії $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Подробиці].",
        "config-pcre-no-utf8": "'''Помилка''': PCRE-модуть PHP, вочевидь, було зібрано без підтримки PCRE_UTF8.\nMediaWiki вимагає підтримку UTF-8 для коректної роботи.",
        "config-memory-raised": "Обмеження пам'яті PHP (<code>memory_limit</code>) $1, піднято до $2.",
        "config-memory-bad": "'''Увага:''' Розмір пам'яті PHP (<code>memory_limit</code>) становить $1.\nІмовірно, це замало.\nВстановлення може не вдатись!",
-       "config-ctype": "'''Помилка''': PHP має бути зібраним з підтримкою [http://www.php.net/manual/en/ctype.installation.php розширення Ctype].",
-       "config-iconv": "'''Фатальна помилка''': PHP має бути зібраним з підтримкою [http://www.php.net/manual/en/iconv.installation.php розширення iconv].",
-       "config-json": "'''Fatal:''' PHP був скомпільований без підтримки JSON.\nВам потрібно встановити або розширення PHP JSON або розширення[http://pecl.php.net/package/jsonc PECL jsonc] перед встановлення Медіавікі.\n* Розширення PHP включено у Red Hat Enterprise Linux (CentOS) 5 та 6, хоча має бути доступним у  <code>/etc/php.ini</code> або <code>/etc/php.d/json.ini</code>.\n* Деякі дистрибутиви Лінукса, випущені після травня 2013, пропустили розширення PHP, натомість упакували розширення  PECL як <code>php5-json</code> або <code>php-pecl-jsonc</code>.",
-       "config-mbstring-absent": "<strong>Фатальна помилка:</strong> PHP має бути скомпільовано з підтримкою [http://www.php.net/manual/en/mbstring.setup.php розширення mbstring].",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] встановлено",
        "config-apc": "[http://www.php.net/apc APC] встановлено",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] встановлено",
        "config-logo": "URL логотипу:",
        "config-logo-help": "Стандартна схема оформлення MediaWiki містить вільне для логотипу місце над бічною панеллю розміром 135x160 пікселів.\n\nЗавантажте зображення відповідного розміру і введіть тут його URL.\n\nВи можете використати <code>$wgStylePath</code> або <code>$wgScriptPath</code>, якщо ваш логотип пов'язаний з цими шляхами.\n\nЯкщо Вам не потрібен логотип, залиште це поле пустим.",
        "config-instantcommons": "Увімкнути Instant Commons",
-       "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] це функція, що дозволяє вікі використовувати зображення, звуки та інші медіа, розміщені на [https://commons.wikimedia.org/ Вікісховищі].\nДля цього MediaWiki необхідний доступ до інтернету.\n\nДодаткову інформацію стосовно цієї функції, включаючи інструкції, як її увімкнути у вікі, відмінних від Вікісховища, дивіться у [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos посібнику].",
+       "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] — це функція, що дозволяє вікі використовувати зображення, звуки та інші медіа, розміщені у [https://commons.wikimedia.org/ Вікісховищі].\nДля цього MediaWiki необхідний доступ до інтернету.\n\nДодаткову інформацію стосовно цієї функції, включаючи інструкції, як її увімкнути у вікі, відмінних від Вікісховища, дивіться у [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos посібнику].",
        "config-cc-error": "Механізм вибору ліцензії Creative Commons не дав результатів.\nВведіть назву ліцензії вручну.",
        "config-cc-again": "Виберіть знову ...",
        "config-cc-not-chosen": "Оберіть, яку ліцензію Creative Commons Ви хочете використовувати, і натисніть \"proceed\".",
        "config-install-extension-tables": "Створення таблиць для увімкнених розширень",
        "config-install-mainpage-failed": "Не вдається вставити головну сторінку: $1",
        "config-install-done": "<strong>Вітаємо!</strong>\nВи успішно встановили MediaWiki.\n\nІнсталятор згенерував файл <code>LocalSettings.php</code>, який містить усі Ваші налаштування.\n\nВам необхідно завантажити його і помістити у кореневу папку Вашої вікі (туди ж, де index.php). Завантаження мало початись автоматично.\n\nЯкщо завантаження не почалось або Ви його скасували, можете заново його почати, натиснувши на посилання внизу:\n\n$3\n\n<strong>Примітка</strong>: Якщо Ви не зробите цього зараз, цей файл не буде доступним пізніше, коли Ви вийдете з встановлення, не скачавши його.\n\nПісля виконання дій, описаних вище, Ви зможете <strong>[$2 увійти у свою вікі]</strong>.",
+       "config-install-done-path": "<strong>Вітаємо!</strong>\nВи встановили Медіавікі.\n\nІнсталятор створив файл <code>LocalSettings.php</code>.\nУ ньому містяться всі Ваші налаштування.\n\nВам потрібно завантажити його й помістити в <code>$4</code>. Завантаження повинно було автоматично розпочатись.\n\nЯкщо завантаження не було запропоновано, або Ви його скасували, Ви можете перезапустити завантаження натиснувши на посилання нижче:\n\n$3\n\n<strong>Зверніть увагу:</strong> Якщо Ви не зробите це зараз, цей згенерований файл налаштувань не буде доступним для Вас пізніше якщо Ви вийдете зі встановлення не завантаживши його.\n\nКоли це було зроблено Ви можете <strong>[$2 зайти до своєї вікі]</strong>.",
        "config-download-localsettings": "Завантажити <code>LocalSettings.php</code>",
        "config-help": "допомога",
        "config-help-tooltip": "натисніть, щоб розгорнути",
        "config-nofile": "Файл \"$1\" не знайдено. Його видалено?",
        "config-extension-link": "Чи знаєте ви, що ваше вікі підтримує [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions розширення]?\n\nВи можете переглядати [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category розширення по категорії] або в [https://www.mediawiki.org/wiki/Extension_Matrix матрицю розширень] щоб побачити повний список розширень.",
        "mainpagetext": "<strong>Програмне забезпечення «MediaWiki» встановлено.</strong>",
-       "mainpagedocfooter": "Ð\86нÑ\84оÑ\80маÑ\86Ñ\96Ñ\8e Ð¿Ñ\80о Ñ\80обоÑ\82Ñ\83 Ð· Ñ\86Ñ\96Ñ\94Ñ\8e Ð²Ñ\96кÑ\96 Ð¼Ð¾Ð¶Ð½Ð° Ð·Ð½Ð°Ð¹Ñ\82и Ð² [https://meta.wikimedia.org/wiki/Help:Contents Ð¿Ð¾Ñ\81Ñ\96бникÑ\83 ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87а].\n\n== Ð\94еÑ\8fкÑ\96 ÐºÐ¾Ñ\80иÑ\81нÑ\96 Ñ\80еÑ\81Ñ\83Ñ\80Ñ\81и ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Ð¡Ð¿Ð¸Ñ\81ок Ð½Ð°Ð»Ð°Ñ\88Ñ\82Ñ\83ванÑ\8c];\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Ð§Ð°Ñ\81Ñ\82Ñ\96 Ð¿Ð¸Ñ\82аннÑ\8f Ð· Ð¿Ñ\80иводÑ\83 MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ð Ð¾Ð·Ñ\81илка Ð¿Ð¾Ð²Ñ\96домленÑ\8c Ð¿Ñ\80о Ð¿Ð¾Ñ\8fвÑ\83 Ð½Ð¾Ð²Ð¸Ñ\85 Ð²ÐµÑ\80Ñ\81Ñ\96й MediaWiki];\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Ð\9bокалÑ\96зÑ\83йÑ\82е MediaWiki Ñ\81воÑ\94Ñ\8e Ð¼Ð¾Ð²Ð¾Ñ\8e]"
+       "mainpagedocfooter": "Ð\86нÑ\84оÑ\80маÑ\86Ñ\96Ñ\8e Ð¿Ñ\80о Ñ\80обоÑ\82Ñ\83 Ð· Ñ\86Ñ\96Ñ\94Ñ\8e Ð²Ñ\96кÑ\96 Ð¼Ð¾Ð¶Ð½Ð° Ð·Ð½Ð°Ð¹Ñ\82и Ð² [https://meta.wikimedia.org/wiki/Help:Contents Ð¿Ð¾Ñ\81Ñ\96бникÑ\83 ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87а].\n\n== Ð\94еÑ\8fкÑ\96 ÐºÐ¾Ñ\80иÑ\81нÑ\96 Ñ\80еÑ\81Ñ\83Ñ\80Ñ\81и ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Ð¡Ð¿Ð¸Ñ\81ок Ð½Ð°Ð»Ð°Ñ\88Ñ\82Ñ\83ванÑ\8c];\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Ð§Ð°Ñ\81Ñ\82Ñ\96 Ð¿Ð¸Ñ\82аннÑ\8f Ð· Ð¿Ñ\80иводÑ\83 MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ð Ð¾Ð·Ñ\81илка Ð¿Ð¾Ð²Ñ\96домленÑ\8c Ð¿Ñ\80о Ð¿Ð¾Ñ\8fвÑ\83 Ð½Ð¾Ð²Ð¸Ñ\85 Ð²ÐµÑ\80Ñ\81Ñ\96й MediaWiki];\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Ð\9bокалÑ\96зÑ\83ваÑ\82и MediaWiki Ñ\81воÑ\94Ñ\8e Ð¼Ð¾Ð²Ð¾Ñ\8e]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Ð\94Ñ\96знаÑ\82иÑ\81Ñ\8f, Ñ\8fк Ð±Ð¾Ñ\80оÑ\82иÑ\81Ñ\8f Ð·Ñ\96 Ñ\81памом Ñ\83 Ñ\81воÑ\97й Ð²Ñ\96кÑ\96]"
 }
index 0225fae..f2f56d0 100644 (file)
        "config-no-db": "Không tìm thấy một trình điều khiển cơ sở dữ liệu phù hợp! Bạn cần phải cài một trình điều khiển cơ sở dữ liệu cho PHP.\n{{PLURAL:$2|Loại|Các loại}} cơ sở dữ liệu sau đây được hỗ trợ: $1.\n\nNếu bạn đã biên dịch PHP lấy, cấu hình lại nó mà kích hoạt một trình khách cơ sở dữ liệu, ví dụ bằng lệnh <code>./configure --with-mysqli</code>.\nNếu bạn đã cài PHP từ một gói Debian hoặc Ubuntu, thì bạn cũng cần phải cài ví dụ gói <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Chú ý:</strong> Bạn có SQLite $1, phiên bản này thấp hơn phiên bản yêu câu tối thiểu $2. SQLite sẽ không có tác dụng.",
        "config-no-fts3": "<strong>Chú ý:</strong> SQLite được biên dịch mà không có [//sqlite.org/fts3.html mô đun FTS3], nên các chức năng tìm kiếm sẽ bị vô hiệu trên hệ thống phía sau này.",
-       "config-mbstring": "<strong>Lỗi chí tử: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] được kích hoạt!</strong>\nTùy chọn này gây lỗi và có thể làm hỏng dữ liệu một cách không thể đoán trước.\nBạn không thể cài đặt hoặc sử dụng MediaWiki trừ phi tùy chọn này bị vô hiệu.",
-       "config-xml-bad": "Mô đun XML của PHP đang bị thiếu.\nMediaWiki yêu cầu các hàm trong mô đun này và sẽ không hoạt động trong cấu hình này.\nBạn có thể cần cài đặt gói RPM php-xml.",
        "config-pcre-old": "<strong>Lỗi chí tử:</strong> PCRE $1 trở lên được yêu cầu phải có.\nBản nhị phân PHP của bạn dang được liên kết với PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Thông tin bổ sung].",
        "config-pcre-no-utf8": "<strong>Lỗi chí tử:</strong> Mô đun PCRE của PHP dường như được biên dịch mà không có hỗ trợ PCRE_UTF8.\nMediaWiki yêu cầu phải có hỗ trợ UTF-8 để hoạt động chính xác.",
        "config-memory-raised": "<code>memory_limit</code> của PHP là $1, tăng lên $2.",
        "config-memory-bad": "<strong>Cảnh báo:</strong> <code>memory_limit</code> của PHP là $1.\nGiá trị này có lẽ quá thấp.\nCài đặt có thể bị thất bại!",
-       "config-ctype": "<strong>Lỗi chí tử:</strong> PHP phải được biên dịch với hỗ trợ cho [http://www.php.net/manual/en/ctype.installation.php phần mở rộng Ctype].",
-       "config-iconv": "<strong>Lỗi chí tử:</strong> PHP phải được biên dịch với hỗ trợ cho [http://www.php.net/manual/en/iconv.installation.php phần mở rộng iconv].",
-       "config-json": "<strong>Lỗi chí tử:</strong> PHP được biên dịch mà không có hỗ trợ cho JSON.\nBạn phải cài đặt hoặc phần mở rộng JSON PHP hoặc phần mở rộng [http://pecl.php.net/package/jsonc PECL jsonc] trước khi cài đặt MediaWiki.\n* Phần mở rộng PHP có sẵn trong Red Hat Enterprise Linux (CentOS) 5 và 6 nhưng phải được kích hoạt trong <code>/etc/php.ini</code> hoặc <code>/etc/php.d/json.ini</code>.\n* Một số phiên bản Linux được phát hành sau tháng 5 năm 2013 bỏ qua phần mở rộng PHP và gói lại phần mở rộng PECL là <code>php5-json</code> hoặc <code>php-pecl-jsonc</code> thay thế.",
-       "config-mbstring-absent": "<strong>Lỗi chí tử:</strong> PHP phải được biên dịch với hỗ trợ cho [http://www.php.net/manual/en/mbstring.setup.php phần mở rộng mbstring].",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] đã được cài đặt",
        "config-apc": "[http://www.php.net/apc APC] đã được cài đặt",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] đã được cài đặt",
        "config-install-extension-tables": "Đang tạo bảng cho các phần mở rộng được kích hoạt",
        "config-install-mainpage-failed": "Không thể chèn trang đầu: $1",
        "config-install-done": "<strong>Xin chúc mừng!</strong>\nBạn đã cài đặt MediaWiki.\n\nBộ cài đặt đã tạo ra một tập tin <code>LocalSettings.php</code>.\nTập tin này chứa tất cả các cấu hình của bạn.\n\nBạn sẽ cần phải tải nó về và đặt nó trong thư mục cài đặt wiki của bạn (cùng thư mục với index.php). Việc tải về có lẽ sẽ được khởi động tự động.\n\nNếu bản tải về không được cung cấp, hoặc nếu bạn hủy bỏ nó, bạn có thể khởi động lại tải về bằng cách nhấn vào liên kết dưới đây:\n\n$3\n\n<strong>Lưu ý:</strong> Nếu bạn không làm điều này ngay bây giờ, điều này sẽ tạo ra tập tin cấu hình sẽ không có giá trị cho bạn sau này nếu bạn thoát khỏi trình cài đặt mà không tải nó về.\n\nKhi đã việc tải về đã hoàn thành, bạn có thể <strong>[$2 truy cập trang wiki của bạn]</strong>.",
+       "config-install-done-path": "<strong>Xin chúc mừng!</strong>\nBạn đã cài đặt MediaWiki.\n\nBộ cài đặt đã tạo ra một tập tin <code>LocalSettings.php</code>.\nTập tin này chứa tất cả các cấu hình của bạn.\n\nBạn sẽ cần phải tải nó về và đặt nó tại <code>$4</code>. Việc tải về có lẽ sẽ được khởi động tự động.\n\nNếu bản tải về không được cung cấp, hoặc nếu bạn hủy bỏ nó, bạn có thể khởi động lại tải về bằng cách nhấn vào liên kết dưới đây:\n\n$3\n\n<strong>Lưu ý:</strong> Nếu bạn không làm điều này ngay bây giờ, điều này sẽ tạo ra tập tin cấu hình sẽ không có giá trị cho bạn sau này nếu bạn thoát khỏi trình cài đặt mà không tải nó về.\n\nKhi đã việc tải về đã hoàn thành, bạn có thể <strong>[$2 truy cập trang wiki của bạn]</strong>.",
        "config-download-localsettings": "Tải về <code>LocalSettings.php</code>",
        "config-help": "Trợ giúp",
        "config-help-tooltip": "nhấn chuột để mở rộng",
index 57116ff..6b5bfe0 100644 (file)
@@ -7,7 +7,8 @@
                ]
        },
        "config-information": "信息",
+       "config-back": "← 转去",
        "config-page-language": "闲话",
-       "mainpagetext": "'''MediaWiki安装成功哉!'''",
+       "mainpagetext": "<strong>MediaWiki安装好哉。</strong>",
        "mainpagedocfooter": "请访问[https://meta.wikimedia.org/wiki/Help:Contents 用户手册]以获得使用此维基软件个信息!\n\n== 入门 ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki 配置设置列表]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki 常见问题解答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 发布邮件列表]"
 }
index 20afffe..d541696 100644 (file)
        "config-no-db": "无法找到合适的数据库驱动!您需要为PHP安装数据库驱动。目前支持以下数据库{{PLURAL:$2|类型}}:$1。\n\n如果您自己编译了PHP,请通过启用数据库客户端重新配置它,例如使用 <code>./configure --with-mysqli</code>。如果您从 Debian 或 Ubuntu 安装包安装了PHP,那么您也需要安装,例如 <code>php5-mysql</code> 安装包。",
        "config-outdated-sqlite": "<strong>警告:</strong>您已安装SQLite $1,但是它的版本低于最低要求版本$2。因此您无法选择SQLite。",
        "config-no-fts3": "<strong>警告:</strong>已编译的SQLite不包含[//sqlite.org/fts3.html FTS3模块],后台搜索功能将不可用。",
-       "config-mbstring": "<strong>致命错误:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]已启用!</strong>\n此选项会导致错误并不可预测地破坏数据,请将其禁用,否则您将不能安装或使用MediaWiki。",
-       "config-xml-bad": "缺少PHP的XML模块。MediaWiki需要使用该模块提供的函数,在当前配置下将无法工作。您可能需要安装php-xml RPM包。",
        "config-pcre-old": "<strong>致命错误:</strong>需要PCRE $1 或更高版本。\n您的 PHP 二进制文件与 PCRE $2 链接。\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE 详细信息]。",
        "config-pcre-no-utf8": "<strong>致命错误:</strong>PHP的PCRE模块在编译时可能没有包含PCRE_UTF8支持。\nMediaWiki需要UTF-8支持才能正常工作。",
        "config-memory-raised": "PHP的内存使用上限<code>memory_limit</code>为$1,自动提升到$2。",
        "config-memory-bad": "<strong>警告:</strong>PHP的内存使用上限<code>memory_limit</code>为$1。\n该设定可能过低,并导致安装失败!",
-       "config-ctype": "<strong>致命错误:</strong>PHP必须有[http://www.php.net/manual/en/ctype.installation.php Ctype 扩展]来支持编译。",
-       "config-iconv": "<strong>致命错误:</strong>PHP必须编译支持[http://www.php.net/manual/en/iconv.installation.php iconv拓展]。",
-       "config-json": "<strong>致命错误:</strong>PHP编译没有附带JSON支持。\n在安装MediaWiki前,你必须安装PHP JSON扩展或者[http://pecl.php.net/package/jsonc PECL jsonc]扩展。\n* PHP扩展已包含在Red Hat Enterprise Linux (CentOS) 5和6中,但必须在<code>/etc/php.ini</code>或<code>/etc/php.d/json.ini</code>中启用。\n* 部分在2013年5月后发行的Linux发行版省略了PHP扩展,而将PECL扩展打包成了<code>php5-json</code>或<code>php-pecl-jsonc</code>。",
-       "config-mbstring-absent": "<strong>致命错误:</strong>PHP必须有[http://www.php.net/manual/en/mbstring.setup.php mbstring扩展]来支持编译。",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache]已安装",
        "config-apc": "[http://www.php.net/apc APC]已安装",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache]已安装",
        "config-subscribe": "订阅[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 发行公告邮件列表]。",
        "config-subscribe-help": "此低流量的邮件列表仅用于发行公告,其中包括重要安全公告。请订阅该列表以便在新的版本推出时升级您的MediaWiki。",
        "config-subscribe-noemail": "您选择了订阅发行公告邮件列表,但没有提供电子邮件地址。请提供一个电子邮件地址以订阅邮件列表。",
+       "config-pingback": "与MediaWiki开发人员分享有关此安装程序的数据。",
+       "config-pingback-help": "如果您选择此选项,MediaWiki将定期与https://www.mediawiki.org通信,传输与此MediaWiki实例相关的基础数据。此数据包括例如系统类型、PHP版本和选择的数据库后端。维基媒体基金会与MediaWiki开发人员分享此数据,以帮助引导将来的开发计划。以下数据将为您的系统发送:\n<pre>$1</pre>",
        "config-almost-done": "您几乎已经完成了!现在您可以跳过剩下的配置流程并立即安装wiki。",
        "config-optional-continue": "多问我一些问题吧。",
        "config-optional-skip": "我已经不耐烦了,赶紧安装我的wiki。",
        "config-install-extensions": "正在包含扩展程序",
        "config-install-database": "正在配置数据库",
        "config-install-schema": "创建架构",
-       "config-install-pg-schema-not-exist": "PostgreSQL 架构不存在",
+       "config-install-pg-schema-not-exist": "PostgreSQL 架构不存在",
        "config-install-pg-schema-failed": "创建数据表失败。请确保用户“$1”拥有写入模式“$2”的权限。",
        "config-install-pg-commit": "正在提交更改",
        "config-install-pg-plpgsql": "正在检查PL/pgSQL语言",
        "config-install-extension-tables": "正在创建已启用扩展程序表",
        "config-install-mainpage-failed": "无法插入首页:$1",
        "config-install-done": "<strong>恭喜!</strong>\n您已经安装了MediaWiki。\n\n安装程序已经生成了<code>LocalSettings.php</code>文件,其中包含了您所有的配置。\n\n您需要下载该文件,并将其放在您wiki的根目录(index.php的同级目录)中。稍后下载将自动开始。\n\n如果浏览器没有提示您下载,或者您取消了下载,您可以点击下面的链接重新开始下载:\n\n$3\n\n<strong>注意:</strong>如果您现在不完成本步骤,而是没有下载便退出了安装过程,此后您将无法获得自动生成的配置文件。\n\n当本步骤完成后,您可以<strong>[$2 进入您的wiki]</strong>。",
+       "config-install-done-path": "<strong>祝贺!</strong>您已经安装了MediaWiki。\n\n安装程序已经生成了<code>LocalSettings.php</code>文件。它包含您所有的配置。\n\n您需要下载该文件,并将其放在<code>$4</code>。下载应已自动开始。\n\n如果没有提供下载,或者您取消了下载,您可以点击下面的链接重新开始下载:\n\n$3\n\n<strong>注意:</strong>如果您现在不完成本步骤,而是没有下载便退出了安装过程,此后您将无法获得自动生成的配置文件。\n\n当本步骤完成后,您可以<strong>[$2 进入您的wiki]</strong>。",
        "config-download-localsettings": "下载<code>LocalSettings.php</code>",
        "config-help": "帮助",
        "config-help-tooltip": "单击展开",
index a0eeac5..dab2f26 100644 (file)
@@ -15,7 +15,8 @@
                        "LNDDYL",
                        "NigelSoft",
                        "Macofe",
-                       "Reke"
+                       "Reke",
+                       "Suchichi02"
                ]
        },
        "config-desc": "MediaWiki 安裝程式",
        "config-no-db": "找不到合適的資料庫驅動程式!您需要安裝 PHP 資料庫驅動程式。\n目前支援以下{{PLURAL:$2|類型|類型}}的資料庫: $1 。\n\n如果您是自行編譯 PHP,您必須重新設定並開啟資料庫客戶端,例:使用 <code>./configure --with-mysqli</code> 指令參數。\n如果您是使用 Debian 或 Ubuntu 的套件安裝 PHP ,您則需要額外安裝,例:<code>php5-mysql</code> 套件。",
        "config-outdated-sqlite": "<strong>警告:</strong>您已安裝 SQLite $1,但是它的版本低於最低需求版本 $2。 因此您無法使用 SQLite。",
        "config-no-fts3": "<strong>警告:</strong> SQLite 編譯時未包含 [//sqlite.org/fts3.html FTS3 模組],後台搜尋功能將無法使用。",
-       "config-mbstring": "<strong>嚴重:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] 選項被開啟!</strong>\n此選項會導致資料在無法預測的情況下損壞。\n您必須將開選項關閉方可繼續安裝 MediaWiki。",
-       "config-xml-bad": "PHP 缺少的 XML 模組。\nMediaWiki 需要使用此模組中所提供的函數,且在目前的設定下將無法繼續作業。\n您可能需要安裝 php-xml RPM 套件。",
        "config-pcre-old": "<strong>嚴重:</strong> 需要使用 PCRE $1 或更新的版本。\n您的 PHP 執行檔使用的是 PCRE $2。\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE 詳細資訊]。",
        "config-pcre-no-utf8": "<strong>嚴重:</strong> PHP 的 PCRE 模組在編譯時未包含 PCRE_UTF8 支援。\nMediaWiki 需要支援 UTF-8 才可正常運作。",
        "config-memory-raised": "PHP 的記憶體使用上限 <code>memory_limit</code> 目前為 $1,自動提高到 $2。",
        "config-memory-bad": "<strong>警告:</strong>PHP 的記憶體使用上限 <code>memory_limit</code> 為 $1。\n該設定值可能過低。\n這可能導致後續的安裝失敗!",
-       "config-ctype": "<strong>嚴重:</strong> PHP 編譯時必須包含 [http://www.php.net/manual/en/ctype.installation.php Ctype 擴充套件]。",
-       "config-iconv": "<strong>嚴重:</strong>PHP 編譯時必須包含 [http://www.php.net/manual/en/iconv.installation.php iconv 擴充套件]。",
-       "config-json": "<strong>嚴重:</strong> PHP 編譯時並未包含 JSON 擴充套件。\n在 MediaWiki 繼續安裝之前您必須先安裝 PHP JSON 擴充套件或 [http://pecl.php.net/package/jsonc PECL jsonc] 擴充套件。\n* 此 PHP 擴充套件在 Red Hat Enterprice Linux (CentOS) 5 版與 6 版以有內含,須於 <code>/etc/php.ini</code> 或 <code>/etc/php.d/json.ini</code> 設定檔將該項目開啟。\n* 部分於 2013 年 5 月以後發佈的 Linux 並沒有此 PHP 擴充套件,可透過安裝 PECL 擴充套件 <code>php5-json</code> 或 <code>php-pecl-jsonc</code> 替代。",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] 已安裝",
        "config-apc": "[http://www.php.net/apc APC] 已安裝",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] 已安裝",
        "config-help-tooltip": "點選以展開",
        "config-nofile": "查無檔案 \"$1\",是否已被刪除?",
        "config-extension-link": "您是否了解您的 Wiki 支援 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions 擴充套件]?\n\n\n您可以瀏覽 [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category 擴充套件分類] 或 [https://www.mediawiki.org/wiki/Extension_Matrix 擴充套件資料表] 以取得相關的資訊。",
-       "mainpagetext": "<strong>已成功安裝 MediaWiki。</strong>",
+       "mainpagetext": "<strong>已安裝 MediaWiki。</strong>",
        "mainpagedocfooter": "請參閱 [https://meta.wikimedia.org/wiki/Help:Contents 使用者手冊] 以取得使用 Wiki 的相關訊息!\n\n== 新手入門 ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki 系統設定]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki 常見問答集]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵寄清單]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources MediaWiki 介面在地化]"
 }
index e5357ce..f39f8fd 100644 (file)
@@ -42,14 +42,20 @@ class DeleteLinksJob extends Job {
                }
 
                $pageId = $this->params['pageId'];
+
+               // Serialize links updates by page ID so they see each others' changes
+               $scopedLock = LinksUpdate::acquirePageLock( wfGetDB( DB_MASTER ), $pageId, 'job' );
+
                if ( WikiPage::newFromID( $pageId, WikiPage::READ_LATEST ) ) {
                        // The page was restored somehow or something went wrong
                        $this->setLastError( "deleteLinks: Page #$pageId exists" );
                        return false;
                }
 
+               $timestamp = isset( $this->params['timestamp'] ) ? $this->params['timestamp'] : null;
+
                $page = WikiPage::factory( $this->title ); // title when deleted
-               $update = new LinksDeletionUpdate( $page, $pageId );
+               $update = new LinksDeletionUpdate( $page, $pageId, $timestamp );
                DataUpdate::runUpdates( [ $update ] );
 
                return true;
index 617c32b..3cd3448 100644 (file)
@@ -167,7 +167,8 @@ class DoubleRedirectJob extends Job {
                $reason = wfMessage( 'double-redirect-fixed-' . $this->reason,
                        $this->redirTitle->getPrefixedText(), $newTitle->getPrefixedText()
                )->inContentLanguage()->text();
-               $article->doEditContent( $newContent, $reason, EDIT_UPDATE | EDIT_SUPPRESS_RC, false, $user );
+               $flags = EDIT_UPDATE | EDIT_SUPPRESS_RC | EDIT_INTERNAL;
+               $article->doEditContent( $newContent, $reason, $flags, false, $user );
                $wgUser = $oldUser;
 
                return true;
@@ -178,7 +179,8 @@ class DoubleRedirectJob extends Job {
         *
         * @param Title $title
         *
-        * @return bool If the specified title is not a redirect, or if it is a circular redirect
+        * @return Title|bool The final Title after following all redirects, or false if
+        *  the page is not a redirect or the redirect loops.
         */
        public static function getFinalDestination( $title ) {
                $dbw = wfGetDB( DB_MASTER );
index 7acbdf2..a14cdd7 100644 (file)
@@ -102,18 +102,15 @@ class HTMLCacheUpdateJob extends Job {
                        return;
                }
 
-               // The page_touched field will need to be bumped for these pages.
-               // Only bump it to the present time if no "rootJobTimestamp" was known.
-               // If it is known, it can be used instead, which avoids invalidating output
-               // that was in fact generated *after* the relevant dependency change time
-               // (e.g. template edit). This is particularily useful since refreshLinks jobs
-               // save back parser output and usually run along side htmlCacheUpdate jobs;
-               // their saved output would be invalidated by using the current timestamp.
-               if ( isset( $this->params['rootJobTimestamp'] ) ) {
-                       $touchTimestamp = $this->params['rootJobTimestamp'];
-               } else {
-                       $touchTimestamp = wfTimestampNow();
-               }
+               // Bump page_touched to the current timestamp. This used to use the root job timestamp
+               // (e.g. template/file edit time), which was a bit more efficient when template edits are
+               // rare and don't effect the same pages much. However, this way allows for better
+               // de-duplication, which is much more useful for wikis with high edit rates. Note that
+               // RefreshLinksJob, which is enqueued alongside HTMLCacheUpdateJob, saves the parser output
+               // since it has to parse anyway. We assume that vast majority of the cache jobs finish
+               // before the link jobs, so using the current timestamp instead of the root timestamp is
+               // not expected to invalidate these cache entries too often.
+               $touchTimestamp = wfTimestampNow();
 
                $dbw = wfGetDB( DB_MASTER );
                // Update page_touched (skipping pages already touched since the root job).
index 9711496..8fba728 100644 (file)
@@ -40,13 +40,13 @@ class RefreshLinksJob extends Job {
        const PARSE_THRESHOLD_SEC = 1.0;
        /** @var integer Lag safety margin when comparing root job times to last-refresh times */
        const CLOCK_FUDGE = 10;
+       /** @var integer How many seconds to wait for slaves to catch up */
+       const LAG_WAIT_TIMEOUT = 15;
 
        function __construct( Title $title, array $params ) {
                parent::__construct( 'refreshLinks', $title, $params );
                // Avoid the overhead of de-duplication when it would be pointless
                $this->removeDuplicates = (
-                       // Master positions won't match
-                       !isset( $params['masterPos'] ) &&
                        // Ranges rarely will line up
                        !isset( $params['range'] ) &&
                        // Multiple pages per job make matches unlikely
@@ -83,20 +83,22 @@ class RefreshLinksJob extends Job {
 
                // Job to update all (or a range of) backlink pages for a page
                if ( !empty( $this->params['recursive'] ) ) {
+                       // When the base job branches, wait for the slaves to catch up to the master.
+                       // From then on, we know that any template changes at the time the base job was
+                       // enqueued will be reflected in backlink page parses when the leaf jobs run.
+                       if ( !isset( $params['range'] ) ) {
+                               try {
+                                       wfGetLBFactory()->waitForReplication( [
+                                               'wiki'    => wfWikiID(),
+                                               'timeout' => self::LAG_WAIT_TIMEOUT
+                                       ] );
+                               } catch ( DBReplicationWaitError $e ) { // only try so hard
+                                       $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
+                                       $stats->increment( 'refreshlinks.lag_wait_failed' );
+                               }
+                       }
                        // Carry over information for de-duplication
                        $extraParams = $this->getRootJobParams();
-                       // Avoid slave lag when fetching templates.
-                       // When the outermost job is run, we know that the caller that enqueued it must have
-                       // committed the relevant changes to the DB by now. At that point, record the master
-                       // position and pass it along as the job recursively breaks into smaller range jobs.
-                       // Hopefully, when leaf jobs are popped, the slaves will have reached that position.
-                       if ( isset( $this->params['masterPos'] ) ) {
-                               $extraParams['masterPos'] = $this->params['masterPos'];
-                       } elseif ( wfGetLB()->getServerCount() > 1 ) {
-                               $extraParams['masterPos'] = wfGetLB()->getMasterPos();
-                       } else {
-                               $extraParams['masterPos'] = false;
-                       }
                        $extraParams['triggeredRecursive'] = true;
                        // Convert this into no more than $wgUpdateRowsPerJob RefreshLinks per-title
                        // jobs and possibly a recursive RefreshLinks job for the rest of the backlinks
@@ -109,35 +111,35 @@ class RefreshLinksJob extends Job {
                        JobQueueGroup::singleton()->push( $jobs );
                // Job to update link tables for a set of titles
                } elseif ( isset( $this->params['pages'] ) ) {
-                       $this->waitForMasterPosition();
                        foreach ( $this->params['pages'] as $pageId => $nsAndKey ) {
                                list( $ns, $dbKey ) = $nsAndKey;
                                $this->runForTitle( Title::makeTitleSafe( $ns, $dbKey ) );
                        }
                // Job to update link tables for a given title
                } else {
-                       $this->waitForMasterPosition();
                        $this->runForTitle( $this->title );
                }
 
                return true;
        }
 
-       protected function waitForMasterPosition() {
-               if ( !empty( $this->params['masterPos'] ) && wfGetLB()->getServerCount() > 1 ) {
-                       // Wait for the current/next slave DB handle to catch up to the master.
-                       // This way, we get the correct page_latest for templates or files that just
-                       // changed milliseconds ago, having triggered this job to begin with.
-                       wfGetLB()->waitFor( $this->params['masterPos'] );
-               }
-       }
-
        /**
         * @param Title $title
         * @return bool
         */
        protected function runForTitle( Title $title ) {
+               $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
+
                $page = WikiPage::factory( $title );
+               $page->loadPageData( WikiPage::READ_LATEST );
+
+               // Serialize links updates by page ID so they see each others' changes
+               $scopedLock = LinksUpdate::acquirePageLock( wfGetDB( DB_MASTER ), $page->getId(), 'job' );
+               // Get the latest ID *after* acquirePageLock() flushed the transaction.
+               // This is used to detect edits/moves after loadPageData() but before the scope lock.
+               // The works around the chicken/egg problem of determining the scope lock key.
+               $latest = $title->getLatestRevID( Title::GAID_FOR_UPDATE );
+
                if ( !empty( $this->params['triggeringRevisionId'] ) ) {
                        // Fetch the specified revision; lockAndGetLatest() below detects if the page
                        // was edited since and aborts in order to avoid corrupting the link tables
@@ -150,15 +152,15 @@ class RefreshLinksJob extends Job {
                        $revision = Revision::newFromTitle( $title, false, Revision::READ_LATEST );
                }
 
-               $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
-
                if ( !$revision ) {
                        $stats->increment( 'refreshlinks.rev_not_found' );
                        $this->setLastError( "Revision not found for {$title->getPrefixedDBkey()}" );
                        return false; // just deleted?
-               } elseif ( !$revision->isCurrent() ) {
-                       // If the revision isn't current, there's no point in doing a bunch
-                       // of work just to fail at the lockAndGetLatest() check later.
+               } elseif ( $revision->getId() != $latest || $revision->getPage() !== $page->getId() ) {
+                       // Do not clobber over newer updates with older ones. If all jobs where FIFO and
+                       // serialized, it would be OK to update links based on older revisions since it
+                       // would eventually get to the latest. Since that is not the case (by design),
+                       // only update the link tables to a state matching the current revision's output.
                        $stats->increment( 'refreshlinks.rev_not_current' );
                        $this->setLastError( "Revision {$revision->getId()} is not current" );
                        return false;
@@ -258,17 +260,6 @@ class RefreshLinksJob extends Job {
                        }
                }
 
-               $latestNow = $page->lockAndGetLatest();
-               if ( !$latestNow || $revision->getId() != $latestNow ) {
-                       // Do not clobber over newer updates with older ones. If all jobs where FIFO and
-                       // serialized, it would be OK to update links based on older revisions since it
-                       // would eventually get to the latest. Since that is not the case (by design),
-                       // only update the link tables to a state matching the current revision's output.
-                       $stats->increment( 'refreshlinks.rev_cas_failure' );
-                       $this->setLastError( "page_latest changed from {$revision->getId()} to $latestNow" );
-                       return false;
-               }
-
                DataUpdate::runUpdates( $updates );
 
                InfoAction::invalidateCache( $title );
index 331f2d5..320a0b6 100644 (file)
@@ -35,6 +35,8 @@
  *                use application/x-www-form-urlencoded (headers sent automatically)
  *   - stream   : resource to stream the HTTP response body to
  *   - proxy    : HTTP proxy to use
+ *   - flags    : map of boolean flags which supports:
+ *                  - relayResponseHeaders : write out header via header()
  * Request maps can use integer index 0 instead of 'method' and 1 instead of 'url'.
  *
  * @author Aaron Schulz
@@ -104,7 +106,7 @@ class MultiHttpClient {
         *   - reqTimeout     : post-connection timeout per request (seconds)
         * @return array Response array for request
         */
-       final public function run( array $req, array $opts = [] ) {
+       public function run( array $req, array $opts = [] ) {
                return $this->runMulti( [ $req ], $opts )[0]['response'];
        }
 
@@ -172,6 +174,7 @@ class MultiHttpClient {
                                $req['body'] = '';
                                $req['headers']['content-length'] = 0;
                        }
+                       $req['flags'] = isset( $req['flags'] ) ? $req['flags'] : [];
                        $handles[$index] = $this->getCurlHandle( $req, $opts );
                        if ( count( $reqs ) > 1 ) {
                                // https://github.com/guzzle/guzzle/issues/349
@@ -373,6 +376,9 @@ class MultiHttpClient {
 
                curl_setopt( $ch, CURLOPT_HEADERFUNCTION,
                        function ( $ch, $header ) use ( &$req ) {
+                               if ( !empty( $req['flags']['relayResponseHeaders'] ) ) {
+                                       header( $header );
+                               }
                                $length = strlen( $header );
                                $matches = [];
                                if ( preg_match( "/^(HTTP\/1\.[01]) (\d{3}) (.*)/", $header, $matches ) ) {
diff --git a/includes/libs/ReverseArrayIterator.php b/includes/libs/ReverseArrayIterator.php
new file mode 100644 (file)
index 0000000..37b68c3
--- /dev/null
@@ -0,0 +1,76 @@
+<?php
+/**
+ * Convenience class for iterating over an array in reverse order.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.27
+ */
+
+/**
+ * Convenience class for iterating over an array in reverse order.
+ *
+ * @since 1.27
+ */
+class ReverseArrayIterator implements Iterator, Countable {
+       /** @var array $array */
+       protected $array;
+
+       /**
+        * Creates an iterator which will visit the keys in $array in
+        * reverse order.  If given an object, will visit the properties
+        * of the object in reverse order.  (Note that the default order
+        * for PHP arrays and objects is declaration/assignment order.)
+        *
+        * @param array|object $array
+        */
+       public function __construct( $array = [] ) {
+               if ( is_array( $array ) ) {
+                       $this->array = $array;
+               } elseif ( is_object( $array ) ) {
+                       $this->array = get_object_vars( $array );
+               } else {
+                       throw new InvalidArgumentException( __METHOD__ . ' requires an array or object' );
+               }
+
+               $this->rewind();
+       }
+
+        public function current() {
+               return current( $this->array );
+        }
+
+        public function key() {
+               return key( $this->array );
+        }
+
+        public function next() {
+               prev( $this->array );
+        }
+
+        public function rewind() {
+               end( $this->array );
+        }
+
+        public function valid() {
+               return key( $this->array ) !== null;
+        }
+
+        public function count() {
+               return count( $this->array );
+        }
+}
diff --git a/includes/libs/objectcache/RESTBagOStuff.php b/includes/libs/objectcache/RESTBagOStuff.php
new file mode 100644 (file)
index 0000000..9fc3fe1
--- /dev/null
@@ -0,0 +1,135 @@
+<?php
+
+/**
+ * Interface to key-value storage behind an HTTP server.
+ *
+ * Uses URL of the form "baseURL/{KEY}" to store, fetch, and delete values.
+ *
+ * E.g., when base URL is `/v1/sessions/`, then the store would do:
+ *
+ * `PUT /v1/sessions/12345758`
+ *
+ * and fetch would do:
+ *
+ * `GET /v1/sessions/12345758`
+ *
+ * delete would do:
+ *
+ * `DELETE /v1/sessions/12345758`
+ *
+ * Configure with:
+ *
+ * @code
+ * $wgObjectCaches['sessions'] = array(
+ *     'class' => 'RESTBagOStuff',
+ *     'url' => 'http://localhost:7231/wikimedia.org/v1/sessions/'
+ * );
+ * @endcode
+ */
+class RESTBagOStuff extends BagOStuff {
+
+       /**
+        * @var MultiHttpClient
+        */
+       private $client;
+
+       /**
+        * REST URL to use for storage.
+        * @var string
+        */
+       private $url;
+
+       public function __construct( $params ) {
+               if ( empty( $params['url'] ) ) {
+                       throw new InvalidArgumentException( 'URL parameter is required' );
+               }
+               parent::__construct( $params );
+               if ( empty( $params['client'] ) ) {
+                       $this->client = new MultiHttpClient( [] );
+               } else {
+                       $this->client = $params['client'];
+               }
+               // Make sure URL ends with /
+               $this->url = rtrim( $params['url'], '/' ) . '/';
+       }
+
+       /**
+        * @param string  $key
+        * @param integer $flags Bitfield of BagOStuff::READ_* constants [optional]
+        * @return mixed Returns false on failure and if the item does not exist
+        */
+       protected function doGet( $key, $flags = 0 ) {
+               $req = [
+                       'method' => 'GET',
+                   'url' => $this->url . rawurlencode( $key ),
+
+               ];
+               list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->client->run( $req );
+               if ( $rcode === 200 ) {
+                       if ( is_string( $rbody ) ) {
+                               return unserialize( $rbody );
+                       }
+                       return false;
+               }
+               if ( $rcode === 0 || ( $rcode >= 400 && $rcode != 404 ) ) {
+                       return $this->handleError( "Failed to fetch $key", $rcode, $rerr );
+               }
+               return false;
+       }
+
+       /**
+        * Handle storage error
+        * @param string $msg Error message
+        * @param int    $rcode Error code from client
+        * @param string $rerr Error message from client
+        * @return false
+        */
+       protected function handleError( $msg, $rcode, $rerr ) {
+               $this->logger->error( "$msg : ({code}) {error}", [
+                       'code' => $rcode,
+                       'error' => $rerr
+               ] );
+               $this->setLastError( $rcode === 0 ? self::ERR_UNREACHABLE : self::ERR_UNEXPECTED );
+               return false;
+       }
+
+       /**
+        * Set an item
+        *
+        * @param string $key
+        * @param mixed  $value
+        * @param int    $exptime Either an interval in seconds or a unix timestamp for expiry
+        * @param int    $flags Bitfield of BagOStuff::WRITE_* constants
+        * @return bool Success
+        */
+       public function set( $key, $value, $exptime = 0, $flags = 0 ) {
+               $req = [
+                       'method' => 'PUT',
+                       'url' => $this->url . rawurlencode( $key ),
+                       'body' => serialize( $value )
+               ];
+               list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->client->run( $req );
+               if ( $rcode === 200 || $rcode === 201 ) {
+                       return true;
+               }
+               return $this->handleError( "Failed to store $key", $rcode, $rerr );
+       }
+
+       /**
+        * Delete an item.
+        *
+        * @param string $key
+        * @return bool True if the item was deleted or not found, false on failure
+        */
+       public function delete( $key ) {
+               $req = [
+                       'method' => 'DELETE',
+                       'url' => $this->url . rawurlencode( $key ),
+               ];
+               list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->client->run( $req );
+               if ( $rcode === 200 || $rcode === 204 || $rcode === 205 ) {
+                       return true;
+               }
+               return $this->handleError( "Failed to delete $key", $rcode, $rerr );
+       }
+}
index 45713cc..b5d014f 100644 (file)
@@ -759,9 +759,10 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         * @param array $opts Options map:
         *   - checkKeys: List of "check" keys. The key at $key will be seen as invalid when either
         *      touchCheckKey() or resetCheckKey() is called on any of these keys.
-        *   - lowTTL: Consider pre-emptive updates when the current TTL (sec) of the key is less than
-        *      this. It becomes more likely over time, becoming a certainty once the key is expired.
-        *      Default: WANObjectCache::LOW_TTL seconds.
+        *      Default: [].
+        *   - lowTTL: Consider pre-emptive updates when the current TTL (seconds) of the key is less
+        *      than this. It becomes more likely over time, becoming certain once the key is expired.
+        *      Default: WANObjectCache::LOW_TTL.
         *   - lockTSE: If the key is tombstoned or expired (by checkKeys) less than this many seconds
         *      ago, then try to have a single thread handle cache regeneration at any given time.
         *      Other threads will try to use stale values if possible. If, on miss, the time since
@@ -770,9 +771,14 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         *      higher this is set, the higher the worst-case staleness can be.
         *      Use WANObjectCache::TSE_NONE to disable this logic.
         *      Default: WANObjectCache::TSE_NONE.
-        *   - pcTTL: Process cache the value in this PHP instance with this TTL. This avoids
-        *      network I/O when a key is read several times. This will not cache if the callback
-        *      returns false however. Note that any purges will not be seen while process cached;
+        *   - busyValue: If no value exists and another thread is currently regenerating it, use this
+        *      as a fallback value (or a callback to generate such a value). This assures that cache
+        *      stampedes cannot happen if the value falls out of cache. This can be used as insurance
+        *      against cache regeneration becoming very slow for some reason (greater than the TTL).
+        *      Default: null.
+        *   - pcTTL: Process cache the value in this PHP instance for this many seconds. This avoids
+        *      network I/O when a key is read several times. This will not cache when the callback
+        *      returns false, however. Note that any purges will not be seen while process cached;
         *      since the callback should use slave DBs and they may be lagged or have snapshot
         *      isolation anyway, this should not typically matter.
         *      Default: WANObjectCache::TTL_UNCACHEABLE.
@@ -782,6 +788,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         *      however, as this reduces compatibility (due to serialization).
         *      Default: null.
         * @return mixed Value found or written to the key
+        * @note Callable type hints are not used to avoid class-autoloading
         */
        final public function getWithSetCallback( $key, $ttl, $callback, array $opts = [] ) {
                $pcTTL = isset( $opts['pcTTL'] ) ? $opts['pcTTL'] : self::TTL_UNCACHEABLE;
@@ -856,11 +863,13 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         *   - minTime: Treat values older than this UNIX timestamp as not existing. Default: null.
         * @param float &$asOf Cache generation timestamp of returned value [returned]
         * @return mixed
+        * @note Callable type hints are not used to avoid class-autoloading
         */
        protected function doGetWithSetCallback( $key, $ttl, $callback, array $opts, &$asOf = null ) {
                $lowTTL = isset( $opts['lowTTL'] ) ? $opts['lowTTL'] : min( self::LOW_TTL, $ttl );
                $lockTSE = isset( $opts['lockTSE'] ) ? $opts['lockTSE'] : self::TSE_NONE;
                $checkKeys = isset( $opts['checkKeys'] ) ? $opts['checkKeys'] : [];
+               $busyValue = isset( $opts['busyValue'] ) ? $opts['busyValue'] : null;
                $minTime = isset( $opts['minTime'] ) ? $opts['minTime'] : 0.0;
                $versioned = isset( $opts['version'] );
 
@@ -882,11 +891,13 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                $isTombstone = ( $curTTL !== null && $value === false );
                // Assume a key is hot if requested soon after invalidation
                $isHot = ( $curTTL !== null && $curTTL <= 0 && abs( $curTTL ) <= $lockTSE );
+               // Use the mutex if there is no value and a busy fallback is given
+               $checkBusy = ( $busyValue !== null && $value === false );
                // Decide whether a single thread should handle regenerations.
                // This avoids stampedes when $checkKeys are bumped and when preemptive
                // renegerations take too long. It also reduces regenerations while $key
                // is tombstoned. This balances cache freshness with avoiding DB load.
-               $useMutex = ( $isHot || ( $isTombstone && $lockTSE > 0 ) );
+               $useMutex = ( $isHot || ( $isTombstone && $lockTSE > 0 ) || $checkBusy );
 
                $lockAcquired = false;
                if ( $useMutex ) {
@@ -902,12 +913,16 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                                // For hot keys, either another thread has the lock or the lock failed;
                                // use the INTERIM value from the last thread that regenerated it.
                                $wrapped = $this->cache->get( self::INTERIM_KEY_PREFIX . $key );
-                               $value = $this->unwrap( $wrapped, microtime( true ) );
+                               list( $value ) = $this->unwrap( $wrapped, microtime( true ) );
                                if ( $value !== false && $this->isValid( $value, $versioned, $asOf, $minTime ) ) {
                                        $asOf = $wrapped[self::FLD_TIME];
 
                                        return $value;
                                }
+                               // Use the busy fallback value if nothing else
+                               if ( $busyValue !== null ) {
+                                       return is_callable( $busyValue ) ? $busyValue() : $busyValue;
+                               }
                        }
                }
 
@@ -921,7 +936,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                $asOf = microtime( true );
                // When delete() is called, writes are write-holed by the tombstone,
                // so use a special INTERIM key to pass the new value around threads.
-               if ( $useMutex && $value !== false && $ttl >= 0 ) {
+               if ( ( $isTombstone && $lockTSE > 0 ) && $value !== false && $ttl >= 0 ) {
                        $tempTTL = max( 1, (int)$lockTSE ); // set() expects seconds
                        $wrapped = $this->wrap( $value, $tempTTL, $asOf );
                        $this->cache->set( self::INTERIM_KEY_PREFIX . $key, $wrapped, $tempTTL );
index 432dcb2..c203a16 100644 (file)
@@ -25,8 +25,10 @@ use DummyLinker;
 use Hooks;
 use Html;
 use HtmlArmor;
+use LinkCache;
 use Linker;
 use MediaWiki\MediaWikiServices;
+use MWNamespace;
 use Sanitizer;
 use Title;
 use TitleFormatter;
@@ -34,6 +36,7 @@ use TitleFormatter;
 /**
  * Class that generates HTML <a> links for pages.
  *
+ * @see https://www.mediawiki.org/wiki/Manual:LinkRenderer
  * @since 1.28
  */
 class LinkRenderer {
@@ -62,6 +65,11 @@ class LinkRenderer {
         */
        private $titleFormatter;
 
+       /**
+        * @var LinkCache
+        */
+       private $linkCache;
+
        /**
         * Whether to run the legacy Linker hooks
         *
@@ -71,9 +79,11 @@ class LinkRenderer {
 
        /**
         * @param TitleFormatter $titleFormatter
+        * @param LinkCache $linkCache
         */
-       public function __construct( TitleFormatter $titleFormatter ) {
+       public function __construct( TitleFormatter $titleFormatter, LinkCache $linkCache ) {
                $this->titleFormatter = $titleFormatter;
+               $this->linkCache = $linkCache;
        }
 
        /**
@@ -225,7 +235,7 @@ class LinkRenderer {
        }
 
        /**
-        * If you have already looked up the proper CSS classes using Linker::getLinkColour()
+        * If you have already looked up the proper CSS classes using LinkRenderer::getLinkClasses()
         * or some other method, use this to avoid looking it up again.
         *
         * @param LinkTarget $target
@@ -276,7 +286,7 @@ class LinkRenderer {
                if ( $target->isExternal() ) {
                        $classes[] = 'extiw';
                }
-               $colour = Linker::getLinkColour( $target, $this->stubThreshold );
+               $colour = $this->getLinkClasses( $target );
                if ( $colour !== '' ) {
                        $classes[] = $colour;
                }
@@ -391,16 +401,13 @@ class LinkRenderer {
        private function getLinkURL( LinkTarget $target, array $query = [] ) {
                // TODO: Use a LinkTargetResolver service instead of Title
                $title = Title::newFromLinkTarget( $target );
-               $proto = $this->expandUrls !== false
-                       ? $this->expandUrls
-                       : PROTO_RELATIVE;
                if ( $this->forceArticlePath ) {
                        $realQuery = $query;
                        $query = [];
                } else {
                        $realQuery = [];
                }
-               $url = $title->getLinkURL( $query, false, $proto );
+               $url = $title->getLinkURL( $query, false, $this->expandUrls );
 
                if ( $this->forceArticlePath && $realQuery ) {
                        $url = wfAppendQuery( $url, $realQuery );
@@ -445,4 +452,30 @@ class LinkRenderer {
                return $ret;
        }
 
+       /**
+        * Return the CSS classes of a known link
+        *
+        * @param LinkTarget $target
+        * @return string CSS class
+        */
+       public function getLinkClasses( LinkTarget $target ) {
+               // Make sure the target is in the cache
+               $id = $this->linkCache->addLinkObj( $target );
+               if ( $id == 0 ) {
+                       // Doesn't exist
+                       return '';
+               }
+
+               if ( $this->linkCache->getGoodLinkFieldObj( $target, 'redirect' ) ) {
+                       # Page is a redirect
+                       return 'mw-redirect';
+               } elseif ( $this->stubThreshold > 0 && MWNamespace::isContent( $target->getNamespace() )
+                       && $this->linkCache->getGoodLinkFieldObj( $target, 'length' ) < $this->stubThreshold
+               ) {
+                       # Page is a stub
+                       return 'stub';
+               }
+
+               return '';
+       }
 }
index 7124be1..b7c05c2 100644 (file)
@@ -21,6 +21,7 @@
  */
 namespace MediaWiki\Linker;
 
+use LinkCache;
 use TitleFormatter;
 use User;
 
@@ -35,18 +36,25 @@ class LinkRendererFactory {
         */
        private $titleFormatter;
 
+       /**
+        * @var LinkCache
+        */
+       private $linkCache;
+
        /**
         * @param TitleFormatter $titleFormatter
+        * @param LinkCache $linkCache
         */
-       public function __construct( TitleFormatter $titleFormatter ) {
+       public function __construct( TitleFormatter $titleFormatter, LinkCache $linkCache ) {
                $this->titleFormatter = $titleFormatter;
+               $this->linkCache = $linkCache;
        }
 
        /**
         * @return LinkRenderer
         */
        public function create() {
-               return new LinkRenderer( $this->titleFormatter );
+               return new LinkRenderer( $this->titleFormatter, $this->linkCache );
        }
 
        /**
index f392bd1..78b0296 100644 (file)
@@ -418,12 +418,12 @@ class FormatMetadata extends ContextSource {
 
                                        case 'Flash':
                                                $flashDecode = [
-                                                       'fired' => $val & bindec( '00000001' ),
-                                                       'return' => ( $val & bindec( '00000110' ) ) >> 1,
-                                                       'mode' => ( $val & bindec( '00011000' ) ) >> 3,
-                                                       'function' => ( $val & bindec( '00100000' ) ) >> 5,
-                                                       'redeye' => ( $val & bindec( '01000000' ) ) >> 6,
-//                                             'reserved' => ($val & bindec( '10000000' )) >> 7,
+                                                       'fired' => $val & 0b00000001,
+                                                       'return' => ( $val & 0b00000110 ) >> 1,
+                                                       'mode' => ( $val & 0b00011000 ) >> 3,
+                                                       'function' => ( $val & 0b00100000 ) >> 5,
+                                                       'redeye' => ( $val & 0b01000000 ) >> 6,
+                                                       // 'reserved' => ( $val & 0b10000000 ) >> 7,
                                                ];
                                                $flashMsgs = [];
                                                # We do not need to handle unknown values since all are used.
index 6b0f887..0ebfab7 100644 (file)
@@ -43,7 +43,7 @@ abstract class MediaHandler {
         * Get a MediaHandler for a given MIME type from the instance cache
         *
         * @param string $type
-        * @return MediaHandler
+        * @return MediaHandler|bool
         */
        static function getHandler( $type ) {
                global $wgMediaHandlers;
index 9176b54..b3a555a 100644 (file)
@@ -421,8 +421,10 @@ class ThumbnailImage extends MediaTransformOutput {
                }
 
                // Additional densities for responsive images, if specified.
-               if ( !empty( $this->responsiveUrls ) ) {
-                       $attribs['srcset'] = Html::srcSet( $this->responsiveUrls );
+               // If any of these urls is the same as src url, it'll be excluded.
+               $responsiveUrls = array_diff( $this->responsiveUrls, [ $this->url ] );
+               if ( !empty( $responsiveUrls ) ) {
+                       $attribs['srcset'] = Html::srcSet( $responsiveUrls );
                }
 
                Hooks::run( 'ThumbnailBeforeProduceHTML', [ $this, &$attribs, &$linkAttribs ] );
index eccf36f..2a6f88c 100644 (file)
@@ -467,7 +467,7 @@ class Article implements Page {
         * page of the given title.
         */
        public function view() {
-               global $wgUseFileCache, $wgUseETag, $wgDebugToolbar, $wgMaxRedirects;
+               global $wgUseFileCache, $wgDebugToolbar, $wgMaxRedirects;
 
                # Get variables from query string
                # As side effect this will load the revision and update the title
@@ -520,10 +520,6 @@ class Article implements Page {
 
                # Try client and file cache
                if ( !$wgDebugToolbar && $oldid === 0 && $this->mPage->checkTouched() ) {
-                       if ( $wgUseETag ) {
-                               $outputPage->setETag( $parserCache->getETag( $this->mPage, $parserOptions ) );
-                       }
-
                        # Use the greatest of the page's timestamp or the timestamp of any
                        # redirect in the chain (bug 67849)
                        $timestamp = $this->mPage->getTouched();
@@ -2601,8 +2597,8 @@ class Article implements Page {
         * Call to WikiPage function for backwards compatibility.
         * @see WikiPage::updateCategoryCounts
         */
-       public function updateCategoryCounts( array $added, array $deleted ) {
-               return $this->mPage->updateCategoryCounts( $added, $deleted );
+       public function updateCategoryCounts( array $added, array $deleted, $id = 0 ) {
+               return $this->mPage->updateCategoryCounts( $added, $deleted, $id );
        }
 
        /**
index 106911c..1396685 100644 (file)
@@ -222,11 +222,12 @@ class ImagePage extends Article {
                                $out->addStyle( $css );
                        }
                }
-               // always show the local local Filepage.css, bug 29277
-               $out->addModuleStyles( 'filepage' );
 
-               // Add MediaWiki styles for a file page
-               $out->addModuleStyles( 'mediawiki.action.view.filepage' );
+               $out->addModuleStyles( [
+                       'filepage', // always show the local local Filepage.css, bug 29277
+                       'mediawiki.action.view.filepage', // Add MediaWiki styles for a file page
+               ] );
+
        }
 
        /**
index 13e5f14..e7352af 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use \MediaWiki\Logger\LoggerFactory;
+
 /**
  * Class representing a MediaWiki article and history.
  *
@@ -1101,15 +1103,10 @@ class WikiPage implements Page, IDBAccessObject {
                        return false;
                }
 
-               $title = $this->mTitle;
-               wfGetDB( DB_MASTER )->onTransactionIdle( function() use ( $title ) {
-                       // Invalidate the cache in auto-commit mode
-                       $title->invalidateCache();
-               } );
-
+               $this->mTitle->invalidateCache();
                // Send purge after above page_touched update was committed
                DeferredUpdates::addUpdate(
-                       new CdnCacheUpdate( $title->getCdnUrls() ),
+                       new CdnCacheUpdate( $this->mTitle->getCdnUrls() ),
                        DeferredUpdates::PRESEND
                );
 
@@ -1480,6 +1477,8 @@ class WikiPage implements Page, IDBAccessObject {
         *          Mark the edit a "bot" edit regardless of user rights
         *      EDIT_AUTOSUMMARY
         *          Fill in blank summaries with generated text where possible
+        *      EDIT_INTERNAL
+        *          Signal that the page retrieve/save cycle happened entirely in this request.
         *
         * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the
         * article will be detected. If EDIT_UPDATE is specified and the article
@@ -1540,6 +1539,8 @@ class WikiPage implements Page, IDBAccessObject {
         *          Mark the edit a "bot" edit regardless of user rights
         *      EDIT_AUTOSUMMARY
         *          Fill in blank summaries with generated text where possible
+        *      EDIT_INTERNAL
+        *          Signal that the page retrieve/save cycle happened entirely in this request.
         *
         * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the
         * article will be detected. If EDIT_UPDATE is specified and the article
@@ -1627,8 +1628,14 @@ class WikiPage implements Page, IDBAccessObject {
                        $summary = $handler->getAutosummary( $old_content, $content, $flags );
                }
 
+               // Avoid statsd noise and wasted cycles check the edit stash (T136678)
+               if ( ( $flags & EDIT_INTERNAL ) || ( $flags & EDIT_FORCE_BOT ) ) {
+                       $useCache = false;
+               } else {
+                       $useCache = true;
+               }
+
                // Get the pre-save transform content and final parser output
-               $useCache = !( $flags & EDIT_FORCE_BOT ); // avoid statsd noise (T136678)
                $editInfo = $this->prepareContentForEdit( $content, null, $user, $serialFormat, $useCache );
                $pstContent = $editInfo->pstContent; // Content object
                $meta = [
@@ -1784,8 +1791,12 @@ class WikiPage implements Page, IDBAccessObject {
                        $this->mTimestamp = $now;
                } else {
                        // Bug 32948: revision ID must be set to page {{REVISIONID}} and
-                       // related variables correctly
+                       // related variables correctly. Likewise for {{REVISIONUSER}} (T135261).
                        $revision->setId( $this->getLatest() );
+                       $revision->setUserIdAndName(
+                               $this->getUser( Revision::RAW ),
+                               $this->getUserText( Revision::RAW )
+                       );
                }
 
                if ( $changed ) {
@@ -1799,30 +1810,31 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                // Do secondary updates once the main changes have been committed...
-               $that = $this;
-               $dbw->onTransactionIdle(
-                       function () use (
-                               $dbw, &$that, $revision, &$user, $content, $summary, &$flags,
-                               $changed, $meta, &$status
-                       ) {
-                               // Do per-page updates in a transaction
-                               $dbw->setFlag( DBO_TRX );
-                               // Update links tables, site stats, etc.
-                               $that->doEditUpdates(
-                                       $revision,
-                                       $user,
-                                       [
-                                               'changed' => $changed,
-                                               'oldcountable' => $meta['oldCountable'],
-                                               'oldrevision' => $meta['oldRevision']
-                                       ]
-                               );
-                               // Trigger post-save hook
-                               $params = [ &$that, &$user, $content, $summary, $flags & EDIT_MINOR,
-                                       null, null, &$flags, $revision, &$status, $meta['baseRevId'] ];
-                               ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $params );
-                               Hooks::run( 'PageContentSaveComplete', $params );
-                       }
+               DeferredUpdates::addUpdate(
+                       new AtomicSectionUpdate(
+                               $dbw,
+                               __METHOD__,
+                               function () use (
+                                       $revision, &$user, $content, $summary, &$flags,
+                                       $changed, $meta, &$status
+                               ) {
+                                       // Update links tables, site stats, etc.
+                                       $this->doEditUpdates(
+                                               $revision,
+                                               $user,
+                                               [
+                                                       'changed' => $changed,
+                                                       'oldcountable' => $meta['oldCountable'],
+                                                       'oldrevision' => $meta['oldRevision']
+                                               ]
+                                       );
+                                       // Trigger post-save hook
+                                       $params = [ &$this, &$user, $content, $summary, $flags & EDIT_MINOR,
+                                               null, null, &$flags, $revision, &$status, $meta['baseRevId'] ];
+                                       ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $params );
+                                       Hooks::run( 'PageContentSaveComplete', $params );
+                               }
+                       )
                );
 
                return $status;
@@ -1927,26 +1939,27 @@ class WikiPage implements Page, IDBAccessObject {
                $status->value['revision'] = $revision;
 
                // Do secondary updates once the main changes have been committed...
-               $that = $this;
-               $dbw->onTransactionIdle(
-                       function () use (
-                               &$that, $dbw, $revision, &$user, $content, $summary, &$flags, $meta, &$status
-                       ) {
-                               // Do per-page updates in a transaction
-                               $dbw->setFlag( DBO_TRX );
-                               // Update links, etc.
-                               $that->doEditUpdates( $revision, $user, [ 'created' => true ] );
-                               // Trigger post-create hook
-                               $params = [ &$that, &$user, $content, $summary,
-                                       $flags & EDIT_MINOR, null, null, &$flags, $revision ];
-                               ContentHandler::runLegacyHooks( 'ArticleInsertComplete', $params );
-                               Hooks::run( 'PageContentInsertComplete', $params );
-                               // Trigger post-save hook
-                               $params = array_merge( $params, [ &$status, $meta['baseRevId'] ] );
-                               ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $params );
-                               Hooks::run( 'PageContentSaveComplete', $params );
+               DeferredUpdates::addUpdate(
+                       new AtomicSectionUpdate(
+                               $dbw,
+                               __METHOD__,
+                               function () use (
+                                       $revision, &$user, $content, $summary, &$flags, $meta, &$status
+                               ) {
+                                       // Update links, etc.
+                                       $this->doEditUpdates( $revision, $user, [ 'created' => true ] );
+                                       // Trigger post-create hook
+                                       $params = [ &$this, &$user, $content, $summary,
+                                               $flags & EDIT_MINOR, null, null, &$flags, $revision ];
+                                       ContentHandler::runLegacyHooks( 'ArticleInsertComplete', $params );
+                                       Hooks::run( 'PageContentInsertComplete', $params );
+                                       // Trigger post-save hook
+                                       $params = array_merge( $params, [ &$status, $meta['baseRevId'] ] );
+                                       ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $params );
+                                       Hooks::run( 'PageContentSaveComplete', $params );
 
-                       }
+                               }
+                       )
                );
 
                return $status;
@@ -2061,7 +2074,7 @@ class WikiPage implements Page, IDBAccessObject {
                } else {
                        $edit->timestamp = wfTimestampNow();
                }
-               // @note: $cachedEdit is not used if the rev ID was referenced in the text
+               // @note: $cachedEdit is safely not used if the rev ID was referenced in the text
                $edit->revid = $revid;
 
                if ( $cachedEdit ) {
@@ -2092,6 +2105,16 @@ class WikiPage implements Page, IDBAccessObject {
                                                }
                                        }
                                );
+                       } else {
+                               // Try to avoid a second parse if {{REVISIONID}} is used
+                               $edit->popts->setSpeculativeRevIdCallback( function () {
+                                       return 1 + (int)wfGetDB( DB_MASTER )->selectField(
+                                               'revision',
+                                               'MAX(rev_id)',
+                                               [],
+                                               __METHOD__
+                                       );
+                               } );
                        }
                        $edit->output = $edit->pstContent
                                ? $edit->pstContent->getParserOutput( $this->mTitle, $revid, $edit->popts )
@@ -2154,17 +2177,32 @@ class WikiPage implements Page, IDBAccessObject {
                ];
                $content = $revision->getContent();
 
-               // Parse the text
-               // Be careful not to do pre-save transform twice: $text is usually
-               // already pre-save transformed once.
-               if ( !$this->mPreparedEdit || $this->mPreparedEdit->output->getFlag( 'vary-revision' ) ) {
-                       wfDebug( __METHOD__ . ": No prepared edit or vary-revision is set...\n" );
-                       $editInfo = $this->prepareContentForEdit( $content, $revision, $user );
+               $logger = LoggerFactory::getInstance( 'SaveParse' );
+
+               // See if the parser output before $revision was inserted is still valid
+               $editInfo = false;
+               if ( !$this->mPreparedEdit ) {
+                       $logger->debug( __METHOD__ . ": No prepared edit...\n" );
+               } elseif ( $this->mPreparedEdit->output->getFlag( 'vary-revision' ) ) {
+                       $logger->info( __METHOD__ . ": Prepared edit has vary-revision...\n" );
+               } elseif ( $this->mPreparedEdit->output->getFlag( 'vary-revision-id' )
+                       && $this->mPreparedEdit->output->getSpeculativeRevIdUsed() !== $revision->getId()
+               ) {
+                       $logger->info( __METHOD__ . ": Prepared edit has vary-revision-id with wrong ID...\n" );
+               } elseif ( $this->mPreparedEdit->output->getFlag( 'vary-user' ) && !$options['changed'] ) {
+                       $logger->info( __METHOD__ . ": Prepared edit has vary-user and is null...\n" );
                } else {
-                       wfDebug( __METHOD__ . ": No vary-revision, using prepared edit...\n" );
+                       wfDebug( __METHOD__ . ": Using prepared edit...\n" );
                        $editInfo = $this->mPreparedEdit;
                }
 
+               if ( !$editInfo ) {
+                       // Parse the text again if needed. Be careful not to do pre-save transform twice:
+                       // $text is usually already pre-save transformed once. Avoid using the edit stash
+                       // as any prepared content from there or in doEditContent() was already rejected.
+                       $editInfo = $this->prepareContentForEdit( $content, $revision, $user, null, false );
+               }
+
                // Save it to the parser cache.
                // Make sure the cache time matches page_touched to avoid double parsing.
                ParserCache::singleton()->save(
@@ -3142,7 +3180,7 @@ class WikiPage implements Page, IDBAccessObject {
                $summary = $wgContLang->truncate( $summary, 255 );
 
                // Save
-               $flags = EDIT_UPDATE;
+               $flags = EDIT_UPDATE | EDIT_INTERNAL;
 
                if ( $guser->isAllowed( 'minoredit' ) ) {
                        $flags |= EDIT_MINOR;
@@ -3238,6 +3276,14 @@ class WikiPage implements Page, IDBAccessObject {
                $title->touchLinks();
                $title->purgeSquid();
                $title->deleteTitleProtection();
+
+               if ( $title->getNamespace() == NS_CATEGORY ) {
+                       // Load the Category object, which will schedule a job to create
+                       // the category table row if necessary. Checking a slave is ok
+                       // here, in the worst case it'll run an unnecessary recount job on
+                       // a category that probably doesn't have many members.
+                       Category::newFromTitle( $title )->getID();
+               }
        }
 
        /**
@@ -3404,16 +3450,16 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @param array $added The names of categories that were added
         * @param array $deleted The names of categories that were deleted
+        * @param integer $id Page ID (this should be the original deleted page ID)
         */
-       public function updateCategoryCounts( array $added, array $deleted ) {
-               $that = $this;
-               $method = __METHOD__;
+       public function updateCategoryCounts( array $added, array $deleted, $id = 0 ) {
+               $id = $id ?: $this->getId();
                $dbw = wfGetDB( DB_MASTER );
-
+               $method = __METHOD__;
                // Do this at the end of the commit to reduce lock wait timeouts
                $dbw->onTransactionPreCommitOrIdle(
-                       function () use ( $dbw, $that, $method, $added, $deleted ) {
-                               $ns = $that->getTitle()->getNamespace();
+                       function () use ( $dbw, $added, $deleted, $id, $method ) {
+                               $ns = $this->getTitle()->getNamespace();
 
                                $addFields = [ 'cat_pages = cat_pages + 1' ];
                                $removeFields = [ 'cat_pages = cat_pages - 1' ];
@@ -3430,7 +3476,7 @@ class WikiPage implements Page, IDBAccessObject {
                                                'category',
                                                'cat_title',
                                                [ 'cat_title' => $added ],
-                                               __METHOD__
+                                               $method
                                        );
 
                                        // For category rows that already exist, do a plain
@@ -3441,7 +3487,7 @@ class WikiPage implements Page, IDBAccessObject {
                                                        'category',
                                                        $addFields,
                                                        [ 'cat_title' => $existingAdded ],
-                                                       __METHOD__
+                                                       $method
                                                );
                                        }
 
@@ -3477,12 +3523,28 @@ class WikiPage implements Page, IDBAccessObject {
 
                                foreach ( $added as $catName ) {
                                        $cat = Category::newFromName( $catName );
-                                       Hooks::run( 'CategoryAfterPageAdded', [ $cat, $that ] );
+                                       Hooks::run( 'CategoryAfterPageAdded', [ $cat, $this ] );
                                }
 
                                foreach ( $deleted as $catName ) {
                                        $cat = Category::newFromName( $catName );
-                                       Hooks::run( 'CategoryAfterPageRemoved', [ $cat, $that ] );
+                                       Hooks::run( 'CategoryAfterPageRemoved', [ $cat, $this, $id ] );
+                               }
+
+                               // Refresh counts on categories that should be empty now, to
+                               // trigger possible deletion. Check master for the most
+                               // up-to-date cat_pages.
+                               if ( count( $deleted ) ) {
+                                       $rows = $dbw->select(
+                                               'category',
+                                               [ 'cat_id', 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files' ],
+                                               [ 'cat_title' => $deleted, 'cat_pages <= 0' ],
+                                               $method
+                                       );
+                                       foreach ( $rows as $row ) {
+                                               $cat = Category::newFromRow( $row );
+                                               $cat->refreshCounts();
+                                       }
                                }
                        }
                );
index 2451390..05bcebe 100644 (file)
@@ -79,12 +79,15 @@ class CacheTime {
 
        /**
         * Sets the number of seconds after which this object should expire.
+        *
         * This value is used with the ParserCache.
         * If called with a value greater than the value provided at any previous call,
         * the new call has no effect. The value returned by getCacheExpiry is smaller
         * or equal to the smallest number that was provided as an argument to
         * updateCacheExpiry().
         *
+        * Avoid using 0 if at all possible. Consider JavaScript for highly dynamic content.
+        *
         * @param int $seconds
         */
        public function updateCacheExpiry( $seconds ) {
index 1c6f404..b34ac1f 100644 (file)
@@ -288,7 +288,6 @@ class LinkHolderArray {
                $linkCache = LinkCache::singleton();
                $output = $this->parent->getOutput();
                $linkRenderer = $this->parent->getLinkRenderer();
-               $threshold = $linkRenderer->getStubThreshold();
 
                $dbr = wfGetDB( DB_SLAVE );
 
@@ -321,7 +320,7 @@ class LinkHolderArray {
                                } else {
                                        $id = $linkCache->getGoodLinkID( $pdbk );
                                        if ( $id != 0 ) {
-                                               $colours[$pdbk] = Linker::getLinkColour( $title, $threshold );
+                                               $colours[$pdbk] = $linkRenderer->getLinkClasses( $title );
                                                $output->addLink( $title, $id );
                                                $linkcolour_ids[$id] = $pdbk;
                                        } elseif ( $linkCache->isBadLink( $pdbk ) ) {
@@ -353,7 +352,7 @@ class LinkHolderArray {
                                $pdbk = $title->getPrefixedDBkey();
                                $linkCache->addGoodLinkObjFromRow( $title, $s );
                                $output->addLink( $title, $s->page_id );
-                               $colours[$pdbk] = Linker::getLinkColour( $title, $threshold );
+                               $colours[$pdbk] = $linkRenderer->getLinkClasses( $title );
                                // add id to the extension todolist
                                $linkcolour_ids[$s->page_id] = $pdbk;
                        }
@@ -456,7 +455,6 @@ class LinkHolderArray {
                $variantMap = []; // maps $pdbkey_Variant => $keys (of link holders)
                $output = $this->parent->getOutput();
                $linkCache = LinkCache::singleton();
-               $threshold = $this->parent->getOptions()->getStubThreshold();
                $titlesToBeConverted = '';
                $titlesAttrs = [];
 
@@ -549,6 +547,7 @@ class LinkHolderArray {
                        );
 
                        $linkcolour_ids = [];
+                       $linkRenderer = $this->parent->getLinkRenderer();
 
                        // for each found variants, figure out link holders and replace
                        foreach ( $varRes as $s ) {
@@ -575,7 +574,7 @@ class LinkHolderArray {
                                                $entry['pdbk'] = $varPdbk;
 
                                                // set pdbk and colour
-                                               $colours[$varPdbk] = Linker::getLinkColour( $variantTitle, $threshold );
+                                               $colours[$varPdbk] = $linkRenderer->getLinkClasses( $variantTitle );
                                                $linkcolour_ids[$s->page_id] = $pdbk;
                                        }
                                }
index bdf3efb..46ea773 100644 (file)
@@ -51,24 +51,6 @@ class MWTidy {
                return $driver->tidy( $text );
        }
 
-       /**
-        * Get CSS modules needed if HTML from the current driver is to be displayed.
-        *
-        * This is just a migration tool to allow some changes expected as part of
-        * Tidy replacement (T89331) to be exposed on the client side via user
-        * scripts, without actually replacing tidy. See T49673.
-        *
-        * @return array
-        */
-       public static function getModuleStyles() {
-               $driver = self::singleton();
-               if ( $driver && $driver instanceof MediaWiki\Tidy\RaggettBase ) {
-                       return [ 'mediawiki.raggett' ];
-               } else {
-                       return [];
-               }
-       }
-
        /**
         * Check HTML for errors, used if $wgValidateAllHtml = true.
         *
@@ -119,26 +101,42 @@ class MWTidy {
                        } else {
                                return false;
                        }
-                       switch ( $config['driver'] ) {
-                               case 'RaggettInternalHHVM':
-                                       self::$instance = new MediaWiki\Tidy\RaggettInternalHHVM( $config );
-                                       break;
-                               case 'RaggettInternalPHP':
-                                       self::$instance = new MediaWiki\Tidy\RaggettInternalPHP( $config );
-                                       break;
-                               case 'RaggettExternal':
-                                       self::$instance = new MediaWiki\Tidy\RaggettExternal( $config );
-                                       break;
-                               case 'Html5Depurate':
-                                       self::$instance = new MediaWiki\Tidy\Html5Depurate( $config );
-                                       break;
-                               default:
-                                       throw new MWException( "Invalid tidy driver: \"{$config['driver']}\"" );
-                       }
+                       self::$instance = self::factory( $config );
                }
                return self::$instance;
        }
 
+       /**
+        * Create a new Tidy driver object from configuration.
+        * @see $wgTidyConfig
+        * @param array $config
+        * @return TidyDriverBase
+        */
+       public static function factory( array $config ) {
+               switch ( $config['driver'] ) {
+                       case 'RaggettInternalHHVM':
+                               $instance = new MediaWiki\Tidy\RaggettInternalHHVM( $config );
+                               break;
+                       case 'RaggettInternalPHP':
+                               $instance = new MediaWiki\Tidy\RaggettInternalPHP( $config );
+                               break;
+                       case 'RaggettExternal':
+                               $instance = new MediaWiki\Tidy\RaggettExternal( $config );
+                               break;
+                       case 'Html5Depurate':
+                               $instance = new MediaWiki\Tidy\Html5Depurate( $config );
+                               break;
+                       case 'Html5Internal':
+                               $instance = new MediaWiki\Tidy\Html5Internal( $config );
+                               break;
+                       case 'disabled':
+                               return false;
+                       default:
+                               throw new MWException( "Invalid tidy driver: \"{$config['driver']}\"" );
+               }
+               return $instance;
+       }
+
        /**
         * Set the driver to be used. This is for testing.
         * @param TidyDriverBase|false|null $instance
index 116b274..f9eea48 100644 (file)
@@ -501,60 +501,46 @@ class Parser {
                                [ $this->mHighestExpansionDepth, $this->mOptions->getMaxPPExpandDepth() ]
                        );
                        $this->mOutput->setLimitReportData( 'limitreport-expensivefunctioncount',
-                               [ $this->mExpensiveFunctionCount, $this->mOptions->getExpensiveParserFunctionLimit() ]
+                               [ $this->mExpensiveFunctionCount,
+                                       $this->mOptions->getExpensiveParserFunctionLimit() ]
                        );
                        Hooks::run( 'ParserLimitReportPrepare', [ $this, $this->mOutput ] );
 
-                       $limitReport = "NewPP limit report\n";
-                       if ( $wgShowHostnames ) {
-                               $limitReport .= 'Parsed by ' . wfHostname() . "\n";
-                       }
-                       $limitReport .= 'Cached time: ' . $this->mOutput->getCacheTime() . "\n";
-                       $limitReport .= 'Cache expiry: ' . $this->mOutput->getCacheExpiry() . "\n";
-                       $limitReport .= 'Dynamic content: ' .
-                               ( $this->mOutput->hasDynamicContent() ? 'true' : 'false' ) .
-                               "\n";
-
-                       foreach ( $this->mOutput->getLimitReportData() as $key => $value ) {
-                               if ( Hooks::run( 'ParserLimitReportFormat',
-                                       [ $key, &$value, &$limitReport, false, false ]
-                               ) ) {
-                                       $keyMsg = wfMessage( $key )->inLanguage( 'en' )->useDatabase( false );
-                                       $valueMsg = wfMessage( [ "$key-value-text", "$key-value" ] )
-                                               ->inLanguage( 'en' )->useDatabase( false );
-                                       if ( !$valueMsg->exists() ) {
-                                               $valueMsg = new RawMessage( '$1' );
-                                       }
-                                       if ( !$keyMsg->isDisabled() && !$valueMsg->isDisabled() ) {
-                                               $valueMsg->params( $value );
-                                               $limitReport .= "{$keyMsg->text()}: {$valueMsg->text()}\n";
-                                       }
-                               }
-                       }
-                       // Since we're not really outputting HTML, decode the entities and
-                       // then re-encode the things that need hiding inside HTML comments.
-                       $limitReport = htmlspecialchars_decode( $limitReport );
+                       $limitReport = '';
                        Hooks::run( 'ParserLimitReport', [ $this, &$limitReport ] );
+                       if ( $limitReport != '' ) {
+                               // Sanitize for comment. Note '‐' in the replacement is U+2010,
+                               // which looks much like the problematic '-'.
+                               $limitReport = str_replace( [ '-', '&' ], [ '‐', '&amp;' ], $limitReport );
+                               $text .= "\n<!-- \nNewPP limit report\n$limitReport-->\n";
+                       }
 
-                       // Sanitize for comment. Note '‐' in the replacement is U+2010,
-                       // which looks much like the problematic '-'.
-                       $limitReport = str_replace( [ '-', '&' ], [ '‐', '&amp;' ], $limitReport );
-                       $text .= "\n<!-- \n$limitReport-->\n";
-
-                       // Add on template profiling data
+                       // Add on template profiling data in human/machine readable way
                        $dataByFunc = $this->mProfiler->getFunctionStats();
                        uasort( $dataByFunc, function ( $a, $b ) {
                                return $a['real'] < $b['real']; // descending order
                        } );
-                       $profileReport = "Transclusion expansion time report (%,ms,calls,template)\n";
+                       $profileReport = [];
                        foreach ( array_slice( $dataByFunc, 0, 10 ) as $item ) {
-                               $profileReport .= sprintf( "%6.2f%% %8.3f %6d - %s\n",
-                                       $item['%real'], $item['real'], $item['calls'],
-                                       htmlspecialchars( $item['name'] ) );
+                               $profileReport[] = sprintf( "%6.2f%% %8.3f %6d %s",
+                                       $item['%real'], $item['real'], $item['calls'], $item['name'] );
                        }
-                       $text .= "\n<!-- \n$profileReport-->\n";
+                       $this->mOutput->setLimitReportData( 'limitreport-timingprofile', $profileReport );
 
-                       if ( $this->mGeneratedPPNodeCount > $this->mOptions->getMaxGeneratedPPNodeCount() / 10 ) {
+                       // Add other cache related metadata
+                       if ( $wgShowHostnames ) {
+                               $this->mOutput->setLimitReportData( 'cachereport-origin', wfHostname() );
+                       }
+                       $this->mOutput->setLimitReportData( 'cachereport-timestamp',
+                               $this->mOutput->getCacheTime() );
+                       $this->mOutput->setLimitReportData( 'cachereport-ttl',
+                               $this->mOutput->getCacheExpiry() );
+                       $this->mOutput->setLimitReportData( 'cachereport-transientcontent',
+                               $this->mOutput->hasDynamicContent() );
+
+                       if ( $this->mGeneratedPPNodeCount
+                               > $this->mOptions->getMaxGeneratedPPNodeCount() / 10
+                       ) {
                                wfDebugLog( 'generated-pp-node-count', $this->mGeneratedPPNodeCount . ' ' .
                                        $this->mTitle->getPrefixedDBkey() );
                        }
@@ -1264,7 +1250,9 @@ class Parser {
                        $text,
                        [ &$this, 'attributeStripCallback' ],
                        false,
-                       array_keys( $this->mTransparentTagHooks )
+                       array_keys( $this->mTransparentTagHooks ),
+                       [],
+                       [ &$this, 'addTrackingCategory' ]
                );
                Hooks::run( 'InternalParseBeforeLinks', [ &$this, &$text, &$this->mStripState ] );
 
@@ -1353,9 +1341,10 @@ class Parser {
 
                $text = Sanitizer::normalizeCharReferences( $text );
 
-               if ( MWTidy::isEnabled() && $this->mOptions->getTidy() ) {
-                       $text = MWTidy::tidy( $text );
-                       $this->mOutput->addModuleStyles( MWTidy::getModuleStyles() );
+               if ( MWTidy::isEnabled() ) {
+                       if ( $this->mOptions->getTidy() ) {
+                               $text = MWTidy::tidy( $text );
+                       }
                } else {
                        # attempt to sanitize at least some nesting problems
                        # (bug #2702 and quite a few others)
@@ -1470,10 +1459,14 @@ class Parser {
                                ' ' => '',
                                'x' => 'X',
                        ] );
-                       $titleObj = SpecialPage::getTitleFor( 'Booksources', $num );
-                       return '<a href="' .
-                               htmlspecialchars( $titleObj->getLocalURL() ) .
-                               "\" class=\"internal mw-magiclink-isbn\">ISBN $isbn</a>";
+                       return $this->getLinkRenderer()->makeKnownLink(
+                               SpecialPage::getTitleFor( 'Booksources', $num ),
+                               "ISBN $isbn",
+                               [
+                                       'class' => 'internal mw-magiclink-isbn',
+                                       'title' => false // suppress title attribute
+                               ]
+                       );
                } else {
                        return $m[0];
                }
@@ -2296,13 +2289,9 @@ class Parser {
                                                # cloak any absolute URLs inside the image markup, so replaceExternalLinks() won't touch them
                                                $s .= $prefix . $this->armorLinks(
                                                        $this->makeImage( $nt, $text, $holders ) ) . $trail;
-                                       } else {
-                                               $s .= $prefix . $trail;
+                                               continue;
                                        }
-                                       continue;
-                               }
-
-                               if ( $ns == NS_CATEGORY ) {
+                               } elseif ( $ns == NS_CATEGORY ) {
                                        $s = rtrim( $s . "\n" ); # bug 87
 
                                        if ( $wasblank ) {
@@ -2600,9 +2589,13 @@ class Parser {
                        case 'revisionid':
                                # Let the edit saving system know we should parse the page
                                # *after* a revision ID has been assigned.
-                               $this->mOutput->setFlag( 'vary-revision' );
-                               wfDebug( __METHOD__ . ": {{REVISIONID}} used, setting vary-revision...\n" );
+                               $this->mOutput->setFlag( 'vary-revision-id' );
+                               wfDebug( __METHOD__ . ": {{REVISIONID}} used, setting vary-revision-id...\n" );
                                $value = $this->mRevisionId;
+                               if ( !$value && $this->mOptions->getSpeculativeRevIdCallback() ) {
+                                       $value = call_user_func( $this->mOptions->getSpeculativeRevIdCallback() );
+                                       $this->mOutput->setSpeculativeRevIdUsed( $value );
+                               }
                                break;
                        case 'revisionday':
                                # Let the edit saving system know we should parse the page
@@ -2648,16 +2641,12 @@ class Parser {
                                break;
                        case 'revisionuser':
                                # Let the edit saving system know we should parse the page
-                               # *after* a revision ID has been assigned. This is for null edits.
-                               $this->mOutput->setFlag( 'vary-revision' );
-                               wfDebug( __METHOD__ . ": {{REVISIONUSER}} used, setting vary-revision...\n" );
+                               # *after* a revision ID has been assigned for null edits.
+                               $this->mOutput->setFlag( 'vary-user' );
+                               wfDebug( __METHOD__ . ": {{REVISIONUSER}} used, setting vary-user...\n" );
                                $value = $this->getRevisionUser();
                                break;
                        case 'revisionsize':
-                               # Let the edit saving system know we should parse the page
-                               # *after* a revision ID has been assigned. This is for null edits.
-                               $this->mOutput->setFlag( 'vary-revision' );
-                               wfDebug( __METHOD__ . ": {{REVISIONSIZE}} used, setting vary-revision...\n" );
                                $value = $this->getRevisionSize();
                                break;
                        case 'namespace':
@@ -3129,6 +3118,7 @@ class Parser {
                                        && $this->mOptions->getAllowSpecialInclusion()
                                        && $this->ot['html']
                                ) {
+                                       $specialPage = SpecialPageFactory::getPage( $title->getDBkey() );
                                        // Pass the template arguments as URL parameters.
                                        // "uselang" will have no effect since the Language object
                                        // is forced to the one defined in ParserOptions.
@@ -3147,15 +3137,22 @@ class Parser {
                                        $context = new RequestContext;
                                        $context->setTitle( $title );
                                        $context->setRequest( new FauxRequest( $pageArgs ) );
-                                       $context->setUser( $this->getUser() );
+                                       if ( $specialPage && $specialPage->maxIncludeCacheTime() === 0 ) {
+                                               $context->setUser( $this->getUser() );
+                                       } else {
+                                               // If this page is cached, then we better not be per user.
+                                               $context->setUser( User::newFromName( '127.0.0.1', false ) );
+                                       }
                                        $context->setLanguage( $this->mOptions->getUserLangObj() );
-                                       $ret = SpecialPageFactory::capturePath( $title, $context );
+                                       $ret = SpecialPageFactory::capturePath( $title, $context, $this->getLinkRenderer() );
                                        if ( $ret ) {
                                                $text = $context->getOutput()->getHTML();
                                                $this->mOutput->addOutputPageMetadata( $context->getOutput() );
                                                $found = true;
                                                $isHTML = true;
-                                               $this->disableCache();
+                                               if ( $specialPage && $specialPage->maxIncludeCacheTime() !== false ) {
+                                                       $this->mOutput->updateCacheExpiry( $specialPage->maxIncludeCacheTime() );
+                                               }
                                        }
                                } elseif ( MWNamespace::isNonincludable( $title->getNamespace() ) ) {
                                        $found = false; # access denied
@@ -5298,6 +5295,7 @@ class Parser {
        /**
         * Set a flag in the output object indicating that the content is dynamic and
         * shouldn't be cached.
+        * @deprecated since 1.28; use getOutput()->updateCacheExpiry()
         */
        public function disableCache() {
                wfDebug( "Parser output marked as uncacheable.\n" );
@@ -5637,7 +5635,7 @@ class Parser {
                        # will change the size.
                        if ( $revObject ) {
                                $this->mRevisionSize = $revObject->getSize();
-                       } elseif ( $this->ot['wiki'] || $this->mOptions->getIsPreview() ) {
+                       } else {
                                $this->mRevisionSize = $this->mInputSize;
                        }
                }
index 91cd0f4..891c4dd 100644 (file)
@@ -117,17 +117,22 @@ class ParserOptions {
        private $mRemoveComments = true;
 
        /**
-        * Callback for current revision fetching. Used as first argument to call_user_func().
+        * @var callable Callback for current revision fetching; first argument to call_user_func().
         */
        private $mCurrentRevisionCallback =
                [ 'Parser', 'statelessFetchRevision' ];
 
        /**
-        * Callback for template fetching. Used as first argument to call_user_func().
+        * @var callable Callback for template fetching; first argument to call_user_func().
         */
        private $mTemplateCallback =
                [ 'Parser', 'statelessFetchTemplate' ];
 
+       /**
+        * @var callable|null Callback to generate a guess for {{REVISIONID}}
+        */
+       private $mSpeculativeRevIdCallback;
+
        /**
         * Enable limit report in an HTML comment on output
         */
@@ -302,6 +307,11 @@ class ParserOptions {
                return $this->mTemplateCallback;
        }
 
+       /** @since 1.28 */
+       public function getSpeculativeRevIdCallback() {
+               return $this->mSpeculativeRevIdCallback;
+       }
+
        public function getEnableLimitReport() {
                return $this->mEnableLimitReport;
        }
@@ -483,6 +493,11 @@ class ParserOptions {
                return wfSetVar( $this->mCurrentRevisionCallback, $x );
        }
 
+       /** @since 1.28 */
+       public function setSpeculativeRevIdCallback( $x ) {
+               return wfSetVar( $this->mSpeculativeRevIdCallback, $x );
+       }
+
        public function setTemplateCallback( $x ) {
                return wfSetVar( $this->mTemplateCallback, $x );
        }
index 6c7ad4e..f052812 100644 (file)
@@ -188,9 +188,7 @@ class ParserOutput extends CacheTime {
         */
        private $mExtensionData = [];
 
-       /**
-        * @var array $mLimitReportData Parser limit report data.
-        */
+       /** @var array $mLimitReportData Parser limit report data. */
        private $mLimitReportData = [];
 
        /**
@@ -208,6 +206,9 @@ class ParserOutput extends CacheTime {
         */
        private $mFlags = [];
 
+       /** @var integer|null Assumed rev ID for {{REVISIONID}} if no revision is set */
+       private $mSpeculativeRevId;
+
        const EDITSECTION_REGEX =
                '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#';
 
@@ -272,6 +273,19 @@ class ParserOutput extends CacheTime {
                return $text;
        }
 
+       /**
+        * @param integer $id
+        * @since 1.28
+        */
+       public function setSpeculativeRevIdUsed( $id ) {
+               $this->mSpeculativeRevId = $id;
+       }
+
+       /** @since 1.28 */
+       public function getSpeculativeRevIdUsed() {
+               return $this->mSpeculativeRevId;
+       }
+
        public function &getLanguageLinks() {
                return $this->mLanguageLinks;
        }
@@ -351,15 +365,6 @@ class ParserOutput extends CacheTime {
                return $this->mModuleStyles;
        }
 
-       /**
-        * @deprecated since 1.26 Obsolete
-        * @return array
-        */
-       public function getModuleMessages() {
-               wfDeprecated( __METHOD__, '1.26' );
-               return [];
-       }
-
        /** @since 1.23 */
        public function getJsConfigVars() {
                return $this->mJsConfigVars;
@@ -628,14 +633,6 @@ class ParserOutput extends CacheTime {
                $this->mModuleStyles = array_merge( $this->mModuleStyles, (array)$modules );
        }
 
-       /**
-        * @deprecated since 1.26 Use addModules() instead
-        * @param string|array $modules
-        */
-       public function addModuleMessages( $modules ) {
-               wfDeprecated( __METHOD__, '1.26' );
-       }
-
        /**
         * Add one or more variables to be set in mw.config in JavaScript.
         *
@@ -982,24 +979,34 @@ class ParserOutput extends CacheTime {
        /**
         * Sets parser limit report data for a key
         *
-        * The key is used as the prefix for various messages used for formatting:
-        *  - $key: The label for the field in the limit report
-        *  - $key-value-text: Message used to format the value in the "NewPP limit
-        *      report" HTML comment. If missing, uses $key-format.
-        *  - $key-value-html: Message used to format the value in the preview
-        *      limit report table. If missing, uses $key-format.
-        *  - $key-value: Message used to format the value. If missing, uses "$1".
-        *
-        * Note that all values are interpreted as wikitext, and so should be
-        * encoded with htmlspecialchars() as necessary, but should avoid complex
-        * HTML for sanity of display in the "NewPP limit report" comment.
+        * If $value consist of a list of two floats, it will be interpreted as
+        * (actual value, maximum allowed value). The presence of a "-" in $key will cause
+        * the first part of the key to be interpreted as a namespace.
         *
         * @since 1.22
-        * @param string $key Message key
-        * @param mixed $value Appropriate for Message::params()
+        * @param string $key Data key
+        * @param mixed $value Data value One of (float, string, bool, JSON serializable array)
         */
        public function setLimitReportData( $key, $value ) {
-               $this->mLimitReportData[$key] = $value;
+               if ( is_array( $value ) ) {
+                       if ( array_keys( $value ) === [ 0, 1 ]
+                               && is_numeric( $value[0] )
+                               && is_numeric( $value[1] )
+                       ) {
+                               $data = [ 'value' => $value[0], 'limit' => $value[1] ];
+                       } else {
+                               $data = $value;
+                       }
+               } else {
+                       $data = $value;
+               }
+
+               if ( strpos( $key, '-' ) ) {
+                       list( $ns, $name ) = explode( '-', $key, 2 );
+                       $this->mLimitReportData[$ns][$name] = $data;
+               } else {
+                       $this->mLimitReportData[$key] = $data;
+               }
        }
 
        /**
index 0e11967..012288f 100644 (file)
  * Differences from DOM schema:
  *   * attribute nodes are children
  *   * "<h>" nodes that aren't at the top are replaced with <possible-h>
+ *
+ * Nodes are stored in a recursive array data structure. A node store is an
+ * array where each element may be either a scalar (representing a text node)
+ * or a "descriptor", which is a two-element array where the first element is
+ * the node name and the second element is the node store for the children.
+ *
+ * Attributes are represented as children that have a node name starting with
+ * "@", and a single text node child.
+ *
+ * @todo: Consider replacing descriptor arrays with objects of a new class.
+ * Benchmark and measure resulting memory impact.
+ *
  * @ingroup Parser
  */
 // @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
@@ -37,6 +49,7 @@ class Preprocessor_Hash extends Preprocessor {
        public $parser;
 
        const CACHE_PREFIX = 'preprocess-hash';
+       const CACHE_VERSION = 2;
 
        public function __construct( $parser ) {
                $this->parser = $parser;
@@ -65,23 +78,20 @@ class Preprocessor_Hash extends Preprocessor {
                $list = [];
 
                foreach ( $values as $k => $val ) {
-                       $partNode = new PPNode_Hash_Tree( 'part' );
-                       $nameNode = new PPNode_Hash_Tree( 'name' );
-
                        if ( is_int( $k ) ) {
-                               $nameNode->addChild( new PPNode_Hash_Attr( 'index', $k ) );
-                               $partNode->addChild( $nameNode );
+                               $store = [ [ 'part', [
+                                       [ 'name', [ [ '@index', [ $k ] ] ] ],
+                                       [ 'value', [ strval( $val ) ] ],
+                               ] ] ];
                        } else {
-                               $nameNode->addChild( new PPNode_Hash_Text( $k ) );
-                               $partNode->addChild( $nameNode );
-                               $partNode->addChild( new PPNode_Hash_Text( '=' ) );
+                               $store = [ [ 'part', [
+                                       [ 'name', [ strval( $k ) ] ],
+                                       '=',
+                                       [ 'value', [ strval( $val ) ] ],
+                               ] ] ];
                        }
 
-                       $valueNode = new PPNode_Hash_Tree( 'value' );
-                       $valueNode->addChild( new PPNode_Hash_Text( $val ) );
-                       $partNode->addChild( $valueNode );
-
-                       $list[] = $partNode;
+                       $list[] = new PPNode_Hash_Tree( $store, 0 );
                }
 
                $node = new PPNode_Hash_Array( $list );
@@ -90,7 +100,6 @@ class Preprocessor_Hash extends Preprocessor {
 
        /**
         * Preprocess some wikitext and return the document tree.
-        * This is the ghost of Parser::replace_variables().
         *
         * @param string $text The text to parse
         * @param int $flags Bitwise combination of:
@@ -104,17 +113,16 @@ class Preprocessor_Hash extends Preprocessor {
         * change in the DOM tree for a given text, must be passed through the section identifier
         * in the section edit link and thus back to extractSections().
         *
-        * The output of this function is currently only cached in process memory, but a persistent
-        * cache may be implemented at a later date which takes further advantage of these strict
-        * dependency requirements.
-        *
         * @throws MWException
         * @return PPNode_Hash_Tree
         */
        public function preprocessToObj( $text, $flags = 0 ) {
                $tree = $this->cacheGetTree( $text, $flags );
                if ( $tree !== false ) {
-                       return unserialize( $tree );
+                       $store = json_decode( $tree );
+                       if ( is_array( $store ) ) {
+                               return new PPNode_Hash_Tree( $store, 0 );
+                       }
                }
 
                $forInclusion = $flags & Parser::PTD_FOR_INCLUSION;
@@ -150,7 +158,7 @@ class Preprocessor_Hash extends Preprocessor {
 
                // Input pointer, starts out pointing to a pseudo-newline before the start
                $i = 0;
-               // Current accumulator
+               // Current accumulator. See the doc comment for Preprocessor_Hash for the format.
                $accum =& $stack->getAccum();
                // True to find equals signs in arguments
                $findEquals = false;
@@ -176,11 +184,11 @@ class Preprocessor_Hash extends Preprocessor {
                                $startPos = strpos( $text, '<onlyinclude>', $i );
                                if ( $startPos === false ) {
                                        // Ignored section runs to the end
-                                       $accum->addNodeWithText( 'ignore', substr( $text, $i ) );
+                                       $accum[] = [ 'ignore', [ substr( $text, $i ) ] ];
                                        break;
                                }
                                $tagEndPos = $startPos + strlen( '<onlyinclude>' ); // past-the-end
-                               $accum->addNodeWithText( 'ignore', substr( $text, $i, $tagEndPos - $i ) );
+                               $accum[] = [ 'ignore', [ substr( $text, $i, $tagEndPos - $i ) ] ];
                                $i = $tagEndPos;
                                $findOnlyinclude = false;
                        }
@@ -208,7 +216,7 @@ class Preprocessor_Hash extends Preprocessor {
                                # Output literal section, advance input counter
                                $literalLength = strcspn( $text, $search, $i );
                                if ( $literalLength > 0 ) {
-                                       $accum->addLiteral( substr( $text, $i, $literalLength ) );
+                                       self::addLiteral( $accum, substr( $text, $i, $literalLength ) );
                                        $i += $literalLength;
                                }
                                if ( $i >= $lengthText ) {
@@ -261,7 +269,7 @@ class Preprocessor_Hash extends Preprocessor {
                                // Determine element name
                                if ( !preg_match( $elementsRegex, $text, $matches, 0, $i + 1 ) ) {
                                        // Element name missing or not listed
-                                       $accum->addLiteral( '<' );
+                                       self::addLiteral( $accum, '<' );
                                        ++$i;
                                        continue;
                                }
@@ -278,7 +286,7 @@ class Preprocessor_Hash extends Preprocessor {
                                        if ( $endPos === false ) {
                                                // Unclosed comment in input, runs to end
                                                $inner = substr( $text, $i );
-                                               $accum->addNodeWithText( 'comment', $inner );
+                                               $accum[] = [ 'comment', [ $inner ] ];
                                                $i = $lengthText;
                                        } else {
                                                // Search backwards for leading whitespace
@@ -309,13 +317,16 @@ class Preprocessor_Hash extends Preprocessor {
                                                        && substr( $text, $wsEnd + 1, 1 ) == "\n"
                                                ) {
                                                        // Remove leading whitespace from the end of the accumulator
-                                                       // Sanity check first though
                                                        $wsLength = $i - $wsStart;
+                                                       $endIndex = count( $accum ) - 1;
+
+                                                       // Sanity check
                                                        if ( $wsLength > 0
-                                                               && $accum->lastNode instanceof PPNode_Hash_Text
-                                                               && strspn( $accum->lastNode->value, " \t", -$wsLength ) === $wsLength
+                                                               && $endIndex >= 0
+                                                               && is_string( $accum[$endIndex] )
+                                                               && strspn( $accum[$endIndex], " \t", -$wsLength ) === $wsLength
                                                        ) {
-                                                               $accum->lastNode->value = substr( $accum->lastNode->value, 0, -$wsLength );
+                                                               $accum[$endIndex] = substr( $accum[$endIndex], 0, -$wsLength );
                                                        }
 
                                                        // Dump all but the last comment to the accumulator
@@ -326,7 +337,7 @@ class Preprocessor_Hash extends Preprocessor {
                                                                        break;
                                                                }
                                                                $inner = substr( $text, $startPos, $endPos - $startPos );
-                                                               $accum->addNodeWithText( 'comment', $inner );
+                                                               $accum[] = [ 'comment', [ $inner ] ];
                                                        }
 
                                                        // Do a line-start run next time to look for headings after the comment
@@ -347,7 +358,7 @@ class Preprocessor_Hash extends Preprocessor {
                                                }
                                                $i = $endPos + 1;
                                                $inner = substr( $text, $startPos, $endPos - $startPos + 1 );
-                                               $accum->addNodeWithText( 'comment', $inner );
+                                               $accum[] = [ 'comment', [ $inner ] ];
                                        }
                                        continue;
                                }
@@ -361,14 +372,14 @@ class Preprocessor_Hash extends Preprocessor {
                                        // Infinite backtrack
                                        // Disable tag search to prevent worst-case O(N^2) performance
                                        $noMoreGT = true;
-                                       $accum->addLiteral( '<' );
+                                       self::addLiteral( $accum, '<' );
                                        ++$i;
                                        continue;
                                }
 
                                // Handle ignored tags
                                if ( in_array( $lowerName, $ignoredTags ) ) {
-                                       $accum->addNodeWithText( 'ignore', substr( $text, $i, $tagEndPos - $i + 1 ) );
+                                       $accum[] = [ 'ignore', [ substr( $text, $i, $tagEndPos - $i + 1 ) ] ];
                                        $i = $tagEndPos + 1;
                                        continue;
                                }
@@ -401,7 +412,8 @@ class Preprocessor_Hash extends Preprocessor {
                                                } else {
                                                        // Don't match the tag, treat opening tag as literal and resume parsing.
                                                        $i = $tagEndPos + 1;
-                                                       $accum->addLiteral( substr( $text, $tagStartPos, $tagEndPos + 1 - $tagStartPos ) );
+                                                       self::addLiteral( $accum,
+                                                               substr( $text, $tagStartPos, $tagEndPos + 1 - $tagStartPos ) );
                                                        // Cache results, otherwise we have O(N^2) performance for input like <foo><foo><foo>...
                                                        $noMoreClosingTag[$name] = true;
                                                        continue;
@@ -410,7 +422,7 @@ class Preprocessor_Hash extends Preprocessor {
                                }
                                // <includeonly> and <noinclude> just become <ignore> tags
                                if ( in_array( $lowerName, $ignoredElements ) ) {
-                                       $accum->addNodeWithText( 'ignore', substr( $text, $tagStartPos, $i - $tagStartPos ) );
+                                       $accum[] = [ 'ignore', [ substr( $text, $tagStartPos, $i - $tagStartPos ) ] ];
                                        continue;
                                }
 
@@ -422,23 +434,23 @@ class Preprocessor_Hash extends Preprocessor {
                                        $attr = substr( $text, $attrStart, $attrEnd - $attrStart );
                                }
 
-                               $extNode = new PPNode_Hash_Tree( 'ext' );
-                               $extNode->addChild( PPNode_Hash_Tree::newWithText( 'name', $name ) );
-                               $extNode->addChild( PPNode_Hash_Tree::newWithText( 'attr', $attr ) );
+                               $children = [
+                                       [ 'name', [ $name ] ],
+                                       [ 'attr', [ $attr ] ] ];
                                if ( $inner !== null ) {
-                                       $extNode->addChild( PPNode_Hash_Tree::newWithText( 'inner', $inner ) );
+                                       $children[] = [ 'inner', [ $inner ] ];
                                }
                                if ( $close !== null ) {
-                                       $extNode->addChild( PPNode_Hash_Tree::newWithText( 'close', $close ) );
+                                       $children[] = [ 'close', [ $close ] ];
                                }
-                               $accum->addNode( $extNode );
+                               $accum[] = [ 'ext', $children ];
                        } elseif ( $found == 'line-start' ) {
                                // Is this the start of a heading?
                                // Line break belongs before the heading element in any case
                                if ( $fakeLineStart ) {
                                        $fakeLineStart = false;
                                } else {
-                                       $accum->addLiteral( $curChar );
+                                       self::addLiteral( $accum, $curChar );
                                        $i++;
                                }
 
@@ -494,11 +506,15 @@ class Preprocessor_Hash extends Preprocessor {
                                        }
                                        if ( $count > 0 ) {
                                                // Normal match, output <h>
-                                               $element = new PPNode_Hash_Tree( 'possible-h' );
-                                               $element->addChild( new PPNode_Hash_Attr( 'level', $count ) );
-                                               $element->addChild( new PPNode_Hash_Attr( 'i', $headingIndex++ ) );
-                                               $element->lastChild->nextSibling = $accum->firstNode;
-                                               $element->lastChild = $accum->lastNode;
+                                               $element = [ [ 'possible-h',
+                                                       array_merge(
+                                                               [
+                                                                       [ '@level', [ $count ] ],
+                                                                       [ '@i', [ $headingIndex++ ] ]
+                                                               ],
+                                                               $accum
+                                                       )
+                                               ] ];
                                        } else {
                                                // Single equals sign on its own line, count=0
                                                $element = $accum;
@@ -513,11 +529,8 @@ class Preprocessor_Hash extends Preprocessor {
                                extract( $stack->getFlags() );
 
                                // Append the result to the enclosing accumulator
-                               if ( $element instanceof PPNode ) {
-                                       $accum->addNode( $element );
-                               } else {
-                                       $accum->addAccum( $element );
-                               }
+                               array_splice( $accum, count( $accum ), 0, $element );
+
                                // Note that we do NOT increment the input pointer.
                                // This is because the closing linebreak could be the opening linebreak of
                                // another heading. Infinite loops are avoided because the next iteration MUST
@@ -542,7 +555,7 @@ class Preprocessor_Hash extends Preprocessor {
                                        extract( $stack->getFlags() );
                                } else {
                                        # Add literal brace(s)
-                                       $accum->addLiteral( str_repeat( $curChar, $count ) );
+                                       self::addLiteral( $accum, str_repeat( $curChar, $count ) );
                                }
                                $i += $count;
                        } elseif ( $found == 'close' ) {
@@ -571,7 +584,7 @@ class Preprocessor_Hash extends Preprocessor {
                                if ( $matchingCount <= 0 ) {
                                        # No matching element found in callback array
                                        # Output a literal closing brace and continue
-                                       $accum->addLiteral( str_repeat( $curChar, $count ) );
+                                       self::addLiteral( $accum, str_repeat( $curChar, $count ) );
                                        $i += $count;
                                        continue;
                                }
@@ -579,77 +592,38 @@ class Preprocessor_Hash extends Preprocessor {
                                if ( $name === null ) {
                                        // No element, just literal text
                                        $element = $piece->breakSyntax( $matchingCount );
-                                       $element->addLiteral( str_repeat( $rule['end'], $matchingCount ) );
+                                       self::addLiteral( $element, str_repeat( $rule['end'], $matchingCount ) );
                                } else {
                                        # Create XML element
-                                       # Note: $parts is already XML, does not need to be encoded further
                                        $parts = $piece->parts;
                                        $titleAccum = $parts[0]->out;
                                        unset( $parts[0] );
 
-                                       $element = new PPNode_Hash_Tree( $name );
+                                       $children = [];
 
                                        # The invocation is at the start of the line if lineStart is set in
                                        # the stack, and all opening brackets are used up.
                                        if ( $maxCount == $matchingCount && !empty( $piece->lineStart ) ) {
-                                               $element->addChild( new PPNode_Hash_Attr( 'lineStart', 1 ) );
+                                               $children[] = [ '@lineStart', [ 1 ] ];
                                        }
-                                       $titleNode = new PPNode_Hash_Tree( 'title' );
-                                       $titleNode->firstChild = $titleAccum->firstNode;
-                                       $titleNode->lastChild = $titleAccum->lastNode;
-                                       $element->addChild( $titleNode );
+                                       $titleNode = [ 'title', $titleAccum ];
+                                       $children[] = $titleNode;
                                        $argIndex = 1;
                                        foreach ( $parts as $part ) {
                                                if ( isset( $part->eqpos ) ) {
-                                                       // Find equals
-                                                       $lastNode = false;
-                                                       for ( $node = $part->out->firstNode; $node; $node = $node->nextSibling ) {
-                                                               if ( $node === $part->eqpos ) {
-                                                                       break;
-                                                               }
-                                                               $lastNode = $node;
-                                                       }
-                                                       if ( !$node ) {
-                                                               // if ( $cacheable ) { ... }
-                                                               throw new MWException( __METHOD__ . ': eqpos not found' );
-                                                       }
-                                                       if ( $node->name !== 'equals' ) {
-                                                               // if ( $cacheable ) { ... }
-                                                               throw new MWException( __METHOD__ . ': eqpos is not equals' );
-                                                       }
-                                                       $equalsNode = $node;
-
-                                                       // Construct name node
-                                                       $nameNode = new PPNode_Hash_Tree( 'name' );
-                                                       if ( $lastNode !== false ) {
-                                                               $lastNode->nextSibling = false;
-                                                               $nameNode->firstChild = $part->out->firstNode;
-                                                               $nameNode->lastChild = $lastNode;
-                                                       }
-
-                                                       // Construct value node
-                                                       $valueNode = new PPNode_Hash_Tree( 'value' );
-                                                       if ( $equalsNode->nextSibling !== false ) {
-                                                               $valueNode->firstChild = $equalsNode->nextSibling;
-                                                               $valueNode->lastChild = $part->out->lastNode;
-                                                       }
-                                                       $partNode = new PPNode_Hash_Tree( 'part' );
-                                                       $partNode->addChild( $nameNode );
-                                                       $partNode->addChild( $equalsNode->firstChild );
-                                                       $partNode->addChild( $valueNode );
-                                                       $element->addChild( $partNode );
+                                                       $equalsNode = $part->out[$part->eqpos];
+                                                       $nameNode = [ 'name', array_slice( $part->out, 0, $part->eqpos ) ];
+                                                       $valueNode = [ 'value', array_slice( $part->out, $part->eqpos + 1 ) ];
+                                                       $partNode = [ 'part', [ $nameNode, $equalsNode, $valueNode ] ];
+                                                       $children[] = $partNode;
                                                } else {
-                                                       $partNode = new PPNode_Hash_Tree( 'part' );
-                                                       $nameNode = new PPNode_Hash_Tree( 'name' );
-                                                       $nameNode->addChild( new PPNode_Hash_Attr( 'index', $argIndex++ ) );
-                                                       $valueNode = new PPNode_Hash_Tree( 'value' );
-                                                       $valueNode->firstChild = $part->out->firstNode;
-                                                       $valueNode->lastChild = $part->out->lastNode;
-                                                       $partNode->addChild( $nameNode );
-                                                       $partNode->addChild( $valueNode );
-                                                       $element->addChild( $partNode );
+                                                       $nameNode = [ 'name', [ [ '@index', [ $argIndex++ ] ] ] ];
+                                                       $valueNode = [ 'value', $part->out ];
+                                                       $partNode = [ 'part', [ $nameNode, $valueNode ] ];
+                                                       $children[] = $partNode;
                                                }
                                        }
+                                       $element = [ [ $name, $children ] ];
                                }
 
                                # Advance input pointer
@@ -669,18 +643,14 @@ class Preprocessor_Hash extends Preprocessor {
                                                $stack->push( $piece );
                                                $accum =& $stack->getAccum();
                                        } else {
-                                               $accum->addLiteral( str_repeat( $piece->open, $piece->count ) );
+                                               self::addLiteral( $accum, str_repeat( $piece->open, $piece->count ) );
                                        }
                                }
 
                                extract( $stack->getFlags() );
 
                                # Add XML element to the enclosing accumulator
-                               if ( $element instanceof PPNode ) {
-                                       $accum->addNode( $element );
-                               } else {
-                                       $accum->addAccum( $element );
-                               }
+                               array_splice( $accum, count( $accum ), 0, $element );
                        } elseif ( $found == 'pipe' ) {
                                $findEquals = true; // shortcut for getFlags()
                                $stack->addPart();
@@ -688,33 +658,44 @@ class Preprocessor_Hash extends Preprocessor {
                                ++$i;
                        } elseif ( $found == 'equals' ) {
                                $findEquals = false; // shortcut for getFlags()
-                               $accum->addNodeWithText( 'equals', '=' );
-                               $stack->getCurrentPart()->eqpos = $accum->lastNode;
+                               $accum[] = [ 'equals', [ '=' ] ];
+                               $stack->getCurrentPart()->eqpos = count( $accum ) - 1;
                                ++$i;
                        }
                }
 
                # Output any remaining unclosed brackets
                foreach ( $stack->stack as $piece ) {
-                       $stack->rootAccum->addAccum( $piece->breakSyntax() );
+                       array_splice( $stack->rootAccum, count( $stack->rootAccum ), 0, $piece->breakSyntax() );
                }
 
                # Enable top-level headings
-               for ( $node = $stack->rootAccum->firstNode; $node; $node = $node->nextSibling ) {
-                       if ( isset( $node->name ) && $node->name === 'possible-h' ) {
-                               $node->name = 'h';
+               foreach ( $stack->rootAccum as &$node ) {
+                       if ( is_array( $node ) && $node[PPNode_Hash_Tree::NAME] === 'possible-h' ) {
+                               $node[PPNode_Hash_Tree::NAME] = 'h';
                        }
                }
 
-               $rootNode = new PPNode_Hash_Tree( 'root' );
-               $rootNode->firstChild = $stack->rootAccum->firstNode;
-               $rootNode->lastChild = $stack->rootAccum->lastNode;
+               $rootStore = [ [ 'root', $stack->rootAccum ] ];
+               $rootNode = new PPNode_Hash_Tree( $rootStore, 0 );
 
                // Cache
-               $this->cacheSetTree( $text, $flags, serialize( $rootNode ) );
+               $tree = json_encode( $rootStore, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE );
+               if ( $tree !== false ) {
+                       $this->cacheSetTree( $text, $flags, $tree );
+               }
 
                return $rootNode;
        }
+
+       private static function addLiteral( array &$accum, $text ) {
+               $n = count( $accum );
+               if ( $n && is_string( $accum[$n - 1] ) ) {
+                       $accum[$n - 1] .= $text;
+               } else {
+                       $accum[] = $text;
+               }
+       }
 }
 
 /**
@@ -728,7 +709,7 @@ class PPDStack_Hash extends PPDStack {
        public function __construct() {
                $this->elementClass = 'PPDStackElement_Hash';
                parent::__construct();
-               $this->rootAccum = new PPDAccum_Hash;
+               $this->rootAccum = [];
        }
 }
 
@@ -748,7 +729,7 @@ class PPDStackElement_Hash extends PPDStackElement {
         * Get the accumulator that would result if the close is not found.
         *
         * @param int|bool $openingCount
-        * @return PPDAccum_Hash
+        * @return array
         */
        public function breakSyntax( $openingCount = false ) {
                if ( $this->open == "\n" ) {
@@ -757,16 +738,24 @@ class PPDStackElement_Hash extends PPDStackElement {
                        if ( $openingCount === false ) {
                                $openingCount = $this->count;
                        }
-                       $accum = new PPDAccum_Hash;
-                       $accum->addLiteral( str_repeat( $this->open, $openingCount ) );
+                       $accum = [ str_repeat( $this->open, $openingCount ) ];
+                       $lastIndex = 0;
                        $first = true;
                        foreach ( $this->parts as $part ) {
                                if ( $first ) {
                                        $first = false;
+                               } elseif ( is_string( $accum[$lastIndex] ) ) {
+                                       $accum[$lastIndex] .= '|';
                                } else {
-                                       $accum->addLiteral( '|' );
+                                       $accum[++$lastIndex] = '|';
+                               }
+                               foreach ( $part->out as $node ) {
+                                       if ( is_string( $node ) && is_string( $accum[$lastIndex] ) ) {
+                                               $accum[$lastIndex] .= $node;
+                                       } else {
+                                               $accum[++$lastIndex] = $node;
+                                       }
                                }
-                               $accum->addAccum( $part->out );
                        }
                }
                return $accum;
@@ -781,81 +770,12 @@ class PPDPart_Hash extends PPDPart {
        // @codingStandardsIgnoreEnd
 
        public function __construct( $out = '' ) {
-               $accum = new PPDAccum_Hash;
                if ( $out !== '' ) {
-                       $accum->addLiteral( $out );
-               }
-               parent::__construct( $accum );
-       }
-}
-
-/**
- * @ingroup Parser
- */
-// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
-class PPDAccum_Hash {
-       // @codingStandardsIgnoreEnd
-
-       public $firstNode, $lastNode;
-
-       public function __construct() {
-               $this->firstNode = $this->lastNode = false;
-       }
-
-       /**
-        * Append a string literal
-        * @param string $s
-        */
-       public function addLiteral( $s ) {
-               if ( $this->lastNode === false ) {
-                       $this->firstNode = $this->lastNode = new PPNode_Hash_Text( $s );
-               } elseif ( $this->lastNode instanceof PPNode_Hash_Text ) {
-                       $this->lastNode->value .= $s;
-               } else {
-                       $this->lastNode->nextSibling = new PPNode_Hash_Text( $s );
-                       $this->lastNode = $this->lastNode->nextSibling;
-               }
-       }
-
-       /**
-        * Append a PPNode
-        * @param PPNode $node
-        */
-       public function addNode( PPNode $node ) {
-               if ( $this->lastNode === false ) {
-                       $this->firstNode = $this->lastNode = $node;
-               } else {
-                       $this->lastNode->nextSibling = $node;
-                       $this->lastNode = $node;
-               }
-       }
-
-       /**
-        * Append a tree node with text contents
-        * @param string $name
-        * @param string $value
-        */
-       public function addNodeWithText( $name, $value ) {
-               $node = PPNode_Hash_Tree::newWithText( $name, $value );
-               $this->addNode( $node );
-       }
-
-       /**
-        * Append a PPDAccum_Hash
-        * Takes over ownership of the nodes in the source argument. These nodes may
-        * subsequently be modified, especially nextSibling.
-        * @param PPDAccum_Hash $accum
-        */
-       public function addAccum( $accum ) {
-               if ( $accum->lastNode === false ) {
-                       // nothing to add
-               } elseif ( $this->lastNode === false ) {
-                       $this->firstNode = $accum->firstNode;
-                       $this->lastNode = $accum->lastNode;
+                       $accum = [ $out ];
                } else {
-                       $this->lastNode->nextSibling = $accum->firstNode;
-                       $this->lastNode = $accum->lastNode;
+                       $accum = [];
                }
+               parent::__construct( $accum );
        }
 }
 
@@ -1050,130 +970,144 @@ class PPFrame_Hash implements PPFrame {
                        }
 
                        $newIterator = false;
+                       $contextName = false;
+                       $contextChildren = false;
 
                        if ( $contextNode === false ) {
                                // nothing to do
                        } elseif ( is_string( $contextNode ) ) {
                                $out .= $contextNode;
-                       } elseif ( is_array( $contextNode ) || $contextNode instanceof PPNode_Hash_Array ) {
+                       } elseif ( $contextNode instanceof PPNode_Hash_Array ) {
                                $newIterator = $contextNode;
                        } elseif ( $contextNode instanceof PPNode_Hash_Attr ) {
                                // No output
                        } elseif ( $contextNode instanceof PPNode_Hash_Text ) {
                                $out .= $contextNode->value;
                        } elseif ( $contextNode instanceof PPNode_Hash_Tree ) {
-                               if ( $contextNode->name == 'template' ) {
-                                       # Double-brace expansion
-                                       $bits = $contextNode->splitTemplate();
-                                       if ( $flags & PPFrame::NO_TEMPLATES ) {
-                                               $newIterator = $this->virtualBracketedImplode(
-                                                       '{{', '|', '}}',
-                                                       $bits['title'],
-                                                       $bits['parts']
-                                               );
-                                       } else {
-                                               $ret = $this->parser->braceSubstitution( $bits, $this );
-                                               if ( isset( $ret['object'] ) ) {
-                                                       $newIterator = $ret['object'];
-                                               } else {
-                                                       $out .= $ret['text'];
-                                               }
-                                       }
-                               } elseif ( $contextNode->name == 'tplarg' ) {
-                                       # Triple-brace expansion
-                                       $bits = $contextNode->splitTemplate();
-                                       if ( $flags & PPFrame::NO_ARGS ) {
-                                               $newIterator = $this->virtualBracketedImplode(
-                                                       '{{{', '|', '}}}',
-                                                       $bits['title'],
-                                                       $bits['parts']
-                                               );
-                                       } else {
-                                               $ret = $this->parser->argSubstitution( $bits, $this );
-                                               if ( isset( $ret['object'] ) ) {
-                                                       $newIterator = $ret['object'];
-                                               } else {
-                                                       $out .= $ret['text'];
-                                               }
-                                       }
-                               } elseif ( $contextNode->name == 'comment' ) {
-                                       # HTML-style comment
-                                       # Remove it in HTML, pre+remove and STRIP_COMMENTS modes
-                                       # Not in RECOVER_COMMENTS mode (msgnw) though.
-                                       if ( ( $this->parser->ot['html']
-                                               || ( $this->parser->ot['pre'] && $this->parser->mOptions->getRemoveComments() )
-                                               || ( $flags & PPFrame::STRIP_COMMENTS )
-                                               ) && !( $flags & PPFrame::RECOVER_COMMENTS )
-                                       ) {
-                                               $out .= '';
-                                       } elseif ( $this->parser->ot['wiki'] && !( $flags & PPFrame::RECOVER_COMMENTS ) ) {
-                                               # Add a strip marker in PST mode so that pstPass2() can
-                                               # run some old-fashioned regexes on the result.
-                                               # Not in RECOVER_COMMENTS mode (extractSections) though.
-                                               $out .= $this->parser->insertStripItem( $contextNode->firstChild->value );
+                               $contextName = $contextNode->name;
+                               $contextChildren = $contextNode->getRawChildren();
+                       } elseif ( is_array( $contextNode ) ) {
+                               // Node descriptor array
+                               if ( count( $contextNode ) !== 2 ) {
+                                       throw new MWException( __METHOD__.
+                                               ': found an array where a node descriptor should be' );
+                               }
+                               list( $contextName, $contextChildren ) = $contextNode;
+                       } else {
+                               throw new MWException( __METHOD__ . ': Invalid parameter type' );
+                       }
+
+                       // Handle node descriptor array or tree object
+                       if ( $contextName === false ) {
+                               // Not a node, already handled above
+                       } elseif ( $contextName[0] === '@' ) {
+                               // Attribute: no output
+                       } elseif ( $contextName === 'template' ) {
+                               # Double-brace expansion
+                               $bits = PPNode_Hash_Tree::splitRawTemplate( $contextChildren );
+                               if ( $flags & PPFrame::NO_TEMPLATES ) {
+                                       $newIterator = $this->virtualBracketedImplode(
+                                               '{{', '|', '}}',
+                                               $bits['title'],
+                                               $bits['parts']
+                                       );
+                               } else {
+                                       $ret = $this->parser->braceSubstitution( $bits, $this );
+                                       if ( isset( $ret['object'] ) ) {
+                                               $newIterator = $ret['object'];
                                        } else {
-                                               # Recover the literal comment in RECOVER_COMMENTS and pre+no-remove
-                                               $out .= $contextNode->firstChild->value;
+                                               $out .= $ret['text'];
                                        }
-                               } elseif ( $contextNode->name == 'ignore' ) {
-                                       # Output suppression used by <includeonly> etc.
-                                       # OT_WIKI will only respect <ignore> in substed templates.
-                                       # The other output types respect it unless NO_IGNORE is set.
-                                       # extractSections() sets NO_IGNORE and so never respects it.
-                                       if ( ( !isset( $this->parent ) && $this->parser->ot['wiki'] )
-                                               || ( $flags & PPFrame::NO_IGNORE )
-                                       ) {
-                                               $out .= $contextNode->firstChild->value;
+                               }
+                       } elseif ( $contextName === 'tplarg' ) {
+                               # Triple-brace expansion
+                               $bits = PPNode_Hash_Tree::splitRawTemplate( $contextChildren );
+                               if ( $flags & PPFrame::NO_ARGS ) {
+                                       $newIterator = $this->virtualBracketedImplode(
+                                               '{{{', '|', '}}}',
+                                               $bits['title'],
+                                               $bits['parts']
+                                       );
+                               } else {
+                                       $ret = $this->parser->argSubstitution( $bits, $this );
+                                       if ( isset( $ret['object'] ) ) {
+                                               $newIterator = $ret['object'];
                                        } else {
-                                               // $out .= '';
+                                               $out .= $ret['text'];
                                        }
-                               } elseif ( $contextNode->name == 'ext' ) {
-                                       # Extension tag
-                                       $bits = $contextNode->splitExt() + [ 'attr' => null, 'inner' => null, 'close' => null ];
-                                       if ( $flags & PPFrame::NO_TAGS ) {
-                                               $s = '<' . $bits['name']->firstChild->value;
-                                               if ( $bits['attr'] ) {
-                                                       $s .= $bits['attr']->firstChild->value;
-                                               }
-                                               if ( $bits['inner'] ) {
-                                                       $s .= '>' . $bits['inner']->firstChild->value;
-                                                       if ( $bits['close'] ) {
-                                                               $s .= $bits['close']->firstChild->value;
-                                                       }
-                                               } else {
-                                                       $s .= '/>';
-                                               }
-                                               $out .= $s;
-                                       } else {
-                                               $out .= $this->parser->extensionSubstitution( $bits, $this );
+                               }
+                       } elseif ( $contextName === 'comment' ) {
+                               # HTML-style comment
+                               # Remove it in HTML, pre+remove and STRIP_COMMENTS modes
+                               # Not in RECOVER_COMMENTS mode (msgnw) though.
+                               if ( ( $this->parser->ot['html']
+                                       || ( $this->parser->ot['pre'] && $this->parser->mOptions->getRemoveComments() )
+                                       || ( $flags & PPFrame::STRIP_COMMENTS )
+                                       ) && !( $flags & PPFrame::RECOVER_COMMENTS )
+                               ) {
+                                       $out .= '';
+                               } elseif ( $this->parser->ot['wiki'] && !( $flags & PPFrame::RECOVER_COMMENTS ) ) {
+                                       # Add a strip marker in PST mode so that pstPass2() can
+                                       # run some old-fashioned regexes on the result.
+                                       # Not in RECOVER_COMMENTS mode (extractSections) though.
+                                       $out .= $this->parser->insertStripItem( $contextChildren[0] );
+                               } else {
+                                       # Recover the literal comment in RECOVER_COMMENTS and pre+no-remove
+                                       $out .= $contextChildren[0];
+                               }
+                       } elseif ( $contextName === 'ignore' ) {
+                               # Output suppression used by <includeonly> etc.
+                               # OT_WIKI will only respect <ignore> in substed templates.
+                               # The other output types respect it unless NO_IGNORE is set.
+                               # extractSections() sets NO_IGNORE and so never respects it.
+                               if ( ( !isset( $this->parent ) && $this->parser->ot['wiki'] )
+                                       || ( $flags & PPFrame::NO_IGNORE )
+                               ) {
+                                       $out .= $contextChildren[0];
+                               } else {
+                                       // $out .= '';
+                               }
+                       } elseif ( $contextName === 'ext' ) {
+                               # Extension tag
+                               $bits = PPNode_Hash_Tree::splitRawExt( $contextChildren ) +
+                                       [ 'attr' => null, 'inner' => null, 'close' => null ];
+                               if ( $flags & PPFrame::NO_TAGS ) {
+                                       $s = '<' . $bits['name']->getFirstChild()->value;
+                                       if ( $bits['attr'] ) {
+                                               $s .= $bits['attr']->getFirstChild()->value;
                                        }
-                               } elseif ( $contextNode->name == 'h' ) {
-                                       # Heading
-                                       if ( $this->parser->ot['html'] ) {
-                                               # Expand immediately and insert heading index marker
-                                               $s = '';
-                                               for ( $node = $contextNode->firstChild; $node; $node = $node->nextSibling ) {
-                                                       $s .= $this->expand( $node, $flags );
+                                       if ( $bits['inner'] ) {
+                                               $s .= '>' . $bits['inner']->getFirstChild()->value;
+                                               if ( $bits['close'] ) {
+                                                       $s .= $bits['close']->getFirstChild()->value;
                                                }
-
-                                               $bits = $contextNode->splitHeading();
-                                               $titleText = $this->title->getPrefixedDBkey();
-                                               $this->parser->mHeadings[] = [ $titleText, $bits['i'] ];
-                                               $serial = count( $this->parser->mHeadings ) - 1;
-                                               $marker = Parser::MARKER_PREFIX . "-h-$serial-" . Parser::MARKER_SUFFIX;
-                                               $s = substr( $s, 0, $bits['level'] ) . $marker . substr( $s, $bits['level'] );
-                                               $this->parser->mStripState->addGeneral( $marker, '' );
-                                               $out .= $s;
                                        } else {
-                                               # Expand in virtual stack
-                                               $newIterator = $contextNode->getChildren();
+                                               $s .= '/>';
                                        }
+                                       $out .= $s;
+                               } else {
+                                       $out .= $this->parser->extensionSubstitution( $bits, $this );
+                               }
+                       } elseif ( $contextName === 'h' ) {
+                               # Heading
+                               if ( $this->parser->ot['html'] ) {
+                                       # Expand immediately and insert heading index marker
+                                       $s = $this->expand( $contextChildren, $flags );
+                                       $bits = PPNode_Hash_Tree::splitRawHeading( $contextChildren );
+                                       $titleText = $this->title->getPrefixedDBkey();
+                                       $this->parser->mHeadings[] = [ $titleText, $bits['i'] ];
+                                       $serial = count( $this->parser->mHeadings ) - 1;
+                                       $marker = Parser::MARKER_PREFIX . "-h-$serial-" . Parser::MARKER_SUFFIX;
+                                       $s = substr( $s, 0, $bits['level'] ) . $marker . substr( $s, $bits['level'] );
+                                       $this->parser->mStripState->addGeneral( $marker, '' );
+                                       $out .= $s;
                                } else {
-                                       # Generic recursive expansion
-                                       $newIterator = $contextNode->getChildren();
+                                       # Expand in virtual stack
+                                       $newIterator = $contextChildren;
                                }
                        } else {
-                               throw new MWException( __METHOD__ . ': Invalid parameter type' );
+                               # Generic recursive expansion
+                               $newIterator = $contextChildren;
                        }
 
                        if ( $newIterator !== false ) {
@@ -1689,17 +1623,85 @@ class PPCustomFrame_Hash extends PPFrame_Hash {
 class PPNode_Hash_Tree implements PPNode {
        // @codingStandardsIgnoreEnd
 
-       public $name, $firstChild, $lastChild, $nextSibling;
+       public $name;
+
+       /**
+        * The store array for children of this node. It is "raw" in the sense that
+        * nodes are two-element arrays ("descriptors") rather than PPNode_Hash_*
+        * objects.
+        */
+       private $rawChildren;
+
+       /**
+        * The store array for the siblings of this node, including this node itself.
+        */
+       private $store;
+
+       /**
+        * The index into $this->store which contains the descriptor of this node.
+        */
+       private $index;
+
+       /**
+        * The offset of the name within descriptors, used in some places for
+        * readability.
+        */
+       const NAME = 0;
+
+       /**
+        * The offset of the child list within descriptors, used in some places for
+        * readability.
+        */
+       const CHILDREN = 1;
+
+       /**
+        * Construct an object using the data from $store[$index]. The rest of the
+        * store array can be accessed via getNextSibling().
+        *
+        * @param array $store
+        * @param integer $index
+        */
+       public function __construct( array $store, $index ) {
+               $this->store = $store;
+               $this->index = $index;
+               list( $this->name, $this->rawChildren ) = $this->store[$index];
+       }
+
+       /**
+        * Construct an appropriate PPNode_Hash_* object with a class that depends
+        * on what is at the relevant store index.
+        *
+        * @param array $store
+        * @param integer $index
+        * @return PPNode_Hash_Tree|PPNode_Hash_Attr|PPNode_Hash_Text
+        */
+       public static function factory( array $store, $index ) {
+               if ( !isset( $store[$index] ) ) {
+                       return false;
+               }
 
-       public function __construct( $name ) {
-               $this->name = $name;
-               $this->firstChild = $this->lastChild = $this->nextSibling = false;
+               $descriptor = $store[$index];
+               if ( is_string( $descriptor ) ) {
+                       $class = 'PPNode_Hash_Text';
+               } elseif ( is_array( $descriptor ) ) {
+                       if ( $descriptor[self::NAME][0] === '@' ) {
+                               $class = 'PPNode_Hash_Attr';
+                       } else {
+                               $class = 'PPNode_Hash_Tree';
+                       }
+               } else {
+                       throw new MWException( __METHOD__.': invalid node descriptor' );
+               }
+               return new $class( $store, $index );
        }
 
+       /**
+        * Convert a node to XML, for debugging
+        */
        public function __toString() {
                $inner = '';
                $attribs = '';
-               for ( $node = $this->firstChild; $node; $node = $node->nextSibling ) {
+               for ( $node = $this->getFirstChild(); $node; $node = $node->getNextSibling() ) {
                        if ( $node instanceof PPNode_Hash_Attr ) {
                                $attribs .= ' ' . $node->name . '="' . htmlspecialchars( $node->value ) . '"';
                        } else {
@@ -1713,55 +1715,67 @@ class PPNode_Hash_Tree implements PPNode {
                }
        }
 
-       /**
-        * @param string $name
-        * @param string $text
-        * @return PPNode_Hash_Tree
-        */
-       public static function newWithText( $name, $text ) {
-               $obj = new self( $name );
-               $obj->addChild( new PPNode_Hash_Text( $text ) );
-               return $obj;
-       }
-
-       public function addChild( $node ) {
-               if ( $this->lastChild === false ) {
-                       $this->firstChild = $this->lastChild = $node;
-               } else {
-                       $this->lastChild->nextSibling = $node;
-                       $this->lastChild = $node;
-               }
-       }
-
        /**
         * @return PPNode_Hash_Array
         */
        public function getChildren() {
                $children = [];
-               for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) {
-                       $children[] = $child;
+               foreach ( $this->rawChildren as $i => $child ) {
+                       $children[] = self::factory( $this->rawChildren, $i );
                }
                return new PPNode_Hash_Array( $children );
        }
 
+       /**
+        * Get the first child, or false if there is none. Note that this will
+        * return a temporary proxy object: different instances will be returned
+        * if this is called more than once on the same node.
+        *
+        * @return PPNode_Hash_Tree|PPNode_Hash_Attr|PPNode_Hash_Text|boolean
+        */
        public function getFirstChild() {
-               return $this->firstChild;
+               if ( !isset( $this->rawChildren[0] ) ) {
+                       return false;
+               } else {
+                       return self::factory( $this->rawChildren, 0 );
+               }
        }
 
+       /**
+        * Get the next sibling, or false if there is none. Note that this will
+        * return a temporary proxy object: different instances will be returned
+        * if this is called more than once on the same node.
+        *
+        * @return PPNode_Hash_Tree|PPNode_Hash_Attr|PPNode_Hash_Text|boolean
+        */
        public function getNextSibling() {
-               return $this->nextSibling;
+               return self::factory( $this->store, $this->index + 1 );
        }
 
+       /**
+        * Get an array of the children with a given node name
+        *
+        * @param string $name
+        * @return PPNode_Hash_Array
+        */
        public function getChildrenOfType( $name ) {
                $children = [];
-               for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) {
-                       if ( isset( $child->name ) && $child->name === $name ) {
-                               $children[] = $child;
+               foreach ( $this->rawChildren as $i => $child ) {
+                       if ( is_array( $child ) && $child[self::NAME] === $name ) {
+                               $children[] = self::factory( $this->rawChildren, $i );
                        }
                }
                return new PPNode_Hash_Array( $children );
        }
 
+       /**
+        * Get the raw child array. For internal use.
+        * @return array
+        */
+       public function getRawChildren() {
+               return $this->rawChildren;
+       }
+
        /**
         * @return bool
         */
@@ -1794,20 +1808,27 @@ class PPNode_Hash_Tree implements PPNode {
         * @return array
         */
        public function splitArg() {
+               return self::splitRawArg( $this->rawChildren );
+       }
+
+       /**
+        * Like splitArg() but for a raw child array. For internal use only.
+        */
+       public static function splitRawArg( array $children ) {
                $bits = [];
-               for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) {
-                       if ( !isset( $child->name ) ) {
+               foreach ( $children as $i => $child ) {
+                       if ( !is_array( $child ) ) {
                                continue;
                        }
-                       if ( $child->name === 'name' ) {
-                               $bits['name'] = $child;
-                               if ( $child->firstChild instanceof PPNode_Hash_Attr
-                                       && $child->firstChild->name === 'index'
+                       if ( $child[self::NAME] === 'name' ) {
+                               $bits['name'] = new self( $children, $i );
+                               if ( isset( $child[self::CHILDREN][0][self::NAME] )
+                                       && $child[self::CHILDREN][0][self::NAME] === '@index'
                                ) {
-                                       $bits['index'] = $child->firstChild->value;
+                                       $bits['index'] = $child[self::CHILDREN][0][self::CHILDREN][0];
                                }
-                       } elseif ( $child->name === 'value' ) {
-                               $bits['value'] = $child;
+                       } elseif ( $child[self::NAME] === 'value' ) {
+                               $bits['value'] = new self( $children, $i );
                        }
                }
 
@@ -1828,19 +1849,31 @@ class PPNode_Hash_Tree implements PPNode {
         * @return array
         */
        public function splitExt() {
+               return self::splitRawExt( $this->rawChildren );
+       }
+
+       /**
+        * Like splitExt() but for a raw child array. For internal use only.
+        */
+       public static function splitRawExt( array $children ) {
                $bits = [];
-               for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) {
-                       if ( !isset( $child->name ) ) {
+               foreach ( $children as $i => $child ) {
+                       if ( !is_array( $child ) ) {
                                continue;
                        }
-                       if ( $child->name == 'name' ) {
-                               $bits['name'] = $child;
-                       } elseif ( $child->name == 'attr' ) {
-                               $bits['attr'] = $child;
-                       } elseif ( $child->name == 'inner' ) {
-                               $bits['inner'] = $child;
-                       } elseif ( $child->name == 'close' ) {
-                               $bits['close'] = $child;
+                       switch ( $child[self::NAME] ) {
+                       case 'name':
+                               $bits['name'] = new self( $children, $i );
+                               break;
+                       case 'attr':
+                               $bits['attr'] = new self( $children, $i );
+                               break;
+                       case 'inner':
+                               $bits['inner'] = new self( $children, $i );
+                               break;
+                       case 'close':
+                               $bits['close'] = new self( $children, $i );
+                               break;
                        }
                }
                if ( !isset( $bits['name'] ) ) {
@@ -1859,15 +1892,22 @@ class PPNode_Hash_Tree implements PPNode {
                if ( $this->name !== 'h' ) {
                        throw new MWException( 'Invalid h node passed to ' . __METHOD__ );
                }
+               return self::splitRawHeading( $this->rawChildren );
+       }
+
+       /**
+        * Like splitHeading() but for a raw child array. For internal use only.
+        */
+       public static function splitRawHeading( array $children ) {
                $bits = [];
-               for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) {
-                       if ( !isset( $child->name ) ) {
+               foreach ( $children as $i => $child ) {
+                       if ( !is_array( $child ) ) {
                                continue;
                        }
-                       if ( $child->name == 'i' ) {
-                               $bits['i'] = $child->value;
-                       } elseif ( $child->name == 'level' ) {
-                               $bits['level'] = $child->value;
+                       if ( $child[self::NAME] === '@i' ) {
+                               $bits['i'] = $child[self::CHILDREN][0];
+                       } elseif ( $child[self::NAME] === '@level' ) {
+                               $bits['level'] = $child[self::CHILDREN][0];
                        }
                }
                if ( !isset( $bits['i'] ) ) {
@@ -1883,20 +1923,29 @@ class PPNode_Hash_Tree implements PPNode {
         * @return array
         */
        public function splitTemplate() {
+               return self::splitRawTemplate( $this->rawChildren );
+       }
+
+       /**
+        * Like splitTemplate() but for a raw child array. For internal use only.
+        */
+       public static function splitRawTemplate( array $children ) {
                $parts = [];
                $bits = [ 'lineStart' => '' ];
-               for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) {
-                       if ( !isset( $child->name ) ) {
+               foreach ( $children as $i => $child ) {
+                       if ( !is_array( $child ) ) {
                                continue;
                        }
-                       if ( $child->name == 'title' ) {
-                               $bits['title'] = $child;
-                       }
-                       if ( $child->name == 'part' ) {
-                               $parts[] = $child;
-                       }
-                       if ( $child->name == 'lineStart' ) {
+                       switch ( $child[self::NAME] ) {
+                       case 'title':
+                               $bits['title'] = new self( $children, $i );
+                               break;
+                       case 'part':
+                               $parts[] = new self( $children, $i );
+                               break;
+                       case '@lineStart':
                                $bits['lineStart'] = '1';
+                               break;
                        }
                }
                if ( !isset( $bits['title'] ) ) {
@@ -1914,13 +1963,23 @@ class PPNode_Hash_Tree implements PPNode {
 class PPNode_Hash_Text implements PPNode {
        // @codingStandardsIgnoreEnd
 
-       public $value, $nextSibling;
+       public $value;
+       private $store, $index;
 
-       public function __construct( $value ) {
-               if ( is_object( $value ) ) {
+       /**
+        * Construct an object using the data from $store[$index]. The rest of the
+        * store array can be accessed via getNextSibling().
+        *
+        * @param array $store
+        * @param integer $index
+        */
+       public function __construct( array $store, $index ) {
+               $this->value = $store[$index];
+               if ( !is_scalar( $this->value ) ) {
                        throw new MWException( __CLASS__ . ' given object instead of string' );
                }
-               $this->value = $value;
+               $this->store = $store;
+               $this->index = $index;
        }
 
        public function __toString() {
@@ -1928,7 +1987,7 @@ class PPNode_Hash_Text implements PPNode {
        }
 
        public function getNextSibling() {
-               return $this->nextSibling;
+               return PPNode_Hash_Tree::factory( $this->store, $this->index + 1 );
        }
 
        public function getChildren() {
@@ -1975,7 +2034,7 @@ class PPNode_Hash_Text implements PPNode {
 class PPNode_Hash_Array implements PPNode {
        // @codingStandardsIgnoreEnd
 
-       public $value, $nextSibling;
+       public $value;
 
        public function __construct( $value ) {
                $this->value = $value;
@@ -1998,7 +2057,7 @@ class PPNode_Hash_Array implements PPNode {
        }
 
        public function getNextSibling() {
-               return $this->nextSibling;
+               return false;
        }
 
        public function getChildren() {
@@ -2033,11 +2092,25 @@ class PPNode_Hash_Array implements PPNode {
 class PPNode_Hash_Attr implements PPNode {
        // @codingStandardsIgnoreEnd
 
-       public $name, $value, $nextSibling;
+       public $name, $value;
+       private $store, $index;
 
-       public function __construct( $name, $value ) {
-               $this->name = $name;
-               $this->value = $value;
+       /**
+        * Construct an object using the data from $store[$index]. The rest of the
+        * store array can be accessed via getNextSibling().
+        *
+        * @param array $store
+        * @param integer $index
+        */
+       public function __construct( array $store, $index ) {
+               $descriptor = $store[$index];
+               if ( $descriptor[PPNode_Hash_Tree::NAME][0] !== '@' ) {
+                       throw new MWException( __METHOD__.': invalid name in attribute descriptor' );
+               }
+               $this->name = substr( $descriptor[PPNode_Hash_Tree::NAME], 1 );
+               $this->value = $descriptor[PPNode_Hash_Tree::CHILDREN][0];
+               $this->store = $store;
+               $this->index = $index;
        }
 
        public function __toString() {
@@ -2049,7 +2122,7 @@ class PPNode_Hash_Attr implements PPNode {
        }
 
        public function getNextSibling() {
-               return $this->nextSibling;
+               return PPNode_Hash_Tree::factory( $this->store, $this->index + 1 );
        }
 
        public function getChildren() {
index 3fe9cdd..1017e44 100644 (file)
@@ -40,10 +40,6 @@ class ProfilerStub extends Profiler {
        public function close() {
        }
 
-       public function getCurrentSection() {
-               return '';
-       }
-
        public function logData() {
        }
 
index 04ec841..65ac6e6 100644 (file)
@@ -46,8 +46,6 @@ class SectionProfiler {
        protected $collateOnly = true;
        /** @var array Cache of a standard broken collation entry */
        protected $errorEntry;
-       /** @var callable Cache of a profile out callback */
-       protected $profileOutCallback;
 
        /**
         * @param array $params
@@ -55,9 +53,6 @@ class SectionProfiler {
        public function __construct( array $params = [] ) {
                $this->errorEntry = $this->getErrorEntry();
                $this->collateOnly = empty( $params['trace'] );
-               $this->profileOutCallback = function ( $profiler, $section ) {
-                       $profiler->profileOutInternal( $section );
-               };
        }
 
        /**
index 78f9370..9563fc0 100644 (file)
@@ -10,11 +10,12 @@ class ExtensionProcessor implements Processor {
        protected static $globalSettings = [
                'ResourceLoaderSources',
                'ResourceLoaderLESSVars',
-               'ResourceLoaderLESSImportPaths',
                'DefaultUserOptions',
                'HiddenPrefs',
                'GroupPermissions',
                'RevokePermissions',
+               'GrantPermissions',
+               'GrantPermissionGroups',
                'ImplicitGroups',
                'GroupsAddToSelf',
                'GroupsRemoveFromSelf',
@@ -26,6 +27,8 @@ class ExtensionProcessor implements Processor {
                'SessionProviders',
                'AuthManagerAutoConfig',
                'CentralIdLookupProviders',
+               'ChangeCredentialsBlacklist',
+               'RemoveCredentialsBlacklist',
                'RateLimits',
                'RecentChangesFlags',
                'MediaHandlers',
@@ -61,6 +64,7 @@ class ExtensionProcessor implements Processor {
        protected static $mergeStrategies = [
                'wgGroupPermissions' => 'array_plus_2d',
                'wgRevokePermissions' => 'array_plus_2d',
+               'wgGrantPermissions' => 'array_plus_2d',
                'wgHooks' => 'array_merge_recursive',
                'wgExtensionCredits' => 'array_merge_recursive',
                'wgExtraGenderNamespaces' => 'array_plus',
@@ -105,6 +109,7 @@ class ExtensionProcessor implements Processor {
                'MessagesDirs',
                'type',
                'config',
+               'config_prefix',
                'ParserTestFiles',
                'AutoloadClasses',
                'manifest_version',
@@ -157,9 +162,14 @@ class ExtensionProcessor implements Processor {
         * @return array
         */
        public function extractInfo( $path, array $info, $version ) {
-               $this->extractConfig( $info );
-               $this->extractHooks( $info );
                $dir = dirname( $path );
+               if ( $version === 2 ) {
+                       $this->extractConfig2( $info, $dir );
+               } else {
+                       // $version === 1
+                       $this->extractConfig1( $info );
+               }
+               $this->extractHooks( $info );
                $this->extractExtensionMessagesFiles( $dir, $info );
                $this->extractMessagesDirs( $dir, $info );
                $this->extractNamespaces( $info );
@@ -345,12 +355,12 @@ class ExtensionProcessor implements Processor {
        }
 
        /**
-        * Set configuration settings
+        * Set configuration settings for manifest_version == 1
         * @todo In the future, this should be done via Config interfaces
         *
         * @param array $info
         */
-       protected function extractConfig( array $info ) {
+       protected function extractConfig1( array $info ) {
                if ( isset( $info['config'] ) ) {
                        if ( isset( $info['config']['_prefix'] ) ) {
                                $prefix = $info['config']['_prefix'];
@@ -366,6 +376,33 @@ class ExtensionProcessor implements Processor {
                }
        }
 
+       /**
+        * Set configuration settings for manifest_version == 2
+        * @todo In the future, this should be done via Config interfaces
+        *
+        * @param array $info
+        * @param string $dir
+        */
+       protected function extractConfig2( array $info, $dir ) {
+               if ( isset( $info['config_prefix'] ) ) {
+                       $prefix = $info['config_prefix'];
+               } else {
+                       $prefix = 'wg';
+               }
+               if ( isset( $info['config'] ) ) {
+                       foreach ( $info['config'] as $key => $data ) {
+                               $value = $data['value'];
+                               if ( isset( $value['merge_strategy'] ) ) {
+                                       $value[ExtensionRegistry::MERGE_STRATEGY] = $data['merge_strategy'];
+                               }
+                               if ( isset( $data['path'] ) && $data['path'] ) {
+                                       $value = "$dir/$value";
+                               }
+                               $this->globals["$prefix$key"] = $value;
+                       }
+               }
+       }
+
        protected function extractParserTestFiles( $dir, array $info ) {
                if ( isset( $info['ParserTestFiles'] ) ) {
                        foreach ( $info['ParserTestFiles'] as $path ) {
index dc53ca4..3bec457 100644 (file)
@@ -19,7 +19,7 @@ class ExtensionRegistry {
        /**
         * Version of the highest supported manifest version
         */
-       const MANIFEST_VERSION = 1;
+       const MANIFEST_VERSION = 2;
 
        /**
         * Version of the oldest supported manifest version
index 09535b7..1a93f6e 100644 (file)
@@ -601,10 +601,8 @@ class ResourceLoader implements LoggerAwareInterface {
         * @return string Hash
         */
        public static function makeHash( $value ) {
-               // Use base64 to output more entropy in a more compact string (default hex is only base16).
-               // The first 8 chars of a base64 encoded digest represent the same binary as
-               // the first 12 chars of a hex encoded digest.
-               return substr( base64_encode( sha1( $value, true ) ), 0, 8 );
+               $hash = hash( 'fnv132', $value );
+               return Wikimedia\base_convert( $hash, 16, 36, 7 );
        }
 
        /**
@@ -1390,13 +1388,14 @@ MESSAGE;
         * the given value.
         *
         * @param array $configuration List of configuration values keyed by variable name
+        * @param bool $pretty Pretty-print with extra whitespace
         * @return string
         */
-       public static function makeConfigSetScript( array $configuration ) {
+       public static function makeConfigSetScript( array $configuration, $pretty = null ) {
                return Xml::encodeJsCall(
                        'mw.config.set',
                        [ $configuration ],
-                       ResourceLoader::inDebugMode()
+                       ( $pretty === null ) ? ResourceLoader::inDebugMode() : $pretty
                );
        }
 
@@ -1470,34 +1469,6 @@ MESSAGE;
                return wfAppendQuery( $script, $query );
        }
 
-       /**
-        * Build a load.php URL
-        * @deprecated since 1.24 Use createLoaderURL() instead
-        * @param array $modules Array of module names (strings)
-        * @param string $lang Language code
-        * @param string $skin Skin name
-        * @param string|null $user User name. If null, the &user= parameter is omitted
-        * @param string|null $version Versioning timestamp
-        * @param bool $debug Whether the request should be in debug mode
-        * @param string|null $only &only= parameter
-        * @param bool $printable Printable mode
-        * @param bool $handheld Handheld mode
-        * @param array $extraQuery Extra query parameters to add
-        * @return string URL to load.php. May be protocol-relative if $wgLoadScript is, too.
-        */
-       public static function makeLoaderURL( $modules, $lang, $skin, $user = null,
-               $version = null, $debug = false, $only = null, $printable = false,
-               $handheld = false, $extraQuery = []
-       ) {
-               global $wgLoadScript;
-
-               $query = self::makeLoaderQuery( $modules, $lang, $skin, $user, $version, $debug,
-                       $only, $printable, $handheld, $extraQuery
-               );
-
-               return wfAppendQuery( $wgLoadScript, $query );
-       }
-
        /**
         * Helper for createLoaderURL()
         *
@@ -1507,7 +1478,7 @@ MESSAGE;
         * @param array $extraQuery
         * @return array
         */
-       public static function createLoaderQuery( ResourceLoaderContext $context, $extraQuery = [] ) {
+       protected static function createLoaderQuery( ResourceLoaderContext $context, $extraQuery = [] ) {
                return self::makeLoaderQuery(
                        $context->getModules(),
                        $context->getLanguage(),
@@ -1524,7 +1495,7 @@ MESSAGE;
 
        /**
         * Build a query array (array representation of query string) for load.php. Helper
-        * function for makeLoaderURL().
+        * function for createLoaderURL().
         *
         * @param array $modules
         * @param string $lang
index b06553a..6b755d7 100644 (file)
@@ -922,6 +922,28 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                return $this->targets;
        }
 
+       /**
+        * Get the module's load type.
+        *
+        * @since 1.28
+        * @return string
+        */
+       public function getType() {
+               $canBeStylesOnly = !(
+                       // All options except 'styles', 'skinStyles' and 'debugRaw'
+                       $this->scripts
+                       || $this->debugScripts
+                       || $this->templates
+                       || $this->languageScripts
+                       || $this->skinScripts
+                       || $this->dependencies
+                       || $this->messages
+                       || $this->skipFunction
+                       || $this->raw
+               );
+               return $canBeStylesOnly ? self::LOAD_STYLES : self::LOAD_GENERAL;
+       }
+
        /**
         * Compile a LESS file into CSS.
         *
index 121a6c9..59f9a63 100644 (file)
@@ -35,6 +35,12 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
        const TYPE_STYLES = 'styles';
        const TYPE_COMBINED = 'combined';
 
+       # Desired load type
+       // Module only has styles (loaded via <style> or <link rel=stylesheet>)
+       const LOAD_STYLES = 'styles';
+       // Module may have other resources (loaded via mw.loader from a script)
+       const LOAD_GENERAL = 'general';
+
        # sitewide core module like a skin file or jQuery component
        const ORIGIN_CORE_SITEWIDE = 1;
 
@@ -343,6 +349,16 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
                return $this->targets;
        }
 
+       /**
+        * Get the module's load type.
+        *
+        * @since 1.28
+        * @return string ResourceLoaderModule LOAD_* constant
+        */
+       public function getType() {
+               return self::LOAD_GENERAL;
+       }
+
        /**
         * Get the skip function.
         *
@@ -443,7 +459,7 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
                                        ]
                                );
 
-                               $dbw->onTransactionIdle( function () use ( &$scopeLock ) {
+                               $dbw->onTransactionResolution( function () use ( &$scopeLock ) {
                                        ScopedCallback::consume( $scopeLock ); // release after commit
                                } );
                        }
diff --git a/includes/resourceloader/ResourceLoaderSiteStylesModule.php b/includes/resourceloader/ResourceLoaderSiteStylesModule.php
new file mode 100644 (file)
index 0000000..46808a1
--- /dev/null
@@ -0,0 +1,53 @@
+<?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
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Trevor Parscal
+ * @author Roan Kattouw
+ */
+
+/**
+ * Module for site style customizations
+ */
+class ResourceLoaderSiteStylesModule extends ResourceLoaderWikiModule {
+
+       /**
+        * Get list of pages used by this module
+        *
+        * @param ResourceLoaderContext $context
+        * @return array List of pages
+        */
+       protected function getPages( ResourceLoaderContext $context ) {
+               $pages = [];
+               if ( $this->getConfig()->get( 'UseSiteCss' ) ) {
+                       $pages['MediaWiki:Common.css'] = [ 'type' => 'style' ];
+                       $pages['MediaWiki:' . ucfirst( $context->getSkin() ) . '.css'] = [ 'type' => 'style' ];
+                       $pages['MediaWiki:Print.css'] = [ 'type' => 'style', 'media' => 'print' ];
+
+               }
+               return $pages;
+       }
+
+       /**
+        * @return string
+        */
+       public function getType() {
+               return self::LOAD_STYLES;
+       }
+}
index 34866f3..7b2d532 100644 (file)
@@ -217,7 +217,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        }
 
                        $versionHash = $module->getVersionHash( $context );
-                       if ( strlen( $versionHash ) !== 8 ) {
+                       if ( strlen( $versionHash ) !== 7 ) {
                                $context->getLogger()->warning(
                                        "Module '{module}' produced an invalid version hash: '{version}'.",
                                        [
index 9c198d1..4d0bff7 100644 (file)
@@ -83,4 +83,11 @@ class ResourceLoaderUserCSSPrefsModule extends ResourceLoaderModule {
        public function getGroup() {
                return 'private';
        }
+
+       /**
+        * @return string
+        */
+       public function getType() {
+               return self::LOAD_STYLES;
+       }
 }
index e3ada8e..82051b1 100644 (file)
@@ -61,9 +61,6 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
        // Group of module
        protected $group;
 
-       // Whether to enable variable expansion (e.g. "{skin}")
-       protected $allowVariables = false;
-
        /**
         * @param array $options For back-compat, this can be omitted in favour of overwriting getPages.
         */
@@ -79,7 +76,6 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                                case 'scripts':
                                case 'group':
                                case 'targets':
-                               case 'allowVariables':
                                        $this->{$member} = $option;
                                        break;
                        }
@@ -109,30 +105,19 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                // Filter out pages from origins not allowed by the current wiki configuration.
                if ( $config->get( 'UseSiteJs' ) ) {
                        foreach ( $this->scripts as $script ) {
-                               $page = $this->expandVariables( $context, $script );
-                               $pages[$page] = [ 'type' => 'script' ];
+                               $pages[$script] = [ 'type' => 'script' ];
                        }
                }
 
                if ( $config->get( 'UseSiteCss' ) ) {
                        foreach ( $this->styles as $style ) {
-                               $page = $this->expandVariables( $context, $style );
-                               $pages[$page] = [ 'type' => 'style' ];
+                               $pages[$style] = [ 'type' => 'style' ];
                        }
                }
 
                return $pages;
        }
 
-       private function expandVariables( ResourceLoaderContext $context, $pageName ) {
-               if ( !$this->allowVariables ) {
-                       return $pageName;
-               }
-               return strtr( $pageName, [
-                       '{skin}' => $context->getSkin()
-               ] );
-       }
-
        /**
         * Get group name
         *
@@ -336,7 +321,21 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                return $this->titleInfo[$key];
        }
 
+       /**
+        * @return string
+        */
        public function getPosition() {
                return $this->position;
        }
+
+       /**
+        * @since 1.28
+        * @return string
+        */
+       public function getType() {
+               // Check both because subclasses don't always pass pages via the constructor,
+               // they may also override getPages() instead, in which case we should keep
+               // defaulting to LOAD_GENERAL and allow them to override getType() separately.
+               return ( $this->styles && !$this->scripts ) ? self::LOAD_STYLES : self::LOAD_GENERAL;
+       }
 }
index 72c460e..ad9259b 100644 (file)
@@ -77,7 +77,7 @@ class RevDelArchiveList extends RevDelRevisionList {
                return Status::newGood();
        }
 
-       public function doPostCommitUpdates() {
+       public function doPostCommitUpdates( array $visibilityChangeMap ) {
                return Status::newGood();
        }
 }
index e2bb516..39fb8ef 100644 (file)
  * Item class for a filearchive table row
  */
 class RevDelArchivedFileItem extends RevDelFileItem {
+       /** @var RevDelArchivedFileList */
+       protected $list;
+       /** @var ArchivedFile */
+       protected $file;
+       /** @var LocalFile */
+       protected $lockFile;
+
        public function __construct( $list, $row ) {
                RevDelItem::__construct( $list, $row );
                $this->file = ArchivedFile::newFromRow( $row );
+               $this->lockFile = RepoGroup::singleton()->getLocalRepo()->newFile( $row->fa_name );
        }
 
        public function getIdField() {
@@ -107,8 +115,7 @@ class RevDelArchivedFileItem extends RevDelFileItem {
                                                'target' => $this->list->title->getPrefixedText(),
                                                'file' => $file->getKey(),
                                                'token' => $user->getEditToken( $file->getKey() )
-                                       ],
-                                       false, PROTO_RELATIVE
+                                       ]
                                ),
                        ];
                }
@@ -126,4 +133,12 @@ class RevDelArchivedFileItem extends RevDelFileItem {
 
                return $ret;
        }
+
+       public function lock() {
+               return $this->lockFile->acquireFileLock();
+       }
+
+       public function unlock() {
+               return $this->lockFile->releaseFileLock();
+       }
 }
index 921fe5a..3a3b467 100644 (file)
  * Item class for an oldimage table row
  */
 class RevDelFileItem extends RevDelItem {
-       /** @var File */
+       /** @var OldLocalFile */
        public $file;
+       /** @var RevDelFileList */
+       protected $list;
 
        public function __construct( $list, $row ) {
                parent::__construct( $list, $row );
@@ -215,8 +217,7 @@ class RevDelFileItem extends RevDelItem {
                                                'target' => $this->list->title->getPrefixedText(),
                                                'file' => $file->getArchiveName(),
                                                'token' => $user->getEditToken( $file->getArchiveName() )
-                                       ],
-                                       false, PROTO_RELATIVE
+                                       ]
                                ),
                        ];
                }
@@ -234,4 +235,12 @@ class RevDelFileItem extends RevDelItem {
 
                return $ret;
        }
+
+       public function lock() {
+               return $this->file->acquireFileLock();
+       }
+
+       public function unlock() {
+               return $this->file->releaseFileLock();
+       }
 }
index 75e1885..00cb2e1 100644 (file)
@@ -104,7 +104,7 @@ class RevDelFileList extends RevDelList {
                return $status;
        }
 
-       public function doPostCommitUpdates() {
+       public function doPostCommitUpdates( array $visibilityChangeMap ) {
                $file = wfLocalFile( $this->title );
                $file->purgeCache();
                $file->purgeDescription();
index dba368d..b114c75 100644 (file)
@@ -61,4 +61,22 @@ abstract class RevDelItem extends RevisionItemBase {
         * @return array Data for the API result
         */
        abstract public function getApiData( ApiResult $result );
+
+       /**
+        * Lock the item against changes outside of the DB
+        * @return Status
+        * @since 1.28
+        */
+       public function lock() {
+               return Status::newGood();
+       }
+
+       /**
+        * Unlock the item against changes outside of the DB
+        * @return Status
+        * @since 1.28
+        */
+       public function unlock() {
+               return Status::newGood();
+       }
 }
index 87e641d..d365bf6 100644 (file)
@@ -81,14 +81,13 @@ abstract class RevDelList extends RevisionListBase {
        public function areAnySuppressed() {
                $bit = $this->getSuppressBit();
 
-               // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
-               for ( $this->reset(); $this->current(); $this->next() ) {
-                       // @codingStandardsIgnoreEnd
-                       $item = $this->current();
+               /** @var $item RevDelItem */
+               foreach ( $this as $item ) {
                        if ( $item->getBits() & $bit ) {
                                return true;
                        }
                }
+
                return false;
        }
 
@@ -104,6 +103,8 @@ abstract class RevDelList extends RevisionListBase {
         * @since 1.23 Added 'perItemStatus' param
         */
        public function setVisibility( array $params ) {
+               $status = Status::newGood();
+
                $bitPars = $params['value'];
                $comment = $params['comment'];
                $perItemStatus = isset( $params['perItemStatus'] ) ? $params['perItemStatus'] : false;
@@ -113,9 +114,17 @@ abstract class RevDelList extends RevisionListBase {
                $dbw = wfGetDB( DB_MASTER );
                $this->res = $this->doQuery( $dbw );
 
+               $status->merge( $this->acquireItemLocks() );
+               if ( !$status->isGood() ) {
+                       return $status;
+               }
+
                $dbw->startAtomic( __METHOD__ );
+               $dbw->onTransactionResolution( function () {
+                       // Release locks on commit or error
+                       $this->releaseItemLocks();
+               } );
 
-               $status = Status::newGood();
                $missing = array_flip( $this->ids );
                $this->clearFileOps();
                $idsForLog = [];
@@ -132,11 +141,12 @@ abstract class RevDelList extends RevisionListBase {
                $virtualNewBits = 0;
                $logType = 'delete';
 
-               // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
-               for ( $this->reset(); $this->current(); $this->next() ) {
-                       // @codingStandardsIgnoreEnd
-                       /** @var $item RevDelItem */
-                       $item = $this->current();
+               // Will be filled with id => [old, new bits] information and
+               // passed to doPostCommitUpdates().
+               $visibilityChangeMap = [];
+
+               /** @var $item RevDelItem */
+               foreach ( $this as $item ) {
                        unset( $missing[$item->getId()] );
 
                        if ( $perItemStatus ) {
@@ -205,6 +215,13 @@ abstract class RevDelList extends RevisionListBase {
                                } elseif ( IP::isIPAddress( $item->getAuthorName() ) ) {
                                        $authorIPs[] = $item->getAuthorName();
                                }
+
+                               // Save the old and new bits in $visibilityChangeMap for
+                               // later use.
+                               $visibilityChangeMap[$item->getId()] = [
+                                       'oldBits' => $oldBits,
+                                       'newBits' => $newBits,
+                               ];
                        } else {
                                $itemStatus->error(
                                        'revdelete-concurrent-change', $item->formatDate(), $item->formatTime() );
@@ -223,7 +240,7 @@ abstract class RevDelList extends RevisionListBase {
                }
 
                if ( $status->successCount == 0 ) {
-                       $dbw->rollback( __METHOD__ );
+                       $dbw->endAtomic( __METHOD__ );
                        return $status;
                }
 
@@ -233,8 +250,8 @@ abstract class RevDelList extends RevisionListBase {
                // Move files, if there are any
                $status->merge( $this->doPreCommitUpdates() );
                if ( !$status->isOK() ) {
-                       // Fatal error, such as no configured archive directory
-                       $dbw->rollback( __METHOD__ );
+                       // Fatal error, such as no configured archive directory or I/O failures
+                       wfGetLBFactory()->rollbackMasterChanges( __METHOD__ );
                        return $status;
                }
 
@@ -253,17 +270,39 @@ abstract class RevDelList extends RevisionListBase {
                        ]
                );
 
-               // Clear caches
-               $that = $this;
-               $dbw->onTransactionIdle( function() use ( $that ) {
-                       $that->doPostCommitUpdates();
-               } );
+               // Clear caches after commit
+               DeferredUpdates::addCallableUpdate(
+                       function () use ( $visibilityChangeMap ) {
+                               $this->doPostCommitUpdates( $visibilityChangeMap );
+                       },
+                       DeferredUpdates::PRESEND
+               );
 
                $dbw->endAtomic( __METHOD__ );
 
                return $status;
        }
 
+       final protected function acquireItemLocks() {
+               $status = Status::newGood();
+               /** @var $item RevDelItem */
+               foreach ( $this as $item ) {
+                       $status->merge( $item->lock() );
+               }
+
+               return $status;
+       }
+
+       final protected function releaseItemLocks() {
+               $status = Status::newGood();
+               /** @var $item RevDelItem */
+               foreach ( $this as $item ) {
+                       $status->merge( $item->unlock() );
+               }
+
+               return $status;
+       }
+
        /**
         * Reload the list data from the master DB. This can be done after setVisibility()
         * to allow $item->getHTML() to show the new data.
@@ -351,9 +390,10 @@ abstract class RevDelList extends RevisionListBase {
        /**
         * A hook for setVisibility(): do any necessary updates post-commit.
         * STUB
+        * @param array [id => ['oldBits' => $oldBits, 'newBits' => $newBits], ... ]
         * @return Status
         */
-       public function doPostCommitUpdates() {
+       public function doPostCommitUpdates( array $visibilityChangeMap ) {
                return Status::newGood();
        }
 
index 27e5148..3486645 100644 (file)
@@ -170,10 +170,10 @@ class RevDelRevisionList extends RevDelList {
                return Status::newGood();
        }
 
-       public function doPostCommitUpdates() {
+       public function doPostCommitUpdates( array $visibilityChangeMap ) {
                $this->title->purgeSquid();
                // Extensions that require referencing previous revisions may need this
-               Hooks::run( 'ArticleRevisionVisibilitySet', [ $this->title, $this->ids ] );
+               Hooks::run( 'ArticleRevisionVisibilitySet', [ $this->title, $this->ids, $visibilityChangeMap ] );
                return Status::newGood();
        }
 }
diff --git a/includes/search/NullIndexField.php b/includes/search/NullIndexField.php
new file mode 100644 (file)
index 0000000..933e0ad
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * Null index field - means search engine does not implement this field.
+ */
+class NullIndexField implements SearchIndexField {
+
+       /**
+        * Get mapping for specific search engine
+        * @param SearchEngine $engine
+        * @return array|null Null means this field does not map to anything
+        */
+       public function getMapping( SearchEngine $engine ) {
+               return null;
+       }
+
+       /**
+        * Set global flag for this field.
+        *
+        * @param int  $flag Bit flag to set/unset
+        * @param bool $unset True if flag should be unset, false by default
+        * @return $this
+        */
+       public function setFlag( $flag, $unset = false ) {
+       }
+
+       /**
+        * Check if flag is set.
+        * @param $flag
+        * @return int 0 if unset, !=0 if set
+        */
+       public function checkFlag( $flag ) {
+               return 0;
+       }
+
+       /**
+        * Merge two field definitions if possible.
+        *
+        * @param SearchIndexField $that
+        * @return SearchIndexField|false New definition or false if not mergeable.
+        */
+       public function merge( SearchIndexField $that ) {
+               return $that;
+       }
+}
index 0171ed9..9168d64 100644 (file)
@@ -655,6 +655,46 @@ abstract class SearchEngine {
                return null;
        }
 
+       /**
+        * Create a search field definition.
+        * Specific search engines should override this method to create search fields.
+        * @param string $name
+        * @param int    $type
+        * @return SearchIndexField
+        * @since 1.28
+        */
+       public function makeSearchFieldMapping( $name, $type ) {
+               return new NullIndexField();
+       }
+
+       /**
+        * Get fields for search index
+        * @since 1.28
+        * @return SearchIndexField[] Index field definitions for all content handlers
+        */
+       public function getSearchIndexFields() {
+               $models = ContentHandler::getContentModels();
+               $fields = [];
+               foreach ( $models as $model ) {
+                       $handler = ContentHandler::getForModelID( $model );
+                       $handlerFields = $handler->getFieldsForSearchIndex( $this );
+                       foreach ( $handlerFields as $fieldName => $fieldData ) {
+                               if ( empty( $fields[$fieldName] ) ) {
+                                       $fields[$fieldName] = $fieldData;
+                               } else {
+                                       // TODO: do we allow some clashes with the same type or reject all of them?
+                                       $mergeDef = $fields[$fieldName]->merge( $fieldData );
+                                       if ( !$mergeDef ) {
+                                               throw new InvalidArgumentException( "Duplicate field $fieldName for model $model" );
+                                       }
+                                       $fields[$fieldName] = $mergeDef;
+                               }
+                       }
+               }
+               // Hook to allow extensions to produce search mapping fields
+               Hooks::run( 'SearchIndexFields', [ &$fields, $this ] );
+               return $fields;
+       }
 }
 
 /**
diff --git a/includes/search/SearchIndexField.php b/includes/search/SearchIndexField.php
new file mode 100644 (file)
index 0000000..7499853
--- /dev/null
@@ -0,0 +1,65 @@
+<?php
+/**
+ * Definition of a mapping for the search index field.
+ * @since 1.28
+ */
+interface SearchIndexField {
+       /**
+        * Field types
+        */
+       const INDEX_TYPE_TEXT = 0;
+       const INDEX_TYPE_KEYWORD = 1;
+       const INDEX_TYPE_INTEGER = 2;
+       const INDEX_TYPE_NUMBER = 3;
+       const INDEX_TYPE_DATETIME = 4;
+       const INDEX_TYPE_NESTED = 5;
+       const INDEX_TYPE_BOOL = 6;
+       /**
+        * Generic field flags.
+        */
+       /**
+        * This field is case-insensitive.
+        */
+       const FLAG_CASEFOLD = 1;
+       /**
+        * This field contains secondary information, which is
+        * already present in other fields, but can be used for
+        * scoring.
+        */
+       const FLAG_SCORING = 2;
+       /**
+        * This field does not need highlight handling.
+        */
+       const FLAG_NO_HIGHLIGHT = 4;
+       /**
+        * Do not index this field, just store it.
+        */
+       const FLAG_NO_INDEX = 8;
+       /**
+        * Get mapping for specific search engine
+        * @param SearchEngine $engine
+        * @return array|null Null means this field does not map to anything
+        */
+       public function getMapping( SearchEngine $engine );
+       /**
+        * Set global flag for this field.
+        *
+        * @param int  $flag Bit flag to set/unset
+        * @param bool $unset True if flag should be unset, false by default
+        * @return $this
+        */
+       public function setFlag( $flag, $unset = false );
+       /**
+        * Check if flag is set.
+        * @param $flag
+        * @return int 0 if unset, !=0 if set
+        */
+       public function checkFlag( $flag );
+       /**
+        * Merge two field definitions if possible.
+        *
+        * @param SearchIndexField $that
+        * @return SearchIndexField|false New definition or false if not mergeable.
+        */
+       public function merge( SearchIndexField $that );
+}
diff --git a/includes/search/SearchIndexFieldDefinition.php b/includes/search/SearchIndexFieldDefinition.php
new file mode 100644 (file)
index 0000000..3a86c82
--- /dev/null
@@ -0,0 +1,118 @@
+<?php
+
+/**
+ * Basic infrastructure of the field definition.
+ * Specific engines will need to override it at least for getMapping,
+ * but can reuse other parts.
+ * @since 1.28
+ */
+abstract class SearchIndexFieldDefinition implements SearchIndexField {
+       /**
+        * Name of the field
+        *
+        * @var string
+        */
+       protected $name;
+       /**
+        * Type of the field, one of the constants above
+        *
+        * @var int
+        */
+       protected $type;
+       /**
+        * Bit flags for the field.
+        *
+        * @var int
+        */
+       protected $flags = 0;
+       /**
+        * Subfields
+        * @var SearchIndexFieldDefinition[]
+        */
+       protected $subfields = [];
+
+       /**
+        * SearchIndexFieldDefinition constructor.
+        * @param string $name Field name
+        * @param int    $type Index type
+        */
+       public function __construct( $name, $type ) {
+               $this->name = $name;
+               $this->type = $type;
+       }
+
+       /**
+        * Get field name
+        * @return string
+        */
+       public function getName() {
+               return $this->name;
+       }
+
+       /**
+        * Get index type
+        * @return int
+        */
+       public function getIndexType() {
+               return $this->type;
+       }
+
+       /**
+        * Set global flag for this field.
+        *
+        * @param int  $flag Bit flag to set/unset
+        * @param bool $unset True if flag should be unset, false by default
+        * @return $this
+        */
+       public function setFlag( $flag, $unset = false ) {
+               if ( $unset ) {
+                       $this->flags &= ~$flag;
+               } else {
+                       $this->flags |= $flag;
+               }
+               return $this;
+       }
+
+       /**
+        * Check if flag is set.
+        * @param $flag
+        * @return int 0 if unset, !=0 if set
+        */
+       public function checkFlag( $flag ) {
+               return $this->flags & $flag;
+       }
+
+       /**
+        * Merge two field definitions if possible.
+        *
+        * @param SearchIndexField $that
+        * @return SearchIndexField|false New definition or false if not mergeable.
+        */
+       public function merge( SearchIndexField $that ) {
+               // TODO: which definitions may be compatible?
+               if ( ( $that instanceof self ) && $this->type === $that->type &&
+                    $this->flags === $that->flags && $this->type !== self::INDEX_TYPE_NESTED
+               ) {
+                       return $that;
+               }
+               return false;
+       }
+
+       /**
+        * Get subfields
+        * @return SearchIndexFieldDefinition[]
+        */
+       public function getSubfields() {
+               return $this->subfields;
+       }
+
+       /**
+        * Set subfields
+        * @param SearchIndexFieldDefinition[] $subfields
+        * @return $this
+        */
+       public function setSubfields( array $subfields ) {
+               $this->subfields = $subfields;
+               return $this;
+       }
+}
index 3df0dae..79fc720 100644 (file)
@@ -221,7 +221,7 @@ class CookieSessionProvider extends SessionProvider {
                        if ( $value === false ) {
                                $response->clearCookie( $key, $options );
                        } else {
-                               $expirationDuration = $this->getLoginCookieExpiration( $key );
+                               $expirationDuration = $this->getLoginCookieExpiration( $key, $session->shouldRememberUser() );
                                $expiration = $expirationDuration ? $expirationDuration + time() : null;
                                $response->setCookie( $key, (string)$value, $expiration, $options );
                        }
@@ -271,7 +271,10 @@ class CookieSessionProvider extends SessionProvider {
                $response = $request->response();
                if ( $set ) {
                        if ( $backend->shouldRememberUser() ) {
-                               $expirationDuration = $this->getLoginCookieExpiration( 'forceHTTPS' );
+                               $expirationDuration = $this->getLoginCookieExpiration(
+                                       'forceHTTPS',
+                                       true
+                               );
                                $expiration = $expirationDuration ? $expirationDuration + time() : null;
                        } else {
                                $expiration = null;
@@ -397,23 +400,40 @@ class CookieSessionProvider extends SessionProvider {
        }
 
        public function getRememberUserDuration() {
-               return min( $this->getLoginCookieExpiration( 'UserID' ),
-                       $this->getLoginCookieExpiration( 'Token' ) ) ?: null;
+               return min( $this->getLoginCookieExpiration( 'UserID', true ),
+                       $this->getLoginCookieExpiration( 'Token', true ) ) ?: null;
+       }
+
+       /**
+        * Gets the list of cookies that must be set to the 'remember me' duration,
+        * if $wgExtendedLoginCookieExpiration is in use.
+        *
+        * @return string[] Array of unprefixed cookie keys
+        */
+       protected function getExtendedLoginCookies() {
+               return [ 'UserID', 'UserName', 'Token' ];
        }
 
        /**
         * Returns the lifespan of the login cookies, in seconds. 0 means until the end of the session.
+        *
+        * Cookies that are session-length do not call this function.
+        *
         * @param string $cookieName
+        * @param boolean $shouldRememberUser Whether the user should be remembered
+        *   long-term
         * @return int Cookie expiration time in seconds; 0 for session cookies
         */
-       protected function getLoginCookieExpiration( $cookieName ) {
+       protected function getLoginCookieExpiration( $cookieName, $shouldRememberUser ) {
+               $extendedCookies = $this->getExtendedLoginCookies();
                $normalExpiration = $this->config->get( 'CookieExpiration' );
-               $extendedExpiration = $this->config->get( 'ExtendedLoginCookieExpiration' );
-               $extendedCookies = $this->config->get( 'ExtendedLoginCookies' );
 
-               if ( !in_array( $cookieName, $extendedCookies, true ) ) {
+               if ( $shouldRememberUser && in_array( $cookieName, $extendedCookies, true ) ) {
+                       $extendedExpiration = $this->config->get( 'ExtendedLoginCookieExpiration' );
+
+                       return ( $extendedExpiration !== null ) ? (int)$extendedExpiration : (int)$normalExpiration;
+               } else {
                        return (int)$normalExpiration;
                }
-               return ( $extendedExpiration !== null ) ? (int)$extendedExpiration : (int)$normalExpiration;
        }
 }
index 719f905..8fa212e 100644 (file)
@@ -46,6 +46,9 @@ use WebRequest;
  * @since 1.27
  */
 final class Session implements \Countable, \Iterator, \ArrayAccess {
+       /** @var null|string[] Encryption algorithm to use */
+       private static $encryptionAlgorithm = null;
+
        /** @var SessionBackend Session backend */
        private $backend;
 
@@ -409,24 +412,42 @@ final class Session implements \Countable, \Iterator, \ArrayAccess {
         * Decide what type of encryption to use, based on system capabilities.
         * @return array
         */
-       private function getEncryptionAlgorithm() {
+       private static function getEncryptionAlgorithm() {
                global $wgSessionInsecureSecrets;
 
-               if (
-                       function_exists( 'openssl_encrypt' )
-                       && in_array( 'aes-256-ctr', openssl_get_cipher_methods(), true )
-               ) {
-                       return [ 'openssl', 'aes-256-ctr' ];
-               } elseif (
-                       function_exists( 'mcrypt_encrypt' )
-                       && in_array( 'rijndael-128', mcrypt_list_algorithms(), true )
-                       && in_array( 'ctr', mcrypt_list_modes(), true )
-               ) {
-                       return [ 'mcrypt', 'rijndael-128', 'ctr' ];
-               } elseif ( $wgSessionInsecureSecrets ) {
-                       // @todo: import a pure-PHP library for AES instead of this
-                       return [ 'insecure' ];
-               } else {
+               if ( self::$encryptionAlgorithm === null ) {
+                       if ( function_exists( 'openssl_encrypt' ) ) {
+                               $methods = openssl_get_cipher_methods();
+                               if ( in_array( 'aes-256-ctr', $methods, true ) ) {
+                                       self::$encryptionAlgorithm = [ 'openssl', 'aes-256-ctr' ];
+                                       return self::$encryptionAlgorithm;
+                               }
+                               if ( in_array( 'aes-256-cbc', $methods, true ) ) {
+                                       self::$encryptionAlgorithm = [ 'openssl', 'aes-256-cbc' ];
+                                       return self::$encryptionAlgorithm;
+                               }
+                       }
+
+                       if ( function_exists( 'mcrypt_encrypt' )
+                               && in_array( 'rijndael-128', mcrypt_list_algorithms(), true )
+                       ) {
+                               $modes = mcrypt_list_modes();
+                               if ( in_array( 'ctr', $modes, true ) ) {
+                                       self::$encryptionAlgorithm = [ 'mcrypt', 'rijndael-128', 'ctr' ];
+                                       return self::$encryptionAlgorithm;
+                               }
+                               if ( in_array( 'cbc', $modes, true ) ) {
+                                       self::$encryptionAlgorithm = [ 'mcrypt', 'rijndael-128', 'cbc' ];
+                                       return self::$encryptionAlgorithm;
+                               }
+                       }
+
+                       if ( $wgSessionInsecureSecrets ) {
+                               // @todo: import a pure-PHP library for AES instead of this
+                               self::$encryptionAlgorithm = [ 'insecure' ];
+                               return self::$encryptionAlgorithm;
+                       }
+
                        throw new \BadMethodCallException(
                                'Encryption is not available. You really should install the PHP OpenSSL extension, ' .
                                'or failing that the mcrypt extension. But if you really can\'t and you\'re willing ' .
@@ -435,6 +456,7 @@ final class Session implements \Countable, \Iterator, \ArrayAccess {
                        );
                }
 
+               return self::$encryptionAlgorithm;
        }
 
        /**
@@ -455,7 +477,7 @@ final class Session implements \Countable, \Iterator, \ArrayAccess {
                // Encrypt
                // @todo: import a pure-PHP library for AES instead of doing $wgSessionInsecureSecrets
                $iv = \MWCryptRand::generate( 16, true );
-               $algorithm = $this->getEncryptionAlgorithm();
+               $algorithm = self::getEncryptionAlgorithm();
                switch ( $algorithm[0] ) {
                        case 'openssl':
                                $ciphertext = openssl_encrypt( $serialized, $algorithm[1], $encKey, OPENSSL_RAW_DATA, $iv );
@@ -464,6 +486,11 @@ final class Session implements \Countable, \Iterator, \ArrayAccess {
                                }
                                break;
                        case 'mcrypt':
+                               // PKCS7 padding
+                               $blocksize = mcrypt_get_block_size( $algorithm[1], $algorithm[2] );
+                               $pad = $blocksize - ( strlen( $serialized ) % $blocksize );
+                               $serialized .= str_repeat( chr( $pad ), $pad );
+
                                $ciphertext = mcrypt_encrypt( $algorithm[1], $encKey, $serialized, $algorithm[2], $iv );
                                if ( $ciphertext === false ) {
                                        throw new \UnexpectedValueException( 'Encryption failed' );
@@ -521,7 +548,7 @@ final class Session implements \Countable, \Iterator, \ArrayAccess {
                }
 
                // Decrypt
-               $algorithm = $this->getEncryptionAlgorithm();
+               $algorithm = self::getEncryptionAlgorithm();
                switch ( $algorithm[0] ) {
                        case 'openssl':
                                $serialized = openssl_decrypt( base64_decode( $ciphertext ), $algorithm[1], $encKey,
@@ -540,6 +567,10 @@ final class Session implements \Countable, \Iterator, \ArrayAccess {
                                        $this->logger->debug( $ex->getMessage(), [ 'exception' => $ex ] );
                                        return $default;
                                }
+
+                               // Remove PKCS7 padding
+                               $pad = ord( substr( $serialized, -1 ) );
+                               $serialized = substr( $serialized, 0, -$pad );
                                break;
                        case 'insecure':
                                $ex = new \Exception(
index 50794d0..4d57ad9 100644 (file)
@@ -456,7 +456,7 @@ abstract class SessionProvider implements SessionProviderInterface, LoggerAwareI
         * @warning This will be called early during MediaWiki startup. Do not
         *  use $wgUser, $wgLang, $wgOut, $wgParser, or their equivalents via
         *  RequestContext from this method!
-        * @return Message
+        * @return \Message
         */
        protected function describeMessage() {
                return wfMessage(
index c1c10c2..974789f 100644 (file)
@@ -40,11 +40,6 @@ class DBSiteStore implements SiteStore {
         */
        private $dbLoadBalancer;
 
-       /**
-        * @var string[]
-        */
-       private $languageCodeMapping = [];
-
        /**
         * @since 1.27
         *
@@ -101,17 +96,15 @@ class DBSiteStore implements SiteStore {
                );
 
                foreach ( $res as $row ) {
-                       $languageCode = $row->site_language === '' ? null : $row->site_language;
-                       if ( isset( $this->languageCodeMapping[ $languageCode ] ) ) {
-                               $languageCode = $this->languageCodeMapping[ $languageCode ];
-                       }
-
                        $site = Site::newForType( $row->site_type );
                        $site->setGlobalId( $row->site_global_key );
                        $site->setInternalId( (int)$row->site_id );
                        $site->setForward( (bool)$row->site_forward );
                        $site->setGroup( $row->site_group );
-                       $site->setLanguageCode( $languageCode );
+                       $site->setLanguageCode( $row->site_language === ''
+                               ? null
+                               : $row->site_language
+                       );
                        $site->setSource( $row->site_source );
                        $site->setExtraData( unserialize( $row->site_data ) );
                        $site->setExtraConfig( unserialize( $row->site_config ) );
@@ -294,13 +287,4 @@ class DBSiteStore implements SiteStore {
                return $ok;
        }
 
-       /**
-        * Provide an array that maps language codes
-        *
-        * @param string[] $newMapping
-        */
-       public function setLanguageCodeMapping( array $newMapping ) {
-               $this->languageCodeMapping = $newMapping;
-       }
-
 }
index 424d8e6..9654440 100644 (file)
@@ -42,11 +42,6 @@ class FileBasedSiteLookup implements SiteLookup {
         */
        private $cacheFile;
 
-       /**
-        * @var string[]
-        */
-       private $languageCodeMapping = [];
-
        /**
         * @param string $cacheFile
         */
@@ -123,18 +118,13 @@ class FileBasedSiteLookup implements SiteLookup {
         * @return Site
         */
        private function newSiteFromArray( array $data ) {
-               $languageCode = $data['language'];
-               if ( isset( $this->languageCodeMapping[ $languageCode ] ) ) {
-                       $languageCode = $this->languageCodeMapping[ $languageCode ];
-               }
-
                $siteType = array_key_exists( 'type', $data ) ? $data['type'] : Site::TYPE_UNKNOWN;
                $site = Site::newForType( $siteType );
 
                $site->setGlobalId( $data['globalid'] );
                $site->setForward( $data['forward'] );
                $site->setGroup( $data['group'] );
-               $site->setLanguageCode( $languageCode );
+               $site->setLanguageCode( $data['language'] );
                $site->setSource( $data['source'] );
                $site->setExtraData( $data['data'] );
                $site->setExtraConfig( $data['config'] );
@@ -146,13 +136,4 @@ class FileBasedSiteLookup implements SiteLookup {
                return $site;
        }
 
-       /**
-        * Provide an array that maps language codes
-        *
-        * @param string[] $newMapping
-        */
-       public function setLanguageCodeMapping( array $newMapping ) {
-               $this->languageCodeMapping = $newMapping;
-       }
-
 }
index 2f71736..1a079b4 100644 (file)
@@ -34,6 +34,22 @@ use UtfNormal\Validator;
  */
 class MediaWikiPageNameNormalizer {
 
+       /**
+        * @var Http
+        */
+       private $http;
+
+       /**
+        * @param Http|null $http
+        */
+       public function __construct( Http $http = null ) {
+               if ( !$http ) {
+                       $http = new Http();
+               }
+
+               $this->http = $http;
+       }
+
        /**
         * Returns the normalized form of the given page title, using the
         * normalization rules of the given site. If the given title is a redirect,
@@ -85,7 +101,7 @@ class MediaWikiPageNameNormalizer {
 
                // Go on call the external site
                // @todo we need a good way to specify a timeout here.
-               $ret = Http::get( $url, [], __METHOD__ );
+               $ret = $this->http->get( $url, [], __METHOD__ );
 
                if ( $ret === false ) {
                        wfDebugLog( "MediaWikiSite", "call to external site failed: $url" );
index 3408db3..71ca57b 100644 (file)
@@ -140,7 +140,7 @@ abstract class BaseTemplate extends QuickTemplate {
                        if ( isset( $plink['active'] ) ) {
                                $ptool['active'] = $plink['active'];
                        }
-                       foreach ( [ 'href', 'class', 'text', 'dir' ] as $k ) {
+                       foreach ( [ 'href', 'class', 'text', 'dir', 'data' ] as $k ) {
                                if ( isset( $plink[$k] ) ) {
                                        $ptool['links'][0][$k] = $plink[$k];
                                }
@@ -318,6 +318,15 @@ abstract class BaseTemplate extends QuickTemplate {
         *
         * If you don't want an accesskey, set $item['tooltiponly'] = true;
         *
+        * If a "data" key is present, it must be an array, where the keys represent
+        * the data-xxx properties with their provided values. For example,
+        *  $item['data'] = array(
+        *       'foo' => 1,
+        *       'bar' => 'baz',
+        *  );
+        * will render as element properties:
+        *  data-foo='1' data-bar='baz'
+        *
         * @param array $options Can be used to affect the output of a link.
         * Possible options are:
         *   - 'text-wrapper' key to specify a list of elements to wrap the text of
@@ -363,6 +372,13 @@ abstract class BaseTemplate extends QuickTemplate {
                                unset( $attrs[$k] );
                        }
 
+                       if ( isset( $attrs['data'] ) ) {
+                               foreach ( $attrs['data'] as $key => $value ) {
+                                       $attrs[ 'data-' . $key ] = $value;
+                               }
+                               unset( $attrs[ 'data' ] );
+                       }
+
                        if ( isset( $item['id'] ) && !isset( $item['single-id'] ) ) {
                                $item['single-id'] = $item['id'];
                        }
@@ -425,7 +441,8 @@ abstract class BaseTemplate extends QuickTemplate {
         * list item directly so they will not be passed to makeLink
         * (however the link will still support a tooltip and accesskey from it)
         * If you need an id or class on a single link you should include a "links"
-        * array with just one link item inside of it. If you want to add a title
+        * array with just one link item inside of it. You can also set "link-class" in
+        * $item to set a class on the link itself. If you want to add a title
         * to the list item itself, you can set "itemtitle" to the value.
         * $options is also passed on to makeLink calls
         *
@@ -450,6 +467,12 @@ abstract class BaseTemplate extends QuickTemplate {
                                // generating tooltips and accesskeys.
                                $link['single-id'] = $item['id'];
                        }
+                       if ( isset( $link['link-class'] ) ) {
+                               // link-class should be set on the <a> itself,
+                               // so pass it in as 'class'
+                               $link['class'] = $link['link-class'];
+                               unset( $link['link-class'] );
+                       }
                        $html = $this->makeLink( $key, $link, $options );
                }
 
index af2d5da..e5d272c 100644 (file)
@@ -103,7 +103,6 @@ abstract class QuickTemplate {
        /**
         * @private
         * @param string $str
-        * @return string
         */
        function text( $str ) {
                echo htmlspecialchars( $this->data[$str] );
@@ -112,7 +111,6 @@ abstract class QuickTemplate {
        /**
         * @private
         * @param string $str
-        * @return string
         */
        function html( $str ) {
                echo $this->data[$str];
@@ -121,7 +119,6 @@ abstract class QuickTemplate {
        /**
         * @private
         * @param string $str
-        * @return string
         */
        function msg( $str ) {
                echo htmlspecialchars( $this->translator->translate( $str ) );
@@ -130,7 +127,6 @@ abstract class QuickTemplate {
        /**
         * @private
         * @param string $str
-        * @return string
         */
        function msgHtml( $str ) {
                echo $this->translator->translate( $str );
@@ -140,7 +136,6 @@ abstract class QuickTemplate {
         * An ugly, ugly hack.
         * @private
         * @param string $str
-        * @return string
         */
        function msgWiki( $str ) {
                global $wgOut;
index d70a6b9..64d2f8b 100644 (file)
@@ -141,10 +141,8 @@ abstract class Skin extends ContextSource {
        /**
         * @param OutputPage $out
         */
-       function initPage( OutputPage $out ) {
-
+       public function initPage( OutputPage $out ) {
                $this->preloadExistence();
-
        }
 
        /**
@@ -199,30 +197,29 @@ abstract class Skin extends ContextSource {
        /**
         * Preload the existence of three commonly-requested pages in a single query
         */
-       function preloadExistence() {
+       protected function preloadExistence() {
                $titles = [];
 
-               $user = $this->getUser();
-               $title = $this->getRelevantTitle();
-
                // User/talk link
+               $user = $this->getUser();
                if ( $user->isLoggedIn() ) {
                        $titles[] = $user->getUserPage();
                        $titles[] = $user->getTalkPage();
                }
 
                // Check, if the page can hold some kind of content, otherwise do nothing
-               if ( !$title->canExist() ) {
-                       // nothing
-               } elseif ( $title->isTalkPage() ) {
-                       $titles[] = $title->getSubjectPage();
-               } else {
-                       $titles[] = $title->getTalkPage();
+               $title = $this->getRelevantTitle();
+               if ( $title->canExist() ) {
+                       if ( $title->isTalkPage() ) {
+                               $titles[] = $title->getSubjectPage();
+                       } else {
+                               $titles[] = $title->getTalkPage();
+                       }
                }
 
                Hooks::run( 'SkinPreloadExistence', [ &$titles, $this ] );
 
-               if ( count( $titles ) ) {
+               if ( $titles ) {
                        $lb = new LinkBatch( $titles );
                        $lb->setCaller( __METHOD__ );
                        $lb->execute();
@@ -649,19 +646,23 @@ abstract class Skin extends ContextSource {
        }
 
        /**
+        * @param OutputPage $out Defaults to $this->getOutput() if left as null
         * @return string
         */
-       function subPageSubtitle() {
-               $out = $this->getOutput();
+       function subPageSubtitle( $out = null ) {
+               if ( $out === null ) {
+                       $out = $this->getOutput();
+               }
+               $title = $out->getTitle();
                $subpages = '';
 
                if ( !Hooks::run( 'SkinSubPageSubtitle', [ &$subpages, $this, $out ] ) ) {
                        return $subpages;
                }
 
-               if ( $out->isArticle() && MWNamespace::hasSubpages( $out->getTitle()->getNamespace() ) ) {
-                       $ptext = $this->getTitle()->getPrefixedText();
-                       if ( preg_match( '/\//', $ptext ) ) {
+               if ( $out->isArticle() && MWNamespace::hasSubpages( $title->getNamespace() ) ) {
+                       $ptext = $title->getPrefixedText();
+                       if ( strpos( $ptext, '/' ) !== false ) {
                                $links = explode( '/', $ptext );
                                array_pop( $links );
                                $c = 0;
@@ -1240,6 +1241,8 @@ abstract class Skin extends ContextSource {
                $lines = explode( "\n", $text );
 
                $heading = '';
+               $messageTitle = $this->getConfig()->get( 'EnableSidebarCache' )
+                       ? Title::newMainPage() : $this->getTitle();
 
                foreach ( $lines as $line ) {
                        if ( strpos( $line, '*' ) !== 0 ) {
@@ -1256,7 +1259,7 @@ abstract class Skin extends ContextSource {
                                $line = trim( $line, '* ' );
 
                                if ( strpos( $line, '|' ) !== false ) { // sanity check
-                                       $line = MessageCache::singleton()->transform( $line, false, null, $this->getTitle() );
+                                       $line = MessageCache::singleton()->transform( $line, false, null, $messageTitle );
                                        $line = array_map( 'trim', explode( '|', $line, 2 ) );
                                        if ( count( $line ) !== 2 ) {
                                                // Second sanity check, could be hit by people doing
@@ -1266,7 +1269,7 @@ abstract class Skin extends ContextSource {
 
                                        $extraAttribs = [];
 
-                                       $msgLink = $this->msg( $line[0] )->inContentLanguage();
+                                       $msgLink = $this->msg( $line[0] )->title( $messageTitle )->inContentLanguage();
                                        if ( $msgLink->exists() ) {
                                                $link = $msgLink->text();
                                                if ( $link == '-' ) {
@@ -1275,7 +1278,7 @@ abstract class Skin extends ContextSource {
                                        } else {
                                                $link = $line[0];
                                        }
-                                       $msgText = $this->msg( $line[1] );
+                                       $msgText = $this->msg( $line[1] )->title( $messageTitle );
                                        if ( $msgText->exists() ) {
                                                $text = $msgText->text();
                                        } else {
index cefc5bc..69e2e8b 100644 (file)
@@ -17,6 +17,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Base class for template-based skins.
@@ -749,6 +750,8 @@ class SkinTemplate extends Skin {
                        }
                }
 
+               $linkClass = MediaWikiServices::getInstance()->getLinkRenderer()->getLinkClasses( $title );
+
                // wfMessageFallback will nicely accept $message as an array of fallbacks
                // or just a single key
                $msg = wfMessageFallback( $message )->setContext( $this->getContext() );
@@ -771,11 +774,16 @@ class SkinTemplate extends Skin {
                        return $result;
                }
 
-               return [
+               $result = [
                        'class' => implode( ' ', $classes ),
                        'text' => $text,
                        'href' => $title->getLocalURL( $query ),
                        'primary' => true ];
+               if ( $linkClass !== '' ) {
+                       $result['link-class'] = $linkClass;
+               }
+
+               return $result;
        }
 
        function makeTalkUrlDetails( $name, $urlaction = '' ) {
index 41380f0..c889b73 100644 (file)
@@ -4,7 +4,6 @@ use MediaWiki\Auth\AuthenticationRequest;
 use MediaWiki\Auth\AuthenticationResponse;
 use MediaWiki\Auth\AuthManager;
 use MediaWiki\Logger\LoggerFactory;
-use MediaWiki\Session\SessionManager;
 use MediaWiki\Session\Token;
 
 /**
@@ -570,7 +569,8 @@ abstract class AuthManagerSpecialPage extends SpecialPage {
                        } elseif ( array_key_exists( 'type', $item ) ) {
                                $class = HTMLForm::$typeMappings[$item['type']];
                        }
-                       return !in_array( $class, [ 'HTMLInfoField', 'HTMLSubmitField' ], true );
+                       return !is_a( $class, \HTMLInfoField::class, true ) &&
+                               !is_a( $class, \HTMLSubmitField::class, true );
                } );
        }
 
index 0966f80..60f1dd8 100644 (file)
@@ -368,7 +368,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        /**
         * Build and output the actual changes list.
         *
-        * @param array $rows Database rows
+        * @param ResultWrapper $rows Database rows
         * @param FormOptions $opts
         */
        abstract public function outputChangesList( $rows, $opts );
@@ -475,7 +475,10 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        protected function addModules() {
                $out = $this->getOutput();
                // Styles and behavior for the legend box (see makeLegend())
-               $out->addModuleStyles( 'mediawiki.special.changeslist.legend' );
+               $out->addModuleStyles( [
+                       'mediawiki.special.changeslist.legend',
+                       'mediawiki.special.changeslist',
+               ] );
                $out->addModules( 'mediawiki.special.changeslist.legend.js' );
        }
 
index 8dff163..5dab221 100644 (file)
@@ -27,7 +27,6 @@ use MediaWiki\Auth\AuthManager;
 use MediaWiki\Auth\Throttler;
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\Session\SessionManager;
-use Psr\Log\LogLevel;
 
 /**
  * Holds shared logic for login and account creation pages.
@@ -620,7 +619,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                // add pre/post text
                // header used by ConfirmEdit, CondfirmAccount, Persona, WikimediaIncubator, SemanticSignup
                // should be above the error message but HTMLForm doesn't support that
-               $form->addHeaderText( $fakeTemplate->html( 'header' ) );
+               $form->addHeaderText( $fakeTemplate->get( 'header' ) );
 
                // FIXME the old form used this for error/warning messages which does not play well with
                // HTMLForm (maybe it could with a subclass?); for now only display it for signups
@@ -633,7 +632,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                }
 
                // header used by MobileFrontend
-               $form->addHeaderText( $fakeTemplate->html( 'formheader' ) );
+               $form->addHeaderText( $fakeTemplate->get( 'formheader' ) );
 
                // blank signup footer for site customization
                if ( $this->isSignup() && $this->showExtraInformation() ) {
@@ -854,7 +853,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                                        !isset( $coreField['baseField'] )
                                        || !isset( $fieldInfo[$coreField['baseField']] )
                                ) && !in_array( $fieldName, $specialFields, true )
-                               && $coreField['type'] !== 'submit'
+                               && ( !isset( $coreField['type'] ) || $coreField['type'] !== 'submit' )
                        ) {
                                $coreFieldDescriptors[$fieldName] = null;
                                continue;
@@ -1025,6 +1024,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                                'rememberMe' => [
                                        // option for saving the user token to a cookie
                                        'type' => 'check',
+                                       'name' => 'wpRemember',
                                        'label-message' => $this->msg( 'userlogin-remembermypassword' )
                                                ->numParams( $expirationDays ),
                                        'id' => 'wpRemember',
@@ -1032,7 +1032,6 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                                'loginattempt' => [
                                        // submit button
                                        'type' => 'submit',
-                                       'name' => 'wpRemember',
                                        'default' => $this->msg( 'pt-login-' . $continuePart . 'button' )->text(),
                                        'id' => 'wpLoginAttempt',
                                        'weight' => 100,
@@ -1050,6 +1049,11 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                                        ], $this->msg( 'userlogin-helplink2' )->text() ),
                                        'weight' => 200,
                                ],
+                               // button for ResetPasswordSecondaryAuthenticationProvider
+                               'skipReset' => [
+                                       'weight' => 110,
+                                       'flags' => [],
+                               ],
                        ];
                }
                $fieldDefinitions['username'] += [
index 408c726..35ecc6e 100644 (file)
@@ -1,6 +1,4 @@
 <?php
-use MediaWiki\MediaWikiServices;
-
 /**
  * Parent class for all special pages.
  *
@@ -24,6 +22,8 @@ use MediaWiki\MediaWikiServices;
  */
 
 use MediaWiki\Auth\AuthManager;
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Parent class for all special pages.
@@ -60,6 +60,11 @@ class SpecialPage {
         */
        protected $mContext;
 
+       /**
+        * @var LinkRenderer|null
+        */
+       private $linkRenderer;
+
        /**
         * Get a localised Title object for a specified special page name
         *
@@ -175,6 +180,27 @@ class SpecialPage {
                return $this->mIncludable;
        }
 
+       /**
+        * How long to cache page when it is being included.
+        *
+        * @note If cache time is not 0, then the current user becomes an anon
+        *   if you want to do any per-user customizations, than this method
+        *   must be overriden to return 0.
+        * @since 1.26
+        * @return int Time in seconds, 0 to disable caching altogether,
+        *  false to use the parent page's cache settings
+        */
+       public function maxIncludeCacheTime() {
+               return $this->getConfig()->get( 'MiserMode' ) ? $this->getCacheTTL() : 0;
+       }
+
+       /**
+        * @return int Seconds that this page can be cached
+        */
+       protected function getCacheTTL() {
+               return 60 * 60;
+       }
+
        /**
         * Whether the special page is being evaluated via transclusion
         * @param bool $x
@@ -805,4 +831,24 @@ class SpecialPage {
                        wfTransactionalTimeLimit();
                }
        }
+
+       /**
+        * @since 1.28
+        * @return LinkRenderer
+        */
+       protected function getLinkRenderer() {
+               if ( $this->linkRenderer ) {
+                       return $this->linkRenderer;
+               } else {
+                       return MediaWikiServices::getInstance()->getLinkRenderer();
+               }
+       }
+
+       /**
+        * @since 1.28
+        * @param LinkRenderer $linkRenderer
+        */
+       public function setLinkRenderer( LinkRenderer $linkRenderer ) {
+               $this->linkRenderer = $linkRenderer;
+       }
 }
index 73efa4e..b69b28a 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup SpecialPage
  * @defgroup SpecialPage SpecialPage
  */
+use MediaWiki\Linker\LinkRenderer;
 
 /**
  * Factory for handling the special page list and generating SpecialPage objects.
@@ -523,10 +524,13 @@ class SpecialPageFactory {
         * @param Title $title
         * @param IContextSource $context
         * @param bool $including Bool output is being captured for use in {{special:whatever}}
+        * @param LinkRenderer|null $linkRenderer (since 1.28)
         *
         * @return bool
         */
-       public static function executePath( Title &$title, IContextSource &$context, $including = false ) {
+       public static function executePath( Title &$title, IContextSource &$context, $including = false,
+               LinkRenderer $linkRenderer = null
+       ) {
                // @todo FIXME: Redirects broken due to this call
                $bits = explode( '/', $title->getDBkey(), 2 );
                $name = $bits[0];
@@ -586,6 +590,9 @@ class SpecialPageFactory {
                }
 
                $page->including( $including );
+               if ( $linkRenderer ) {
+                       $page->setLinkRenderer( $linkRenderer );
+               }
 
                // Execute special page
                $page->run( $par );
@@ -605,9 +612,12 @@ class SpecialPageFactory {
         *
         * @param Title $title
         * @param IContextSource $context
+        * @param LinkRenderer|null $linkRenderer (since 1.28)
         * @return string HTML fragment
         */
-       public static function capturePath( Title $title, IContextSource $context ) {
+       public static function capturePath(
+               Title $title, IContextSource $context, LinkRenderer $linkRenderer = null
+       ) {
                global $wgTitle, $wgOut, $wgRequest, $wgUser, $wgLang;
                $main = RequestContext::getMain();
 
@@ -640,7 +650,7 @@ class SpecialPageFactory {
                $main->setLanguage( $context->getLanguage() );
 
                // The useful part
-               $ret = self::executePath( $title, $context, true );
+               $ret = self::executePath( $title, $context, true, $linkRenderer );
 
                // Restore old globals and context
                $wgTitle = $glob['title'];
index fcadede..ce7d24e 100644 (file)
@@ -645,8 +645,10 @@ class SpecialBlock extends FormSpecialPage {
                                return [ 'ipb-blockingself', 'ipb-confirmaction' ];
                        }
                } elseif ( $type == Block::TYPE_RANGE ) {
+                       $user = null;
                        $userId = 0;
                } elseif ( $type == Block::TYPE_IP ) {
+                       $user = null;
                        $target = $target->getName();
                        $userId = 0;
                } else {
@@ -729,6 +731,7 @@ class SpecialBlock extends FormSpecialPage {
                        return $reason;
                }
 
+               $priorBlock = null;
                # Try to insert block. Is there a conflicting block?
                $status = $block->insert();
                if ( !$status ) {
@@ -748,17 +751,16 @@ class SpecialBlock extends FormSpecialPage {
                                # This returns direct blocks before autoblocks/rangeblocks, since we should
                                # be sure the user is blocked by now it should work for our purposes
                                $currentBlock = Block::newFromTarget( $target );
-
                                if ( $block->equals( $currentBlock ) ) {
                                        return [ [ 'ipb_already_blocked', $block->getTarget() ] ];
                                }
-
                                # If the name was hidden and the blocking user cannot hide
                                # names, then don't allow any block changes...
                                if ( $currentBlock->mHideName && !$performer->isAllowed( 'hideuser' ) ) {
                                        return [ 'cant-see-hidden-user' ];
                                }
 
+                               $priorBlock = clone $currentBlock;
                                $currentBlock->isHardblock( $block->isHardblock() );
                                $currentBlock->prevents( 'createaccount', $block->prevents( 'createaccount' ) );
                                $currentBlock->mExpiry = $block->mExpiry;
@@ -786,7 +788,7 @@ class SpecialBlock extends FormSpecialPage {
                        $logaction = 'block';
                }
 
-               Hooks::run( 'BlockIpComplete', [ $block, $performer ] );
+               Hooks::run( 'BlockIpComplete', [ $block, $performer, $priorBlock ] );
 
                # Set *_deleted fields if requested
                if ( $data['HideUser'] ) {
index 1027f1f..7e330aa 100644 (file)
@@ -162,6 +162,7 @@ class SpecialBotPasswords extends FormSpecialPage {
                        ];
 
                } else {
+                       $linkRenderer = $this->getLinkRenderer();
                        $dbr = BotPassword::getDB( DB_SLAVE );
                        $res = $dbr->select(
                                'bot_passwords',
@@ -174,12 +175,9 @@ class SpecialBotPasswords extends FormSpecialPage {
                                        'section' => 'existing',
                                        'type' => 'info',
                                        'raw' => true,
-                                       'default' => Linker::link(
+                                       'default' => $linkRenderer->makeKnownLink(
                                                $this->getPageTitle( $row->bp_app_id ),
-                                               htmlspecialchars( $row->bp_app_id ),
-                                               [],
-                                               [],
-                                               [ 'known' ]
+                                               $row->bp_app_id
                                        ),
                                ];
                        }
index d7d338c..84d1f7c 100644 (file)
  */
 class SpecialCategories extends SpecialPage {
 
-       /**
-        * @var PageLinkRenderer
-        */
-       protected $linkRenderer = null;
-
        public function __construct() {
                parent::__construct( 'Categories' );
 
@@ -39,42 +34,18 @@ class SpecialCategories extends SpecialPage {
                // using the initServices() method.
        }
 
-       /**
-        * Initialize or override the PageLinkRenderer SpecialCategories collaborates with.
-        * Useful mainly for testing.
-        *
-        * @todo the pager should also be injected, and de-coupled from the rendering logic.
-        *
-        * @param PageLinkRenderer $linkRenderer
-        */
-       public function setPageLinkRenderer(
-               PageLinkRenderer $linkRenderer
-       ) {
-               $this->linkRenderer = $linkRenderer;
-       }
-
-       /**
-        * Initialize any services we'll need (unless it has already been provided via a setter).
-        * This allows for dependency injection even though we don't control object creation.
-        */
-       private function initServices() {
-               if ( !$this->linkRenderer ) {
-                       $lang = $this->getContext()->getLanguage();
-                       $titleFormatter = new MediaWikiTitleCodec( $lang, GenderCache::singleton() );
-                       $this->linkRenderer = new MediaWikiPageLinkRenderer( $titleFormatter );
-               }
-       }
-
        public function execute( $par ) {
-               $this->initServices();
-
                $this->setHeaders();
                $this->outputHeader();
                $this->getOutput()->allowClickjacking();
 
                $from = $this->getRequest()->getText( 'from', $par );
 
-               $cap = new CategoryPager( $this->getContext(), $from, $this->linkRenderer );
+               $cap = new CategoryPager(
+                       $this->getContext(),
+                       $from,
+                       $this->getLinkRenderer()
+               );
                $cap->doQuery();
 
                $this->getOutput()->addHTML(
index c7a650c..ccbb275 100644 (file)
@@ -192,6 +192,7 @@ class SpecialChangeContentModel extends FormSpecialPage {
                        $newContent = ContentHandler::getForModelID( $data['model'] )->makeEmptyContent();
                }
                $flags = $this->oldRevision ? EDIT_UPDATE : EDIT_NEW;
+               $flags |= EDIT_INTERNAL;
                if ( $user->isAllowed( 'bot' ) ) {
                        $flags |= EDIT_FORCE_BOT;
                }
index 431b556..cce88b9 100644 (file)
@@ -37,7 +37,10 @@ class SpecialContributions extends IncludableSpecialPage {
                $this->setHeaders();
                $this->outputHeader();
                $out = $this->getOutput();
-               $out->addModuleStyles( 'mediawiki.special' );
+               $out->addModuleStyles( [
+                       'mediawiki.special',
+                       'mediawiki.special.changeslist',
+               ] );
                $this->addHelpLink( 'Help:User contributions' );
 
                $this->opts = [];
@@ -72,6 +75,7 @@ class SpecialContributions extends IncludableSpecialPage {
                $this->opts['target'] = $target;
                $this->opts['topOnly'] = $request->getBool( 'topOnly' );
                $this->opts['newOnly'] = $request->getBool( 'newOnly' );
+               $this->opts['hideMinor'] = $request->getBool( 'hideMinor' );
 
                $nt = Title::makeTitleSafe( NS_USER, $target );
                if ( !$nt ) {
@@ -142,6 +146,9 @@ class SpecialContributions extends IncludableSpecialPage {
                if ( $this->opts['newOnly'] ) {
                        $feedParams['newonly'] = true;
                }
+               if ( $this->opts['hideMinor'] ) {
+                       $feedParams['hideminor'] = true;
+               }
                if ( $this->opts['deletedOnly'] ) {
                        $feedParams['deletedonly'] = true;
                }
@@ -188,6 +195,7 @@ class SpecialContributions extends IncludableSpecialPage {
                                'deletedOnly' => $this->opts['deletedOnly'],
                                'topOnly' => $this->opts['topOnly'],
                                'newOnly' => $this->opts['newOnly'],
+                               'hideMinor' => $this->opts['hideMinor'],
                                'nsInvert' => $this->opts['nsInvert'],
                                'associated' => $this->opts['associated'],
                        ] );
@@ -441,6 +449,10 @@ class SpecialContributions extends IncludableSpecialPage {
                        $this->opts['newOnly'] = false;
                }
 
+               if ( !isset( $this->opts['hideMinor'] ) ) {
+                       $this->opts['hideMinor'] = false;
+               }
+
                $form = Html::openElement(
                        'form',
                        [
@@ -461,6 +473,7 @@ class SpecialContributions extends IncludableSpecialPage {
                        'month',
                        'topOnly',
                        'newOnly',
+                       'hideMinor',
                        'associated',
                        'tagfilter'
                ];
@@ -609,6 +622,17 @@ class SpecialContributions extends IncludableSpecialPage {
                                [ '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' ]
+                       )
+               );
 
                Hooks::run(
                        'SpecialContributions::getForm::filters',
index b046bf9..f06a192 100644 (file)
@@ -23,7 +23,6 @@
 
 use MediaWiki\Auth\AuthManager;
 use MediaWiki\Logger\LoggerFactory;
-use Psr\Log\LogLevel;
 
 /**
  * Implements Special:CreateAccount
@@ -130,7 +129,7 @@ class SpecialCreateAccount extends LoginSignupSpecialPage {
                # Run any hooks; display injected HTML
                $injected_html = '';
                $welcome_creation_msg = 'welcomecreation-msg';
-               Hooks::run( 'UserLoginComplete', [ &$user, &$injected_html ] );
+               Hooks::run( 'UserLoginComplete', [ &$user, &$injected_html, $direct ] );
 
                /**
                 * Let any extensions change what message is shown.
@@ -160,7 +159,7 @@ class SpecialCreateAccount extends LoginSignupSpecialPage {
        }
 
        protected function logAuthResult( $success, $status = null ) {
-               LoggerFactory::getInstance( 'authmanager-stats' )->info( 'Account creation attempt', [
+               LoggerFactory::getInstance( 'authmanager' )->info( 'Account creation attempt', [
                        'event' => 'accountcreation',
                        'successful' => $success,
                        'status' => $status,
index 1ecbee0..d4886f0 100644 (file)
@@ -30,11 +30,6 @@ class LinkSearchPage extends QueryPage {
        /** @var array|bool */
        private $mungedQuery = false;
 
-       /**
-        * @var PageLinkRenderer
-        */
-       protected $linkRenderer = null;
-
        function setParams( $params ) {
                $this->mQuery = $params['query'];
                $this->mNs = $params['namespace'];
@@ -49,39 +44,11 @@ class LinkSearchPage extends QueryPage {
                // using the setServices() method.
        }
 
-       /**
-        * Initialize or override the PageLinkRenderer LinkSearchPage collaborates with.
-        * Useful mainly for testing.
-        *
-        * @todo query logic and rendering logic should be split and also injected
-        *
-        * @param PageLinkRenderer $linkRenderer
-        */
-       public function setPageLinkRenderer(
-               PageLinkRenderer $linkRenderer
-       ) {
-               $this->linkRenderer = $linkRenderer;
-       }
-
-       /**
-        * Initialize any services we'll need (unless it has already been provided via a setter).
-        * This allows for dependency injection even though we don't control object creation.
-        */
-       private function initServices() {
-               global $wgContLang;
-               if ( !$this->linkRenderer ) {
-                       $titleFormatter = new MediaWikiTitleCodec( $wgContLang, GenderCache::singleton() );
-                       $this->linkRenderer = new MediaWikiPageLinkRenderer( $titleFormatter );
-               }
-       }
-
        function isCacheable() {
                return false;
        }
 
        public function execute( $par ) {
-               $this->initServices();
-
                $this->setHeaders();
                $this->outputHeader();
 
@@ -277,7 +244,7 @@ class LinkSearchPage extends QueryPage {
         */
        function formatResult( $skin, $result ) {
                $title = new TitleValue( (int)$result->namespace, $result->title );
-               $pageLink = $this->linkRenderer->renderHtmlLink( $title );
+               $pageLink = $this->getLinkRenderer()->makeLink( $title );
 
                $url = $result->url;
                $urlLink = Linker::makeExternalLink( $url, $url );
index ace6d02..d034a6c 100644 (file)
@@ -83,7 +83,10 @@ class ListredirectsPage extends QueryPage {
                $batch = new LinkBatch;
                foreach ( $res as $row ) {
                        $batch->add( $row->namespace, $row->title );
-                       $batch->addObj( $this->getRedirectTarget( $row ) );
+                       $redirTarget = $this->getRedirectTarget( $row );
+                       if ( $redirTarget ) {
+                               $batch->addObj( $redirTarget );
+                       }
                }
                $batch->execute();
 
@@ -91,6 +94,10 @@ class ListredirectsPage extends QueryPage {
                $res->seek( 0 );
        }
 
+       /**
+        * @param stdClass $row
+        * @return Title|null
+        */
        protected function getRedirectTarget( $row ) {
                if ( isset( $row->rd_title ) ) {
                        return Title::makeTitle( $row->rd_namespace,
@@ -111,9 +118,10 @@ class ListredirectsPage extends QueryPage {
         * @return string
         */
        function formatResult( $skin, $result ) {
+               $linkRenderer = $this->getLinkRenderer();
                # Make a link to the redirect itself
                $rd_title = Title::makeTitle( $result->namespace, $result->title );
-               $rd_link = Linker::link(
+               $rd_link = $linkRenderer->makeLink(
                        $rd_title,
                        null,
                        [],
@@ -126,7 +134,7 @@ class ListredirectsPage extends QueryPage {
                        # Make a link to the destination page
                        $lang = $this->getLanguage();
                        $arr = $lang->getArrow() . $lang->getDirMark();
-                       $targetLink = Linker::link( $target );
+                       $targetLink = $linkRenderer->makeLink( $target );
 
                        return "$rd_link $arr $targetLink";
                } else {
index af087a6..533a331 100644 (file)
@@ -37,6 +37,7 @@ class SpecialLog extends SpecialPage {
                $this->setHeaders();
                $this->outputHeader();
                $this->getOutput()->addModules( 'mediawiki.userSuggest' );
+               $this->addHelpLink( 'Help:Log' );
 
                $opts = new FormOptions;
                $opts->add( 'type', '' );
index 162ef60..b916c1f 100644 (file)
  * @ingroup SpecialPage
  */
 class SpecialMergeHistory extends SpecialPage {
-       /** @var FormOptions */
-       protected $mOpts;
+       /** @var string */
+       protected $mAction;
 
-       /** @var Status */
-       protected $mStatus;
+       /** @var string */
+       protected $mTarget;
 
-       /** @var Title|null */
-       protected $mTargetObj, $mDestObj;
+       /** @var string */
+       protected $mDest;
+
+       /** @var string */
+       protected $mTimestamp;
+
+       /** @var int */
+       protected $mTargetID;
+
+       /** @var int */
+       protected $mDestID;
+
+       /** @var string */
+       protected $mComment;
+
+       /** @var bool Was posted? */
+       protected $mMerge;
+
+       /** @var bool Was submitted? */
+       protected $mSubmitted;
+
+       /** @var Title */
+       protected $mTargetObj;
+
+       /** @var Title */
+       protected $mDestObj;
 
        /** @var int[] */
        public $prevId;
@@ -48,107 +72,124 @@ class SpecialMergeHistory extends SpecialPage {
                return true;
        }
 
+       /**
+        * @return void
+        */
+       private function loadRequestParams() {
+               $request = $this->getRequest();
+               $this->mAction = $request->getVal( 'action' );
+               $this->mTarget = $request->getVal( 'target' );
+               $this->mDest = $request->getVal( 'dest' );
+               $this->mSubmitted = $request->getBool( 'submitted' );
+
+               $this->mTargetID = intval( $request->getVal( 'targetID' ) );
+               $this->mDestID = intval( $request->getVal( 'destID' ) );
+               $this->mTimestamp = $request->getVal( 'mergepoint' );
+               if ( !preg_match( '/[0-9]{14}/', $this->mTimestamp ) ) {
+                       $this->mTimestamp = '';
+               }
+               $this->mComment = $request->getText( 'wpComment' );
+
+               $this->mMerge = $request->wasPosted()
+                       && $this->getUser()->matchEditToken( $request->getVal( 'wpEditToken' ) );
+
+               // target page
+               if ( $this->mSubmitted ) {
+                       $this->mTargetObj = Title::newFromText( $this->mTarget );
+                       $this->mDestObj = Title::newFromText( $this->mDest );
+               } else {
+                       $this->mTargetObj = null;
+                       $this->mDestObj = null;
+               }
+       }
+
        public function execute( $par ) {
                $this->useTransactionalTimeLimit();
 
                $this->checkPermissions();
                $this->checkReadOnly();
 
+               $this->loadRequestParams();
+
                $this->setHeaders();
                $this->outputHeader();
 
-               $this->addHelpLink( 'Help:Merge history' );
-
-               $opts = new FormOptions();
-
-               $opts->add( 'target', '' );
-               $opts->add( 'dest', '' );
-               $opts->add( 'target', '' );
-               $opts->add( 'mergepoint', '' );
-               $opts->add( 'reason', '' );
-               $opts->add( 'merge', false );
-
-               $opts->fetchValuesFromRequest( $this->getRequest() );
-
-               $target = $opts->getValue( 'target' );
-               $dest = $opts->getValue( 'dest' );
-               $targetObj = Title::newFromText( $target );
-               $destObj = Title::newFromText( $dest );
-               $status = Status::newGood();
-
-               $this->mOpts = $opts;
-               $this->mTargetObj = $targetObj;
-               $this->mDestObj = $destObj;
-
-               if ( $opts->getValue( 'merge' ) && $targetObj &&
-                       $destObj && $opts->getValue( 'mergepoint' ) !== '' ) {
+               if ( $this->mTargetID && $this->mDestID && $this->mAction == 'submit' && $this->mMerge ) {
                        $this->merge();
 
                        return;
                }
 
-               if ( $target === '' && $dest === '' ) {
+               if ( !$this->mSubmitted ) {
                        $this->showMergeForm();
 
                        return;
                }
 
-               if ( !$targetObj instanceof Title ) {
-                       $status->merge( Status::newFatal( 'mergehistory-invalid-source' ) );
-               } elseif ( !$targetObj->exists() ) {
-                       $status->merge( Status::newFatal( 'mergehistory-no-source',
-                               wfEscapeWikiText( $targetObj->getPrefixedText() )
-                       ) );
+               $errors = [];
+               if ( !$this->mTargetObj instanceof Title ) {
+                       $errors[] = $this->msg( 'mergehistory-invalid-source' )->parseAsBlock();
+               } elseif ( !$this->mTargetObj->exists() ) {
+                       $errors[] = $this->msg( 'mergehistory-no-source',
+                               wfEscapeWikiText( $this->mTargetObj->getPrefixedText() )
+                       )->parseAsBlock();
                }
 
-               if ( !$destObj instanceof Title ) {
-                       $status->merge( Status::newFatal( 'mergehistory-invalid-destination' ) );
-               } elseif ( !$destObj->exists() ) {
-                       $status->merge( Status::newFatal( 'mergehistory-no-destination',
-                               wfEscapeWikiText( $destObj->getPrefixedText() )
-                       ) );
+               if ( !$this->mDestObj instanceof Title ) {
+                       $errors[] = $this->msg( 'mergehistory-invalid-destination' )->parseAsBlock();
+               } elseif ( !$this->mDestObj->exists() ) {
+                       $errors[] = $this->msg( 'mergehistory-no-destination',
+                               wfEscapeWikiText( $this->mDestObj->getPrefixedText() )
+                       )->parseAsBlock();
                }
 
-               if ( $targetObj && $destObj && $targetObj->equals( $destObj ) ) {
-                       $status->merge( Status::newFatal( 'mergehistory-same-destination' ) );
+               if ( $this->mTargetObj && $this->mDestObj && $this->mTargetObj->equals( $this->mDestObj ) ) {
+                       $errors[] = $this->msg( 'mergehistory-same-destination' )->parseAsBlock();
                }
 
-               $this->mStatus = $status;
-
-               $this->showMergeForm();
-
-               if ( $status->isOK() ) {
+               if ( count( $errors ) ) {
+                       $this->showMergeForm();
+                       $this->getOutput()->addHTML( implode( "\n", $errors ) );
+               } else {
                        $this->showHistory();
                }
        }
 
        function showMergeForm() {
-               $formDescriptor = [
-                       'target' => [
-                               'type' => 'title',
-                               'name' => 'target',
-                               'label-message' => 'mergehistory-from',
-                               'required' => true,
-                       ],
-
-                       'dest' => [
-                               'type' => 'title',
-                               'name' => 'dest',
-                               'label-message' => 'mergehistory-into',
-                               'required' => true,
-                       ],
-               ];
-
-               $form = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
-                       ->setIntro( $this->msg( 'mergehistory-header' ) )
-                       ->setWrapperLegendMsg( 'mergehistory-box' )
-                       ->setSubmitTextMsg( 'mergehistory-go' )
-                       ->setMethod( 'post' )
-                       ->prepareForm()
-                       ->displayForm( $this->mStatus );
+               $out = $this->getOutput();
+               $out->addWikiMsg( 'mergehistory-header' );
+
+               $out->addHTML(
+                       Xml::openElement( 'form', [
+                               'method' => 'get',
+                               'action' => wfScript() ] ) .
+                               '<fieldset>' .
+                               Xml::element( 'legend', [],
+                                       $this->msg( 'mergehistory-box' )->text() ) .
+                               Html::hidden( 'title', $this->getPageTitle()->getPrefixedDBkey() ) .
+                               Html::hidden( 'submitted', '1' ) .
+                               Html::hidden( 'mergepoint', $this->mTimestamp ) .
+                               Xml::openElement( 'table' ) .
+                               '<tr>
+                               <td>' . Xml::label( $this->msg( 'mergehistory-from' )->text(), 'target' ) . '</td>
+                               <td>' . Xml::input( 'target', 30, $this->mTarget, [ 'id' => 'target' ] ) . '</td>
+                       </tr><tr>
+                               <td>' . Xml::label( $this->msg( 'mergehistory-into' )->text(), 'dest' ) . '</td>
+                               <td>' . Xml::input( 'dest', 30, $this->mDest, [ 'id' => 'dest' ] ) . '</td>
+                       </tr><tr><td>' .
+                               Xml::submitButton( $this->msg( 'mergehistory-go' )->text() ) .
+                               '</td></tr>' .
+                               Xml::closeElement( 'table' ) .
+                               '</fieldset>' .
+                               '</form>'
+               );
+
+               $this->addHelpLink( 'Help:Merge history' );
        }
 
        private function showHistory() {
+               $this->showMergeForm();
+
                # List all stored revisions
                $revisions = new MergeHistoryPager(
                        $this, [], $this->mTargetObj, $this->mDestObj
@@ -156,46 +197,62 @@ class SpecialMergeHistory extends SpecialPage {
                $haveRevisions = $revisions && $revisions->getNumRows() > 0;
 
                $out = $this->getOutput();
-               $header = '<h2 id="mw-mergehistory">' .
-                       $this->msg( 'mergehistory-list' )->escaped() . "</h2>\n";
+               $titleObj = $this->getPageTitle();
+               $action = $titleObj->getLocalURL( [ 'action' => 'submit' ] );
+               # Start the form here
+               $top = Xml::openElement(
+                       'form',
+                       [
+                               'method' => 'post',
+                               'action' => $action,
+                               'id' => 'merge'
+                       ]
+               );
+               $out->addHTML( $top );
+
+               if ( $haveRevisions ) {
+                       # Format the user-visible controls (comment field, submission button)
+                       # in a nice little table
+                       $table =
+                               Xml::openElement( 'fieldset' ) .
+                                       $this->msg( 'mergehistory-merge', $this->mTargetObj->getPrefixedText(),
+                                               $this->mDestObj->getPrefixedText() )->parse() .
+                                       Xml::openElement( 'table', [ 'id' => 'mw-mergehistory-table' ] ) .
+                                       '<tr>
+                                               <td class="mw-label">' .
+                                       Xml::label( $this->msg( 'mergehistory-reason' )->text(), 'wpComment' ) .
+                                       '</td>
+                                       <td class="mw-input">' .
+                                       Xml::input( 'wpComment', 50, $this->mComment, [ 'id' => 'wpComment' ] ) .
+                                       '</td>
+                                       </tr>
+                                       <tr>
+                                               <td>&#160;</td>
+                                               <td class="mw-submit">' .
+                                       Xml::submitButton(
+                                               $this->msg( 'mergehistory-submit' )->text(),
+                                               [ 'name' => 'merge', 'id' => 'mw-merge-submit' ]
+                                       ) .
+                                       '</td>
+                                       </tr>' .
+                                       Xml::closeElement( 'table' ) .
+                                       Xml::closeElement( 'fieldset' );
+
+                       $out->addHTML( $table );
+               }
+
+               $out->addHTML(
+                       '<h2 id="mw-mergehistory">' .
+                               $this->msg( 'mergehistory-list' )->escaped() . "</h2>\n"
+               );
 
                if ( $haveRevisions ) {
-                       $hiddenFields = [
-                               'merge' => true,
-                               'target' => $this->mOpts->getValue( 'target' ),
-                               'dest' => $this->mOpts->getValue( 'dest' ),
-                       ];
-
-                       $formDescriptor = [
-                               'reason' => [
-                                       'type' => 'text',
-                                       'name' => 'reason',
-                                       'label-message' => 'mergehistory-reason',
-                               ],
-                       ];
-
-                       $mergeText = $this->msg( 'mergehistory-merge',
-                               $this->mTargetObj->getPrefixedText(),
-                               $this->mDestObj->getPrefixedText()
-                       )->parse();
-
-                       $history = $header .
-                               $revisions->getNavigationBar() .
-                               '<ul>' .
-                               $revisions->getBody() .
-                               '</ul>' .
-                               $revisions->getNavigationBar();
-
-                       $form = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
-                               ->addHiddenFields( $hiddenFields )
-                               ->setPreText( $mergeText )
-                               ->setFooterText( $history )
-                               ->setSubmitTextMsg( 'mergehistory-submit' )
-                               ->setMethod( 'post' )
-                               ->prepareForm()
-                               ->displayForm( false );
+                       $out->addHTML( $revisions->getNavigationBar() );
+                       $out->addHTML( '<ul>' );
+                       $out->addHTML( $revisions->getBody() );
+                       $out->addHTML( '</ul>' );
+                       $out->addHTML( $revisions->getNavigationBar() );
                } else {
-                       $out->addHTML( $header );
                        $out->addWikiMsg( 'mergehistory-empty' );
                }
 
@@ -203,6 +260,18 @@ class SpecialMergeHistory extends SpecialPage {
                $mergeLogPage = new LogPage( 'merge' );
                $out->addHTML( '<h2>' . $mergeLogPage->getName()->escaped() . "</h2>\n" );
                LogEventsList::showLogExtract( $out, 'merge', $this->mTargetObj );
+
+               # When we submit, go by page ID to avoid some nasty but unlikely collisions.
+               # Such would happen if a page was renamed after the form loaded, but before submit
+               $misc = Html::hidden( 'targetID', $this->mTargetObj->getArticleID() );
+               $misc .= Html::hidden( 'destID', $this->mDestObj->getArticleID() );
+               $misc .= Html::hidden( 'target', $this->mTarget );
+               $misc .= Html::hidden( 'dest', $this->mDest );
+               $misc .= Html::hidden( 'wpEditToken', $this->getUser()->getEditToken() );
+               $misc .= Xml::closeElement( 'form' );
+               $out->addHTML( $misc );
+
+               return true;
        }
 
        function formatRevisionRow( $row ) {
@@ -212,7 +281,7 @@ class SpecialMergeHistory extends SpecialPage {
                $last = $this->msg( 'last' )->escaped();
 
                $ts = wfTimestamp( TS_MW, $row->rev_timestamp );
-               $checkBox = Xml::radio( 'mergepoint', $ts, ( $this->mOpts->getValue( 'mergepoint' ) === $ts ) );
+               $checkBox = Xml::radio( 'mergepoint', $ts, ( $this->mTimestamp === $ts ) );
 
                $user = $this->getUser();
 
@@ -267,24 +336,23 @@ class SpecialMergeHistory extends SpecialPage {
         * @return bool Success
         */
        function merge() {
-               $opts = $this->mOpts;
-
                # Get the titles directly from the IDs, in case the target page params
                # were spoofed. The queries are done based on the IDs, so it's best to
                # keep it consistent...
-               $targetObj = $this->mTargetObj;
-               $destObj = $this->mDestObj;
-
-               if ( is_null( $targetObj ) || is_null( $destObj ) ||
-                       $targetObj->getArticleID() == $destObj->getArticleID() ) {
+               $targetTitle = Title::newFromID( $this->mTargetID );
+               $destTitle = Title::newFromID( $this->mDestID );
+               if ( is_null( $targetTitle ) || is_null( $destTitle ) ) {
+                       return false; // validate these
+               }
+               if ( $targetTitle->getArticleID() == $destTitle->getArticleID() ) {
                        return false;
                }
 
                // MergeHistory object
-               $mh = new MergeHistory( $targetObj, $destObj, $opts->getValue( 'mergepoint' ) );
+               $mh = new MergeHistory( $targetTitle, $destTitle, $this->mTimestamp );
 
                // Merge!
-               $mergeStatus = $mh->merge( $this->getUser(), $opts->getValue( 'reason' ) );
+               $mergeStatus = $mh->merge( $this->getUser(), $this->mComment );
                if ( !$mergeStatus->isOK() ) {
                        // Failed merge
                        $this->getOutput()->addWikiMsg( $mergeStatus->getMessage() );
@@ -292,7 +360,7 @@ class SpecialMergeHistory extends SpecialPage {
                }
 
                $targetLink = Linker::link(
-                       $targetObj,
+                       $targetTitle,
                        null,
                        [],
                        [ 'redirect' => 'no' ]
@@ -300,7 +368,7 @@ class SpecialMergeHistory extends SpecialPage {
 
                $this->getOutput()->addWikiMsg( $this->msg( 'mergehistory-done' )
                        ->rawParams( $targetLink )
-                       ->params( $destObj->getPrefixedText() )
+                       ->params( $destTitle->getPrefixedText() )
                        ->numParams( $mh->getMergedRevisionCount() )
                );
 
index f49d730..d0c44c3 100644 (file)
@@ -139,8 +139,6 @@ class MovePageForm extends UnlistedSpecialPage {
         *    parameters, like the second argument to OutputPage::wrapWikiMsg().
         */
        function showForm( $err ) {
-               global $wgContLang;
-
                $this->getSkin()->setRelevantTitle( $this->oldTitle );
 
                $out = $this->getOutput();
@@ -316,7 +314,7 @@ class MovePageForm extends UnlistedSpecialPage {
                                'title' => [
                                        'id' => 'wpNewTitleMain',
                                        'name' => 'wpNewTitleMain',
-                                       'value' => $wgContLang->recodeForEdit( $newTitle->getText() ),
+                                       'value' => $newTitle->getText(),
                                        // Inappropriate, since we're expecting the user to input a non-existent page's title
                                        'suggestions' => false,
                                ],
@@ -601,13 +599,14 @@ class MovePageForm extends UnlistedSpecialPage {
                $out = $this->getOutput();
                $out->setPageTitle( $this->msg( 'pagemovedsub' ) );
 
-               $oldLink = Linker::link(
+               $linkRenderer = $this->getLinkRenderer();
+               $oldLink = $linkRenderer->makeLink(
                        $ot,
                        null,
                        [ 'id' => 'movepage-oldlink' ],
                        [ 'redirect' => 'no' ]
                );
-               $newLink = Linker::linkKnown(
+               $newLink = $linkRenderer->makeKnownLink(
                        $nt,
                        null,
                        [ 'id' => 'movepage-newlink' ]
@@ -723,7 +722,7 @@ class MovePageForm extends UnlistedSpecialPage {
                        # be longer than 255 characters.
                        $newSubpage = Title::makeTitleSafe( $newNs, $newPageName );
                        if ( !$newSubpage ) {
-                               $oldLink = Linker::linkKnown( $oldSubpage );
+                               $oldLink = $linkRenderer->makeKnownLink( $oldSubpage );
                                $extraOutput[] = $this->msg( 'movepage-page-unmoved' )->rawParams( $oldLink )
                                        ->params( Title::makeName( $newNs, $newPageName ) )->escaped();
                                continue;
@@ -731,7 +730,7 @@ class MovePageForm extends UnlistedSpecialPage {
 
                        # This was copy-pasted from Renameuser, bleh.
                        if ( $newSubpage->exists() && !$oldSubpage->isValidMoveTarget( $newSubpage ) ) {
-                               $link = Linker::linkKnown( $newSubpage );
+                               $link = $linkRenderer->makeKnownLink( $newSubpage );
                                $extraOutput[] = $this->msg( 'movepage-page-exists' )->rawParams( $link )->escaped();
                        } else {
                                $success = $oldSubpage->moveTo( $newSubpage, true, $this->reason, $createRedirect );
@@ -740,14 +739,14 @@ class MovePageForm extends UnlistedSpecialPage {
                                        if ( $this->fixRedirects ) {
                                                DoubleRedirectJob::fixRedirects( 'move', $oldSubpage, $newSubpage );
                                        }
-                                       $oldLink = Linker::link(
+                                       $oldLink = $linkRenderer->makeLink(
                                                $oldSubpage,
                                                null,
                                                [],
                                                [ 'redirect' => 'no' ]
                                        );
 
-                                       $newLink = Linker::linkKnown( $newSubpage );
+                                       $newLink = $linkRenderer->makeKnownLink( $newSubpage );
                                        $extraOutput[] = $this->msg( 'movepage-page-moved' )
                                                ->rawParams( $oldLink, $newLink )->escaped();
                                        ++$count;
@@ -759,8 +758,8 @@ class MovePageForm extends UnlistedSpecialPage {
                                                break;
                                        }
                                } else {
-                                       $oldLink = Linker::linkKnown( $oldSubpage );
-                                       $newLink = Linker::link( $newSubpage );
+                                       $oldLink = $linkRenderer->makeKnownLink( $oldSubpage );
+                                       $newLink = $linkRenderer->makeLink( $newSubpage );
                                        $extraOutput[] = $this->msg( 'movepage-page-unmoved' )
                                                ->rawParams( $oldLink, $newLink )->escaped();
                                }
@@ -804,8 +803,9 @@ class MovePageForm extends UnlistedSpecialPage {
                $out->addWikiMsg( 'movesubpagetext', $this->getLanguage()->formatNum( $count ) );
                $out->addHTML( "<ul>\n" );
 
+               $linkRenderer = $this->getLinkRenderer();
                foreach ( $subpages as $subpage ) {
-                       $link = Linker::link( $subpage );
+                       $link = $linkRenderer->makeLink( $subpage );
                        $out->addHTML( "<li>$link</li>\n" );
                }
                $out->addHTML( "</ul>\n" );
index c24b054..718a6dc 100644 (file)
@@ -188,9 +188,13 @@ class SpecialNewpages extends IncludableSpecialPage {
                unset( $changed['offset'] ); // Reset offset if query type changes
 
                $self = $this->getPageTitle();
+               $linkRenderer = $this->getLinkRenderer();
                foreach ( $filters as $key => $msg ) {
                        $onoff = 1 - $this->opts->getValue( $key );
-                       $link = Linker::link( $self, $showhide[$onoff], [],
+                       $link = $linkRenderer->makeLink(
+                               $self,
+                               new HtmlArmor( $showhide[$onoff] ),
+                               [],
                                [ $key => $onoff ] + $changed
                        );
                        $links[$key] = $this->msg( $msg )->rawParams( $link )->escaped();
@@ -307,28 +311,25 @@ class SpecialNewpages extends IncludableSpecialPage {
                $spanTime = Html::element( 'span', [ 'class' => 'mw-newpages-time' ],
                        $lang->userTimeAndDate( $result->rc_timestamp, $this->getUser() )
                );
-               $time = Linker::linkKnown(
+               $linkRenderer = $this->getLinkRenderer();
+               $time = $linkRenderer->makeKnownLink(
                        $title,
-                       $spanTime,
+                       new HtmlArmor( $spanTime ),
                        [],
-                       [ 'oldid' => $result->rc_this_oldid ],
-                       []
+                       [ 'oldid' => $result->rc_this_oldid ]
                );
 
                $query = $title->isRedirect() ? [ 'redirect' => 'no' ] : [];
 
-               // Linker::linkKnown() uses 'known' and 'noclasses' options.
-               // This breaks the colouration for stubs.
-               $plink = Linker::link(
+               $plink = $linkRenderer->makeKnownLink(
                        $title,
                        null,
                        [ 'class' => 'mw-newpages-pagename' ],
-                       $query,
-                       [ 'known' ]
+                       $query
                );
-               $histLink = Linker::linkKnown(
+               $histLink = $linkRenderer->makeKnownLink(
                        $title,
-                       $this->msg( 'hist' )->escaped(),
+                       $this->msg( 'hist' )->text(),
                        [],
                        [ 'action' => 'history' ]
                );
@@ -478,4 +479,8 @@ class SpecialNewpages extends IncludableSpecialPage {
        protected function getGroupName() {
                return 'changes';
        }
+
+       protected function getCacheTTL() {
+               return 60 * 5;
+       }
 }
index efb1748..a5e538f 100644 (file)
  * @ingroup SpecialPage
  */
 class SpecialRandomInCategory extends FormSpecialPage {
+       /** @var string[] */
        protected $extra = []; // Extra SQL statements
+       /** @var Title|false */
        protected $category = false; // Title object of category
+       /** @var int */
        protected $maxOffset = 30; // Max amount to fudge randomness by.
+       /** @var int|null */
        private $maxTimestamp = null;
+       /** @var int|null */
        private $minTimestamp = null;
 
        public function __construct( $name = 'RandomInCategory' ) {
index b6398cb..d4fb72c 100644 (file)
@@ -310,7 +310,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
        /**
         * Build and output the actual changes list.
         *
-        * @param array $rows Database rows
+        * @param ResultWrapper $rows Database rows
         * @param FormOptions $opts
         */
        public function outputChangesList( $rows, $opts ) {
@@ -794,4 +794,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
        public function isIncludable() {
                return true;
        }
+
+       protected function getCacheTTL() {
+               return 60 * 5;
+       }
+
 }
index 36ea983..20dbfd1 100644 (file)
@@ -485,7 +485,9 @@ class SpecialSearch extends SpecialPage {
        protected function getDidYouMeanHtml( SearchResultSet $textMatches ) {
                # mirror Go/Search behavior of original request ..
                $params = [ 'search' => $textMatches->getSuggestionQuery() ];
-               if ( $this->fulltext != null ) {
+               if ( $this->fulltext === null ) {
+                       $params['fulltext'] = 'Search';
+               } else {
                        $params['fulltext'] = $this->fulltext;
                }
                $stParams = array_merge( $params, $this->powerSearchOptions() );
@@ -519,7 +521,9 @@ class SpecialSearch extends SpecialPage {
                // Search instead for '$orig'
 
                $params = [ 'search' => $textMatches->getQueryAfterRewrite() ];
-               if ( $this->fulltext != null ) {
+               if ( $this->fulltext === null ) {
+                       $params['fulltext'] = 'Search';
+               } else {
                        $params['fulltext'] = $this->fulltext;
                }
                $stParams = array_merge( $params, $this->powerSearchOptions() );
@@ -716,7 +720,7 @@ class SpecialSearch extends SpecialPage {
 
                $out .= "<ul class='mw-search-results'>\n";
                while ( $result ) {
-                       $out .= $this->showHit( $result, $terms, ++$pos );
+                       $out .= $this->showHit( $result, $terms, $pos++ );
                        $result = $matches->next();
                }
                $out .= "</ul>\n";
@@ -1240,6 +1244,7 @@ class SpecialSearch extends SpecialPage {
                        'autofocus' => trim( $term ) === '',
                        'value' => $term,
                        'dataLocation' => 'content',
+                       'infusable' => true,
                ] );
 
                $layout = new OOUI\ActionFieldLayout( $searchWidget, new OOUI\ButtonInputWidget( [
index f2eb88d..4c892b2 100644 (file)
@@ -53,6 +53,7 @@ class SpecialTrackingCategories extends SpecialPage {
                'node-count-exceeded-category',
                'expansion-depth-exceeded-category',
                'restricted-displaytitle-ignored',
+               'deprecated-self-close-category',
        ];
 
        function execute( $par ) {
index b0a2579..f73be43 100644 (file)
@@ -71,16 +71,17 @@ class UnusedtemplatesPage extends QueryPage {
         * @return string
         */
        function formatResult( $skin, $result ) {
+               $linkRenderer = $this->getLinkRenderer();
                $title = Title::makeTitle( NS_TEMPLATE, $result->title );
-               $pageLink = Linker::linkKnown(
+               $pageLink = $linkRenderer->makeKnownLink(
                        $title,
                        null,
                        [],
                        [ 'redirect' => 'no' ]
                );
-               $wlhLink = Linker::linkKnown(
+               $wlhLink = $linkRenderer->makeKnownLink(
                        SpecialPage::getTitleFor( 'Whatlinkshere', $title->getPrefixedText() ),
-                       $this->msg( 'unusedtemplateswlh' )->escaped()
+                       $this->msg( 'unusedtemplateswlh' )->text()
                );
 
                return $this->getLanguage()->specialList( $pageLink, $wlhLink );
index 4b731cb..0ef6af1 100644 (file)
@@ -535,7 +535,7 @@ class SpecialUpload extends SpecialPage {
                );
 
                if ( !$status->isGood() ) {
-                       $this->showUploadError( $this->getOutput()->parse( $status->getWikiText() ) );
+                       $this->showRecoverableUploadError( $this->getOutput()->parse( $status->getWikiText() ) );
 
                        return;
                }
index 28c68aa..21f5659 100644 (file)
@@ -23,7 +23,6 @@
 
 use MediaWiki\Auth\AuthManager;
 use MediaWiki\Logger\LoggerFactory;
-use Psr\Log\LogLevel;
 
 /**
  * Implements Special:UserLogin
@@ -125,7 +124,7 @@ class SpecialUserLogin extends LoginSignupSpecialPage {
 
                # Run any hooks; display injected HTML if any, else redirect
                $injected_html = '';
-               Hooks::run( 'UserLoginComplete', [ &$user, &$injected_html ] );
+               Hooks::run( 'UserLoginComplete', [ &$user, &$injected_html, $direct ] );
 
                if ( $injected_html !== '' || $extraMessages ) {
                        $this->showSuccessPage( 'success', $this->msg( 'loginsuccesstitle' ),
@@ -154,7 +153,7 @@ class SpecialUserLogin extends LoginSignupSpecialPage {
        }
 
        protected function logAuthResult( $success, $status = null ) {
-               LoggerFactory::getInstance( 'authmanager-stats' )->info( 'Login attempt', [
+               LoggerFactory::getInstance( 'authmanager' )->info( 'Login attempt', [
                        'event' => 'login',
                        'successful' => $success,
                        'status' => $status,
index 8e4fbaa..60f642d 100644 (file)
@@ -306,9 +306,8 @@ class AllMessagesTablePager extends TablePager {
                                                'title' => 'Special:SearchTranslations',
                                                'group' => 'mediawiki',
                                                'grouppath' => 'mediawiki',
-                                               'query' => 'language:' . $this->getLanguage()->getCode() . '^25 ' .
-                                                       'messageid:"MediaWiki:' . $value . '"^10 "' .
-                                                       $this->msg( $value )->inLanguage( 'en' )->plain() . '"'
+                                               'language' => $this->getLanguage()->getCode(),
+                                               'query' => $value . ' ' . $this->msg( $value )->plain()
                                        ] ),
                                        $this->msg( 'allmessages-filter-translate' )->text()
                                );
index cba4952..b78fed8 100644 (file)
@@ -18,6 +18,7 @@
  * @file
  * @ingroup Pager
  */
+use MediaWiki\Linker\LinkRenderer;
 
 /**
  * @ingroup Pager
 class CategoryPager extends AlphabeticPager {
 
        /**
-        * @var PageLinkRenderer
+        * @var LinkRenderer
         */
        protected $linkRenderer;
 
        /**
         * @param IContextSource $context
         * @param string $from
-        * @param PageLinkRenderer $linkRenderer
+        * @param LinkRenderer $linkRenderer
         */
-       public function __construct( IContextSource $context, $from, PageLinkRenderer $linkRenderer
+       public function __construct( IContextSource $context, $from, LinkRenderer $linkRenderer
        ) {
                parent::__construct( $context );
                $from = str_replace( ' ', '_', $from );
@@ -74,7 +75,7 @@ class CategoryPager extends AlphabeticPager {
                $this->mResult->rewind();
 
                foreach ( $this->mResult as $row ) {
-                       $batch->addObj( Title::makeTitleSafe( NS_CATEGORY, $row->cat_title ) );
+                       $batch->addObj( new TitleValue( NS_CATEGORY, $row->cat_title ) );
                }
                $batch->execute();
                $this->mResult->rewind();
@@ -85,7 +86,7 @@ class CategoryPager extends AlphabeticPager {
        function formatRow( $result ) {
                $title = new TitleValue( NS_CATEGORY, $result->cat_title );
                $text = $title->getText();
-               $link = $this->linkRenderer->renderHtmlLink( $title, $text );
+               $link = $this->linkRenderer->makeLink( $title, $text );
 
                $count = $this->msg( 'nmembers' )->numParams( $result->cat_pages )->escaped();
                return Html::rawElement( 'li', null, $this->getLanguage()->specialList( $link, $count ) ) . "\n";
index 201e4e8..f8eba9a 100644 (file)
@@ -64,6 +64,7 @@ class ContribsPager extends ReverseChronologicalPager {
                $this->deletedOnly = !empty( $options['deletedOnly'] );
                $this->topOnly = !empty( $options['topOnly'] );
                $this->newOnly = !empty( $options['newOnly'] );
+               $this->hideMinor = !empty( $options['hideMinor'] );
 
                $year = isset( $options['year'] ) ? $options['year'] : false;
                $month = isset( $options['month'] ) ? $options['month'] : false;
@@ -223,6 +224,11 @@ class ContribsPager extends ReverseChronologicalPager {
                                        ]
                                ];
                        }
+                       // (T140537) Disallow looking too far in the past for 'newbies' queries. If the user requested
+                       // a timestamp offset far in the past such that there are no edits by users with user_ids in
+                       // the range, we would end up scanning all revisions from that offset until start of time.
+                       $condition[] = 'rev_timestamp > ' .
+                               $this->mDb->addQuotes( $this->mDb->timestamp( wfTimestamp() - 30 * 24 * 60 * 60 ) );
                } else {
                        $uid = User::idFromName( $this->target );
                        if ( $uid ) {
@@ -246,6 +252,10 @@ class ContribsPager extends ReverseChronologicalPager {
                        $condition[] = 'rev_parent_id = 0';
                }
 
+               if ( $this->hideMinor ) {
+                       $condition[] = 'rev_minor_edit = 0';
+               }
+
                return [ $tables, $index, $condition, $join_conds ];
        }
 
@@ -366,8 +376,9 @@ class ContribsPager extends ReverseChronologicalPager {
                        # Mark current revisions
                        $topmarktext = '';
                        $user = $this->getUser();
-                       if ( $row->rev_id == $row->page_latest ) {
+                       if ( $row->rev_id === $row->page_latest ) {
                                $topmarktext .= '<span class="mw-uctop">' . $this->messages['uctop'] . '</span>';
+                               $classes[] = 'mw-contributions-current';
                                # Add rollback link
                                if ( !$row->page_is_new && $page->quickUserCan( 'rollback', $user )
                                        && $page->quickUserCan( 'edit', $user )
@@ -473,6 +484,8 @@ class ContribsPager extends ReverseChronologicalPager {
                        );
                        $classes = array_merge( $classes, $newClasses );
 
+                       Hooks::run( 'SpecialContributions::formatRow::flags', [ $this->getContext(), $row, &$flags ] );
+
                        $templateParams = [
                                'del' => $del,
                                'timestamp' => $d,
index 951cb52..09132f2 100644 (file)
@@ -1262,7 +1262,8 @@ class LoginFormPreAuthManager extends SpecialPage {
                # Run any hooks; display injected HTML if any, else redirect
                $currentUser = $this->getUser();
                $injected_html = '';
-               Hooks::run( 'UserLoginComplete', [ &$currentUser, &$injected_html ] );
+               $direct = RequestContext::getMain()->getRequest()->wasPosted();
+               Hooks::run( 'UserLoginComplete', [ &$currentUser, &$injected_html, $direct ] );
 
                if ( $injected_html !== '' ) {
                        $this->displaySuccessfulAction( 'success', $this->msg( 'loginsuccesstitle' ),
@@ -1283,8 +1284,9 @@ class LoginFormPreAuthManager extends SpecialPage {
                $currentUser = $this->getUser();
                $injected_html = '';
                $welcome_creation_msg = 'welcomecreation-msg';
+               $direct = RequestContext::getMain()->getRequest()->wasPosted();
 
-               Hooks::run( 'UserLoginComplete', [ &$currentUser, &$injected_html ] );
+               Hooks::run( 'UserLoginComplete', [ &$currentUser, &$injected_html, $direct ] );
 
                /**
                 * Let any extensions change what message is shown.
diff --git a/includes/tidy/Balancer.php b/includes/tidy/Balancer.php
new file mode 100644 (file)
index 0000000..b2d6ba1
--- /dev/null
@@ -0,0 +1,3535 @@
+<?php
+/**
+ * An implementation of the tree building portion of the HTML5 parsing
+ * spec.
+ *
+ * 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 Parser
+ * @since 1.27
+ * @author C. Scott Ananian, 2016
+ */
+namespace MediaWiki\Tidy;
+
+use Wikimedia\Assert\Assert;
+use Wikimedia\Assert\ParameterAssertionException;
+use \ExplodeIterator;
+use \IteratorAggregate;
+use \ReverseArrayIterator;
+use \Sanitizer;
+
+# A note for future librarization[1] -- this file is a good candidate
+# for splitting into an independent library, except that it is currently
+# highly optimized for MediaWiki use.  It only implements the portions
+# of the HTML5 tree builder used by tags supported by MediaWiki, and
+# does not contain a true tokenizer pass, instead relying on
+# comment stripping, attribute normalization, and escaping done by
+# the MediaWiki Sanitizer.  It also deliberately avoids building
+# a true DOM in memory, instead serializing elements to an output string
+# as soon as possible (usually as soon as the tag is closed) to reduce
+# its memory footprint.
+
+# We've been gradually lifting some of these restrictions to handle
+# non-sanitized output generated by extensions, but we shortcut the tokenizer
+# for speed (primarily by splitting on `<`) and so rely on syntactic
+# well-formedness.
+
+# On the other hand, I've been pretty careful to note with comments in the
+# code the places where this implementation omits features of the spec or
+# depends on the MediaWiki Sanitizer.  Perhaps in the future we'll want to
+# implement the missing pieces and make this a standalone PHP HTML5 parser.
+# In order to do so, some sort of MediaWiki-specific API will need
+# to be added to (a) allow the Balancer to bypass the tokenizer,
+# and (b) support on-the-fly flattening instead of DOM node creation.
+
+# [1]: https://www.mediawiki.org/wiki/Library_infrastructure_for_MediaWiki
+
+/**
+ * Utility constants and sets for the HTML5 tree building algorithm.
+ * Sets are associative arrays indexed first by namespace and then by
+ * lower-cased tag name.
+ *
+ * @ingroup Parser
+ * @since 1.27
+ */
+class BalanceSets {
+       const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';
+       const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';
+       const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';
+
+       public static $unsupportedSet = [
+               self::HTML_NAMESPACE => [
+                       'html' => true, 'head' => true, 'body' => true, 'frameset' => true,
+                       'frame' => true,
+                       'plaintext' => true, 'isindex' => true,
+                       'xmp' => true, 'iframe' => true, 'noembed' => true,
+                       'noscript' => true, 'script' => true,
+                       'title' => true
+               ]
+       ];
+
+       public static $emptyElementSet = [
+               self::HTML_NAMESPACE => [
+                       'area' => true, 'base' => true, 'basefont' => true,
+                       'bgsound' => true, 'br' => true, 'col' => true, 'command' => true,
+                       'embed' => true, 'frame' => true, 'hr' => true, 'img' => true,
+                       'input' => true, 'keygen' => true, 'link' => true, 'meta' => true,
+                       'param' => true, 'source' => true, 'track' => true, 'wbr' => true
+               ]
+       ];
+
+       public static $extraLinefeedSet = [
+               self::HTML_NAMESPACE => [
+                       'pre' => true, 'textarea' => true, 'listing' => true,
+               ]
+       ];
+
+       public static $headingSet = [
+               self::HTML_NAMESPACE => [
+                       'h1' => true, 'h2' => true, 'h3' => true,
+                       'h4' => true, 'h5' => true, 'h6' => true
+               ]
+       ];
+
+       public static $specialSet = [
+               self::HTML_NAMESPACE => [
+                       'address' => true, 'applet' => true, 'area' => true,
+                       'article' => true, 'aside' => true, 'base' => true,
+                       'basefont' => true, 'bgsound' => true, 'blockquote' => true,
+                       'body' => true, 'br' => true, 'button' => true, 'caption' => true,
+                       'center' => true, 'col' => true, 'colgroup' => true, 'dd' => true,
+                       'details' => true, 'dir' => true, 'div' => true, 'dl' => true,
+                       'dt' => true, 'embed' => true, 'fieldset' => true,
+                       'figcaption' => true, 'figure' => true, 'footer' => true,
+                       'form' => true, 'frame' => true, 'frameset' => true, 'h1' => true,
+                       'h2' => true, 'h3' => true, 'h4' => true, 'h5' => true,
+                       'h6' => true, 'head' => true, 'header' => true, 'hgroup' => true,
+                       'hr' => true, 'html' => true, 'iframe' => true, 'img' => true,
+                       'input' => true, 'isindex' => true, 'li' => true, 'link' => true,
+                       'listing' => true, 'main' => true, 'marquee' => true,
+                       'menu' => true, 'menuitem' => true, 'meta' => true, 'nav' => true,
+                       'noembed' => true, 'noframes' => true, 'noscript' => true,
+                       'object' => true, 'ol' => true, 'p' => true, 'param' => true,
+                       'plaintext' => true, 'pre' => true, 'script' => true,
+                       'section' => true, 'select' => true, 'source' => true,
+                       'style' => true, 'summary' => true, 'table' => true,
+                       'tbody' => true, 'td' => true, 'template' => true,
+                       'textarea' => true, 'tfoot' => true, 'th' => true, 'thead' => true,
+                       'title' => true, 'tr' => true, 'track' => true, 'ul' => true,
+                       'wbr' => true, 'xmp' => true
+               ],
+               self::SVG_NAMESPACE => [
+                       'foreignobject' => true, 'desc' => true, 'title' => true
+               ],
+               self::MATHML_NAMESPACE => [
+                       'mi' => true, 'mo' => true, 'mn' => true, 'ms' => true,
+                       'mtext' => true, 'annotation-xml' => true
+               ]
+       ];
+
+       public static $addressDivPSet = [
+               self::HTML_NAMESPACE => [
+                       'address' => true, 'div' => true, 'p' => true
+               ]
+       ];
+
+       public static $tableSectionRowSet = [
+               self::HTML_NAMESPACE => [
+                       'table' => true, 'thead' => true, 'tbody' => true,
+                       'tfoot' => true, 'tr' => true
+               ]
+       ];
+
+       public static $impliedEndTagsSet = [
+               self::HTML_NAMESPACE => [
+                       'dd' => true, 'dt' => true, 'li' => true, 'optgroup' => true,
+                       'option' => true, 'p' => true, 'rb' => true, 'rp' => true,
+                       'rt' => true, 'rtc' => true
+               ]
+       ];
+
+       public static $thoroughImpliedEndTagsSet = [
+               self::HTML_NAMESPACE => [
+                       'caption' => true, 'colgroup' => true, 'dd' => true, 'dt' => true,
+                       'li' => true, 'optgroup' => true, 'option' => true, 'p' => true,
+                       'rb' => true, 'rp' => true, 'rt' => true, 'rtc' => true,
+                       'tbody' => true, 'td' => true, 'tfoot' => true, 'th' => true,
+                       'thead' => true, 'tr' => true
+               ]
+       ];
+
+       public static $tableCellSet = [
+               self::HTML_NAMESPACE => [
+                       'td' => true, 'th' => true
+               ]
+       ];
+       public static $tableContextSet = [
+               self::HTML_NAMESPACE => [
+                       'table' => true, 'template' => true, 'html' => true
+               ]
+       ];
+
+       public static $tableBodyContextSet = [
+               self::HTML_NAMESPACE => [
+                       'tbody' => true, 'tfoot' => true, 'thead' => true,
+                       'template' => true, 'html' => true
+               ]
+       ];
+
+       public static $tableRowContextSet = [
+               self::HTML_NAMESPACE => [
+                       'tr' => true, 'template' => true, 'html' => true
+               ]
+       ];
+
+       // See https://html.spec.whatwg.org/multipage/forms.html#form-associated-element
+       public static $formAssociatedSet = [
+               self::HTML_NAMESPACE => [
+                       'button' => true, 'fieldset' => true, 'input' => true,
+                       'keygen' => true, 'object' => true, 'output' => true,
+                       'select' => true, 'textarea' => true, 'img' => true
+               ]
+       ];
+
+       public static $inScopeSet = [
+               self::HTML_NAMESPACE => [
+                       'applet' => true, 'caption' => true, 'html' => true,
+                       'marquee' => true, 'object' => true,
+                       'table' => true, 'td' => true, 'template' => true,
+                       'th' => true
+               ],
+               self::SVG_NAMESPACE => [
+                       'foreignobject' => true, 'desc' => true, 'title' => true
+               ],
+               self::MATHML_NAMESPACE => [
+                       'mi' => true, 'mo' => true, 'mn' => true, 'ms' => true,
+                       'mtext' => true, 'annotation-xml' => true
+               ]
+       ];
+
+       private static $inListItemScopeSet = null;
+       public static function inListItemScopeSet() {
+               if ( self::$inListItemScopeSet === null ) {
+                       self::$inListItemScopeSet = self::$inScopeSet;
+                       self::$inListItemScopeSet[self::HTML_NAMESPACE]['ol'] = true;
+                       self::$inListItemScopeSet[self::HTML_NAMESPACE]['ul'] = true;
+               }
+               return self::$inListItemScopeSet;
+       }
+
+       private static $inButtonScopeSet = null;
+       public static function inButtonScopeSet() {
+               if ( self::$inButtonScopeSet === null ) {
+                       self::$inButtonScopeSet = self::$inScopeSet;
+                       self::$inButtonScopeSet[self::HTML_NAMESPACE]['button'] = true;
+               }
+               return self::$inButtonScopeSet;
+       }
+
+       public static $inTableScopeSet = [
+               self::HTML_NAMESPACE => [
+                       'html' => true, 'table' => true, 'template' => true
+               ]
+       ];
+
+       public static $inInvertedSelectScopeSet = [
+               self::HTML_NAMESPACE => [
+                       'option' => true, 'optgroup' => true
+               ]
+       ];
+
+       public static $mathmlTextIntegrationPointSet = [
+               self::MATHML_NAMESPACE => [
+                       'mi' => true, 'mo' => true, 'mn' => true, 'ms' => true,
+                       'mtext' => true
+               ]
+       ];
+
+       public static $htmlIntegrationPointSet = [
+               self::SVG_NAMESPACE => [
+                       'foreignobject' => true,
+                       'desc' => true,
+                       'title' => true
+               ]
+       ];
+
+       // For tidy compatibility.
+       public static $tidyPWrapSet = [
+               self::HTML_NAMESPACE => [
+                       'body' => true, 'blockquote' => true,
+                       // We parse with <body> as the fragment context, but the top-level
+                       // element on the stack is actually <html>.  We could use the
+                       // "adjusted current node" everywhere to work around this, but it's
+                       // easier just to add <html> to the p-wrap set.
+                       'html' => true,
+               ],
+       ];
+       public static $tidyInlineSet = [
+               self::HTML_NAMESPACE => [
+                       'a' => true, 'abbr' => true, 'acronym' => true, 'applet' => true,
+                       'b' => true, 'basefont' => true, 'bdo' => true, 'big' => true,
+                       'br' => true, 'button' => true, 'cite' => true, 'code' => true,
+                       'dfn' => true, 'em' => true, 'font' => true, 'i' => true,
+                       'iframe' => true, 'img' => true, 'input' => true, 'kbd' => true,
+                       'label' => true, 'legend' => true, 'map' => true, 'object' => true,
+                       'param' => true, 'q' => true, 'rb' => true, 'rbc' => true,
+                       'rp' => true, 'rt' => true, 'rtc' => true, 'ruby' => true,
+                       's' => true, 'samp' => true, 'select' => true, 'small' => true,
+                       'span' => true, 'strike' => true, 'strong' => true, 'sub' => true,
+                       'sup' => true, 'textarea' => true, 'tt' => true, 'u' => true,
+                       'var' => true,
+               ],
+       ];
+}
+
+/**
+ * A BalanceElement is a simplified version of a DOM Node.  The main
+ * difference is that we only keep BalanceElements around for nodes
+ * currently on the BalanceStack of open elements.  As soon as an
+ * element is closed, with some minor exceptions relating to the
+ * tree builder "adoption agency algorithm", the element and all its
+ * children are serialized to a string using the flatten() method.
+ * This keeps our memory usage low.
+ *
+ * @ingroup Parser
+ * @since 1.27
+ */
+class BalanceElement {
+       /**
+        * The namespace of the element.
+        * @var string $namespaceURI
+        */
+       public $namespaceURI;
+       /**
+        * The lower-cased name of the element.
+        * @var string $localName
+        */
+       public $localName;
+       /**
+        * Attributes for the element, in array form
+        * @var array $attribs
+        */
+       public $attribs;
+
+       /**
+        * Parent of this element, or the string "flat" if this element has
+        * already been flattened into its parent.
+        * @var string|null $parent
+        */
+       public $parent;
+
+       /**
+        * An array of children of this element.  Typically only the last
+        * child will be an actual BalanceElement object; the rest will
+        * be strings, representing either text nodes or flattened
+        * BalanceElement objects.
+        * @var array $children
+        */
+       public $children;
+
+       /**
+        * A unique string identifier for Noah's Ark purposes, lazy initialized
+        */
+       private $noahKey;
+
+       /**
+        * The next active formatting element in the list, or null if this is the
+        * end of the AFE list or if the element is not in the AFE list.
+        */
+       public $nextAFE;
+
+       /**
+        * The previous active formatting element in the list, or null if this is
+        * the start of the list or if the element is not in the AFE list.
+        */
+       public $prevAFE;
+
+       /**
+        * The next element in the Noah's Ark species bucket.
+        */
+       public $nextNoah;
+
+       /**
+        * Make a new BalanceElement corresponding to the HTML DOM Element
+        * with the given localname, namespace, and attributes.
+        *
+        * @param string $namespaceURI The namespace of the element.
+        * @param string $localName The lowercased name of the tag.
+        * @param array $attribs Attributes of the element
+        */
+       public function __construct( $namespaceURI, $localName, array $attribs ) {
+               $this->localName = $localName;
+               $this->namespaceURI = $namespaceURI;
+               $this->attribs = $attribs;
+               $this->contents = '';
+               $this->parent = null;
+               $this->children = [];
+       }
+
+       /**
+        * Remove the given child from this element.
+        * @param BalanceElement $elt
+        */
+       private function removeChild( BalanceElement $elt ) {
+               Assert::precondition(
+                       $this->parent !== 'flat', "Can't removeChild after flattening $this"
+               );
+               Assert::parameter(
+                       $elt->parent === $this, 'elt', 'must have $this as a parent'
+               );
+               $idx = array_search( $elt, $this->children, true );
+               Assert::parameter( $idx !== false, '$elt', 'must be a child of $this' );
+               $elt->parent = null;
+               array_splice( $this->children, $idx, 1 );
+       }
+
+       /**
+        * Find $a in the list of children and insert $b before it.
+        * @param BalanceElement $a
+        * @param BalanceElement|string $b
+        */
+       public function insertBefore( BalanceElement $a, $b ) {
+               Assert::precondition(
+                       $this->parent !== 'flat', "Can't insertBefore after flattening."
+               );
+               $idx = array_search( $a, $this->children, true );
+               Assert::parameter( $idx !== false, '$a', 'must be a child of $this' );
+               if ( is_string( $b ) ) {
+                       array_splice( $this->children, $idx, 0, [ $b ] );
+               } else {
+                       Assert::parameter( $b->parent !== 'flat', '$b', "Can't be flat" );
+                       if ( $b->parent !== null ) {
+                               $b->parent->removeChild( $b );
+                       }
+                       array_splice( $this->children, $idx, 0, [ $b ] );
+                       $b->parent = $this;
+               }
+       }
+
+       /**
+        * Append $elt to the end of the list of children.
+        * @param BalanceElement|string $elt
+        */
+       public function appendChild( $elt ) {
+               Assert::precondition(
+                       $this->parent !== 'flat', "Can't appendChild after flattening."
+               );
+               if ( is_string( $elt ) ) {
+                       array_push( $this->children, $elt );
+                       return;
+               }
+               // Remove $elt from parent, if it had one.
+               if ( $elt->parent !== null ) {
+                       $elt->parent->removeChild( $elt );
+               }
+               array_push( $this->children, $elt );
+               $elt->parent = $this;
+       }
+
+       /**
+        * Transfer all of the children of $elt to $this.
+        * @param BalanceElement $elt
+        */
+       public function adoptChildren( BalanceElement $elt ) {
+               Assert::precondition(
+                       $elt->parent !== 'flat', "Can't adoptChildren after flattening."
+               );
+               foreach ( $elt->children as $child ) {
+                       if ( !is_string( $child ) ) {
+                               // This is an optimization which avoids an O(n^2) set of
+                               // array_splice operations.
+                               $child->parent = null;
+                       }
+                       $this->appendChild( $child );
+               }
+               $elt->children = [];
+       }
+
+       /**
+        * Flatten this node and all of its children into a string, as specified
+        * by the HTML serialization specification, and replace this node
+        * in its parent by that string.
+        *
+        * @see __toString()
+        */
+       public function flatten( $tidyCompat = false ) {
+               Assert::parameter( $this->parent !== null, '$this', 'must be a child' );
+               Assert::parameter( $this->parent !== 'flat', '$this', 'already flat' );
+               $idx = array_search( $this, $this->parent->children, true );
+               Assert::parameter(
+                       $idx !== false, '$this', 'must be a child of its parent'
+               );
+               if ( $tidyCompat ) {
+                       $blank = true;
+                       foreach ( $this->children as $elt ) {
+                               if ( !is_string( $elt ) ) {
+                                       $elt = $elt->flatten( $tidyCompat );
+                               }
+                               if ( $blank && preg_match( '/[^\t\n\f\r ]/', $elt ) ) {
+                                       $blank = false;
+                               }
+                       }
+                       if ( $this->isHtmlNamed( 'mw:p-wrap' ) ) {
+                               $this->localName = 'p';
+                       } elseif ( $blank ) {
+                               // Add 'mw-empty-elt' class so elements can be hidden via CSS
+                               // for compatibility with legacy tidy.
+                               if ( !count( $this->attribs ) &&
+                                       ( $this->localName === 'tr' || $this->localName === 'li' )
+                               ) {
+                                       $this->attribs = [ 'class' => "mw-empty-elt" ];
+                               }
+                               $blank = false;
+                       }
+                       $flat = $blank ? '' : "{$this}";
+               } else {
+                       $flat = "{$this}";
+               }
+               $this->parent->children[$idx] = $flat;
+               $this->parent = 'flat'; # for assertion checking
+               return $flat;
+       }
+
+       /**
+        * Serialize this node and all of its children to a string, as specified
+        * by the HTML serialization specification.
+        *
+        * @return string The serialization of the BalanceElement
+        * @see https://html.spec.whatwg.org/multipage/syntax.html#serialising-html-fragments
+        */
+       public function __toString() {
+               $encAttribs = '';
+               foreach ( $this->attribs as $name => $value ) {
+                       $encValue = Sanitizer::encodeAttribute( $value );
+                       $encAttribs .= " $name=\"$encValue\"";
+               }
+               if ( !$this->isA( BalanceSets::$emptyElementSet ) ) {
+                       $out = "<{$this->localName}{$encAttribs}>";
+                       $len = strlen( $out );
+                       // flatten children
+                       foreach ( $this->children as $elt ) {
+                               $out .= "{$elt}";
+                       }
+                       $out .= "</{$this->localName}>";
+                       if (
+                               $this->isA( BalanceSets::$extraLinefeedSet ) &&
+                               $out[$len] === "\n"
+                       ) {
+                               // Double the linefeed after pre/listing/textarea
+                               // according to the HTML5 fragment serialization algorithm.
+                               $out = substr( $out, 0, $len + 1 ) .
+                                       substr( $out, $len );
+                       }
+               } else {
+                       $out = "<{$this->localName}{$encAttribs} />";
+                       Assert::invariant(
+                               count( $this->children ) === 0,
+                               "Empty elements shouldn't have children."
+                       );
+               }
+               return $out;
+       }
+
+       # Utility functions on BalanceElements.
+
+       /**
+        * Determine if $this represents a specific HTML tag, is a member of
+        * a tag set, or is equal to another BalanceElement.
+        *
+        * @param BalanceElement|array|string $set The target BalanceElement,
+        *   set (from the BalanceSets class), or string (HTML tag name).
+        * @return bool
+        */
+       public function isA( $set ) {
+               if ( $set instanceof BalanceElement ) {
+                       return $this === $set;
+               } elseif ( is_array( $set ) ) {
+                       return isset( $set[$this->namespaceURI] ) &&
+                               isset( $set[$this->namespaceURI][$this->localName] );
+               } else {
+                       # assume this is an HTML element name.
+                       return $this->isHtml() && $this->localName === $set;
+               }
+       }
+
+       /**
+        * Determine if this element is an HTML element with the specified name
+        * @param string $tagName
+        * @return bool
+        */
+       public function isHtmlNamed( $tagName ) {
+               return $this->namespaceURI === BalanceSets::HTML_NAMESPACE
+                       && $this->localName === $tagName;
+       }
+
+       /**
+        * Determine if $this represents an element in the HTML namespace.
+        *
+        * @return bool
+        */
+       public function isHtml() {
+               return $this->namespaceURI === BalanceSets::HTML_NAMESPACE;
+       }
+
+       /**
+        * Determine if $this represents a MathML text integration point,
+        * as defined in the HTML5 specification.
+        *
+        * @return bool
+        * @see https://html.spec.whatwg.org/multipage/syntax.html#mathml-text-integration-point
+        */
+       public function isMathmlTextIntegrationPoint() {
+               return $this->isA( BalanceSets::$mathmlTextIntegrationPointSet );
+       }
+
+       /**
+        * Determine if $this represents an HTML integration point,
+        * as defined in the HTML5 specification.
+        *
+        * @return bool
+        * @see https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point
+        */
+       public function isHtmlIntegrationPoint() {
+               if ( $this->isA( BalanceSets::$htmlIntegrationPointSet ) ) {
+                       return true;
+               }
+               if (
+                       $this->namespaceURI === BalanceSets::MATHML_NAMESPACE &&
+                       $this->localName === 'annotation-xml' &&
+                       isset( $this->attribs['encoding'] ) &&
+                       ( strcasecmp( $this->attribs['encoding'], 'text/html' ) == 0 ||
+                       strcasecmp( $this->attribs['encoding'], 'application/xhtml+xml' ) == 0 )
+               ) {
+                       return true;
+               }
+               return false;
+       }
+
+       /**
+        * Get a string key for the Noah's Ark algorithm
+        */
+       public function getNoahKey() {
+               if ( $this->noahKey === null ) {
+                       $attribs = $this->attribs;
+                       ksort( $attribs );
+                       $this->noahKey = serialize( [ $this->namespaceURI, $this->localName, $attribs ] );
+               }
+               return $this->noahKey;
+       }
+}
+
+/**
+ * The "stack of open elements" as defined in the HTML5 tree builder
+ * spec.  This contains methods to ensure that content (start tags, text)
+ * are inserted at the correct place in the output string, and to
+ * flatten BalanceElements are they are closed to avoid holding onto
+ * a complete DOM tree for the document in memory.
+ *
+ * The stack defines a PHP iterator to traverse it in "reverse order",
+ * that is, the most-recently-added element is visited first in a
+ * foreach loop.
+ *
+ * @ingroup Parser
+ * @since 1.27
+ * @see https://html.spec.whatwg.org/multipage/syntax.html#the-stack-of-open-elements
+ */
+class BalanceStack implements IteratorAggregate {
+       /**
+        * Backing storage for the stack.
+        * @var array $elements
+        */
+       private $elements = [];
+       /**
+        * Foster parent mode determines how nodes are inserted into the
+        * stack.
+        * @var bool $fosterParentMode
+        * @see https://html.spec.whatwg.org/multipage/syntax.html#foster-parent
+        */
+       public $fosterParentMode = false;
+       /**
+        * Tidy compatibility mode, determines behavior of body/blockquote
+        */
+       public $tidyCompat = false;
+       /**
+        * Reference to the current element
+        */
+       public $currentNode;
+
+       /**
+        * Create a new BalanceStack with a single BalanceElement on it,
+        * representing the root &lt;html&gt; node.
+        */
+       public function __construct() {
+               # always a root <html> element on the stack
+               array_push(
+                       $this->elements,
+                       new BalanceElement( BalanceSets::HTML_NAMESPACE, 'html', [] )
+               );
+               $this->currentNode = $this->elements[0];
+       }
+
+       /**
+        * Return a string representing the output of the tree builder:
+        * all the children of the root &lt;html&gt; node.
+        * @return string
+        */
+       public function getOutput() {
+               // Don't include the outer '<html>....</html>'
+               $out = '';
+               foreach ( $this->elements[0]->children as $elt ) {
+                       $out .= is_string( $elt ) ? $elt :
+                               $elt->flatten( $this->tidyCompat );
+               }
+               return $out;
+       }
+
+       /**
+        * Insert a comment at the appropriate place for inserting a node.
+        * @param string $value Content of the comment.
+        * @see https://html.spec.whatwg.org/multipage/syntax.html#insert-a-comment
+        */
+       public function insertComment( $value ) {
+               // Just another type of text node, except for tidy p-wrapping.
+               return $this->insertText( '<!--' . $value . '-->', true );
+       }
+
+       /**
+        * Insert text at the appropriate place for inserting a node.
+        * @param string $value
+        * @see https://html.spec.whatwg.org/multipage/syntax.html#appropriate-place-for-inserting-a-node
+        */
+       public function insertText( $value, $isComment = false ) {
+               if (
+                       $this->fosterParentMode &&
+                       $this->currentNode->isA( BalanceSets::$tableSectionRowSet )
+               ) {
+                       $this->fosterParent( $value );
+               } elseif (
+                       $this->tidyCompat && !$isComment &&
+                       $this->currentNode->isA( BalanceSets::$tidyPWrapSet )
+               ) {
+                       $this->insertHTMLELement( 'mw:p-wrap', [] );
+                       return $this->insertText( $value );
+               } else {
+                       $this->currentNode->appendChild( $value );
+               }
+       }
+
+       /**
+        * Insert a BalanceElement at the appropriate place, pushing it
+        * on to the open elements stack.
+        * @param string $namespaceURI The element namespace
+        * @param string $tag The tag name
+        * @param string $attribs Normalized attributes, as a string.
+        * @return BalanceElement
+        * @see https://html.spec.whatwg.org/multipage/syntax.html#insert-a-foreign-element
+        */
+       public function insertForeignElement( $namespaceURI, $tag, $attribs ) {
+               return $this->insertElement(
+                       new BalanceElement( $namespaceURI, $tag, $attribs )
+               );
+       }
+
+       /**
+        * Insert an HTML element at the appropriate place, pushing it on to
+        * the open elements stack.
+        * @param string $tag The tag name
+        * @param string $attribs Normalized attributes, as a string.
+        * @return BalanceElement
+        * @see https://html.spec.whatwg.org/multipage/syntax.html#insert-an-html-element
+        */
+       public function insertHTMLElement( $tag, $attribs ) {
+               return $this->insertForeignElement(
+                       BalanceSets::HTML_NAMESPACE, $tag, $attribs
+               );
+       }
+
+       /**
+        * Insert an element at the appropriate place and push it on to the
+        * open elements stack.
+        * @param BalanceElement $elt
+        * @return BalanceElement
+        * @see https://html.spec.whatwg.org/multipage/syntax.html#appropriate-place-for-inserting-a-node
+        */
+       public function insertElement( BalanceElement $elt ) {
+               if (
+                       $this->currentNode->isHtmlNamed( 'mw:p-wrap' ) &&
+                       !$elt->isA( BalanceSets::$tidyInlineSet )
+               ) {
+                       // Tidy compatibility.
+                       $this->pop();
+               }
+               if (
+                       $this->fosterParentMode &&
+                       $this->currentNode->isA( BalanceSets::$tableSectionRowSet )
+               ) {
+                       $elt = $this->fosterParent( $elt );
+               } else {
+                       $this->currentNode->appendChild( $elt );
+               }
+               Assert::invariant( $elt->parent !== null, "$elt must be in tree" );
+               Assert::invariant( $elt->parent !== 'flat', "$elt must not have been previous flattened" );
+               array_push( $this->elements, $elt );
+               $this->currentNode = $elt;
+               return $elt;
+       }
+
+       /**
+        * Determine if the stack has $tag in scope.
+        * @param BalanceElement|array|string $tag
+        * @return bool
+        * @see https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope
+        */
+       public function inScope( $tag ) {
+               return $this->inSpecificScope( $tag, BalanceSets::$inScopeSet );
+       }
+
+       /**
+        * Determine if the stack has $tag in button scope.
+        * @param BalanceElement|array|string $tag
+        * @return bool
+        * @see https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope
+        */
+       public function inButtonScope( $tag ) {
+               return $this->inSpecificScope( $tag, BalanceSets::inButtonScopeSet() );
+       }
+
+       /**
+        * Determine if the stack has $tag in list item scope.
+        * @param BalanceElement|array|string $tag
+        * @return bool
+        * @see https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-list-item-scope
+        */
+       public function inListItemScope( $tag ) {
+               return $this->inSpecificScope( $tag, BalanceSets::inListItemScopeSet() );
+       }
+
+       /**
+        * Determine if the stack has $tag in table scope.
+        * @param BalanceElement|array|string $tag
+        * @return bool
+        * @see https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-table-scope
+        */
+       public function inTableScope( $tag ) {
+               return $this->inSpecificScope( $tag, BalanceSets::$inTableScopeSet );
+       }
+
+       /**
+        * Determine if the stack has $tag in select scope.
+        * @param BalanceElement|array|string $tag
+        * @return bool
+        * @see https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-select-scope
+        */
+       public function inSelectScope( $tag ) {
+               // Can't use inSpecificScope to implement this, since it involves
+               // *inverting* a set of tags.  Implement manually.
+               foreach ( $this as $elt ) {
+                       if ( $elt->isA( $tag ) ) {
+                               return true;
+                       }
+                       if ( !$elt->isA( BalanceSets::$inInvertedSelectScopeSet ) ) {
+                               return false;
+                       }
+               }
+               return false;
+       }
+
+       /**
+        * Determine if the stack has $tag in a specific scope, $set.
+        * @param BalanceElement|array|string $tag
+        * @param BalanceElement|array|string $set
+        * @return bool
+        * @see https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-the-specific-scope
+        */
+       public function inSpecificScope( $tag, $set ) {
+               foreach ( $this as $elt ) {
+                       if ( $elt->isA( $tag ) ) {
+                               return true;
+                       }
+                       if ( $elt->isA( $set ) ) {
+                               return false;
+                       }
+               }
+               return false;
+       }
+
+       /**
+        * Generate implied end tags.
+        * @param string $butnot
+        * @param bool $thorough True if we should generate end tags thoroughly.
+        * @see https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags
+        */
+       public function generateImpliedEndTags( $butnot = null, $thorough = false ) {
+               $endTagSet = $thorough ?
+                       BalanceSets::$thoroughImpliedEndTagsSet :
+                       BalanceSets::$impliedEndTagsSet;
+               while ( $this->currentNode ) {
+                       if ( $butnot !== null && $this->currentNode->isHtmlNamed( $butnot ) ) {
+                               break;
+                       }
+                       if ( !$this->currentNode->isA( $endTagSet ) ) {
+                               break;
+                       }
+                       $this->pop();
+               }
+       }
+
+       /**
+        * Return the adjusted current node.
+        */
+       public function adjustedCurrentNode( $fragmentContext ) {
+               return ( $fragmentContext && count( $this->elements ) === 1 ) ?
+                       $fragmentContext : $this->currentNode;
+       }
+
+       /**
+        * Return an iterator over this stack which visits the current node
+        * first, and the root node last.
+        * @return Iterator
+        */
+       public function getIterator() {
+               return new ReverseArrayIterator( $this->elements );
+       }
+
+       /**
+        * Return the BalanceElement at the given position $idx, where
+        * position 0 represents the root element.
+        * @param int $idx
+        * @return BalanceElement
+        */
+       public function node( $idx ) {
+               return $this->elements[ $idx ];
+       }
+
+       /**
+        * Replace the element at position $idx in the BalanceStack with $elt.
+        * @param int $idx
+        * @param BalanceElement $elt
+        */
+       public function replaceAt( $idx, BalanceElement $elt ) {
+               Assert::precondition(
+                       $this->elements[$idx]->parent !== 'flat',
+                       'Replaced element should not have already been flattened.'
+               );
+               Assert::precondition(
+                       $elt->parent !== 'flat',
+                       'New element should not have already been flattened.'
+               );
+               $this->elements[$idx] = $elt;
+               if ( $idx === count( $this->elements ) - 1 ) {
+                       $this->currentNode = $elt;
+               }
+       }
+
+       /**
+        * Return the position of the given BalanceElement, set, or
+        * HTML tag name string in the BalanceStack.
+        * @param BalanceElement|array|string $tag
+        * @return int
+        */
+       public function indexOf( $tag ) {
+               for ( $i = count( $this->elements ) - 1; $i >= 0; $i-- ) {
+                       if ( $this->elements[$i]->isA( $tag ) ) {
+                               return $i;
+                       }
+               }
+               return -1;
+       }
+
+       /**
+        * Return the number of elements currently in the BalanceStack.
+        * @return int
+        */
+       public function length() {
+               return count( $this->elements );
+       }
+
+       /**
+        * Remove the current node from the BalanceStack, flattening it
+        * in the process.
+        */
+       public function pop() {
+               $elt = array_pop( $this->elements );
+               if ( count( $this->elements ) ) {
+                       $this->currentNode = $this->elements[ count( $this->elements ) - 1 ];
+               } else {
+                       $this->currentNode = null;
+               }
+               if ( !$elt->isHtmlNamed( 'mw:p-wrap' ) ) {
+                       $elt->flatten( $this->tidyCompat );
+               }
+       }
+
+       /**
+        * Remove all nodes up to and including position $idx from the
+        * BalanceStack, flattening them in the process.
+        * @param int $idx
+        */
+       public function popTo( $idx ) {
+               $length = count( $this->elements );
+               for ( $length = count( $this->elements ); $length > $idx; $length-- ) {
+                       $this->pop();
+               }
+       }
+
+       /**
+        * Pop elements off the stack up to and including the first
+        * element with the specified HTML tagname (or matching the given
+        * set).
+        * @param BalanceElement|array|string $tag
+        */
+       public function popTag( $tag ) {
+               while ( $this->currentNode ) {
+                       if ( $this->currentNode->isA( $tag ) ) {
+                               $this->pop();
+                               break;
+                       }
+                       $this->pop();
+               }
+       }
+
+       /**
+        * Pop elements off the stack *not including* the first element
+        * in the specified set.
+        * @param BalanceElement|array|string $set
+        */
+       public function clearToContext( $set ) {
+               // Note that we don't loop to 0. Never pop the <html> elt off.
+               for ( $length = count( $this->elements ); $length > 1; $length-- ) {
+                       if ( $this->currentNode->isA( $set ) ) {
+                               break;
+                       }
+                       $this->pop();
+               }
+       }
+
+       /**
+        * Remove the given $elt from the BalanceStack, optionally
+        * flattening it in the process.
+        * @param BalanceElement $elt The element to remove.
+        * @param bool $flatten Whether to flatten the removed element.
+        */
+       public function removeElement( BalanceElement $elt, $flatten = true ) {
+               Assert::parameter(
+                       $elt->parent !== 'flat',
+                       '$elt',
+                       '$elt should not already have been flattened.'
+               );
+               Assert::parameter(
+                       $elt->parent->parent !== 'flat',
+                       '$elt',
+                       'The parent of $elt should not already have been flattened.'
+               );
+               $idx = array_search( $elt, $this->elements, true );
+               Assert::parameter( $idx !== false, '$elt', 'must be in stack' );
+               array_splice( $this->elements, $idx, 1 );
+               if ( $idx === count( $this->elements ) ) {
+                       $this->currentNode = $this->elements[$idx - 1];
+               }
+               if ( $flatten ) {
+                       // serialize $elt into its parent
+                       // otherwise, it will eventually serialize when the parent
+                       // is serialized, we just hold onto the memory for its
+                       // tree of objects a little longer.
+                       $elt->flatten( $this->tidyCompat );
+               }
+               Assert::postcondition(
+                       array_search( $elt, $this->elements, true ) === false,
+                       '$elt should no longer be in open elements stack'
+               );
+       }
+
+       /**
+        * Find $a in the BalanceStack and insert $b after it.
+        * @param BalanceElement $a
+        * @param BalanceElement $b
+        */
+       public function insertAfter( BalanceElement $a, BalanceElement $b ) {
+               $idx = $this->indexOf( $a );
+               Assert::parameter( $idx !== false, '$a', 'must be in stack' );
+               if ( $idx === count( $this->elements ) - 1 ) {
+                       array_push( $this->elements, $b );
+                       $this->currentNode = $b;
+               } else {
+                       array_splice( $this->elements, $idx + 1, 0, [ $b ] );
+               }
+       }
+
+       # Fostering and adoption.
+
+       /**
+        * Foster parent the given $elt in the stack of open elements.
+        * @param BalanceElement|string $elt
+        * @see https://html.spec.whatwg.org/multipage/syntax.html#foster-parent
+        */
+       private function fosterParent( $elt ) {
+               $lastTable = $this->indexOf( 'table' );
+               $lastTemplate = $this->indexOf( 'template' );
+               $parent = null;
+               $before = null;
+
+               if ( $lastTemplate >= 0 && ( $lastTable < 0 || $lastTemplate > $lastTable ) ) {
+                       $parent = $this->elements[$lastTemplate];
+               } elseif ( $lastTable >= 0 ) {
+                       $parent = $this->elements[$lastTable]->parent;
+                       # Assume all tables have parents, since we're not running scripts!
+                       Assert::invariant(
+                               $parent !== null, "All tables should have parents"
+                       );
+                       $before = $this->elements[$lastTable];
+               } else {
+                       $parent = $this->elements[0]; // the `html` element.
+               }
+
+               if ( $this->tidyCompat ) {
+                       if ( is_string( $elt ) ) {
+                               // We're fostering text: do we need a p-wrapper?
+                               if ( $parent->isA( BalanceSets::$tidyPWrapSet ) ) {
+                                       $this->insertHTMLElement( 'mw:p-wrap', [] );
+                                       $this->insertText( $elt );
+                                       return $elt;
+                               }
+                       } else {
+                               // We're fostering an element; do we need to merge p-wrappers?
+                               if ( $elt->isHtmlNamed( 'mw:p-wrap' ) ) {
+                                       $idx = $before ?
+                                               array_search( $before, $parent->children, true ) :
+                                               count( $parent->children );
+                                       $after = $idx > 0 ? $parent->children[$idx - 1] : '';
+                                       if (
+                                               $after instanceof BalanceElement &&
+                                               $after->isHtmlNamed( 'mw:p-wrap' )
+                                       ) {
+                                               return $after; // Re-use existing p-wrapper.
+                                       }
+                               }
+                       }
+               }
+
+               if ( $before ) {
+                       $parent->insertBefore( $before, $elt );
+               } else {
+                       $parent->appendChild( $elt );
+               }
+               return $elt;
+       }
+
+       /**
+        * Run the "adoption agency algoritm" (AAA) for the given subject
+        * tag name.
+        * @param string $tag The subject tag name.
+        * @param BalanceActiveFormattingElements $afe The current
+        *   active formatting elements list.
+        * @return true if the adoption agency algorithm "did something", false
+        *   if more processing is required by the caller.
+        * @see https://html.spec.whatwg.org/multipage/syntax.html#adoption-agency-algorithm
+        */
+       public function adoptionAgency( $tag, $afe ) {
+               // If the current node is an HTML element whose tag name is subject,
+               // and the current node is not in the list of active formatting
+               // elements, then pop the current node off the stack of open
+               // elements and abort these steps.
+               if (
+                       $this->currentNode->isHtmlNamed( $tag ) &&
+                       !$afe->isInList( $this->currentNode )
+               ) {
+                       $this->pop();
+                       return true; // no more handling required
+               }
+
+               // Let outer loop counter be zero.
+               $outer = 0;
+
+               // Outer loop: If outer loop counter is greater than or
+               // equal to eight, then abort these steps.
+               while ( $outer < 8 ) {
+                       // Increment outer loop counter by one.
+                       $outer++;
+
+                       // Let the formatting element be the last element in the list
+                       // of active formatting elements that: is between the end of
+                       // the list and the last scope marker in the list, if any, or
+                       // the start of the list otherwise, and has the same tag name
+                       // as the token.
+                       $fmtelt = $afe->findElementByTag( $tag );
+
+                       // If there is no such node, then abort these steps and instead
+                       // act as described in the "any other end tag" entry below.
+                       if ( !$fmtelt ) {
+                               return false; // false means handle by the default case
+                       }
+
+                       // Otherwise, if there is such a node, but that node is not in
+                       // the stack of open elements, then this is a parse error;
+                       // remove the element from the list, and abort these steps.
+                       $index = $this->indexOf( $fmtelt );
+                       if ( $index < 0 ) {
+                               $afe->remove( $fmtelt );
+                               return true;   // true means no more handling required
+                       }
+
+                       // Otherwise, if there is such a node, and that node is also in
+                       // the stack of open elements, but the element is not in scope,
+                       // then this is a parse error; ignore the token, and abort
+                       // these steps.
+                       if ( !$this->inScope( $fmtelt ) ) {
+                               return true;
+                       }
+
+                       // Let the furthest block be the topmost node in the stack of
+                       // open elements that is lower in the stack than the formatting
+                       // element, and is an element in the special category. There
+                       // might not be one.
+                       $furthestblock = null;
+                       $furthestblockindex = -1;
+                       $stacklen = $this->length();
+                       for ( $i = $index+1; $i < $stacklen; $i++ ) {
+                               if ( $this->node( $i )->isA( BalanceSets::$specialSet ) ) {
+                                       $furthestblock = $this->node( $i );
+                                       $furthestblockindex = $i;
+                                       break;
+                               }
+                       }
+
+                       // If there is no furthest block, then the UA must skip the
+                       // subsequent steps and instead just pop all the nodes from the
+                       // bottom of the stack of open elements, from the current node
+                       // up to and including the formatting element, and remove the
+                       // formatting element from the list of active formatting
+                       // elements.
+                       if ( !$furthestblock ) {
+                               $this->popTag( $fmtelt );
+                               $afe->remove( $fmtelt );
+                               return true;
+                       } else {
+                               // Let the common ancestor be the element immediately above
+                               // the formatting element in the stack of open elements.
+                               $ancestor = $this->node( $index-1 );
+
+                               // Let a bookmark note the position of the formatting
+                               // element in the list of active formatting elements
+                               // relative to the elements on either side of it in the
+                               // list.
+                               $BOOKMARK = new BalanceElement( '[bookmark]', '[bookmark]', [] );
+                               $afe->insertAfter( $fmtelt, $BOOKMARK );
+
+                               // Let node and last node be the furthest block.
+                               $node = $furthestblock;
+                               $lastnode = $furthestblock;
+                               $nodeindex = $furthestblockindex;
+                               $isAFE = false;
+
+                               // Let inner loop counter be zero.
+                               $inner = 0;
+
+                               while ( true ) {
+
+                                       // Increment inner loop counter by one.
+                                       $inner++;
+
+                                       // Let node be the element immediately above node in
+                                       // the stack of open elements, or if node is no longer
+                                       // in the stack of open elements (e.g. because it got
+                                       // removed by this algorithm), the element that was
+                                       // immediately above node in the stack of open elements
+                                       // before node was removed.
+                                       $node = $this->node( --$nodeindex );
+
+                                       // If node is the formatting element, then go
+                                       // to the next step in the overall algorithm.
+                                       if ( $node === $fmtelt ) break;
+
+                                       // If the inner loop counter is greater than three and node
+                                       // is in the list of active formatting elements, then remove
+                                       // node from the list of active formatting elements.
+                                       $isAFE = $afe->isInList( $node );
+                                       if ( $inner > 3 && $isAFE ) {
+                                               $afe->remove( $node );
+                                               $isAFE = false;
+                                       }
+
+                                       // If node is not in the list of active formatting
+                                       // elements, then remove node from the stack of open
+                                       // elements and then go back to the step labeled inner
+                                       // loop.
+                                       if ( !$isAFE ) {
+                                               // Don't flatten here, since we're about to relocate
+                                               // parts of this $node.
+                                               $this->removeElement( $node, false );
+                                               continue;
+                                       }
+
+                                       // Create an element for the token for which the
+                                       // element node was created with common ancestor as
+                                       // the intended parent, replace the entry for node
+                                       // in the list of active formatting elements with an
+                                       // entry for the new element, replace the entry for
+                                       // node in the stack of open elements with an entry for
+                                       // the new element, and let node be the new element.
+                                       $newelt = new BalanceElement(
+                                               $node->namespaceURI, $node->localName, $node->attribs );
+                                       $afe->replace( $node, $newelt );
+                                       $this->replaceAt( $nodeindex, $newelt );
+                                       $node = $newelt;
+
+                                       // If last node is the furthest block, then move the
+                                       // aforementioned bookmark to be immediately after the
+                                       // new node in the list of active formatting elements.
+                                       if ( $lastnode === $furthestblock ) {
+                                               $afe->remove( $BOOKMARK );
+                                               $afe->insertAfter( $newelt, $BOOKMARK );
+                                       }
+
+                                       // Insert last node into node, first removing it from
+                                       // its previous parent node if any.
+                                       $node->appendChild( $lastnode );
+
+                                       // Let last node be node.
+                                       $lastnode = $node;
+                               }
+
+                               // If the common ancestor node is a table, tbody, tfoot,
+                               // thead, or tr element, then, foster parent whatever last
+                               // node ended up being in the previous step, first removing
+                               // it from its previous parent node if any.
+                               if (
+                                       $this->fosterParentMode &&
+                                       $ancestor->isA( BalanceSets::$tableSectionRowSet )
+                               ) {
+                                       $this->fosterParent( $lastnode );
+                               } else {
+                                       // Otherwise, append whatever last node ended up being in
+                                       // the previous step to the common ancestor node, first
+                                       // removing it from its previous parent node if any.
+                                       $ancestor->appendChild( $lastnode );
+                               }
+
+                               // Create an element for the token for which the
+                               // formatting element was created, with furthest block
+                               // as the intended parent.
+                               $newelt2 = new BalanceElement(
+                                       $fmtelt->namespaceURI, $fmtelt->localName, $fmtelt->attribs );
+
+                               // Take all of the child nodes of the furthest block and
+                               // append them to the element created in the last step.
+                               $newelt2->adoptChildren( $furthestblock );
+
+                               // Append that new element to the furthest block.
+                               $furthestblock->appendChild( $newelt2 );
+
+                               // Remove the formatting element from the list of active
+                               // formatting elements, and insert the new element into the
+                               // list of active formatting elements at the position of
+                               // the aforementioned bookmark.
+                               $afe->remove( $fmtelt );
+                               $afe->replace( $BOOKMARK, $newelt2 );
+
+                               // Remove the formatting element from the stack of open
+                               // elements, and insert the new element into the stack of
+                               // open elements immediately below the position of the
+                               // furthest block in that stack.
+                               $this->removeElement( $fmtelt );
+                               $this->insertAfter( $furthestblock, $newelt2 );
+                       }
+               }
+
+               return true;
+       }
+
+       /**
+        * Return the contents of the open elements stack as a string for
+        * debugging.
+        * @return string
+        */
+       public function __toString() {
+               $r = [];
+               foreach ( $this->elements as $elt ) {
+                       array_push( $r, $elt->localName );
+               }
+               return implode( $r, ' ' );
+       }
+}
+
+/**
+ * A pseudo-element used as a marker in the list of active formatting elements
+ *
+ * @ingroup Parser
+ * @since 1.27
+ */
+class BalanceMarker {
+       public $nextAFE;
+       public $prevAFE;
+}
+
+/**
+ * The list of active formatting elements, which is used to handle
+ * mis-nested formatting element tags in the HTML5 tree builder
+ * specification.
+ *
+ * @ingroup Parser
+ * @since 1.27
+ * @see https://html.spec.whatwg.org/multipage/syntax.html#list-of-active-formatting-elements
+ */
+class BalanceActiveFormattingElements {
+       /** The last (most recent) element in the list */
+       private $tail;
+
+       /** The first (least recent) element in the list */
+       private $head;
+
+       /**
+        * An array of arrays representing the population of elements in each bucket
+        * according to the Noah's Ark clause. The outer array is stack-like, with each
+        * integer-indexed element representing a segment of the list, bounded by
+        * markers. The first element represents the segment of the list before the
+        * first marker.
+        *
+        * The inner arrays are indexed by "Noah key", which is a string which uniquely
+        * identifies each bucket according to the rules in the spec. The value in
+        * the inner array is the first (least recently inserted) element in the bucket,
+        * and subsequent members of the bucket can be found by iterating through the
+        * singly-linked list via $node->nextNoah.
+        *
+        * This is optimised for the most common case of inserting into a bucket
+        * with zero members, and deleting a bucket containing one member. In the
+        * worst case, iteration through the list is still O(1) in the document
+        * size, since each bucket can have at most 3 members.
+        */
+       private $noahTableStack = [ [] ];
+
+       public function __destruct() {
+               for ( $node = $this->head; $node; $node = $next ) {
+                       $next = $node->nextAFE;
+                       $node->prevAFE = $node->nextAFE = $node->nextNoah = null;
+               }
+               $this->head = $this->tail = $this->noahTableStack = null;
+       }
+
+       public function insertMarker() {
+               $elt = new BalanceMarker;
+               if ( $this->tail ) {
+                       $this->tail->nextAFE = $elt;
+                       $elt->prevAFE = $this->tail;
+               } else {
+                       $this->head = $elt;
+               }
+               $this->tail = $elt;
+               $this->noahTableStack[] = [];
+       }
+
+       /**
+        * Follow the steps required when the spec requires us to "push onto the
+        * list of active formatting elements".
+        * @param BalanceElement $elt
+        */
+       public function push( BalanceElement $elt ) {
+               // Must not be in the list already
+               if ( $elt->prevAFE !== null || $this->head === $elt ) {
+                       throw new ParameterAssertionException( '$elt',
+                               'Cannot insert a node into the AFE list twice' );
+               }
+
+               // "Noah's Ark clause" -- if there are already three copies of
+               // this element before we encounter a marker, then drop the last
+               // one.
+               $noahKey = $elt->getNoahKey();
+               $table =& $this->noahTableStack[ count( $this->noahTableStack ) - 1 ];
+               if ( !isset( $table[$noahKey] ) ) {
+                       $table[$noahKey] = $elt;
+               } else {
+                       $count = 1;
+                       $head = $tail = $table[$noahKey];
+                       while ( $tail->nextNoah ) {
+                               $tail = $tail->nextNoah;
+                               $count++;
+                       }
+                       if ( $count >= 3 ) {
+                               $this->remove( $head );
+                       }
+                       $tail->nextNoah = $elt;
+               }
+               // Add to the main AFE list
+               if ( $this->tail ) {
+                       $this->tail->nextAFE = $elt;
+                       $elt->prevAFE = $this->tail;
+               } else {
+                       $this->head = $elt;
+               }
+               $this->tail = $elt;
+       }
+
+       /**
+        * Follow the steps required when the spec asks us to "clear the list of
+        * active formatting elements up to the last marker".
+        */
+       public function clearToMarker() {
+               // Iterate back through the list starting from the tail
+               $tail = $this->tail;
+               while ( $tail && !( $tail instanceof BalanceMarker ) ) {
+                       // Unlink the element
+                       $prev = $tail->prevAFE;
+                       $tail->prevAFE = null;
+                       if ( $prev ) {
+                               $prev->nextAFE = null;
+                       }
+                       $tail->nextNoah = null;
+                       $tail = $prev;
+               }
+               // If we finished on a marker, unlink it and pop it off the Noah table stack
+               if ( $tail ) {
+                       $prev = $tail->prevAFE;
+                       if ( $prev ) {
+                               $prev->nextAFE = null;
+                       }
+                       $tail = $prev;
+                       array_pop( $this->noahTableStack );
+               } else {
+                       // No marker: wipe the top-level Noah table (which is the only one)
+                       $this->noahTableStack[0] = [];
+               }
+               // If we removed all the elements, clear the head pointer
+               if ( !$tail ) {
+                       $this->head = null;
+               }
+               $this->tail = $tail;
+       }
+
+       /**
+        * Find and return the last element with the specified tag between the
+        * end of the list and the last marker on the list.
+        * Used when parsing &lt;a&gt; "in body mode".
+        */
+       public function findElementByTag( $tag ) {
+               $elt = $this->tail;
+               while ( $elt && !( $elt instanceof BalanceMarker ) ) {
+                       if ( $elt->localName === $tag ) {
+                               return $elt;
+                       }
+                       $elt = $elt->prevAFE;
+               }
+               return null;
+       }
+
+       /**
+        * Determine whether an element is in the list of formatting elements.
+        * @return boolean
+        */
+       public function isInList( BalanceElement $elt ) {
+               return $this->head === $elt || $elt->prevAFE;
+       }
+
+       /**
+        * Find the element $elt in the list and remove it.
+        * Used when parsing &lt;a&gt; in body mode.
+        */
+       public function remove( BalanceElement $elt ) {
+               if ( $this->head !== $elt && !$elt->prevAFE ) {
+                       throw new ParameterAssertionException( '$elt',
+                               "Attempted to remove an element which is not in the AFE list" );
+               }
+               // Update head and tail pointers
+               if ( $this->head === $elt ) {
+                       $this->head = $elt->nextAFE;
+               }
+               if ( $this->tail === $elt ) {
+                       $this->tail = $elt->prevAFE;
+               }
+               // Update previous element
+               if ( $elt->prevAFE ) {
+                       $elt->prevAFE->nextAFE = $elt->nextAFE;
+               }
+               // Update next element
+               if ( $elt->nextAFE ) {
+                       $elt->nextAFE->prevAFE = $elt->prevAFE;
+               }
+               // Clear pointers so that isInList() etc. will work
+               $elt->prevAFE = $elt->nextAFE = null;
+               // Update Noah list
+               $this->removeFromNoahList( $elt );
+       }
+
+       private function addToNoahList( BalanceElement $elt ) {
+               $noahKey = $elt->getNoahKey();
+               $table =& $this->noahTableStack[ count( $this->noahTableStack ) - 1 ];
+               if ( !isset( $table[$noahKey] ) ) {
+                       $table[$noahKey] = $elt;
+               } else {
+                       $tail = $table[$noahKey];
+                       while ( $tail->nextNoah ) {
+                               $tail = $tail->nextNoah;
+                       }
+                       $tail->nextNoah = $elt;
+               }
+       }
+
+       private function removeFromNoahList( BalanceElement $elt ) {
+               $table =& $this->noahTableStack[ count( $this->noahTableStack ) - 1 ];
+               $key = $elt->getNoahKey();
+               $noahElt = $table[$key];
+               if ( $noahElt === $elt ) {
+                       if ( $noahElt->nextNoah ) {
+                               $table[$key] = $noahElt->nextNoah;
+                               $noahElt->nextNoah = null;
+                       } else {
+                               unset( $table[$key] );
+                       }
+               } else {
+                       do {
+                               $prevNoahElt = $noahElt;
+                               $noahElt = $prevNoahElt->nextNoah;
+                               if ( $noahElt === $elt ) {
+                                       // Found it, unlink
+                                       $prevNoahElt->nextNoah = $elt->nextNoah;
+                                       $elt->nextNoah = null;
+                                       break;
+                               }
+                       } while ( $noahElt );
+               }
+       }
+
+       /**
+        * Find element $a in the list and replace it with element $b
+        */
+       public function replace( BalanceElement $a, BalanceElement $b ) {
+               if ( $this->head !== $a && !$a->prevAFE ) {
+                       throw new ParameterAssertionException( '$a',
+                               "Attempted to replace an element which is not in the AFE list" );
+               }
+               // Update head and tail pointers
+               if ( $this->head === $a ) {
+                       $this->head = $b;
+               }
+               if ( $this->tail === $a ) {
+                       $this->tail = $b;
+               }
+               // Update previous element
+               if ( $a->prevAFE ) {
+                       $a->prevAFE->nextAFE = $b;
+               }
+               // Update next element
+               if ( $a->nextAFE ) {
+                       $a->nextAFE->prevAFE = $b;
+               }
+               $b->prevAFE = $a->prevAFE;
+               $b->nextAFE = $a->nextAFE;
+               $a->nextAFE = $a->prevAFE = null;
+               // Update Noah list
+               $this->removeFromNoahList( $a );
+               $this->addToNoahList( $b );
+       }
+
+       /**
+        * Find $a in the list and insert $b after it.
+        */
+       public function insertAfter( BalanceElement $a, BalanceElement $b ) {
+               if ( $this->head !== $a && !$a->prevAFE ) {
+                       throw new ParameterAssertionException( '$a',
+                               "Attempted to insert after an element which is not in the AFE list" );
+               }
+               if ( $this->tail === $a ) {
+                       $this->tail = $b;
+               }
+               if ( $a->nextAFE ) {
+                       $a->nextAFE->prevAFE = $b;
+               }
+               $b->nextAFE = $a->nextAFE;
+               $b->prevAFE = $a;
+               $a->nextAFE = $b;
+               $this->addToNoahList( $b );
+       }
+
+       // @codingStandardsIgnoreStart Generic.Files.LineLength.TooLong
+       /**
+        * Reconstruct the active formatting elements.
+        * @param BalanceStack $stack The open elements stack
+        * @see https://html.spec.whatwg.org/multipage/syntax.html#reconstruct-the-active-formatting-elements
+        */
+       // @codingStandardsIgnoreEnd
+       public function reconstruct( $stack ) {
+               $entry = $this->tail;
+               // If there are no entries in the list of active formatting elements,
+               // then there is nothing to reconstruct
+               if ( !$entry ) {
+                       return;
+               }
+               // If the last is a marker, do nothing.
+               if ( $entry instanceof BalanceMarker ) {
+                       return;
+               }
+               // Or if it is an open element, do nothing.
+               if ( $stack->indexOf( $entry ) >= 0 ) {
+                       return;
+               }
+
+               // Loop backward through the list until we find a marker or an
+               // open element
+               $foundit = false;
+               while ( $entry->prevAFE ) {
+                       $entry = $entry->prevAFE;
+                       if ( $entry instanceof BalanceMarker || $stack->indexOf( $entry ) >= 0 ) {
+                               $foundit = true;
+                               break;
+                       }
+               }
+
+               // Now loop forward, starting from the element after the current one (or
+               // the first element if we didn't find a marker or open element),
+               // recreating formatting elements and pushing them back onto the list
+               // of open elements.
+               if ( $foundit ) {
+                       $entry = $entry->nextAFE;
+               }
+               do {
+                       $newElement = $stack->insertHTMLElement(
+                               $entry->localName,
+                               $entry->attribs );
+                       $this->replace( $entry, $newElement );
+                       $entry = $newElement->nextAFE;
+               } while ( $entry );
+       }
+
+       /**
+        * Get a string representation of the AFE list, for debugging
+        */
+       public function __toString() {
+               $prev = null;
+               $s = '';
+               for ( $node = $this->head; $node; $prev = $node, $node = $node->nextAFE ) {
+                       if ( $node instanceof BalanceMarker ) {
+                               $s .= "MARKER\n";
+                               continue;
+                       }
+                       $s .= $node->localName . '#' . substr( md5( spl_object_hash( $node ) ), 0, 8 );
+                       if ( $node->nextNoah ) {
+                               $s .= " (noah sibling: {$node->nextNoah->localName}#" .
+                                       substr( md5( spl_object_hash( $node->nextNoah ) ), 0, 8 ) .
+                                       ')';
+                       }
+                       if ( $node->nextAFE && $node->nextAFE->prevAFE !== $node ) {
+                               $s .= " (reverse link is wrong!)";
+                       }
+                       $s .= "\n";
+               }
+               if ( $prev !== $this->tail ) {
+                       $s .= "(tail pointer is wrong!)\n";
+               }
+               return $s;
+       }
+}
+
+/**
+ * An implementation of the tree building portion of the HTML5 parsing
+ * spec.
+ *
+ * This is used to balance and tidy output so that the result can
+ * always be cleanly serialized/deserialized by an HTML5 parser.  It
+ * does *not* guarantee "conforming" output -- the HTML5 spec contains
+ * a number of constraints which are not enforced by the HTML5 parsing
+ * process.  But the result will be free of gross errors: misnested or
+ * unclosed tags, for example, and will be unchanged by spec-complient
+ * parsing followed by serialization.
+ *
+ * The tree building stage is structured as a state machine.
+ * When comparing the implementation to
+ * https://www.w3.org/TR/html5/syntax.html#tree-construction
+ * note that each state is implemented as a function with a
+ * name ending in `Mode` (because the HTML spec refers to them
+ * as insertion modes).  The current insertion mode is held by
+ * the $parseMode property.
+ *
+ * The following simplifications have been made:
+ * - We handle body content only (ie, we start `in body`.)
+ * - The document is never in "quirks mode".
+ * - All occurrences of < and > have been entity escaped, so we
+ *   can parse tags by simply splitting on those two characters.
+ *   (This also simplifies the handling of < inside <textarea>.)
+ *   The character < must not appear inside comments.
+ *   Similarly, all attributes have been "cleaned" and are double-quoted
+ *   and escaped.
+ * - All null characters are assumed to have been removed.
+ * - The following elements are disallowed: <html>, <head>, <body>, <frameset>,
+ *   <frame>, <plaintext>, <isindex>, <xmp>, <iframe>,
+ *   <noembed>, <noscript>, <script>, <title>.  As a result,
+ *   further simplifications can be made:
+ *   - `frameset-ok` is not tracked.
+ *   - `head element pointer` is not tracked (but presumed non-null)
+ *   - Tokenizer has only a single mode. (<textarea> wants RCDATA and
+ *     <style>/<noframes> want RAWTEXT modes which we only loosely emulate.)
+ *
+ *   We generally mark places where we omit cases from the spec due to
+ *   disallowed elements with a comment: `# OMITTED: <element-name>`.
+ *
+ *   The HTML spec keeps a flag during the parsing process to track
+ *   whether or not a "parse error" has been encountered.  We don't
+ *   bother to track that flag, we just implement the error-handling
+ *   process as specified.
+ *
+ * @ingroup Parser
+ * @since 1.27
+ * @see https://html.spec.whatwg.org/multipage/syntax.html#tree-construction
+ */
+class Balancer {
+       private $parseMode;
+       private $bitsIterator;
+       private $allowedHtmlElements;
+       private $afe;
+       private $stack;
+       private $strict;
+       private $tidyCompat;
+       private $allowComments;
+
+       private $textIntegrationMode;
+       private $pendingTableText;
+       private $originalInsertionMode;
+       private $fragmentContext;
+       private $formElementPointer;
+       private $ignoreLinefeed;
+       private $inRCDATA;
+       private $inRAWTEXT;
+
+       /**
+        * Valid HTML5 comments.
+        * Regex borrowed from Tim Starling's "remex-html" project.
+        */
+       const VALID_COMMENT_REGEX = "~ !--
+               (                             # 1. Comment match detector
+                       > | -> | # Invalid short close
+                       (                         # 2. Comment contents
+                               (?:
+                                       (?! --> )
+                                       (?! --!> )
+                                       (?! --! \z )
+                                       (?! -- \z )
+                                       (?! - \z )
+                                       .
+                               )*+
+                       )
+                       (                         # 3. Comment close
+                               --> |   # Normal close
+                               --!> |  # Comment end bang
+                               (                     # 4. Indicate matches requiring EOF
+                                       --! |   # EOF in comment end bang state
+                                       -- |    # EOF in comment end state
+                                       -  |    # EOF in comment end dash state
+                                               # EOF in comment state
+                               )
+                       )
+               )
+               ([^<]*) \z                    # 5. Non-tag text after the comment
+               ~xs";
+
+       /**
+        * Create a new Balancer.
+        * @param array $config Balancer configuration.  Includes:
+        *     'strict' : boolean, defaults to false.
+        *         When true, enforces syntactic constraints on input:
+        *         all non-tag '<' must be escaped, all attributes must be
+        *         separated by a single space and double-quoted.  This is
+        *         consistent with the output of the Sanitizer.
+        *     'allowedHtmlElements' : array, defaults to null.
+        *         When present, the keys of this associative array give
+        *         the acceptable HTML tag names.  When not present, no
+        *         tag sanitization is done.
+        *     'tidyCompat' : boolean, defaults to false.
+        *         When true, the serialization algorithm is tweaked to
+        *         provide historical compatibility with the old "tidy"
+        *         program: <p>-wrapping is done to the children of
+        *         <body> and <blockquote> elements, and empty elements
+        *         are removed.
+        *     'allowComments': boolean, defaults to true.
+        *         When true, allows HTML comments in the input.
+        *         The Sanitizer generally strips all comments, so if you
+        *         are running on sanitized output you can set this to
+        *         false to get a bit more performance.
+        */
+       public function __construct( array $config = [] ) {
+               $config = $config + [
+                       'strict' => false,
+                       'allowedHtmlElements' => null,
+                       'tidyCompat' => false,
+                       'allowComments' => true,
+               ];
+               $this->allowedHtmlElements = $config['allowedHtmlElements'];
+               $this->strict = $config['strict'];
+               $this->tidyCompat = $config['tidyCompat'];
+               $this->allowComments = $config['allowComments'];
+               if ( $this->allowedHtmlElements !== null ) {
+                       # Sanity check!
+                       $bad = array_uintersect_assoc(
+                               $this->allowedHtmlElements,
+                               BalanceSets::$unsupportedSet[BalanceSets::HTML_NAMESPACE],
+                               function( $a, $b ) {
+                                       // Ignore the values (just intersect the keys) by saying
+                                       // all values are equal to each other.
+                                       return 0;
+                               }
+                       );
+                       if ( count( $bad ) > 0 ) {
+                               $badstr = implode( array_keys( $bad ), ',' );
+                               throw new ParameterAssertionException(
+                                       '$config',
+                                       'Balance attempted with sanitization including ' .
+                                       "unsupported elements: {$badstr}"
+                               );
+                       }
+               }
+       }
+
+       /**
+        * Return a balanced HTML string for the HTML fragment given by $text,
+        * subject to the caveats listed in the class description.  The result
+        * will typically be idempotent -- that is, rebalancing the output
+        * would result in no change.
+        *
+        * @param string $text The markup to be balanced
+        * @param callable $processingCallback Callback to do any variable or
+        *   parameter replacements in HTML attributes values
+        * @param array|bool $processingArgs Arguments for the processing callback
+        * @return string The balanced markup
+        */
+       public function balance( $text, $processingCallback = null, $processingArgs = [] ) {
+               $this->parseMode = 'inBodyMode';
+               $this->bitsIterator = new ExplodeIterator( '<', $text );
+               $this->afe = new BalanceActiveFormattingElements();
+               $this->stack = new BalanceStack();
+               $this->stack->tidyCompat = $this->tidyCompat;
+               $this->processingCallback = $processingCallback;
+               $this->processingArgs = $processingArgs;
+
+               $this->textIntegrationMode =
+                       $this->ignoreLinefeed =
+                       $this->inRCDATA =
+                       $this->inRAWTEXT = false;
+
+               # The stack is constructed with an <html> element already on it.
+               # Set this up as a fragment parsed with <body> as the context.
+               $this->fragmentContext =
+                       new BalanceElement( BalanceSets::HTML_NAMESPACE, 'body', [] );
+               $this->resetInsertionMode();
+               $this->formElementPointer = null;
+               for ( $e = $this->fragmentContext; $e != null; $e = $e->parent ) {
+                       if ( $e->isHtmlNamed( 'form' ) ) {
+                               $this->formElementPointer = $e;
+                               break;
+                       }
+               }
+
+               // First element is text not tag
+               $x = $this->bitsIterator->current();
+               $this->bitsIterator->next();
+               $this->insertToken( 'text', str_replace( '>', '&gt;', $x ) );
+               // Now process each tag.
+               while ( $this->bitsIterator->valid() ) {
+                       $this->advance();
+               }
+               $this->insertToken( 'eof', null );
+               $result = $this->stack->getOutput();
+               // Free memory before returning.
+               $this->bitsIterator = null;
+               $this->afe = null;
+               $this->stack = null;
+               $this->fragmentContext = null;
+               $this->formElementPointer = null;
+               return $result;
+       }
+
+       /**
+        * Pass a token to the tree builder.  The $token will be one of the
+        * strings "tag", "endtag", or "text".
+        */
+       private function insertToken( $token, $value, $attribs = null, $selfclose = false ) {
+               // validate tags against $unsupportedSet
+               if ( $token === 'tag' || $token === 'endtag' ) {
+                       if ( isset( BalanceSets::$unsupportedSet[BalanceSets::HTML_NAMESPACE][$value] ) ) {
+                               # As described in "simplifications" above, these tags are
+                               # not supported in the balancer.
+                               Assert::invariant(
+                                       !$this->strict,
+                                       "Unsupported $token <$value> found."
+                               );
+                               return false;
+                       }
+               } elseif ( $token === 'text' && $value === '' ) {
+                       # Don't actually inject the empty string as a text token.
+                       return true;
+               }
+               // Support pre/listing/textarea by suppressing initial linefeed
+               if ( $this->ignoreLinefeed ) {
+                       $this->ignoreLinefeed = false;
+                       if ( $token === 'text' ) {
+                               if ( $value[0] === "\n" ) {
+                                       if ( $value === "\n" ) {
+                                               # Nothing would be left, don't inject the empty string.
+                                               return true;
+                                       }
+                                       $value = substr( $value, 1 );
+                               }
+                       }
+               }
+               // Some hoops we have to jump through
+               $adjusted = $this->stack->adjustedCurrentNode( $this->fragmentContext );
+
+               $isForeign = true;
+               if (
+                       $this->stack->length() === 0 ||
+                       $adjusted->isHtml() ||
+                       $token === 'eof'
+               ) {
+                       $isForeign = false;
+               } elseif ( $adjusted->isMathmlTextIntegrationPoint() ) {
+                       if ( $token === 'text' ) {
+                               $isForeign = false;
+                       } elseif (
+                               $token === 'tag' &&
+                               $value !== 'mglyph' && $value !== 'malignmark'
+                       ) {
+                               $isForeign = false;
+                       }
+               } elseif (
+                       $adjusted->namespaceURI === BalanceSets::MATHML_NAMESPACE &&
+                       $adjusted->localName === 'annotation-xml' &&
+                       $token === 'tag' && $value === 'svg'
+               ) {
+                       $isForeign = false;
+               } elseif (
+                       $adjusted->isHtmlIntegrationPoint() &&
+                       ( $token === 'tag' || $token === 'text' )
+               ) {
+                       $isForeign = false;
+               }
+               if ( $isForeign ) {
+                       return $this->insertForeignToken( $token, $value, $attribs, $selfclose );
+               } else {
+                       $func = $this->parseMode;
+                       return $this->$func( $token, $value, $attribs, $selfclose );
+               }
+       }
+
+       private function insertForeignToken( $token, $value, $attribs = null, $selfclose = false ) {
+               if ( $token === 'text' ) {
+                       $this->stack->insertText( $value );
+                       return true;
+               } elseif ( $token === 'tag' ) {
+                       switch ( $value ) {
+                       case 'font':
+                               if ( isset( $attribs['color'] )
+                                       || isset( $attribs['face'] )
+                                       || isset( $attribs['size'] )
+                               ) {
+                                       break;
+                               }
+                               /* otherwise, fall through */
+                       case 'b':
+                       case 'big':
+                       case 'blockquote':
+                       case 'body':
+                       case 'br':
+                       case 'center':
+                       case 'code':
+                       case 'dd':
+                       case 'div':
+                       case 'dl':
+                       case 'dt':
+                       case 'em':
+                       case 'embed':
+                       case 'h1':
+                       case 'h2':
+                       case 'h3':
+                       case 'h4':
+                       case 'h5':
+                       case 'h6':
+                       case 'head':
+                       case 'hr':
+                       case 'i':
+                       case 'img':
+                       case 'li':
+                       case 'listing':
+                       case 'menu':
+                       case 'meta':
+                       case 'nobr':
+                       case 'ol':
+                       case 'p':
+                       case 'pre':
+                       case 'ruby':
+                       case 's':
+                       case 'small':
+                       case 'span':
+                       case 'strong':
+                       case 'strike':
+                       case 'sub':
+                       case 'sup':
+                       case 'table':
+                       case 'tt':
+                       case 'u':
+                       case 'ul':
+                       case 'var':
+                               if ( $this->fragmentContext ) {
+                                       break;
+                               }
+                               while ( true ) {
+                                       $this->stack->pop();
+                                       $node = $this->stack->currentNode;
+                                       if (
+                                               $node->isMathmlTextIntegrationPoint() ||
+                                               $node->isHtmlIntegrationPoint() ||
+                                               $node->isHtml()
+                                       ) {
+                                               break;
+                                       }
+                               }
+                               return $this->insertToken( $token, $value, $attribs, $selfclose );
+                       }
+                       // "Any other start tag"
+                       $adjusted = ( $this->fragmentContext && $this->stack->length()===1 ) ?
+                               $this->fragmentContext : $this->stack->currentNode;
+                       $this->stack->insertForeignElement(
+                               $adjusted->namespaceURI, $value, $attribs
+                       );
+                       if ( $selfclose ) {
+                               $this->stack->pop();
+                       }
+                       return true;
+               } elseif ( $token === 'endtag' ) {
+                       $first = true;
+                       foreach ( $this->stack as $i => $node ) {
+                               if ( $node->isHtml() && !$first ) {
+                                       // process the end tag as HTML
+                                       $func = $this->parseMode;
+                                       return $this->$func( $token, $value, $attribs, $selfclose );
+                               } elseif ( $i === 0 ) {
+                                       return true;
+                               } elseif ( $node->localName === $value ) {
+                                       $this->stack->popTag( $node );
+                                       return true;
+                               }
+                               $first = false;
+                       }
+               }
+       }
+
+       /**
+        * Grab the next "token" from $bitsIterator.  This is either a open/close
+        * tag or text or a comment, depending on whether the Sanitizer approves.
+        */
+       private function advance() {
+               $x = $this->bitsIterator->current();
+               $this->bitsIterator->next();
+               $regs = [];
+               # Handle comments.  These won't be generated by mediawiki (they
+               # are stripped in the Sanitizer) but may be generated by extensions.
+               if (
+                       $this->allowComments &&
+                       !( $this->inRCDATA || $this->inRAWTEXT ) &&
+                       preg_match( Balancer::VALID_COMMENT_REGEX, $x, $regs, PREG_OFFSET_CAPTURE ) &&
+                       /* verify EOF condition where necessary */
+                       ( $regs[4][1] < 0 || !$this->bitsIterator->valid() )
+               ) {
+                       $contents = $regs[2][0];
+                       $rest = $regs[5][0];
+                       $this->insertToken( 'comment', $contents );
+                       $this->insertToken( 'text', str_replace( '>', '&gt;', $rest ) );
+                       return;
+               }
+               # $slash: Does the current element start with a '/'?
+               # $t: Current element name
+               # $attribStr: String between element name and >
+               # $brace: Ending '>' or '/>'
+               # $rest: Everything until the next element from the $bitsIterator
+               if ( preg_match( Sanitizer::ELEMENT_BITS_REGEX, $x, $regs ) ) {
+                       list( /* $qbar */, $slash, $t, $attribStr, $brace, $rest ) = $regs;
+                       $t = strtolower( $t );
+                       if ( $this->strict ) {
+                               /* Verify that attributes are all properly double-quoted */
+                               Assert::invariant(
+                                       preg_match(
+                                               '/^( [:_A-Z0-9][-.:_A-Z0-9]*="[^"]*")*[ ]*$/i', $attribStr
+                                       ),
+                                       "Bad attribute string found"
+                               );
+                       }
+               } else {
+                       Assert::invariant(
+                               !$this->strict, "< found which does not start a valid tag"
+                       );
+                       $slash = $t = $attribStr = $brace = $rest = null;
+               }
+               $goodtag = $t;
+               if ( $this->inRCDATA ) {
+                       if ( $slash && $t === $this->inRCDATA ) {
+                               $this->inRCDATA = false;
+                       } else {
+                               // No tags allowed; this emulates the "rcdata" tokenizer mode.
+                               $goodtag = false;
+                       }
+               }
+               if ( $this->inRAWTEXT ) {
+                       if ( $slash && $t === $this->inRAWTEXT ) {
+                               $this->inRAWTEXT = false;
+                       } else {
+                               // No tags allowed, no entity-escaping done.
+                               $goodtag = false;
+                       }
+               }
+               $sanitize = $this->allowedHtmlElements !== null;
+               if ( $sanitize ) {
+                       $goodtag = $t && isset( $this->allowedHtmlElements[$t] );
+               }
+               if ( $goodtag ) {
+                       if ( is_callable( $this->processingCallback ) ) {
+                               call_user_func_array( $this->processingCallback, [ &$attribStr, $this->processingArgs ] );
+                       }
+                       if ( $sanitize ) {
+                               $goodtag = Sanitizer::validateTag( $attribStr, $t );
+                       }
+               }
+               if ( $goodtag ) {
+                       if ( $sanitize ) {
+                               $attribs = Sanitizer::decodeTagAttributes( $attribStr );
+                               $attribs = Sanitizer::validateTagAttributes( $attribs, $t );
+                       } else {
+                               $attribs = Sanitizer::decodeTagAttributes( $attribStr );
+                       }
+                       $goodtag = $this->insertToken(
+                               $slash ? 'endtag' : 'tag', $t, $attribs, $brace === '/>'
+                       );
+               }
+               if ( $goodtag ) {
+                       $rest = str_replace( '>', '&gt;', $rest );
+                       $this->insertToken( 'text', str_replace( '>', '&gt;', $rest ) );
+               } elseif ( $this->inRAWTEXT ) {
+                       $this->insertToken( 'text', "<$x" );
+               } else {
+                       # bad tag; serialize entire thing as text.
+                       $this->insertToken( 'text', '&lt;' . str_replace( '>', '&gt;', $x ) );
+               }
+       }
+
+       private function switchMode( $mode ) {
+               Assert::parameter(
+                       substr( $mode, -4 )==='Mode', '$mode', 'should end in Mode'
+               );
+               $oldMode = $this->parseMode;
+               $this->parseMode = $mode;
+               return $oldMode;
+       }
+
+       private function switchModeAndReprocess( $mode, $token, $value, $attribs, $selfclose ) {
+               $this->switchMode( $mode );
+               return $this->insertToken( $token, $value, $attribs, $selfclose );
+       }
+
+       private function resetInsertionMode() {
+               $last = false;
+               foreach ( $this->stack as $i => $node ) {
+                       if ( $i === 0 ) {
+                               $last = true;
+                               if ( $this->fragmentContext ) {
+                                       $node = $this->fragmentContext;
+                               }
+                       }
+                       if ( $node->isHtml() ) {
+                               switch ( $node->localName ) {
+                               case 'select':
+                                       $stacklen = $this->stack->length();
+                                       for ( $j = $i + 1; $j < $stacklen-1; $j++ ) {
+                                               $ancestor = $this->stack->node( $stacklen-$j-1 );
+                                               if ( $ancestor->isHtmlNamed( 'template' ) ) {
+                                                       break;
+                                               }
+                                               if ( $ancestor->isHtmlNamed( 'table' ) ) {
+                                                       $this->switchMode( 'inSelectInTableMode' );
+                                                       return;
+                                               }
+                                       }
+                                       $this->switchMode( 'inSelectMode' );
+                                       return;
+                               case 'tr':
+                                       $this->switchMode( 'inRowMode' );
+                                       return;
+                               case 'tbody':
+                               case 'tfoot':
+                               case 'thead':
+                                       $this->switchMode( 'inTableBodyMode' );
+                                       return;
+                               case 'caption':
+                                       $this->switchMode( 'inCaptionMode' );
+                                       return;
+                               case 'colgroup':
+                                       $this->switchMode( 'inColumnGroupMode' );
+                                       return;
+                               case 'table':
+                                       $this->switchMode( 'inTableMode' );
+                                       return;
+                               case 'template':
+                                       $this->switchMode(
+                                               array_slice( $this->templateInsertionModes, -1 )[0]
+                                       );
+                                       return;
+                               case 'body':
+                                       $this->switchMode( 'inBodyMode' );
+                                       return;
+                               # OMITTED: <frameset>
+                               # OMITTED: <html>
+                               # OMITTED: <head>
+                               default:
+                                       if ( !$last ) {
+                                               # OMITTED: <head>
+                                               if ( $node->isA( BalanceSets::$tableCellSet ) ) {
+                                                       $this->switchMode( 'inCellMode' );
+                                                       return;
+                                               }
+                                       }
+                               }
+                       }
+                       if ( $last ) {
+                               $this->switchMode( 'inBodyMode' );
+                               return;
+                       }
+               }
+       }
+
+       private function stopParsing() {
+               # Most of the spec methods are inapplicable, other than step 2:
+               # "pop all the nodes off the stack of open elements".
+               # We're going to keep the top-most <html> element on the stack, though.
+
+               # Clear the AFE list first, otherwise the element objects will stay live
+               # during serialization, potentially using O(N^2) memory. Note that
+               # popping the stack will never result in reconstructing the active
+               # formatting elements.
+               $this->afe = null;
+               $this->stack->popTo( 1 );
+       }
+
+       private function parseRawText( $value, $attribs = null ) {
+               $this->stack->insertHTMLElement( $value, $attribs );
+               $this->inRAWTEXT = $value;
+               $this->originalInsertionMode = $this->switchMode( 'inTextMode' );
+               return true;
+       }
+
+       private function inTextMode( $token, $value, $attribs = null, $selfclose = false ) {
+               if ( $token === 'text' ) {
+                       $this->stack->insertText( $value );
+                       return true;
+               } elseif ( $token === 'eof' ) {
+                       $this->stack->pop();
+                       return $this->switchModeAndReprocess(
+                               $this->originalInsertionMode, $token, $value, $attribs, $selfclose
+                       );
+               } elseif ( $token === 'endtag' ) {
+                       $this->stack->pop();
+                       $this->switchMode( $this->originalInsertionMode );
+                       return true;
+               }
+               return true;
+       }
+
+       private function inHeadMode( $token, $value, $attribs = null, $selfclose = false ) {
+               if ( $token === 'text' ) {
+                       if ( preg_match( '/^[\x09\x0A\x0C\x0D\x20]+/', $value, $matches ) ) {
+                               $this->stack->insertText( $matches[0] );
+                               $value = substr( $value, strlen( $matches[0] ) );
+                       }
+                       if ( strlen( $value ) === 0 ) {
+                               return true; // All text handled.
+                       }
+                       // Fall through to handle non-whitespace below.
+               } elseif ( $token === 'tag' ) {
+                       switch ( $value ) {
+                       case 'meta':
+                               # OMITTED: in a full HTML parser, this might change the encoding.
+                               /* falls through */
+                       # OMITTED: <html>
+                       case 'base':
+                       case 'basefont':
+                       case 'bgsound':
+                       case 'link':
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               $this->stack->pop();
+                               return true;
+                       # OMITTED: <title>
+                       # OMITTED: <noscript>
+                       case 'noframes':
+                       case 'style':
+                               return $this->parseRawText( $value, $attribs );
+                       # OMITTED: <script>
+                       case 'template':
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               $this->afe->insertMarker();
+                               # OMITTED: frameset_ok
+                               $this->switchMode( 'inTemplateMode' );
+                               $this->templateInsertionModes[] = $this->parseMode;
+                               return true;
+                       # OMITTED: <head>
+                       }
+               } elseif ( $token === 'endtag' ) {
+                       switch ( $value ) {
+                       # OMITTED: <head>
+                       # OMITTED: <body>
+                       # OMITTED: <html>
+                       case 'br':
+                               break; // handle at the bottom of the function
+                       case 'template':
+                               if ( $this->stack->indexOf( $value ) < 0 ) {
+                                       return true; // Ignore the token.
+                               }
+                               $this->stack->generateImpliedEndTags( null, true /* thorough */ );
+                               $this->stack->popTag( $value );
+                               $this->afe->clearToMarker();
+                               array_pop( $this->templateInsertionModes );
+                               $this->resetInsertionMode();
+                               return true;
+                       default:
+                               // ignore any other end tag
+                               return true;
+                       }
+               } elseif ( $token === 'comment' ) {
+                       $this->stack->insertComment( $value );
+                       return true;
+               }
+
+               // If not handled above
+               $this->inHeadMode( 'endtag', 'head' ); // synthetic </head>
+               // Then redo this one
+               return $this->insertToken( $token, $value, $attribs, $selfclose );
+       }
+
+       private function inBodyMode( $token, $value, $attribs = null, $selfclose = false ) {
+               if ( $token === 'text' ) {
+                       $this->afe->reconstruct( $this->stack );
+                       $this->stack->insertText( $value );
+                       return true;
+               } elseif ( $token === 'eof' ) {
+                       if ( !empty( $this->templateInsertionModes ) ) {
+                               return $this->inTemplateMode( $token, $value, $attribs, $selfclose );
+                       }
+                       $this->stopParsing();
+                       return true;
+               } elseif ( $token === 'tag' ) {
+                       switch ( $value ) {
+                       # OMITTED: <html>
+                       case 'base':
+                       case 'basefont':
+                       case 'bgsound':
+                       case 'link':
+                       case 'meta':
+                       case 'noframes':
+                       # OMITTED: <script>
+                       case 'style':
+                       case 'template':
+                       # OMITTED: <title>
+                               return $this->inHeadMode( $token, $value, $attribs, $selfclose );
+                       # OMITTED: <body>
+                       # OMITTED: <frameset>
+
+                       case 'address':
+                       case 'article':
+                       case 'aside':
+                       case 'blockquote':
+                       case 'center':
+                       case 'details':
+                       case 'dialog':
+                       case 'dir':
+                       case 'div':
+                       case 'dl':
+                       case 'fieldset':
+                       case 'figcaption':
+                       case 'figure':
+                       case 'footer':
+                       case 'header':
+                       case 'hgroup':
+                       case 'main':
+                       case 'menu':
+                       case 'nav':
+                       case 'ol':
+                       case 'p':
+                       case 'section':
+                       case 'summary':
+                       case 'ul':
+                               if ( $this->stack->inButtonScope( 'p' ) ) {
+                                       $this->inBodyMode( 'endtag', 'p' );
+                               }
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               return true;
+
+                       case 'h1':
+                       case 'h2':
+                       case 'h3':
+                       case 'h4':
+                       case 'h5':
+                       case 'h6':
+                               if ( $this->stack->inButtonScope( 'p' ) ) {
+                                       $this->inBodyMode( 'endtag', 'p' );
+                               }
+                               if ( $this->stack->currentNode->isA( BalanceSets::$headingSet ) ) {
+                                       $this->stack->pop();
+                               }
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               return true;
+
+                       case 'pre':
+                       case 'listing':
+                               if ( $this->stack->inButtonScope( 'p' ) ) {
+                                       $this->inBodyMode( 'endtag', 'p' );
+                               }
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               $this->ignoreLinefeed = true;
+                               # OMITTED: frameset_ok
+                               return true;
+
+                       case 'form':
+                               if (
+                                       $this->formElementPointer &&
+                                       $this->stack->indexOf( 'template' ) < 0
+                               ) {
+                                       return true; // in a form, not in a template.
+                               }
+                               if ( $this->stack->inButtonScope( "p" ) ) {
+                                       $this->inBodyMode( 'endtag', 'p' );
+                               }
+                               $elt = $this->stack->insertHTMLElement( $value, $attribs );
+                               if ( $this->stack->indexOf( 'template' ) < 0 ) {
+                                       $this->formElementPointer = $elt;
+                               }
+                               return true;
+
+                       case 'li':
+                               # OMITTED: frameset_ok
+                               foreach ( $this->stack as $node ) {
+                                       if ( $node->isHtmlNamed( 'li' ) ) {
+                                               $this->inBodyMode( 'endtag', 'li' );
+                                               break;
+                                       }
+                                       if (
+                                               $node->isA( BalanceSets::$specialSet ) &&
+                                               !$node->isA( BalanceSets::$addressDivPSet )
+                                       ) {
+                                               break;
+                                       }
+                               }
+                               if ( $this->stack->inButtonScope( 'p' ) ) {
+                                       $this->inBodyMode( 'endtag', 'p' );
+                               }
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               return true;
+
+                       case 'dd':
+                       case 'dt':
+                               # OMITTED: frameset_ok
+                               foreach ( $this->stack as $node ) {
+                                       if ( $node->isHtmlNamed( 'dd' ) ) {
+                                               $this->inBodyMode( 'endtag', 'dd' );
+                                               break;
+                                       }
+                                       if ( $node->isHtmlNamed( 'dt' ) ) {
+                                               $this->inBodyMode( 'endtag', 'dt' );
+                                               break;
+                                       }
+                                       if (
+                                               $node->isA( BalanceSets::$specialSet ) &&
+                                               !$node->isA( BalanceSets::$addressDivPSet )
+                                       ) {
+                                               break;
+                                       }
+                               }
+                               if ( $this->stack->inButtonScope( 'p' ) ) {
+                                       $this->inBodyMode( 'endtag', 'p' );
+                               }
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               return true;
+
+                       # OMITTED: <plaintext>
+
+                       case 'button':
+                               if ( $this->stack->inScope( 'button' ) ) {
+                                       $this->inBodyMode( 'endtag', 'button' );
+                                       return $this->insertToken( $token, $value, $attribs, $selfclose );
+                               }
+                               $this->afe->reconstruct( $this->stack );
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               return true;
+
+                       case 'a':
+                               $activeElement = $this->afe->findElementByTag( 'a' );
+                               if ( $activeElement ) {
+                                       $this->inBodyMode( 'endtag', 'a' );
+                                       if ( $this->afe->isInList( $activeElement ) ) {
+                                               $this->afe->remove( $activeElement );
+                                               // Don't flatten here, since when we fall
+                                               // through below we might foster parent
+                                               // the new <a> tag inside this one.
+                                               $this->stack->removeElement( $activeElement, false );
+                                       }
+                               }
+                               /* Falls through */
+                       case 'b':
+                       case 'big':
+                       case 'code':
+                       case 'em':
+                       case 'font':
+                       case 'i':
+                       case 's':
+                       case 'small':
+                       case 'strike':
+                       case 'strong':
+                       case 'tt':
+                       case 'u':
+                               $this->afe->reconstruct( $this->stack );
+                               $this->afe->push( $this->stack->insertHTMLElement( $value, $attribs ), $attribs );
+                               return true;
+
+                       case 'nobr':
+                               $this->afe->reconstruct( $this->stack );
+                               if ( $this->stack->inScope( 'nobr' ) ) {
+                                       $this->inBodyMode( 'endtag', 'nobr' );
+                                       $this->afe->reconstruct( $this->stack );
+                               }
+                               $this->afe->push( $this->stack->insertHTMLElement( $value, $attribs ), $attribs );
+                               return true;
+
+                       case 'applet':
+                       case 'marquee':
+                       case 'object':
+                               $this->afe->reconstruct( $this->stack );
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               $this->afe->insertMarker();
+                               # OMITTED: frameset_ok
+                               return true;
+
+                       case 'table':
+                               # The document is never in "quirks mode"; see simplifications
+                               # above.
+                               if ( $this->stack->inButtonScope( 'p' ) ) {
+                                       $this->inBodyMode( 'endtag', 'p' );
+                               }
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               # OMITTED: frameset_ok
+                               $this->switchMode( 'inTableMode' );
+                               return true;
+
+                       case 'area':
+                       case 'br':
+                       case 'embed':
+                       case 'img':
+                       case 'keygen':
+                       case 'wbr':
+                               $this->afe->reconstruct( $this->stack );
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               $this->stack->pop();
+                               # OMITTED: frameset_ok
+                               return true;
+
+                       case 'input':
+                               $this->afe->reconstruct( $this->stack );
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               $this->stack->pop();
+                               # OMITTED: frameset_ok
+                               # (hence we don't need to examine the tag's "type" attribute)
+                               return true;
+
+                       case 'menuitem':
+                       case 'param':
+                       case 'source':
+                       case 'track':
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               $this->stack->pop();
+                               return true;
+
+                       case 'hr':
+                               if ( $this->stack->inButtonScope( 'p' ) ) {
+                                       $this->inBodyMode( 'endtag', 'p' );
+                               }
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               $this->stack->pop();
+                               return true;
+
+                       case 'image':
+                               # warts!
+                               return $this->inBodyMode( $token, 'img', $attribs, $selfclose );
+
+                       # OMITTED: <isindex>
+
+                       case 'textarea':
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               $this->ignoreLinefeed = true;
+                               $this->inRCDATA = $value; // emulate rcdata tokenizer mode
+                               # OMITTED: frameset_ok
+                               return true;
+
+                       # OMITTED: <xmp>
+                       # OMITTED: <iframe>
+                       # OMITTED: <noembed>
+                       # OMITTED: <noscript>
+
+                       case 'select':
+                               $this->afe->reconstruct( $this->stack );
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               switch ( $this->parseMode ) {
+                               case 'inTableMode':
+                               case 'inCaptionMode':
+                               case 'inTableBodyMode':
+                               case 'inRowMode':
+                               case 'inCellMode':
+                                       $this->switchMode( 'inSelectInTableMode' );
+                                       return true;
+                               default:
+                                       $this->switchMode( 'inSelectMode' );
+                                       return true;
+                               }
+
+                       case 'optgroup':
+                       case 'option':
+                               if ( $this->stack->currentNode->isHtmlNamed( 'option' ) ) {
+                                       $this->inBodyMode( 'endtag', 'option' );
+                               }
+                               $this->afe->reconstruct( $this->stack );
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               return true;
+
+                       case 'rb':
+                       case 'rtc':
+                               if ( $this->stack->inScope( 'ruby' ) ) {
+                                       $this->stack->generateImpliedEndTags();
+                               }
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               return true;
+
+                       case 'rp':
+                       case 'rt':
+                               if ( $this->stack->inScope( 'ruby' ) ) {
+                                       $this->stack->generateImpliedEndTags( 'rtc' );
+                               }
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               return true;
+
+                       case 'math':
+                               $this->afe->reconstruct( $this->stack );
+                               # We skip the spec's "adjust MathML attributes" and
+                               # "adjust foreign attributes" steps, since the browser will
+                               # do this later when it parses the output and it doesn't affect
+                               # balancing.
+                               $this->stack->insertForeignElement(
+                                       BalanceSets::MATHML_NAMESPACE, $value, $attribs
+                               );
+                               if ( $selfclose ) {
+                                       # emit explicit </math> tag.
+                                       $this->stack->pop();
+                               }
+                               return true;
+
+                       case 'svg':
+                               $this->afe->reconstruct( $this->stack );
+                               # We skip the spec's "adjust SVG attributes" and
+                               # "adjust foreign attributes" steps, since the browser will
+                               # do this later when it parses the output and it doesn't affect
+                               # balancing.
+                               $this->stack->insertForeignElement(
+                                       BalanceSets::SVG_NAMESPACE, $value, $attribs
+                               );
+                               if ( $selfclose ) {
+                                       # emit explicit </svg> tag.
+                                       $this->stack->pop();
+                               }
+                               return true;
+
+                       case 'caption':
+                       case 'col':
+                       case 'colgroup':
+                       # OMITTED: <frame>
+                       case 'head':
+                       case 'tbody':
+                       case 'td':
+                       case 'tfoot':
+                       case 'th':
+                       case 'thead':
+                       case 'tr':
+                               // Ignore table tags if we're not inTableMode
+                               return true;
+                       }
+
+                       // Handle any other start tag here
+                       $this->afe->reconstruct( $this->stack );
+                       $this->stack->insertHTMLElement( $value, $attribs );
+                       return true;
+               } elseif ( $token === 'endtag' ) {
+                       switch ( $value ) {
+                       # </body>,</html> are unsupported.
+
+                       case 'template':
+                               return $this->inHeadMode( $token, $value, $attribs, $selfclose );
+
+                       case 'address':
+                       case 'article':
+                       case 'aside':
+                       case 'blockquote':
+                       case 'button':
+                       case 'center':
+                       case 'details':
+                       case 'dialog':
+                       case 'dir':
+                       case 'div':
+                       case 'dl':
+                       case 'fieldset':
+                       case 'figcaption':
+                       case 'figure':
+                       case 'footer':
+                       case 'header':
+                       case 'hgroup':
+                       case 'listing':
+                       case 'main':
+                       case 'menu':
+                       case 'nav':
+                       case 'ol':
+                       case 'pre':
+                       case 'section':
+                       case 'summary':
+                       case 'ul':
+                               // Ignore if there is not a matching open tag
+                               if ( !$this->stack->inScope( $value ) ) {
+                                       return true;
+                               }
+                               $this->stack->generateImpliedEndTags();
+                               $this->stack->popTag( $value );
+                               return true;
+
+                       case 'form':
+                               if ( $this->stack->indexOf( 'template' ) < 0 ) {
+                                       $openform = $this->formElementPointer;
+                                       $this->formElementPointer = null;
+                                       if ( !$openform || !$this->stack->inScope( $openform ) ) {
+                                               return true;
+                                       }
+                                       $this->stack->generateImpliedEndTags();
+                                       // Don't flatten yet if we're removing a <form> element
+                                       // out-of-order. (eg. `<form><div></form>`)
+                                       $flatten = ( $this->stack->currentNode === $openform );
+                                       $this->stack->removeElement( $openform, $flatten );
+                               } else {
+                                       if ( !$this->stack->inScope( 'form' ) ) {
+                                               return true;
+                                       }
+                                       $this->stack->generateImpliedEndTags();
+                                       $this->stack->popTag( 'form' );
+                               }
+                               return true;
+
+                       case 'p':
+                               if ( !$this->stack->inButtonScope( 'p' ) ) {
+                                       $this->inBodyMode( 'tag', 'p', [] );
+                                       return $this->insertToken( $token, $value, $attribs, $selfclose );
+                               }
+                               $this->stack->generateImpliedEndTags( $value );
+                               $this->stack->popTag( $value );
+                               return true;
+
+                       case 'li':
+                               if ( !$this->stack->inListItemScope( $value ) ) {
+                                       return true; # ignore
+                               }
+                               $this->stack->generateImpliedEndTags( $value );
+                               $this->stack->popTag( $value );
+                               return true;
+
+                       case 'dd':
+                       case 'dt':
+                               if ( !$this->stack->inScope( $value ) ) {
+                                       return true; # ignore
+                               }
+                               $this->stack->generateImpliedEndTags( $value );
+                               $this->stack->popTag( $value );
+                               return true;
+
+                       case 'h1':
+                       case 'h2':
+                       case 'h3':
+                       case 'h4':
+                       case 'h5':
+                       case 'h6':
+                               if ( !$this->stack->inScope( BalanceSets::$headingSet ) ) {
+                                       return true; # ignore
+                               }
+                               $this->stack->generateImpliedEndTags();
+                               $this->stack->popTag( BalanceSets::$headingSet );
+                               return true;
+
+                       case 'sarcasm':
+                               # Take a deep breath, then:
+                               break;
+
+                       case 'a':
+                       case 'b':
+                       case 'big':
+                       case 'code':
+                       case 'em':
+                       case 'font':
+                       case 'i':
+                       case 'nobr':
+                       case 's':
+                       case 'small':
+                       case 'strike':
+                       case 'strong':
+                       case 'tt':
+                       case 'u':
+                               if ( $this->stack->adoptionAgency( $value, $this->afe ) ) {
+                                       return true; # If we did something, we're done.
+                               }
+                               break; # Go to the "any other end tag" case.
+
+                       case 'applet':
+                       case 'marquee':
+                       case 'object':
+                               if ( !$this->stack->inScope( $value ) ) {
+                                       return true; # ignore
+                               }
+                               $this->stack->generateImpliedEndTags();
+                               $this->stack->popTag( $value );
+                               $this->afe->clearToMarker();
+                               return true;
+
+                       case 'br':
+                               # Turn </br> into <br>
+                               return $this->inBodyMode( 'tag', $value, [] );
+                       }
+
+                       // Any other end tag goes here
+                       foreach ( $this->stack as $i => $node ) {
+                               if ( $node->isHtmlNamed( $value ) ) {
+                                       $this->stack->generateImpliedEndTags( $value );
+                                       $this->stack->popTo( $i ); # including $i
+                                       break;
+                               } elseif ( $node->isA( BalanceSets::$specialSet ) ) {
+                                       return true; // ignore this close token.
+                               }
+                       }
+                       return true;
+               } elseif ( $token === 'comment' ) {
+                       $this->stack->insertComment( $value );
+                       return true;
+               } else {
+                       Assert::invariant( false, "Bad token type: $token" );
+               }
+       }
+
+       private function inTableMode( $token, $value, $attribs = null, $selfclose = false ) {
+               if ( $token === 'text' ) {
+                       if ( $this->textIntegrationMode ) {
+                               return $this->inBodyMode( $token, $value, $attribs, $selfclose );
+                       } elseif ( $this->stack->currentNode->isA( BalanceSets::$tableSectionRowSet ) ) {
+                               $this->pendingTableText = '';
+                               $this->originalInsertionMode = $this->parseMode;
+                               return $this->switchModeAndReprocess( 'inTableTextMode', $token, $value, $attribs, $selfclose );
+                       }
+                       // fall through to default case.
+               } elseif ( $token === 'eof' ) {
+                       $this->stopParsing();
+                       return true;
+               } elseif ( $token === 'tag' ) {
+                       switch ( $value ) {
+                       case 'caption':
+                               $this->afe->insertMarker();
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               $this->switchMode( 'inCaptionMode' );
+                               return true;
+                       case 'colgroup':
+                               $this->stack->clearToContext( BalanceSets::$tableContextSet );
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               $this->switchMode( 'inColumnGroupMode' );
+                               return true;
+                       case 'col':
+                               $this->inTableMode( 'tag', 'colgroup', [] );
+                               return $this->insertToken( $token, $value, $attribs, $selfclose );
+                       case 'tbody':
+                       case 'tfoot':
+                       case 'thead':
+                               $this->stack->clearToContext( BalanceSets::$tableContextSet );
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               $this->switchMode( 'inTableBodyMode' );
+                               return true;
+                       case 'td':
+                       case 'th':
+                       case 'tr':
+                               $this->inTableMode( 'tag', 'tbody', [] );
+                               return $this->insertToken( $token, $value, $attribs, $selfclose );
+                       case 'table':
+                               if ( !$this->stack->inTableScope( $value ) ) {
+                                       return true; // Ignore this tag.
+                               }
+                               $this->inTableMode( 'endtag', $value );
+                               return $this->insertToken( $token, $value, $attribs, $selfclose );
+
+                       case 'style':
+                       # OMITTED: <script>
+                       case 'template':
+                               return $this->inHeadMode( $token, $value, $attribs, $selfclose );
+
+                       case 'input':
+                               if ( !isset( $attribs['type'] ) || strcasecmp( $attribs['type'], 'hidden' ) !== 0 ) {
+                                       break; // Handle this as "everything else"
+                               }
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               $this->stack->pop();
+                               return true;
+
+                       case 'form':
+                               if (
+                                       $this->formElementPointer ||
+                                       $this->stack->indexOf( 'template' ) >= 0
+                               ) {
+                                       return true; // ignore this token
+                               }
+                               $this->formElementPointer =
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                               $this->stack->popTag( $this->formElementPointer );
+                               return true;
+                       }
+                       // Fall through for "anything else" clause.
+               } elseif ( $token === 'endtag' ) {
+                       switch ( $value ) {
+                       case 'table':
+                               if ( !$this->stack->inTableScope( $value ) ) {
+                                       return true; // Ignore.
+                               }
+                               $this->stack->popTag( $value );
+                               $this->resetInsertionMode();
+                               return true;
+                       # OMITTED: <body>
+                       case 'caption':
+                       case 'col':
+                       case 'colgroup':
+                       # OMITTED: <html>
+                       case 'tbody':
+                       case 'td':
+                       case 'tfoot':
+                       case 'th':
+                       case 'thead':
+                       case 'tr':
+                               return true; // Ignore the token.
+                       case 'template':
+                               return $this->inHeadMode( $token, $value, $attribs, $selfclose );
+                       }
+                       // Fall through for "anything else" clause.
+               } elseif ( $token === 'comment' ) {
+                       $this->stack->insertComment( $value );
+                       return true;
+               }
+               // This is the "anything else" case:
+               $this->stack->fosterParentMode = true;
+               $this->inBodyMode( $token, $value, $attribs, $selfclose );
+               $this->stack->fosterParentMode = false;
+               return true;
+       }
+
+       private function inTableTextMode( $token, $value, $attribs = null, $selfclose = false ) {
+               if ( $token === 'text' ) {
+                       $this->pendingTableText .= $value;
+                       return true;
+               }
+               // Non-text token:
+               $text = $this->pendingTableText;
+               $this->pendingTableText = '';
+               if ( preg_match( '/[^\x09\x0A\x0C\x0D\x20]/', $text ) ) {
+                       // This should match the "anything else" case inTableMode
+                       $this->stack->fosterParentMode = true;
+                       $this->inBodyMode( 'text', $text );
+                       $this->stack->fosterParentMode = false;
+               } else {
+                       // Pending text is just whitespace.
+                       $this->stack->insertText( $text );
+               }
+               return $this->switchModeAndReprocess(
+                       $this->originalInsertionMode, $token, $value, $attribs, $selfclose
+               );
+       }
+
+       // helper for inCaptionMode
+       private function endCaption() {
+               if ( !$this->stack->inTableScope( 'caption' ) ) {
+                       return false;
+               }
+               $this->stack->generateImpliedEndTags();
+               $this->stack->popTag( 'caption' );
+               $this->afe->clearToMarker();
+               $this->switchMode( 'inTableMode' );
+               return true;
+       }
+
+       private function inCaptionMode( $token, $value, $attribs = null, $selfclose = false ) {
+               if ( $token === 'tag' ) {
+                       switch ( $value ) {
+                       case 'caption':
+                       case 'col':
+                       case 'colgroup':
+                       case 'tbody':
+                       case 'td':
+                       case 'tfoot':
+                       case 'th':
+                       case 'thead':
+                       case 'tr':
+                               if ( $this->endCaption() ) {
+                                       $this->insertToken( $token, $value, $attribs, $selfclose );
+                               }
+                               return true;
+                       }
+                       // Fall through to "anything else" case.
+               } elseif ( $token === 'endtag' ) {
+                       switch ( $value ) {
+                       case 'caption':
+                               $this->endCaption();
+                               return true;
+                       case 'table':
+                               if ( $this->endCaption() ) {
+                                       $this->insertToken( $token, $value, $attribs, $selfclose );
+                               }
+                               return true;
+                       case 'body':
+                       case 'col':
+                       case 'colgroup':
+                       # OMITTED: <html>
+                       case 'tbody':
+                       case 'td':
+                       case 'tfoot':
+                       case 'th':
+                       case 'thead':
+                       case 'tr':
+                               // Ignore the token
+                               return true;
+                       }
+                       // Fall through to "anything else" case.
+               }
+               // The Anything Else case
+               return $this->inBodyMode( $token, $value, $attribs, $selfclose );
+       }
+
+       private function inColumnGroupMode( $token, $value, $attribs = null, $selfclose = false ) {
+               if ( $token === 'text' ) {
+                       if ( preg_match( '/^[\x09\x0A\x0C\x0D\x20]+/', $value, $matches ) ) {
+                               $this->stack->insertText( $matches[0] );
+                               $value = substr( $value, strlen( $matches[0] ) );
+                       }
+                       if ( strlen( $value ) === 0 ) {
+                               return true; // All text handled.
+                       }
+                       // Fall through to handle non-whitespace below.
+               } elseif ( $token === 'tag' ) {
+                       switch ( $value ) {
+                       # OMITTED: <html>
+                       case 'col':
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               $this->stack->pop();
+                               return true;
+                       case 'template':
+                               return $this->inHeadMode( $token, $value, $attribs, $selfclose );
+                       }
+                       // Fall through for "anything else".
+               } elseif ( $token === 'endtag' ) {
+                       switch ( $value ) {
+                       case 'colgroup':
+                               if ( !$this->stack->currentNode->isHtmlNamed( 'colgroup' ) ) {
+                                       return true; // Ignore the token.
+                               }
+                               $this->stack->pop();
+                               $this->switchMode( 'inTableMode' );
+                               return true;
+                       case 'col':
+                               return true; // Ignore the token.
+                       case 'template':
+                               return $this->inHeadMode( $token, $value, $attribs, $selfclose );
+                       }
+                       // Fall through for "anything else".
+               } elseif ( $token === 'eof' ) {
+                       return $this->inBodyMode( $token, $value, $attribs, $selfclose );
+               } elseif ( $token === 'comment' ) {
+                       $this->stack->insertComment( $value );
+                       return true;
+               }
+
+               // Anything else
+               if ( !$this->stack->currentNode->isHtmlNamed( 'colgroup' ) ) {
+                       return true; // Ignore the token.
+               }
+               $this->inColumnGroupMode( 'endtag', 'colgroup' );
+               return $this->insertToken( $token, $value, $attribs, $selfclose );
+       }
+
+       // Helper function for inTableBodyMode
+       private function endSection() {
+               if ( !(
+                       $this->stack->inTableScope( 'tbody' ) ||
+                       $this->stack->inTableScope( 'thead' ) ||
+                       $this->stack->inTableScope( 'tfoot' )
+               ) ) {
+                       return false;
+               }
+               $this->stack->clearToContext( BalanceSets::$tableBodyContextSet );
+               $this->stack->pop();
+               $this->switchMode( 'inTableMode' );
+               return true;
+       }
+       private function inTableBodyMode( $token, $value, $attribs = null, $selfclose = false ) {
+               if ( $token === 'tag' ) {
+                       switch ( $value ) {
+                       case 'tr':
+                               $this->stack->clearToContext( BalanceSets::$tableBodyContextSet );
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               $this->switchMode( 'inRowMode' );
+                               return true;
+                       case 'th':
+                       case 'td':
+                               $this->inTableBodyMode( 'tag', 'tr', [] );
+                               $this->insertToken( $token, $value, $attribs, $selfclose );
+                               return true;
+                       case 'caption':
+                       case 'col':
+                       case 'colgroup':
+                       case 'tbody':
+                       case 'tfoot':
+                       case 'thead':
+                               if ( $this->endSection() ) {
+                                       $this->insertToken( $token, $value, $attribs, $selfclose );
+                               }
+                               return true;
+                       }
+               } elseif ( $token === 'endtag' ) {
+                       switch ( $value ) {
+                       case 'table':
+                               if ( $this->endSection() ) {
+                                       $this->insertToken( $token, $value, $attribs, $selfclose );
+                               }
+                               return true;
+                       case 'tbody':
+                       case 'tfoot':
+                       case 'thead':
+                               if ( $this->stack->inTableScope( $value ) ) {
+                                       $this->endSection();
+                               }
+                               return true;
+                       # OMITTED: <body>
+                       case 'caption':
+                       case 'col':
+                       case 'colgroup':
+                       # OMITTED: <html>
+                       case 'td':
+                       case 'th':
+                       case 'tr':
+                               return true; // Ignore the token.
+                       }
+               }
+               // Anything else:
+               return $this->inTableMode( $token, $value, $attribs, $selfclose );
+       }
+
+       // Helper function for inRowMode
+       private function endRow() {
+               if ( !$this->stack->inTableScope( 'tr' ) ) {
+                       return false;
+               }
+               $this->stack->clearToContext( BalanceSets::$tableRowContextSet );
+               $this->stack->pop();
+               $this->switchMode( 'inTableBodyMode' );
+               return true;
+       }
+       private function inRowMode( $token, $value, $attribs = null, $selfclose = false ) {
+               if ( $token === 'tag' ) {
+                       switch ( $value ) {
+                       case 'th':
+                       case 'td':
+                               $this->stack->clearToContext( BalanceSets::$tableRowContextSet );
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               $this->switchMode( 'inCellMode' );
+                               $this->afe->insertMarker();
+                               return true;
+                       case 'caption':
+                       case 'col':
+                       case 'colgroup':
+                       case 'tbody':
+                       case 'tfoot':
+                       case 'thead':
+                       case 'tr':
+                               if ( $this->endRow() ) {
+                                       $this->insertToken( $token, $value, $attribs, $selfclose );
+                               }
+                               return true;
+                       }
+               } elseif ( $token === 'endtag' ) {
+                       switch ( $value ) {
+                       case 'tr':
+                               $this->endRow();
+                               return true;
+                       case 'table':
+                               if ( $this->endRow() ) {
+                                       $this->insertToken( $token, $value, $attribs, $selfclose );
+                               }
+                               return true;
+                       case 'tbody':
+                       case 'tfoot':
+                       case 'thead':
+                               if (
+                                       $this->stack->inTableScope( $value ) &&
+                                       $this->endRow()
+                               ) {
+                                       $this->insertToken( $token, $value, $attribs, $selfclose );
+                               }
+                               return true;
+                       # OMITTED: <body>
+                       case 'caption':
+                       case 'col':
+                       case 'colgroup':
+                       # OMITTED: <html>
+                       case 'td':
+                       case 'th':
+                               return true; // Ignore the token.
+                       }
+               }
+               // Anything else:
+               return $this->inTableMode( $token, $value, $attribs, $selfclose );
+       }
+
+       // Helper for inCellMode
+       private function endCell() {
+               if ( $this->stack->inTableScope( 'td' ) ) {
+                       $this->inCellMode( 'endtag', 'td' );
+                       return true;
+               } elseif ( $this->stack->inTableScope( 'th' ) ) {
+                       $this->inCellMode( 'endtag', 'th' );
+                       return true;
+               } else {
+                       return false;
+               }
+       }
+       private function inCellMode( $token, $value, $attribs = null, $selfclose = false ) {
+               if ( $token === 'tag' ) {
+                       switch ( $value ) {
+                       case 'caption':
+                       case 'col':
+                       case 'colgroup':
+                       case 'tbody':
+                       case 'td':
+                       case 'tfoot':
+                       case 'th':
+                       case 'thead':
+                       case 'tr':
+                               if ( $this->endCell() ) {
+                                       $this->insertToken( $token, $value, $attribs, $selfclose );
+                               }
+                               return true;
+                       }
+               } elseif ( $token === 'endtag' ) {
+                       switch ( $value ) {
+                       case 'td':
+                       case 'th':
+                               if ( $this->stack->inTableScope( $value ) ) {
+                                       $this->stack->generateImpliedEndTags();
+                                       $this->stack->popTag( $value );
+                                       $this->afe->clearToMarker();
+                                       $this->switchMode( 'inRowMode' );
+                               }
+                               return true;
+                       # OMITTED: <body>
+                       case 'caption':
+                       case 'col':
+                       case 'colgroup':
+                       # OMITTED: <html>
+                               return true;
+
+                       case 'table':
+                       case 'tbody':
+                       case 'tfoot':
+                       case 'thead':
+                       case 'tr':
+                               if ( $this->stack->inTableScope( $value ) ) {
+                                       $this->stack->generateImpliedEndTags();
+                                       $this->stack->popTag( BalanceSets::$tableCellSet );
+                                       $this->afe->clearToMarker();
+                                       $this->switchMode( 'inRowMode' );
+                                       $this->insertToken( $token, $value, $attribs, $selfclose );
+                               }
+                               return true;
+                       }
+               }
+               // Anything else:
+               return $this->inBodyMode( $token, $value, $attribs, $selfclose );
+       }
+
+       private function inSelectMode( $token, $value, $attribs = null, $selfclose = false ) {
+               if ( $token === 'text' ) {
+                       $this->stack->insertText( $value );
+                       return true;
+               } elseif ( $token === 'eof' ) {
+                       return $this->inBodyMode( $token, $value, $attribs, $selfclose );
+               } elseif ( $token === 'tag' ) {
+                       switch ( $value ) {
+                       # OMITTED: <html>
+                       case 'option':
+                               if ( $this->stack->currentNode->isHtmlNamed( 'option' ) ) {
+                                       $this->stack->pop();
+                               }
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               return true;
+                       case 'optgroup':
+                               if ( $this->stack->currentNode->isHtmlNamed( 'option' ) ) {
+                                       $this->stack->pop();
+                               }
+                               if ( $this->stack->currentNode->isHtmlNamed( 'optgroup' ) ) {
+                                       $this->stack->pop();
+                               }
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               return true;
+                       case 'select':
+                               $this->inSelectMode( 'endtag', $value ); // treat it like endtag
+                               return true;
+                       case 'input':
+                       case 'keygen':
+                       case 'textarea':
+                               if ( !$this->stack->inSelectScope( 'select' ) ) {
+                                       return true; // ignore token (fragment case)
+                               }
+                               $this->inSelectMode( 'endtag', 'select' );
+                               return $this->insertToken( $token, $value, $attribs, $selfclose );
+                       case 'script':
+                       case 'template':
+                               return $this->inHeadMode( $token, $value, $attribs, $selfclose );
+                       }
+               } elseif ( $token === 'endtag' ) {
+                       switch ( $value ) {
+                       case 'optgroup':
+                               if (
+                                       $this->stack->currentNode->isHtmlNamed( 'option' ) &&
+                                       $this->stack->length() >= 2 &&
+                                       $this->stack->node( $this->stack->length() - 2 )->isHtmlNamed( 'optgroup' )
+                               ) {
+                                       $this->stack->pop();
+                               }
+                               if ( $this->stack->currentNode->isHtmlNamed( 'optgroup' ) ) {
+                                       $this->stack->pop();
+                               }
+                               return true;
+                       case 'option':
+                               if ( $this->stack->currentNode->isHtmlNamed( 'option' ) ) {
+                                       $this->stack->pop();
+                               }
+                               return true;
+                       case 'select':
+                               if ( !$this->stack->inSelectScope( $value ) ) {
+                                       return true; // fragment case
+                               }
+                               $this->stack->popTag( $value );
+                               $this->resetInsertionMode();
+                               return true;
+                       case 'template':
+                               return $this->inHeadMode( $token, $value, $attribs, $selfclose );
+                       }
+               } elseif ( $token === 'comment' ) {
+                       $this->stack->insertComment( $value );
+                       return true;
+               }
+               // anything else: just ignore the token
+               return true;
+       }
+
+       private function inSelectInTableMode( $token, $value, $attribs = null, $selfclose = false ) {
+               switch ( $value ) {
+               case 'caption':
+               case 'table':
+               case 'tbody':
+               case 'tfoot':
+               case 'thead':
+               case 'tr':
+               case 'td':
+               case 'th':
+                       if ( $token === 'tag' ) {
+                               $this->inSelectInTableMode( 'endtag', 'select' );
+                               return $this->insertToken( $token, $value, $attribs, $selfclose );
+                       } elseif ( $token === 'endtag' ) {
+                               if ( $this->stack->inTableScope( $value ) ) {
+                                       $this->inSelectInTableMode( 'endtag', 'select' );
+                                       return $this->insertToken( $token, $value, $attribs, $selfclose );
+                               }
+                               return true;
+                       }
+               }
+               // anything else
+               return $this->inSelectMode( $token, $value, $attribs, $selfclose );
+       }
+
+       private function inTemplateMode( $token, $value, $attribs = null, $selfclose = false ) {
+               if ( $token === 'text' || $token === 'comment' ) {
+                       return $this->inBodyMode( $token, $value, $attribs, $selfclose );
+               } elseif ( $token === 'eof' ) {
+                       if ( $this->stack->indexOf( 'template' ) < 0 ) {
+                               $this->stopParsing();
+                       } else {
+                               $this->stack->popTag( 'template' );
+                               $this->afe->clearToMarker();
+                               array_pop( $this->templateInsertionModes );
+                               $this->resetInsertionMode();
+                               $this->insertToken( $token, $value, $attribs, $selfclose );
+                       }
+                       return true;
+               } elseif ( $token === 'tag' ) {
+                       switch ( $value ) {
+                       case 'base':
+                       case 'basefont':
+                       case 'bgsound':
+                       case 'link':
+                       case 'meta':
+                       case 'noframes':
+                       # OMITTED: <script>
+                       case 'style':
+                       case 'template':
+                       # OMITTED: <title>
+                               return $this->inHeadMode( $token, $value, $attribs, $selfclose );
+
+                       case 'caption':
+                       case 'colgroup':
+                       case 'tbody':
+                       case 'tfoot':
+                       case 'thead':
+                               return $this->switchModeAndReprocess(
+                                       'inTableMode', $token, $value, $attribs, $selfclose
+                               );
+
+                       case 'col':
+                               return $this->switchModeAndReprocess(
+                                       'inColumnGroupMode', $token, $value, $attribs, $selfclose
+                               );
+
+                       case 'tr':
+                               return $this->switchModeAndReprocess(
+                                       'inTableBodyMode', $token, $value, $attribs, $selfclose
+                               );
+
+                       case 'td':
+                       case 'th':
+                               return $this->switchModeAndReprocess(
+                                       'inRowMode', $token, $value, $attribs, $selfclose
+                               );
+                       }
+                       return $this->switchModeAndReprocess(
+                               'inBodyMode', $token, $value, $attribs, $selfclose
+                       );
+               } elseif ( $token === 'endtag' ) {
+                       switch ( $value ) {
+                       case 'template':
+                               return $this->inHeadMode( $token, $value, $attribs, $selfclose );
+                       }
+                       return true;
+               } else {
+                       Assert::invariant( false, "Bad token type: $token" );
+               }
+       }
+}
diff --git a/includes/tidy/Html5Internal.php b/includes/tidy/Html5Internal.php
new file mode 100644 (file)
index 0000000..4ad8200
--- /dev/null
@@ -0,0 +1,18 @@
+<?php
+
+namespace MediaWiki\Tidy;
+
+class Html5Internal extends TidyDriverBase {
+       private $balancer;
+       public function __construct( array $config ) {
+               parent::__construct( $config + [
+                       'strict' => true,
+                       'tidyCompat' => true,
+               ] );
+               $this->balancer = new Balancer( $this->config );
+       }
+
+       public function tidy( $text ) {
+               return $this->balancer->balance( $text );
+       }
+}
index 2a3986d..bb83d6a 100644 (file)
@@ -14,7 +14,7 @@ class RaggettInternalHHVM extends RaggettBase {
         */
        protected function cleanWrapped( $text, $stderr = false, &$retval = null ) {
                if ( $stderr ) {
-                       throw new Exception( "\$stderr cannot be used with RaggettInternalHHVM" );
+                       throw new \Exception( "\$stderr cannot be used with RaggettInternalHHVM" );
                }
                $cleansource = tidy_repair_string( $text, $this->config['tidyConfigFile'], 'utf8' );
                if ( $cleansource === false ) {
index ab19142..56d5ce7 100644 (file)
@@ -54,7 +54,7 @@ class RaggettWrapper {
                // Preserve empty li elements (T49673) by abusing Tidy's datafld hack
                // The whitespace class is as in TY_(InitMap)
                $wrappedtext = preg_replace( "!<li>([ \r\n\t\f]*)</li>!",
-                       '<li datafld="" class="mw-empty-li">\1</li>', $wrappedtext );
+                       '<li datafld="" class="mw-empty-elt">\1</li>', $wrappedtext );
 
                // Wrap the whole thing in a doctype and body for Tidy.
                $wrappedtext = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"' .
index 06775ef..96ee8c3 100644 (file)
@@ -27,7 +27,7 @@ abstract class TidyDriverBase {
         * @return bool Whether the HTML is valid
         */
        public function validate( $text, &$errorStr ) {
-               throw new MWException( get_class( $this ) . " does not support validate()" );
+               throw new \MWException( get_class( $this ) . " does not support validate()" );
        }
 
        /**
diff --git a/includes/title/MediaWikiPageLinkRenderer.php b/includes/title/MediaWikiPageLinkRenderer.php
deleted file mode 100644 (file)
index a565271..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
-<?php
-/**
- * A service for generating links from page titles
- *
- * 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
- * @license GPL 2+
- * @author Daniel Kinzler
- */
-use MediaWiki\Linker\LinkTarget;
-
-/**
- * A service for generating links from page titles.
- *
- * @see https://www.mediawiki.org/wiki/Requests_for_comment/TitleValue
- * @since 1.23
- */
-class MediaWikiPageLinkRenderer implements PageLinkRenderer {
-       /**
-        * @var TitleFormatter
-        */
-       protected $formatter;
-
-       /**
-        * @var string
-        */
-       protected $baseUrl;
-
-       /**
-        * @note $formatter and $baseUrl are currently not used for generating links,
-        * since we still rely on the Linker class to generate the actual HTML.
-        * Once this is reversed so that  Linker becomes a legacy interface to
-        * HtmlPageLinkRenderer, we will be using them, so it seems prudent to
-        * already declare the dependency and inject them.
-        *
-        * @param TitleFormatter $formatter Formatter for generating the target title string
-        * @param string $baseUrl (currently unused, pending refactoring of Linker).
-        *        Defaults to $wgArticlePath.
-        */
-       public function __construct( TitleFormatter $formatter, $baseUrl = null ) {
-               if ( $baseUrl === null ) {
-                       $baseUrl = $GLOBALS['wgArticlePath'];
-               }
-
-               $this->formatter = $formatter;
-               $this->baseUrl = $baseUrl;
-       }
-
-       /**
-        * Returns the (partial) URL for the given page (including any section identifier).
-        *
-        * @param LinkTarget $page The link's target
-        * @param array $params Any additional URL parameters.
-        *
-        * @return string
-        */
-       public function getPageUrl( LinkTarget $page, $params = [] ) {
-               // TODO: move the code from Linker::linkUrl here!
-               // The below is just a rough estimation!
-
-               $name = $this->formatter->getPrefixedText( $page );
-               $name = str_replace( ' ', '_', $name );
-               $name = wfUrlencode( $name );
-
-               $url = $this->baseUrl . $name;
-
-               if ( $params ) {
-                       $separator = ( strpos( $url, '?' ) ) ? '&' : '?';
-                       $url .= $separator . wfArrayToCgi( $params );
-               }
-
-               $fragment = $page->getFragment();
-               if ( $fragment !== '' ) {
-                       $url = $url . '#' . wfUrlencode( $fragment );
-               }
-
-               return $url;
-       }
-
-       /**
-        * Returns an HTML link to the given page, using the given surface text.
-        *
-        * @param LinkTarget $linkTarget The link's target
-        * @param string $text The link's surface text (will be derived from $page if not given).
-        *
-        * @return string
-        */
-       public function renderHtmlLink( LinkTarget $linkTarget, $text = null ) {
-               if ( $text === null ) {
-                       $text = $this->formatter->getFullText( $linkTarget );
-               }
-
-               // TODO: move the logic implemented by Linker here,
-               // using $this->formatter and $this->baseUrl, and
-               // re-implement Linker to use a HtmlPageLinkRenderer.
-
-               $title = Title::newFromLinkTarget( $linkTarget );
-               $link = Linker::link( $title, htmlspecialchars( $text ) );
-
-               return $link;
-       }
-
-       /**
-        * Returns a wikitext link to the given page, using the given surface text.
-        *
-        * @param LinkTarget $page The link's target
-        * @param string $text The link's surface text (will be derived from $page if not given).
-        *
-        * @return string
-        */
-       public function renderWikitextLink( LinkTarget $page, $text = null ) {
-               if ( $text === null ) {
-                       $text = $this->formatter->getFullText( $page );
-               }
-
-               $name = $this->formatter->getFullText( $page );
-
-               return '[[:' . $name . '|' . wfEscapeWikiText( $text ) . ']]';
-       }
-}
diff --git a/includes/title/PageLinkRenderer.php b/includes/title/PageLinkRenderer.php
deleted file mode 100644 (file)
index e26fe1a..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-<?php
-/**
- * Represents a link rendering service for %MediaWiki.
- *
- * 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
- * @license GPL 2+
- * @author Daniel Kinzler
- */
-use MediaWiki\Linker\LinkTarget;
-
-/**
- * Represents a link rendering service for %MediaWiki.
- *
- * This is designed to encapsulate the knowledge about how page titles map to
- * URLs, and how links are encoded in a given output format.
- *
- * @see https://www.mediawiki.org/wiki/Requests_for_comment/TitleValue
- * @since 1.23
- */
-interface PageLinkRenderer {
-       /**
-        * Returns the URL for the given page.
-        *
-        * @todo expand this to cover the functionality of Linker::linkUrl
-        *
-        * @param LinkTarget $page The link's target
-        * @param array $params Any additional URL parameters.
-        *
-        * @return string
-        */
-       public function getPageUrl( LinkTarget $page, $params = [] );
-
-       /**
-        * Returns an HTML link to the given page, using the given surface text.
-        *
-        * @todo expand this to cover the functionality of Linker::link
-        *
-        * @param LinkTarget $page The link's target
-        * @param string $text The link's surface text (will be derived from $page if not given).
-        *
-        * @return string
-        */
-       public function renderHtmlLink( LinkTarget $page, $text = null );
-
-       /**
-        * Returns a wikitext link to the given page, using the given surface text.
-        *
-        * @param LinkTarget $page The link's target
-        * @param string $text The link's surface text (will be derived from $page if not given).
-        *
-        * @return string
-        */
-       public function renderWikitextLink( LinkTarget $page, $text = null );
-}
index ba5171f..71d032f 100644 (file)
@@ -353,7 +353,7 @@ abstract class UploadBase {
 
                $error = '';
                if ( !Hooks::run( 'UploadVerification',
-                       [ $this->mDestName, $this->mTempPath, &$error ] )
+                       [ $this->mDestName, $this->mTempPath, &$error ], '1.28' )
                ) {
                        return [ 'status' => self::HOOK_ABORTED, 'error' => $error ];
                }
@@ -467,9 +467,13 @@ abstract class UploadBase {
                        }
                }
 
-               Hooks::run( 'UploadVerifyFile', [ $this, $mime, &$status ] );
-               if ( $status !== true ) {
-                       return $status;
+               $error = true;
+               Hooks::run( 'UploadVerifyFile', [ $this, $mime, &$error ] );
+               if ( $error !== true ) {
+                       if ( !is_array( $error ) ) {
+                               $error = [ $error ];
+                       }
+                       return $error;
                }
 
                wfDebug( __METHOD__ . ": all clear; passing.\n" );
@@ -717,13 +721,23 @@ abstract class UploadBase {
         */
        public function performUpload( $comment, $pageText, $watch, $user, $tags = [] ) {
                $this->getLocalFile()->load( File::READ_LATEST );
+               $props = $this->mFileProps;
+
+               $error = null;
+               Hooks::run( 'UploadVerifyUpload', [ $this, $user, $props, $comment, $pageText, &$error ] );
+               if ( $error ) {
+                       if ( !is_array( $error ) ) {
+                               $error = [ $error ];
+                       }
+                       return call_user_func_array( 'Status::newFatal', $error );
+               }
 
                $status = $this->getLocalFile()->upload(
                        $this->mTempPath,
                        $comment,
                        $pageText,
                        File::DELETE_SOURCE,
-                       $this->mFileProps,
+                       $props,
                        false,
                        $user,
                        $tags
@@ -1416,7 +1430,10 @@ abstract class UploadBase {
                                return [ 'uploaded-event-handler-on-svg', $attrib, $value ];
                        }
 
-                       # href with non-local target (don't allow http://, javascript:, etc)
+                       # Do not allow relative links, or unsafe url schemas.
+                       # For <a> tags, only data:, http: and https: and same-document
+                       # fragment links are allowed. For all other tags, only data:
+                       # and fragment are allowed.
                        if ( $stripped == 'href'
                                && strpos( $value, 'data:' ) !== 0
                                && strpos( $value, '#' ) !== 0
index 60144bb..bc87cd0 100644 (file)
@@ -153,7 +153,7 @@ class PasswordReset {
                        'Capture' => $displayPassword ? '1' : null,
                ];
                if ( !Hooks::run( 'SpecialPasswordResetOnSubmit', [ &$users, $data, &$error ] ) ) {
-                       return StatusValue::newFatal( wfMessage( $error ) );
+                       return StatusValue::newFatal( Message::newFromSpecifier( $error ) );
                }
 
                if ( !$users ) {
index 5eef0c2..a774aba 100644 (file)
@@ -477,7 +477,7 @@ class User implements IDBAccessObject {
                                $setOpts += Database::getCacheSetOptions( wfGetDB( DB_SLAVE ) );
                                wfDebug( "User: cache miss for user {$this->mId}\n" );
 
-                               $this->loadFromDatabase();
+                               $this->loadFromDatabase( self::READ_NORMAL );
                                $this->loadGroups();
                                $this->loadOptions();
 
@@ -772,15 +772,15 @@ class User implements IDBAccessObject {
                        return self::$idCacheByName[$name];
                }
 
-               $db = ( $flags & self::READ_LATEST )
-                       ? wfGetDB( DB_MASTER )
-                       : wfGetDB( DB_SLAVE );
+               list( $index, $options ) = DBAccessObjectUtils::getDBOptions( $flags );
+               $db = wfGetDB( $index );
 
                $s = $db->selectRow(
                        'user',
                        [ 'user_id' ],
                        [ 'user_name' => $nt->getText() ],
-                       __METHOD__
+                       __METHOD__,
+                       $options
                );
 
                if ( $s === false ) {
@@ -806,7 +806,7 @@ class User implements IDBAccessObject {
        }
 
        /**
-        * Does the string match an anonymous IPv4 address?
+        * Does the string match an anonymous IP address?
         *
         * This function exists for username validation, in order to reject
         * usernames which are similar in form to IP addresses. Strings such
@@ -1524,16 +1524,19 @@ class User implements IDBAccessObject {
                global $wgNamespacesToBeSearchedDefault, $wgDefaultUserOptions, $wgContLang, $wgDefaultSkin;
 
                static $defOpt = null;
-               if ( !defined( 'MW_PHPUNIT_TEST' ) && $defOpt !== null ) {
-                       // Disabling this for the unit tests, as they rely on being able to change $wgContLang
-                       // mid-request and see that change reflected in the return value of this function.
-                       // Which is insane and would never happen during normal MW operation
+               static $defOptLang = null;
+
+               if ( $defOpt !== null && $defOptLang === $wgContLang->getCode() ) {
+                       // $wgContLang does not change (and should not change) mid-request,
+                       // but the unit tests change it anyway, and expect this method to
+                       // return values relevant to the current $wgContLang.
                        return $defOpt;
                }
 
                $defOpt = $wgDefaultUserOptions;
                // Default language setting
-               $defOpt['language'] = $wgContLang->getCode();
+               $defOptLang = $wgContLang->getCode();
+               $defOpt['language'] = $defOptLang;
                foreach ( LanguageConverter::$languagesWithVariants as $langCode ) {
                        $defOpt[$langCode == $wgContLang->getCode() ? 'variant' : "variant-$langCode"] = $langCode;
                }
index 419ee47..c7bd395 100644 (file)
@@ -31,7 +31,7 @@ class BatchRowIterator implements RecursiveIterator {
        protected $db;
 
        /**
-        * @var string $table The name of the table to read from
+        * @var string|array $table The name or names of the table to read from
         */
        protected $table;
 
@@ -79,7 +79,7 @@ class BatchRowIterator implements RecursiveIterator {
 
        /**
         * @param IDatabase $db The database to read from
-        * @param string       $table      The name of the table to read from
+        * @param string|array $table      The name or names of the table to read from
         * @param string|array $primaryKey The name or names of the primary key columns
         * @param integer      $batchSize  The number of rows to fetch per iteration
         * @throws MWException
index 4a2205e..8676baf 100644 (file)
@@ -53,7 +53,7 @@ define( 'RE_IPV6_BLOCK', RE_IPV6_ADD . '\/' . RE_IPV6_PREFIX );
 define( 'RE_IPV6_GAP', ':(?:0+:)*(?::(?:0+:)*)?' );
 define( 'RE_IPV6_V4_PREFIX', '0*' . RE_IPV6_GAP . '(?:ffff:)?' );
 
-// This might be useful for regexps used elsewhere, matches any IPv6 or IPv6 address or network
+// This might be useful for regexps used elsewhere, matches any IPv4 or IPv6 address or network
 define( 'IP_ADDRESS_STRING',
        '(?:' .
                RE_IP_ADD . '(?:\/' . RE_IP_PREFIX . ')?' . // IPv4
index 9469c41..1376fa7 100644 (file)
@@ -156,7 +156,7 @@ class MWCryptHKDF {
 
        /**
         * Return a singleton instance, based on the global configs.
-        * @return HKDF
+        * @return self
         * @throws MWException
         */
        protected static function singleton() {
index ee769da..a9e8042 100644 (file)
@@ -42,9 +42,6 @@ class ComplexTitleInputWidget extends \OOUI\Widget {
                $this->title = new TitleInputWidget( array_merge(
                        $config['title'],
                        [
-                               // The inner TitleInputWidget shouldn't be infusable,
-                               // only the ComplexTitleInputWidget itself can be.
-                               'infusable' => false,
                                'relative' => true,
                                'namespace' => isset( $config['namespace']['value'] ) ?
                                        $config['namespace']['value'] :
old mode 100755 (executable)
new mode 100644 (file)
index 6baaff0..0d71629
@@ -30,7 +30,6 @@ class SearchInputWidget extends TitleInputWidget {
         */
        public function __construct( array $config = [] ) {
                $config = array_merge( [
-                       'infusable' => true,
                        'maxLength' => null,
                        'type' => 'search',
                        'icon' => 'search',
@@ -48,7 +47,7 @@ class SearchInputWidget extends TitleInputWidget {
                        $this->performSearchOnClick = $config['performSearchOnClick'];
                }
 
-               if ( $config['dataLocation'] ) {
+               if ( isset( $config['dataLocation'] ) ) {
                        // identifies the location of the search bar for tracking purposes
                        $this->dataLocation = $config['dataLocation'];
                }
index 886afa6..da2e94b 100644 (file)
@@ -32,7 +32,7 @@ class TitleInputWidget extends \OOUI\TextInputWidget {
        public function __construct( array $config = [] ) {
                // Parent constructor
                parent::__construct(
-                       array_merge( [ 'infusable' => true, 'maxLength' => 255 ], $config )
+                       array_merge( [ 'maxLength' => 255 ], $config )
                );
 
                // Properties, which are ignored in PHP and just shipped back to JS
index 86c2bc3..d591ad1 100644 (file)
@@ -17,7 +17,7 @@ class UserInputWidget extends \OOUI\TextInputWidget {
         */
        public function __construct( array $config = [] ) {
                // Parent constructor
-               parent::__construct( array_merge( [ 'infusable' => true ], $config ) );
+               parent::__construct( $config );
 
                // Initialization
                $this->addClasses( [ 'mw-widget-userInputWidget' ] );
index 0a6ccd3..d96710a 100644 (file)
@@ -30,8 +30,6 @@ if ( !defined( 'MEDIAWIKI' ) ) {
        exit( 1 );
 }
 
-mb_internal_encoding( 'UTF-8' );
-
 use CLDRPluralRuleParser\Evaluator;
 
 /**
@@ -1089,7 +1087,7 @@ class Language {
         * @throws MWException
         * @return string
         */
-       public function sprintfDate( $format, $ts, DateTimeZone $zone = null, &$ttl = null ) {
+       public function sprintfDate( $format, $ts, DateTimeZone $zone = null, &$ttl = 'unused' ) {
                $s = '';
                $raw = false;
                $roman = false;
@@ -1454,7 +1452,9 @@ class Language {
                        }
                }
 
-               if ( $usedSecond ) {
+               if ( $ttl === 'unused' ) {
+                       // No need to calculate the TTL, the caller wont use it anyway.
+               } elseif ( $usedSecond ) {
                        $ttl = 1;
                } elseif ( $usedMinute ) {
                        $ttl = 60 - substr( $ts, 12, 2 );
@@ -2577,9 +2577,6 @@ class Language {
         * @return string
         */
        public function iconv( $in, $out, $string ) {
-               # This is a wrapper for iconv in all languages except esperanto,
-               # which does some nasty x-conversions beforehand
-
                # Even with //IGNORE iconv can whine about illegal characters in
                # *input* string. We just ignore those too.
                # REF: http://bugs.php.net/bug.php?id=37166
@@ -2929,46 +2926,29 @@ class Language {
                }
        }
 
+       /**
+        * @deprecated No-op since 1.28
+        */
        function initEncoding() {
-               # Some languages may have an alternate char encoding option
-               # (Esperanto X-coding, Japanese furigana conversion, etc)
-               # If this language is used as the primary content language,
-               # an override to the defaults can be set here on startup.
+               // No-op.
        }
 
        /**
         * @param string $s
         * @return string
+        * @deprecated No-op since 1.28
         */
        function recodeForEdit( $s ) {
-               # For some languages we'll want to explicitly specify
-               # which characters make it into the edit box raw
-               # or are converted in some way or another.
-               global $wgEditEncoding;
-               if ( $wgEditEncoding == '' || $wgEditEncoding == 'UTF-8' ) {
-                       return $s;
-               } else {
-                       return $this->iconv( 'UTF-8', $wgEditEncoding, $s );
-               }
+               return $s;
        }
 
        /**
         * @param string $s
         * @return string
+        * @deprecated No-op since 1.28
         */
        function recodeInput( $s ) {
-               # Take the previous into account.
-               global $wgEditEncoding;
-               if ( $wgEditEncoding != '' ) {
-                       $enc = $wgEditEncoding;
-               } else {
-                       $enc = 'UTF-8';
-               }
-               if ( $enc == 'UTF-8' ) {
-                       return $s;
-               } else {
-                       return $this->iconv( $enc, 'UTF-8', $s );
-               }
+               return $s;
        }
 
        /**
diff --git a/languages/classes/LanguageEo.php b/languages/classes/LanguageEo.php
deleted file mode 100644 (file)
index 3fec5fc..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-<?php
-/**
- * Esperanto (Esperanto) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @author Brion Vibber <brion@pobox.com>
- * @ingroup Language
- */
-
-/**
- * Esperanto (Esperanto)
- *
- * @ingroup Language
- */
-class LanguageEo extends Language {
-       /**
-        * Wrapper for charset conversions.
-        *
-        * In most languages, this calls through to standard system iconv(), but
-        * for Esperanto we're also adding a special pseudo-charset to convert
-        * accented characters to/from the ASCII-friendly "X" surrogate coding:
-        *
-        *     cx = ĉ     cxx = cx
-        *     gx = ĝ     gxx = gx
-        *     hx = ĥ     hxx = hx
-        *     jx = ĵ     jxx = jx
-        *     sx = ŝ     sxx = sx
-        *     ux = ŭ     uxx = ux
-        *     xx = x
-        *
-        *   http://en.wikipedia.org/wiki/Esperanto_orthography#X-system
-        *   http://eo.wikipedia.org/wiki/X-sistemo
-        *
-        * X-conversion is applied, in either direction, between "utf-8" and "x" charsets;
-        * this comes into effect when input is run through $wgRequest->getText() and the
-        * $wgEditEncoding is set to 'x'.
-        *
-        * In the long run, this should be moved out of here and into the client-side
-        * editor behavior; the original server-side translation system dates to 2002-2003
-        * when many browsers with really bad Unicode support were still in use.
-        *
-        * @param string $in Input character set
-        * @param string $out Output character set
-        * @param string $string Text to be converted
-        * @return string
-        */
-       public function iconv( $in, $out, $string ) {
-               if ( strcasecmp( $in, 'x' ) == 0 && strcasecmp( $out, 'utf-8' ) == 0 ) {
-                       return preg_replace_callback(
-                               '/([cghjsu]x?)((?:xx)*)(?!x)/i',
-                               [ $this, 'strrtxuCallback' ], $string );
-               } elseif ( strcasecmp( $in, 'UTF-8' ) == 0 && strcasecmp( $out, 'x' ) == 0 ) {
-                       # Double Xs only if they follow cxapelutaj literoj.
-                       return preg_replace_callback(
-                               '/((?:[cghjsu]|\xc4[\x88\x89\x9c\x9d\xa4\xa5\xb4\xb5]|\xc5[\x9c\x9d\xac\xad])x*)/i',
-                               [ $this, 'strrtuxCallback' ], $string );
-               }
-               return parent::iconv( $in, $out, $string );
-       }
-
-       /**
-        * @param array $matches
-        * @return string
-        */
-       function strrtuxCallback( $matches ) {
-               static $ux = [
-                       'x' => 'xx', 'X' => 'Xx',
-                       "\xc4\x88" => "Cx", "\xc4\x89" => "cx",
-                       "\xc4\x9c" => "Gx", "\xc4\x9d" => "gx",
-                       "\xc4\xa4" => "Hx", "\xc4\xa5" => "hx",
-                       "\xc4\xb4" => "Jx", "\xc4\xb5" => "jx",
-                       "\xc5\x9c" => "Sx", "\xc5\x9d" => "sx",
-                       "\xc5\xac" => "Ux", "\xc5\xad" => "ux",
-               ];
-               return strtr( $matches[1], $ux );
-       }
-
-       /**
-        * @param array $matches
-        * @return string
-        */
-       function strrtxuCallback( $matches ) {
-               static $xu = [
-                       'xx' => 'x', 'xX' => 'x',
-                       'Xx' => 'X', 'XX' => 'X',
-                       "Cx" => "\xc4\x88", "CX" => "\xc4\x88",
-                       "cx" => "\xc4\x89", "cX" => "\xc4\x89",
-                       "Gx" => "\xc4\x9c", "GX" => "\xc4\x9c",
-                       "gx" => "\xc4\x9d", "gX" => "\xc4\x9d",
-                       "Hx" => "\xc4\xa4", "HX" => "\xc4\xa4",
-                       "hx" => "\xc4\xa5", "hX" => "\xc4\xa5",
-                       "Jx" => "\xc4\xb4", "JX" => "\xc4\xb4",
-                       "jx" => "\xc4\xb5", "jX" => "\xc4\xb5",
-                       "Sx" => "\xc5\x9c", "SX" => "\xc5\x9c",
-                       "sx" => "\xc5\x9d", "sX" => "\xc5\x9d",
-                       "Ux" => "\xc5\xac", "UX" => "\xc5\xac",
-                       "ux" => "\xc5\xad", "uX" => "\xc5\xad",
-               ];
-               return strtr( $matches[1], $xu ) . strtr( $matches[2], $xu );
-       }
-
-       function initEncoding() {
-               global $wgEditEncoding;
-               $wgEditEncoding = 'x';
-       }
-}
index a7de1f9..836fb86 100644 (file)
@@ -78,6 +78,7 @@ class Names {
                'az' => 'azərbaycanca', # Azerbaijani
                'azb' => 'تۆرکجه', # South Azerbaijani
                'ba' => 'башҡортса', # Bashkir
+               'ban' => 'Basa Bali', # Balinese
                'bar' => 'Boarisch', # Bavarian (Austro-Bavarian and South Tyrolean)
                'bat-smg' => 'žemaitėška', # Samogitian (deprecated code, 'sgs' in ISO 693-3 since 2010-06-30 )
                'bbc' => 'Batak Toba', # Batak Toba (falls back to bbc-latn)
@@ -373,6 +374,7 @@ class Names {
                'shi' => 'Tašlḥiyt/ⵜⴰⵛⵍⵃⵉⵜ', # Tachelhit (multiple scripts - defaults to Latin)
                'shi-tfng' => 'ⵜⴰⵛⵍⵃⵉⵜ', # Tachelhit (Tifinagh script)
                'shi-latn' => 'Tašlḥiyt', # Tachelhit (Latin script)
+               'shn' => 'ၽႃႇသႃႇတႆး ', # Shan
                'si' => 'සිංහල', # Sinhalese
                'simple' => 'Simple English', # Simple English
                'sk' => 'slovenčina', # Slovak
index b7943ed..37a0584 100644 (file)
@@ -421,7 +421,6 @@ public static $zh2Hant = [
 '埘' => '塒',
 '埙' => '塤',
 '埚' => '堝',
-'埯' => '垵',
 '堑' => '塹',
 '堕' => '墮',
 '墙' => '牆',
@@ -3205,7 +3204,7 @@ public static $zh2Hant = [
 '不好干预' => '不好干預',
 '不嫌母丑' => '不嫌母醜',
 '不寒而栗' => '不寒而慄',
-'不吊' => '不弔',
+'不吊,' => '不弔,',
 '不卷' => '不捲',
 '不采' => '不採',
 '不斗胆' => '不斗膽',
@@ -3567,6 +3566,8 @@ public static $zh2Hant = [
 '于康震' => '于康震',
 '于广洲' => '于廣洲',
 '于廣洲' => '于廣洲',
+'于建嵘' => '于建嶸',
+'于建嶸' => '于建嶸',
 '于式枚' => '于式枚',
 '于从濂' => '于從濂',
 '于從濂' => '于從濂',
@@ -3815,6 +3816,7 @@ public static $zh2Hant = [
 '并入' => '併入',
 '并兼' => '併兼',
 '并到' => '併到',
+'并力' => '併力',
 '并合' => '併合',
 '并名' => '併名',
 '并吞' => '併吞',
@@ -4034,7 +4036,7 @@ public static $zh2Hant = [
 '其次辟地' => '其次辟地',
 '其余' => '其餘',
 '典范' => '典範',
-'兼并' => '兼',
+'兼并' => '兼',
 '冉有仆' => '冉有僕',
 '冗余' => '冗餘',
 '冤仇' => '冤讎',
@@ -4421,6 +4423,7 @@ public static $zh2Hant = [
 '吟游' => '吟遊',
 '吧台' => '吧檯',
 '含齿戴发' => '含齒戴髮',
+'吸干' => '吸乾',
 '吹干' => '吹乾',
 '吹发' => '吹髮',
 '吹胡' => '吹鬍',
@@ -4964,7 +4967,6 @@ public static $zh2Hant = [
 '嶒棱' => '嶒稜',
 '岳岳' => '嶽嶽',
 '岳麓' => '嶽麓',
-'川谷' => '川穀',
 '巡回医疗' => '巡回醫療',
 '巡回' => '巡迴',
 '巡游' => '巡遊',
@@ -5007,7 +5009,6 @@ public static $zh2Hant = [
 '年谷' => '年穀',
 '年里' => '年裡',
 '年鉴' => '年鑑',
-'并力' => '并力',
 '并州' => '并州',
 '并日而食' => '并日而食',
 '并迭' => '并迭',
@@ -5118,7 +5119,6 @@ public static $zh2Hant = [
 '吊孝' => '弔孝',
 '吊客' => '弔客',
 '吊宴' => '弔宴',
-'吊带' => '弔帶',
 '吊影' => '弔影',
 '吊恤' => '弔恤',
 '吊慰' => '弔慰',
@@ -5127,7 +5127,6 @@ public static $zh2Hant = [
 '吊撒' => '弔撒',
 '吊文' => '弔文',
 '吊旗' => '弔旗',
-'吊死' => '弔死',
 '吊民' => '弔民',
 '吊祭' => '弔祭',
 '吊纸' => '弔紙',
@@ -5141,6 +5140,7 @@ public static $zh2Hant = [
 '吊贺迎送' => '弔賀迎送',
 '吊头' => '弔頭',
 '吊鹤' => '弔鶴',
+'引发' => '引發',
 '引斗' => '引鬥',
 '弘历' => '弘曆',
 '弘历史' => '弘歷史',
@@ -5154,6 +5154,7 @@ public static $zh2Hant = [
 '张柏芝' => '張栢芝',
 '张乐于张徐' => '張樂于張徐',
 '張樂于張徐' => '張樂于張徐',
+'強制' => '強制',
 '强制' => '強制',
 '强制作用' => '強制作用',
 '强奸' => '強姦',
@@ -5262,8 +5263,6 @@ public static $zh2Hant = [
 '心系一' => '心繫一',
 '心系世' => '心繫世',
 '心系中' => '心繫中',
-'心系乔' => '心繫乔',
-'心繫乔' => '心繫乔',
 '心系五' => '心繫五',
 '心系京' => '心繫京',
 '心系人' => '心繫人',
@@ -5288,6 +5287,7 @@ public static $zh2Hant = [
 '心系和' => '心繫和',
 '心系哪' => '心繫哪',
 '心系唐' => '心繫唐',
+'心系乔' => '心繫喬',
 '心系嘱' => '心繫囑',
 '心系四' => '心繫四',
 '心系困' => '心繫困',
@@ -5578,6 +5578,7 @@ public static $zh2Hant = [
 '抱素怀朴' => '抱素懷樸',
 '抵御' => '抵禦',
 '抹干' => '抹乾',
+'抽干' => '抽乾',
 '抽公签' => '抽公籤',
 '抽签' => '抽籤',
 '抿发' => '抿髮',
@@ -5625,7 +5626,6 @@ public static $zh2Hant = [
 '挌斗' => '挌鬥',
 '挑大梁' => '挑大樑',
 '挑斗' => '挑鬥',
-'振荡' => '振蕩',
 '捉奸徒' => '捉奸徒',
 '捉奸细' => '捉奸細',
 '捉奸贼' => '捉奸賊',
@@ -5696,6 +5696,8 @@ public static $zh2Hant = [
 '扫荡' => '掃蕩',
 '授勋' => '授勳',
 '掌柜' => '掌柜',
+'排干' => '排乾',
+'排干部' => '排幹部',
 '排骨面' => '排骨麵',
 '挂名' => '掛名',
 '挂历' => '掛曆',
@@ -6070,9 +6072,8 @@ public static $zh2Hant = [
 '李連杰' => '李連杰',
 '材干' => '材幹',
 '村落发' => '村落發',
-'村里' => '村裡',
-'村里長' => '村里長',
-'村里长' => '村里長',
+'村里有' => '村裡有',
+'村里的' => '村裡的',
 '杜老志道' => '杜老誌道',
 '杞宋无征' => '杞宋無徵',
 '束发' => '束髮',
@@ -6627,7 +6628,7 @@ public static $zh2Hant = [
 '营干' => '營幹',
 '烩面' => '燴麵',
 '烬余' => '燼餘',
-'爆发指数' => '爆發指數',
+'爆发' => '爆發',
 '争奇斗妍' => '爭奇鬥妍',
 '争奇斗异' => '爭奇鬥異',
 '争奇斗艳' => '爭奇鬥豔',
@@ -6989,6 +6990,7 @@ public static $zh2Hant = [
 '谷保家商' => '穀保家商',
 '谷仓' => '穀倉',
 '谷圭' => '穀圭',
+'谷城县' => '穀城縣',
 '谷场' => '穀場',
 '谷子' => '穀子',
 '谷日' => '穀日',
@@ -7583,6 +7585,7 @@ public static $zh2Hant = [
 '姜老辣' => '薑老辣',
 '姜茶' => '薑茶',
 '姜蓉' => '薑蓉',
+'姜还是老的辣' => '薑還是老的辣',
 '姜饼' => '薑餅',
 '姜黄' => '薑黃',
 '薙发' => '薙髮',
@@ -7619,6 +7622,7 @@ public static $zh2Hant = [
 '药面儿' => '藥麵兒',
 '苏崑' => '蘇崑',
 '苏昆' => '蘇崑',
+'苹婆' => '蘋婆',
 '苹果' => '蘋果',
 '苹果干' => '蘋果乾',
 '兰溪市' => '蘭谿市',
@@ -8433,7 +8437,6 @@ public static $zh2Hant = [
 '里海茨' => '里海茨',
 '里铺' => '里舖',
 '重回' => '重回',
-'重折' => '重摺',
 '重于' => '重於',
 '重罗面' => '重羅麵',
 '重制' => '重製',
@@ -8512,6 +8515,7 @@ public static $zh2Hant = [
 '炼金术' => '鍊金術',
 '锲而不舍' => '鍥而不捨',
 '镰仓' => '鎌倉',
+'镇里' => '鎮裡',
 '镜图里' => '鏡圖裡',
 '锈病' => '鏽病',
 '锈菌' => '鏽菌',
@@ -8674,6 +8678,7 @@ public static $zh2Hant = [
 '陈杰' => '陳杰',
 '陳杰' => '陳杰',
 '陈炼' => '陳鍊',
+'陶制' => '陶製',
 '阳春面' => '陽春麵',
 '阳历' => '陽曆',
 '阳历史' => '陽歷史',
@@ -8725,6 +8730,7 @@ public static $zh2Hant = [
 '雪里红' => '雪裡紅',
 '雪里蕻' => '雪裡蕻',
 '云吞' => '雲吞',
+'云吞面' => '雲吞麵',
 '云笈七签' => '雲笈七籤',
 '云里雾里' => '雲裡霧裡',
 '云游' => '雲遊',
@@ -9424,7 +9430,6 @@ public static $zh2Hant = [
 '龜山庄' => '龜山庄',
 '龟鉴' => '龜鑑',
 ',并力' => ',並力',
-',并力攻' => ',并力攻',
 ',并力討' => ',并力討',
 ',并力讨' => ',并力討',
 ',个中' => ',箇中',
@@ -9859,9 +9864,7 @@ public static $zh2Hans = [
 '圞' => '𪢮',
 '坿' => '附',
 '垜' => '垛',
-'垵' => '埯',
 '埡' => '垭',
-'埰' => '采',
 '執' => '执',
 '堅' => '坚',
 '堊' => '垩',
@@ -13765,6 +13768,7 @@ public static $zh2Hans = [
 '甦醒' => '苏醒',
 '苧烯' => '苧烯',
 '薴烯' => '苧烯',
+'蘋婆' => '苹婆',
 '蘋果' => '苹果',
 '荠苧' => '荠苧',
 '榮陞' => '荣升',
@@ -14084,7 +14088,6 @@ public static $zh2TW = [
 '威士顿康星' => '威斯康辛',
 '威尔士' => '威爾斯',
 '威爾士' => '威爾斯',
-'字库' => '字型檔',
 '存盘' => '存檔',
 '孟德爾遜' => '孟德爾頌',
 '门德尔松' => '孟德爾頌',
@@ -14287,6 +14290,7 @@ public static $zh2TW = [
 '鼠标' => '滑鼠',
 '汉诺威' => '漢諾瓦',
 '漢诺威' => '漢諾瓦',
+'乌冬面' => '烏龍麵',
 '烤烟' => '烤菸',
 '烤煙' => '烤菸',
 '无烟日' => '無菸日',
@@ -15006,6 +15010,7 @@ public static $zh2HK = [
 '來著述' => '來著述',
 '來著錄' => '來著錄',
 '侵占' => '侵佔',
+'促著' => '促着',
 '俄占' => '俄佔',
 '保障著' => '保障着',
 '保障著作' => '保障著作',
@@ -15085,8 +15090,6 @@ public static $zh2HK = [
 '凶殘' => '兇殘',
 '凶殺' => '兇殺',
 '先占' => '先佔',
-'雪鐵龍' => '先進',
-'雪铁龙' => '先進',
 '光著' => '光着',
 '光著作' => '光著作',
 '光著名' => '光著名',
@@ -15275,6 +15278,7 @@ public static $zh2HK = [
 '咖哩' => '咖喱',
 '麥克風' => '咪高峰',
 '麦克风' => '咪高峰',
+'咬著' => '咬着',
 '哥特式' => '哥德式',
 '哥斯大黎加' => '哥斯達黎加',
 '哪里' => '哪裏',
@@ -16105,7 +16109,8 @@ public static $zh2HK = [
 '本著述' => '本著述',
 '本著錄' => '本著錄',
 '里瓦尔多' => '李華度',
-'村里' => '村裏',
+'村里有' => '村裏有',
+'村里的' => '村裏的',
 '杜塞道夫' => '杜塞爾多夫',
 '迪拜' => '杜拜',
 '東協助' => '東協助',
@@ -16343,6 +16348,7 @@ public static $zh2HK = [
 '為著者' => '為著者',
 '為著述' => '為著述',
 '為著錄' => '為著錄',
+'烏龍麵' => '烏冬麵',
 '菸' => '煙',
 '照占' => '照佔',
 '照著' => '照着',
@@ -17050,7 +17056,10 @@ public static $zh2HK = [
 '見著述' => '見著述',
 '見著錄' => '見著錄',
 '視著' => '視着',
+'視著作' => '視著作',
 '視著名' => '視著名',
+'視著稱' => '視著稱',
+'視著者' => '視著者',
 '角落里' => '角落裏',
 '分辨率' => '解像度',
 '解析度' => '解像度',
@@ -17382,6 +17391,7 @@ public static $zh2HK = [
 '鋪著者' => '鋪著者',
 '鋪著述' => '鋪著述',
 '鋪著錄' => '鋪著錄',
+'镇里' => '鎮裏',
 '镜图里' => '鏡圖裏',
 '钟在寺里' => '鐘在寺裏',
 '狄托' => '鐵托',
@@ -17768,6 +17778,7 @@ public static $zh2CN = [
 '麗著者' => '丽著者',
 '麗著述' => '丽著述',
 '麼著' => '么着',
+'烏龍麵' => '乌冬面',
 '樂著' => '乐着',
 '樂著書' => '乐著书',
 '樂著作' => '乐著作',
@@ -17897,7 +17908,9 @@ public static $zh2CN = [
 '側著述' => '侧著述',
 '可攜式' => '便携式',
 '攜帶型' => '便携式',
+'促著' => '促着',
 '保護著' => '保护着',
+'保鑣' => '保镖',
 '保障著' => '保障着',
 '保障著書' => '保障著书',
 '保障著作' => '保障著作',
@@ -18233,6 +18246,7 @@ public static $zh2CN = [
 '味著述' => '味著述',
 '咖哩' => '咖喱',
 '諮' => '咨',
+'咬著' => '咬着',
 '響著' => '响着',
 '響著書' => '响著书',
 '響著作' => '响著作',
@@ -18383,7 +18397,6 @@ public static $zh2CN = [
 '威爾斯' => '威尔士',
 '威斯伐倫' => '威斯特法伦',
 '字型大小' => '字号',
-'字型檔' => '字库',
 '欄位' => '字段',
 '位元組' => '字节',
 '存在著' => '存在着',
@@ -19841,7 +19854,10 @@ public static $zh2CN = [
 '見著述' => '见著述',
 '規畫' => '规划',
 '視著' => '视着',
+'視著作' => '视著作',
 '視著名' => '视著名',
+'視著稱' => '视著称',
+'視著者' => '视著者',
 '占士邦' => '詹姆斯·邦德',
 '警戒著' => '警戒着',
 '計畫' => '计划',
index 1cf554b..699185e 100644 (file)
        "newarticle": "(Barô)",
        "newarticletext": "Droëneuh ka neuseutöt peunawôt u laman nyang goh na.\nKeu neupeugöt laman nyan, neukeutik lam plôk di yup (eu [$1 laman beunantu] keu haba leubèh le).\nMeunyö droëneuh trôk keunoë hana neusaja, neuteugön tèk '''back''' bak ''browser'''droëneuh.",
        "anontalkpagetext": "----''Nyoe nakeuh ôn marit ureueng ngui nyang hana tamöng atawa hana geungui.''\nSaweub nyan, kamoe payah meukubah alamat IP-geuh keu meuparéksa. \nAlamat IP mungkén jingui lé padum-padum droe ureueng.\nMeunyoe droeneuh ureueng nyang hana tamöng nyan, tulông [[Special:CreateAccount|peugöt nan ureueng ngui]] atawa [[Special:UserLogin|tamöng log]] mangat meuteugah nibak bhah nyang hana meuphôm bak uroe la'én.",
-       "noarticletext": "Hana naseukah jinoë lam laman nyoë.\nJi Droëneuh jeuët [[Special:Search/{{PAGENAME}}|neumita keu nan ôn nyoë]] bak ôn-ôn la’én, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} log nyang na hubôngan], atawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} neu'andam ôn nyoë]</span>.",
+       "noarticletext": "Hana naseukah jinoë lam miëng nyoë.\nDroëneuh jeuët [[Special:Search/{{PAGENAME}}|neuseutöt nan miëng nyoë]] bak miëng-miëng la’én, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} neuseutöt log nyang na hubôngan], atawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} neupeugöt miëng nyoë]</span>.",
        "noarticletext-nopermission": "Hana asoë bak laman nyoë jinoë.\nDroëneuh jeuët [[Special:Search/{{PAGENAME}}|neumita keu nan ôn nyoë]] bak laman-laman la'én,\natawa <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} neumita log nyang na meuhubông]</span>, tapi Droëneuh hana idin keu neupeugöt laman nyoë",
        "userpage-userdoesnotexist-view": "Ureueng ngui \"$1\" hana teudapeuta.",
        "updated": "(Seubarô)",
        "recentchanges-label-minor": "Nyoe neuandam ubeut",
        "recentchanges-label-bot": "Neuandam nyoe geupubuet le bot",
        "recentchanges-label-unpatrolled": "Neuandam nyoe goh lom geukalon",
+       "recentchanges-label-plusminus": "Seunipat miëng geugantoë lé jeumeulah bita nyoë",
        "recentchanges-legend-heading": "<strong>Hareutoë:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (eu cit [[Special:NewPages|dapeuta laman barô]])",
        "rcnotefrom": "Di yup nyoë nakeuh neuubah yôh <strong>$2</strong> (geupeudeuh trôh ‘an <strong>$1</strong> neuubah).",
        "undelete-search-submit": "Mita",
        "namespace": "Ruweuëng nan:",
        "invert": "Peubalék peuniléh",
+       "tooltip-invert": "Neuceuë kutak nyoë keu neupeusom neuubah miëng lam ruweuëng nan nyang neupiléh (ngön ruweuëng nan teukaw`èt meunyö neuceuë)",
        "namespace_association": "Ruweuëng nan meuhubông",
+       "tooltip-namespace_association": "Neuceuë kutak nyoë keu neupeurôh ruweuëng nan marit atawa bhaih nyang teukaw`èt ngön ruweuëng nan teupiléh",
        "blanknamespace": "(Keuë)",
        "contributions": "Beuneuri {{GENDER:$1|ureuëng ngui}}",
        "contributions-title": "Beuneuri ureuëng ngui keu $1",
        "tags": "Tag neuubah nyang sah",
        "tag-filter": "Saréng [[Special:Tags|tag]]:",
        "tag-filter-submit": "Saréng",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag}}]]: $2)",
        "logentry-newusers-create": "$1 {{GENDER:$2|geupeugöt}} akun ureuëng ngui",
        "searchsuggest-search": "Mita",
        "duration-seconds": "{{PLURAL:$1|deutik}}",
index f63f7c3..97a8233 100644 (file)
@@ -10,7 +10,8 @@
                        "GeekEmad",
                        "Nemo bis",
                        "Shbib Al-Subaie",
-                       "Macofe"
+                       "Macofe",
+                       "علاء"
                ]
        },
        "tog-usenewrc": ")جمّع التعديلات حسب الصفحة في أحدث التغييرات وقائمة المراقبة (يتطلب جافاسكربت",
        "rc-enhanced-hide": "أخفِ التفاصيل",
        "recentchangeslinked": "تغييرات ذات علاقة",
        "recentchangeslinked-title": "التغييرات المرتبطة ب \"$1\"",
-       "recentchangeslinked-summary": "هذه قائمة بالتغييرات التي تمت حديثا للصفحات الموصولة من صفحة معينة (أو إلى الأعضاء ضمن تصنيف معين).\nالصفحات في [[Special:Watchlist|قائمة مراقبتك]] '''عريضة'''",
+       "recentchangeslinked-summary": "هذه قائمة بالتغييرات التي تمت حديثاً للصفحات الموصولة من صفحة معينة (أو إلى الأعضاء ضمن تصنيف معين).\nالصفحات في [[Special:Watchlist|قائمة مراقبتك]] '''عريضة'''",
        "recentchangeslinked-page": "اسم الصفحة:",
-       "recentchangeslinked-to": "أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضا عن ذلك",
+       "recentchangeslinked-to": "أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضاً عن ذلك",
        "uploadlogpage": "سجل الرفع",
        "filedesc": "ملخص:",
        "license": "ترخيص:",
index 73c4c8f..7bdc097 100644 (file)
        "october-date": "$1 Oktober",
        "november-date": "$1 November",
        "december-date": "$1 Desember",
+       "period-am": "AM",
+       "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Kategorie|Kategorieë}}",
        "category_header": "Bladsye in kategorie \"$1\"",
        "subcategories": "Subkategorieë",
        "morenotlisted": "Die lys is nie volledig nie.",
        "mypage": "Gebruikersblad",
        "mytalk": "Bespreking",
-       "anontalk": "Besprekingsblad vir hierdie IP",
+       "anontalk": "Bespreking",
        "navigation": "Navigasie",
        "and": "&#32;en",
        "qbfind": "Vind",
        "retypenew": "Tik nuwe wagwoord weer in",
        "resetpass_submit": "Stel wagwoord en meld aan",
        "changepassword-success": "U wagwoord is suksesvol gewysig!",
+       "botpasswords-label-create": "Skep",
+       "botpasswords-label-update": "Opdateer",
+       "botpasswords-label-cancel": "Kanselleer",
+       "botpasswords-label-delete": "Skrap",
+       "botpasswords-label-resetpassword": "Herstel wagwoord",
+       "botpasswords-label-grants": "Toepaslike regte:",
        "resetpass_forbidden": "Wagwoorde kannie gewysig word nie.",
        "resetpass-no-info": "U moet ingeteken wees om hierdie bladsy direk te kan gebruik.",
        "resetpass-submit-loggedin": "Verander wagwoord",
        "sig_tip": "Handtekening met datum",
        "hr_tip": "Horisontale streep (selde nodig)",
        "summary": "Opsomming:",
-       "subject": "Onderwerp/opskrif:",
+       "subject": "Onderwerp:",
        "minoredit": "Klein wysiging",
        "watchthis": "Hou bladsy dop",
        "savearticle": "Stoor bladsy",
+       "savechanges": "Stoor wysigings",
+       "publishpage": "Publiseer bladsy",
+       "publishchanges": "Publiseer wysigings",
        "preview": "Voorskou",
        "showpreview": "Wys voorskou",
        "showdiff": "Wys veranderings",
        "recentchanges-label-plusminus": "Bladsy is met die aantal grepe gewysig",
        "recentchanges-legend-heading": "<strong>Sleutel:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sien ook die [[Special:NewPages|lys van nuwe bladsye]])",
+       "recentchanges-submit": "Wys",
        "rcnotefrom": "Wysigings sedert <strong>$2</strong> (maksimum van <strong>$1</strong> word gewys).",
        "rclistfrom": "Vertoon wysigings vanaf $3 $2",
        "rcshowhideminor": "$1 klein wysigings",
        "mostrevisions": "Artikels met meeste wysigings",
        "prefixindex": "Alle bladsye (voorvoegselindeks)",
        "prefixindex-namespace": "Alle bladsye met die voorvoegsel (naamruimte $1)",
+       "prefixindex-submit": "Wys",
        "shortpages": "Kort bladsye",
        "longpages": "Lang bladsye",
        "deadendpages": "Doodloopbladsye",
        "apisandbox": "API-sandput",
        "apisandbox-api-disabled": "API is afgeskakel op hierdie webwerf.",
        "apisandbox-intro": "Gebruik hierdie bladsy om te eksperimenteer met die '''MediaWiki-API'''.\nSien die [https://www.mediawiki.org/wiki/API:Main_page API-dokumentasie] vir verdere details oor die gebruik van die API. Voorbeeld: [https://www.mediawiki.org/wiki/API#A_simple_example hoe die inhoud van 'n Tuisblad te laai]. Kies 'n handeling om meer voorbeelde te sien.",
+       "apisandbox-unfullscreen": "Wys bladsy",
        "apisandbox-submit": "Maak versoek",
        "apisandbox-reset": "Vee uit",
+       "apisandbox-retry": "Herprobeer",
        "apisandbox-examples": "Voorbeeld",
        "apisandbox-results": "Resultaat",
        "apisandbox-request-url-label": "Versoek-URL:",
        "specialloguserlabel": "Uitvoerende gebruiker:",
        "speciallogtitlelabel": "Teiken (bladsy of gebruiker):",
        "log": "Logboeke",
+       "logeventslist-submit": "Wys",
        "all-logs-page": "Alle openbare logboeke",
        "alllogstext": "Vertoon 'n samestelling van alle boekstawings van {{SITENAME}}.\nU kan die resultate vernou deur 'n boekstaaftipe, gebruikersnaam (kas-sensitief) of spesifieke blad (ook kas-sensitief) te kies.",
        "logempty": "Geen inskrywings in die logboek voldoen aan die kriteria nie.",
        "log-title-wildcard": "Soek bladsye wat met die naam begin",
        "showhideselectedlogentries": "Wys/versteek gekose logboekreëls",
+       "checkbox-select": "Selekteer: $1",
+       "checkbox-all": "Alle",
+       "checkbox-none": "Geen",
+       "checkbox-invert": "Omkeer",
        "allpages": "Alle bladsye",
        "nextpage": "Volgende blad ($1)",
        "prevpage": "Vorige bladsye ($1)",
        "cachedspecial-viewing-cached-ts": "U kyk na 'n gekasde weergawe ban die bladsy, wat moontlik nie volledig bygewerk is nie.",
        "cachedspecial-refresh-now": "Wys nuutste.",
        "categories": "Kategorieë",
+       "categories-submit": "Wys",
        "categoriespagetext": "Die volgende {{PLURAL:$1|kategorie|kategorieë}} bevat bladsye of media.\n[[Special:UnusedCategories|Ongebruikte kategorieë]] word nie gewys nie.\nSien ook [[Special:WantedCategories|nie-bestaande kategorieë met verwysings]].",
        "categoriesfrom": "Wys kategorieë vanaf:",
        "deletedcontributions": "Geskrapte gebruikersbydraes",
        "wlnote": "Hier volg die laaste {{PLURAL:$1|verandering|'''$1''' veranderings}} binne die laaste {{PLURAL:$2|uur|'''$2''' ure}}, soos vanaf $3 om $4.",
        "wlshowlast": "Wys afgelope $1 ure, $2 dae of",
        "watchlist-hide": "Versteek",
+       "watchlist-submit": "Wys",
        "wlshowtime": "Wys laaste:",
        "wlshowhideminor": "klein wysigings",
        "wlshowhidebots": "robotte",
        "delete-confirm": "Skrap \"$1\"",
        "delete-legend": "Skrap",
        "historywarning": "'''Waarskuwing:''' Die bladsy wat u wil verwyder het 'n geskiedenis met ongeveer $1 {{PLURAL:$1|weergawe|weergawes}}:",
+       "historyaction-submit": "Wys",
        "confirmdeletetext": "U staan op die punt om 'n bladsy of prent, insluitende hul geskiedenis, uit die databasis te skrap.\nBevestig asseblief dat u dit wil doen, dat u die gevolge verstaan en dat u dit doen in ooreenstemming met die [[{{MediaWiki:Policy-url}}|beleid]].",
        "actioncomplete": "Aksie uitgevoer",
        "actionfailed": "Aksie het gefaal",
        "sessionfailure-title": "Sessie het gefaal",
        "sessionfailure": "Dit lyk of daar 'n probleem met u sessie is.\nHierdie aksie is gekanselleer omdat dit 'n veiligheidsrisiko is (moontlike kaping van u sessie).\nGaan een bladsy terug, herlaai die bladsy en probeer dan weer.",
        "changecontentmodel-reason-label": "Rede:",
+       "changecontentmodel-submit": "Wysig",
        "protectlogpage": "Beskermingboekstaaf",
        "protectlogtext": "Hieronder is 'n lys van veranderinge wat aan die beveilig van bladsye aangebring is.\nSien die [[Special:ProtectedPages|lys van beveiligde bladsye]] vir alle bladsye wat tans operasioneel beveilig is.",
        "protectedarticle": "het [[$1]] beskerm",
        "confirm-watch-top": "Voeg hierdie bladsy by u dophoulys?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Verwyder hierdie bladsy van u dophoulys?",
+       "confirm-rollback-button": "OK",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← vorige bladsy",
        "imgmultipagenext": "volgende bladsy →",
        "watchlisttools-edit": "Bekyk en wysig dophoulys",
        "watchlisttools-raw": "Wysig bronkode",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|kontak]])",
+       "timezone-local": "Lokaal",
        "duplicate-defaultsort": "Waarskuwing: Die standaardsortering \"$2\" kry voorrang voor die sortering \"$1\".",
        "version": "Weergawe",
        "version-extensions": "Uitbreidings geïnstalleer",
        "tags-activate-reason": "Rede:",
        "tags-activate-submit": "Aktiveer",
        "tags-deactivate-reason": "Rede:",
+       "tags-deactivate-submit": "Deaktiveer",
        "tags-edit-existing-tags-none": "''Geen''",
        "tags-edit-reason": "Rede:",
        "comparepages": "Vergelyk bladsye",
        "pagelang-language": "Taal",
        "pagelang-use-default": "Gebruik standaard taal",
        "pagelang-select-lang": "Kies taal",
+       "pagelang-submit": "Dien in",
        "right-pagelang": "Wysig die taal van die bladsy",
        "log-name-pagelang": "Logboek van taalwysigings",
        "log-description-pagelang": "Hierdie is 'n logboek van wysigings van die taal van bladsye.",
        "logentry-pagelang-pagelang": "$1 wysig die taal van bladsy '$3' van $4 na $5.",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>afgeskakel</strong>)",
        "mediastatistics": "Mediastatistieke",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 greep|$1 grepe}} ($2; $3%)",
        "mediastatistics-table-mimetype": "MIME-tipe",
        "mediastatistics-header-text": "Tekslêers",
        "mediastatistics-header-executable": "Uitvoerbare lêers",
        "mediastatistics-header-archive": "Gekompakteerde lêers",
+       "mediastatistics-header-total": "Alle lêers",
        "json-error-syntax": "Sintaksfout",
        "headline-anchor-title": "Skakel na die afdeling",
        "special-characters-group-latin": "Latyns",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
        "mw-widgets-titleinput-description-new-page": "bladsy bestaan nog nie",
        "mw-widgets-titleinput-description-redirect": "aanstuur na $1",
-       "api-error-blacklisted": "Kies asseblief 'n ander, beskrywende titel."
+       "log-action-filter-all": "Alle",
+       "authprovider-resetpass-skip-label": "Slaan oor"
 }
index 5b46fa8..f76e97e 100644 (file)
                        "ASammour",
                        "Maroen1990",
                        "Sonic N800",
-                       "Jdforrester"
+                       "Jdforrester",
+                       "Alaa",
+                       "Izoozo",
+                       "علاء"
                ]
        },
        "tog-underline": "سطر تحت الوصلات:",
@@ -89,7 +92,7 @@
        "tog-enotifrevealaddr": "أظهر عنوان بريدي الإلكتروني في إشعارات البريد الإلكتروني",
        "tog-shownumberswatching": "اعرض عدد المستخدمين المراقبين",
        "tog-oldsig": "التوقيع الحالي:",
-       "tog-fancysig": "وضع الوصلة يدويا واستعمال نص الويكي",
+       "tog-fancysig": "وضع الوصلة يدوياً واستعمال نص الويكي",
        "tog-uselivepreview": "استعمال المعاينة المباشرة",
        "tog-forceeditsummary": "نبهني عند عدم إدخال ملخص تعديل",
        "tog-watchlisthideown": "أخف تعديلاتي من قائمة المراقبة",
        "tog-ccmeonemails": "أرسل إلي نسخا من الرسائل الإلكترونية التي أرسلها إلى المستخدمين الآخرين",
        "tog-diffonly": "لا تعرض محتوى الصفحة أسفل الفرق",
        "tog-showhiddencats": "أظهر التصنيفات المخفية",
-       "tog-norollbackdiff": "أزÙ\84 Ø§Ù\84Ù\81رÙ\82 Ø¨Ø¹Ø¯ Ø¥Ø­Ø¯Ø§Ø« Ø§Ø³ØªØ±Ø¬Ø§ع",
+       "tog-norollbackdiff": "عدÙ\85 Ø¥Ø¸Ù\87ار Ø§Ù\84اختÙ\84اÙ\81ات Ø¨Ø¹Ø¯ ØªÙ\86Ù\81Ù\8aØ° Ø§Ù\84تراجع",
        "tog-useeditwarning": "حذّرني عندما أغادر تحرير صفحة فيها تغييرات لم أحفظها",
        "tog-prefershttps": "دائما استخدم اتصالا آمنا بعد الدخول",
        "underline-always": "دائما",
        "category_header": "صفحات تصنيف «$1»",
        "subcategories": "تصنيفات فرعية",
        "category-media-header": "ملفات تصنيف \"$1\"",
-       "category-empty": "هذا التصنيف لا يحتوي حاليا على صفحات أو ملفات.",
+       "category-empty": "هذا التصنيف لا يحتوي حالياً على أي صفحات أو ملفات.",
        "hidden-categories": "{{PLURAL:$1|لا تصنيفات مخفية|تصنيف مخفي|تصنيفان مخفيان|تصنيفات مخفية}}",
        "hidden-category-category": "تصنيفات مخفية",
        "category-subcat-count": "{{PLURAL:$2|هذا التصنيف يحوي التصنيف الفرعي التالي|هذا التصنيف يحوي {{PLURAL:$1||التصنيف الفرعي|تصنيفين فرعيين|$1 تصنيفات فرعية}}، من إجمالي $2.}}",
        "password-change-forbidden": "أنت لا يمكنك تغيير كلمات السر على هذا الويكي.",
        "externaldberror": "هناك إما خطأ في دخول قاعدة البيانات الخارجية أو أنه غير مسموح لك بتحديث حسابك الخارجي.",
        "login": "تسجيل الدخول",
+       "login-security": "توكيد هويتك",
        "nav-login-createaccount": "دخول / إنشاء حساب",
        "userlogin": "دخول / إنشاء حساب",
        "userloginnocreate": "تسجيل الدخول",
        "userlogin-resetpassword-link": "نسيت كلمة مرورك؟",
        "userlogin-helplink2": "المساعدة في الدخول",
        "userlogin-loggedin": "أنت {{GENDER:$1|مسجل|مسجلة}} الدخول مسبقًا باسم $1. {{GENDER:$1|استخدم|استخدمي}} النموذج بالأسفل لتسجيل الدخول بحساب آخر.",
+       "userlogin-reauth": "عليك الدخول مرة أخرى لتؤكد أنك {{GENDER:$1|$1}}.",
        "userlogin-createanother": "إنشاء حساب آخر",
        "createacct-emailrequired": "عنوان البريد الإلكتروني",
        "createacct-emailoptional": "البريد الإلكتروني (اختياري)",
        "createacct-reason-ph": "لماذا تقوم بإنشاء حساب آخر",
        "createacct-submit": "افتح الحساب",
        "createacct-another-submit": "أنشئ حسابا",
+       "createacct-continue-submit": "مواصلة إنشاء الحساب",
+       "createacct-another-continue-submit": "مواصلة إنشاء الحساب",
        "createacct-benefit-heading": "{{SITENAME}} موقع يساهم فيه أشخاص مثلك.",
        "createacct-benefit-body1": "{{PLURAL:$1|تحريرا|تحريرات}}",
        "createacct-benefit-body2": "{{PLURAL:$1|صفحة}}",
        "resetpass-abort-generic": "منعت مُلحقة إتمام صيرورة تغيير كلمة السّر.",
        "resetpass-expired": "انتهت مدة صلاحية كلمة السر الخاصة بك. الرجاء تعيين كلمة سر جديدة لتسجيل الدخول.",
        "resetpass-expired-soft": "انتهت مدة صلاحية كلمة السر الخاصة بك. الرجاء تعيين كلمة سر جديدة الآن أو النقر على زر إلغاء لإعادة تعيين كلمة السر لاحقاً.",
-       "resetpass-validity-soft": "كلمة السر الخاصة بك غير مقبولة :  $1 \n\nرجاءا اختر كلمة سر جديدة الآن، أو انقر فوق \"{{int:authprovider-resetpass-skip-label}}\" لتغييرها في وقت لاحق.",
+       "resetpass-validity-soft": "كلمة السر الخاصة بك غير صالحة :  $1 \n\nرجاءا اختر كلمة سر جديدة الآن، أو انقر فوق \"{{int:authprovider-resetpass-skip-label}}\" لتغييرها في وقت لاحق.",
        "passwordreset": "إعادة ضبط كلمة السر",
        "passwordreset-text-one": "أكمل هذا النموذج لإعادة ضبط كلمة السر الخاصة بك.",
        "passwordreset-text-many": "{{PLURAL:$1||املأ الحقل لتستعيد كلمة السر|املأ أحد الحقلين لتستعيد كلمة السر|املأ أحد الحقول لتستعيد كلمة السر}}.",
        "minoredit": "هذا تعديل طفيف",
        "watchthis": "راقب هذه الصفحة",
        "savearticle": "احفظ الصفحة",
+       "savechanges": "احفظ التغييرات",
        "publishpage": "نشر الصفحة",
+       "publishchanges": "انشر التغييرات",
        "preview": "عرض مسبق",
        "showpreview": "أظهر معاينة",
        "showdiff": "عرض التغييرات",
        "rev-delundel": "أظهر/أخف",
        "rev-showdeleted": "أظهر",
        "revisiondelete": "حذف/استرجاع المراجعات",
-       "revdelete-nooldid-title": "مراجعة هدف غير صحيحة",
+       "revdelete-nooldid-title": "النسخة المطلوبة غير محددة",
        "revdelete-nooldid-text": "إما أنك لم تحدد مراجعة معينة هدفا لهذه الوظيفة، أو أن المراجعة المحددة غير موجودة، أو أنك تحاول إخفاء المراجعة الحالية.",
        "revdelete-no-file": "الملف المحدد غير موجود.",
        "revdelete-show-file-confirm": "هل أنت متأكد أنك تريد رؤية مراجعة محذوفة للملف \"<nowiki>$1</nowiki>\" بتاريخ $2 الساعة $3؟",
        "lineno": "سطر $1:",
        "compareselectedversions": "قارن بين النسختين المختارتين",
        "showhideselectedversions": "أظهر/أخف المراجعات المختارة",
-       "editundo": "رجÙ\88ع",
+       "editundo": "تراجع",
        "diff-empty": "(لا فرق)",
        "diff-multi-sameuser": "({{PLURAL:$1|لا مراجعات متوسطة|مراجعة متوسطة واحدة|مراجعتان متوسطتان|$1 مراجعات متوسطة|$1 مراجعة متوسطة}} بواسطة نفس المستخدم غير {{PLURAL:$1|معروضة|معروضة|معروضتين|معروضة}})",
        "diff-multi-otherusers": "({{PLURAL:$1|لا مراجعات|مراجعة متوسطة واحدة|مراجعتان متوسطتان|$1 مراجعات متوسطة|$1 مراجعة متوسطة}} بواسطة {{PLURAL:$2|ولا مستخدم|مستخدم واحد آخر|مستخدمين اثنين آخرين|$2 مستخدمين|$2 مستخدماً|$2 مستخدم}} غير {{PLURAL:$1|معروضة|معروضة|معروضتين|معروضة}})",
        "badsig": "توقيع خام غير صحيح؛ تحقق من وسوم HTML.",
        "badsiglength": "توقيعك طويل جدا.\nيجب أن يكون أقل من $1 {{PLURAL:$1|حرف|حروف}}.",
        "yourgender": "كيف تفضل أن توصف؟",
-       "gender-unknown": "عند ذكرك، البرنامج سيستخدم كلمات محايدة النوع متى ما كان ذلك ممكنا",
+       "gender-unknown": "عند ذكرك، البرنامج سيستخدم كلمات محايدة النوع متى ما كان ذلك ممكناً",
        "gender-male": "هو يعدل صفحات الويكي",
        "gender-female": "هي تعدل صفحات الويكي",
-       "prefs-help-gender": "ضبط هذا التفضيل اختياري.\nيستخدم البرنامج هذه القيمة لمخاطبتك ومخاطبة الآخرين عنك وفقا للصيغة النحوية الملائمة للجنس.\nستكون هذه المعلومة علنية.",
+       "prefs-help-gender": "ضبط هذا التفضيل اختياري.\nيستخدم البرنامج هذه القيمة لمخاطبتك ومخاطبة الآخرين عنك وفقاً للصيغة النحوية الملائمة للجنس.\nهذه المعلومة ستكون علنية.",
        "email": "البريد الإلكتروني",
        "prefs-help-realname": "الاسم الحقيقي اختياري.\nلو اخترت أن توفره، فسيستخدم في الإشارة إلى عملك.",
        "prefs-help-email": "تحديد عنوان البريد الإلكتروني اختياري، ولكنه يلزم لإعادة تعيين كلمة المرور في حال نسيت كلمة المرور الخاصة بك.",
        "userrights-removed-self": "أزلت بنجاح صلاحياتك، ولن تتمكن من الوصول لهذه الصفحة مجددا.",
        "group": "المجموعة:",
        "group-user": "مستخدمون",
-       "group-autoconfirmed": "مستخدمون مؤكدون تلقائيا",
+       "group-autoconfirmed": "مستخدمون مؤكدون تلقائياً",
        "group-bot": "بوتات",
        "group-sysop": "مديرو نظام",
        "group-bureaucrat": "بيروقراطيون",
-       "group-suppress": "Ù\86ظار",
+       "group-suppress": "Ù\85زÙ\8aÙ\84Ù\88Ù\86",
        "group-all": "(الكل)",
        "group-user-member": "{{GENDER:$1|مستخدم|مستخدمة}}",
        "group-autoconfirmed-member": "{{GENDER:$1|مستخدم مؤكد تلقائيًا|مستخدمة مؤكدة تلقائيًا}}",
        "group-bot-member": "{{GENDER:$1|بوت}}",
        "group-sysop-member": "{{GENDER:$1|إداري|إدارية}}",
        "group-bureaucrat-member": "{{GENDER:$1|بيروقراط}}",
-       "group-suppress-member": "{{GENDER:$1|Ù\86اظر|Ù\86اظرة}}",
+       "group-suppress-member": "{{GENDER:$1|Ù\85زÙ\8aÙ\84\85زÙ\8aÙ\84ة}}",
        "grouppage-user": "{{ns:project}}:مستخدمون",
-       "grouppage-autoconfirmed": "{{ns:project}}:مستخدمون مؤكدون تلقائيا",
+       "grouppage-autoconfirmed": "{{ns:project}}:مستخدمون مؤكدون تلقائياً",
        "grouppage-bot": "{{ns:project}}:بوتات",
        "grouppage-sysop": "{{ns:project}}:إداريون",
        "grouppage-bureaucrat": "{{ns:project}}:بيروقراطيون",
-       "grouppage-suppress": "{{ns:project}}:نظار",
+       "grouppage-suppress": "{{ns:project}}:خاصية الإزالة",
        "right-read": "قراءة الصفحات",
        "right-edit": "تعديل الصفحات",
        "right-createpage": "إنشاء الصفحات (التي ليست صفحات نقاش)",
        "rightslogtext": "هذا سجل بالتغييرات في صلاحيات المستخدمين.",
        "action-read": "قراءة هذه الصفحة",
        "action-edit": "تعديل هذه الصفحة",
-       "action-createpage": "إنشاء الصفحات",
+       "action-createpage": "إنشاء هذه الصفحة",
        "action-createtalk": "إنشاء صفحات النقاش",
        "action-createaccount": "إنشاء حساب المستخدم هذا",
        "action-autocreateaccount": "تلقائيا إنشاء هذا الحساب مستخدم خارجي",
        "recentchangeslinked-feed": "تغييرات ذات علاقة",
        "recentchangeslinked-toolbox": "تغييرات ذات علاقة",
        "recentchangeslinked-title": "التغييرات المرتبطة بصفحة «$1»",
-       "recentchangeslinked-summary": "هذه قائمة بالتغييرات التي تمت حديثا للصفحات الموصولة من صفحة معينة (أو إلى الأعضاء ضمن تصنيف معين).\nالصفحات في [[Special:Watchlist|قائمة مراقبتك]] '''مغلظة'''",
+       "recentchangeslinked-summary": "هذه قائمة بالتغييرات التي تمت حديثاً للصفحات الموصولة من صفحة معينة (أو إلى الأعضاء ضمن تصنيف معين).\nالصفحات في [[Special:Watchlist|قائمة مراقبتك]] '''عريضة'''",
        "recentchangeslinked-page": "اسم الصفحة:",
-       "recentchangeslinked-to": "أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضا عن ذلك",
+       "recentchangeslinked-to": "أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضاً عن ذلك",
        "recentchanges-page-added-to-category": "[[:$1]] أضيفت إلى التصنيف",
        "recentchanges-page-added-to-category-bundled": "أضيفت [[:$1]] و{{PLURAL:$2|صفحة واحدة|صفحتان|$2 صفحات}} إلى التصنيف",
        "recentchanges-page-removed-from-category": "أزيلت [[:$1]] من التصنيف",
        "watching": "يراقب...",
        "unwatching": "إزالة المراقبة...",
        "watcherrortext": "حدث خطأ أثناء تغيير إعدادات الرصد الخاصة بك \"$1\".",
-       "enotif_reset": "عÙ\84Ù\85 Ø¹Ù\84Ù\89 Ù\83Ù\84 Ø§Ù\84صÙ\81حات Ù\83Ù\85زارة",
+       "enotif_reset": "عÙ\84Ù\85 Ø¹Ù\84Ù\89 Ù\83Ù\84 Ø§Ù\84صÙ\81حات Ù\83Ù\85رئÙ\8aة",
        "enotif_impersonal_salutation": "مستخدم {{SITENAME}}",
        "enotif_subject_deleted": "الصفحة {{SITENAME}} $1 حذفها {{الجنس: $2 | $2 }}",
        "enotif_subject_created": "الصفحة {{SITENAME}}  $1  أنشأها {{الجنس: $2 | $2 }}",
        "delete-warning-toobig": "لهذه الصفحة تاريخ تعديل طويل، أكثر من {{PLURAL:$1||مراجعة واحدة|مراجعتين|$1 مراجعات|$1 مراجعة}}.\nقد يؤدي حذفها إلى اضطراب عمليات قاعدة البيانات في {{SITENAME}}؛\nاستمر مع الحذر.",
        "deleteprotected": "لا يمكنك حذف هذه الصفحة لأنها محمية.",
        "deleting-backlinks-warning": "[[Special:WhatLinksHere/{{FULLPAGENAME}}|تتصل صفحات أخرى]] بالصفحة التي تريد حذفها.",
-       "rollback": "استرجاع التعديلات",
+       "rollback": "التراجع عن التعديلات",
        "rollbacklink": "استرجع",
        "rollbacklinkcount": "استرجع {{PLURAL:$1|لا تعديلات|تعديلا واحدا|تعديلين|$1 تعديلات|$1 تعديلاً|تعديل}}",
        "rollbacklinkcount-morethan": "استرجاع أكثر من {{PLURAL:$1|تعديل|تعديل|تعديلين|$1 تعديلات|$1 تعديلاً|$1 تعديل}}",
        "revertpage-nouser": "استرجع تعديلات مستخدم مخفيّ حتى آخر مراجعة ل{{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "استرجع تعديلات $1؛\nاسترجع حتى آخر نسخة بواسطة $2.",
        "sessionfailure-title": "فشل في الجلسة",
-       "sessionfailure": "يبدو أنه هناك مشكلة في هذه جلسة الدخول الخاصة بك؛\nلذلك فقد ألغيت هذه العملية كإجراء احترازي ضد الاختراق.\nمن فضلك اضغط على مفتاح \"رجوع\" لتحميل الصفحة التي جئت منها، ثم حاول مرة أخرى.",
+       "sessionfailure": "يبدو أنه هناك مشكلة في جلسة الدخول الخاصة بك؛\nلذلك فقد ألغيت هذه العملية كإجراء احترازي ضد الاختراق.\nمن فضلك اضغط على مفتاح \"رجوع\" لتحميل الصفحة التي جئت منها، ثم حاول مرة أخرى.",
        "changecontentmodel": "غير نموذج المحتوى لصفحة",
        "changecontentmodel-legend": "غير نموذج المحتوى",
        "changecontentmodel-title-label": "عنوان الصفحة",
        "sp-contributions-username": "عنوان أيبي أو اسم مستخدم:",
        "sp-contributions-toponly": "أظهر أعلى المراجعات فقط",
        "sp-contributions-newonly": "أظهر إنشاء الصفحات فقط",
+       "sp-contributions-hideminor": "أخف التعديلات الطفيفة",
        "sp-contributions-submit": "بحث",
        "whatlinkshere": "ماذا يصل هنا",
        "whatlinkshere-title": "الصفحات التي تصل إلى \"$1\"",
        "allmessagesname": "الاسم",
        "allmessagesdefault": "النص الافتراضي",
        "allmessagescurrent": "النص الحالي",
-       "allmessagestext": "Ù\87Ø°Ù\87 Ù\82ائÙ\85Ø© Ø¨Ø±Ø³Ø§Ø¦Ù\84 Ø§Ù\84Ù\86ظاÙ\85 Ø§Ù\84Ù\85تÙ\88Ù\81رة Ù\81Ù\8a Ù\86طاÙ\82 Ù\85Ù\8aدÙ\8aاÙ\88Ù\8aÙ\83Ù\8a.\nÙ\85Ù\86 Ù\81ضÙ\84Ù\83 Ø²Ø± [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation ØªØ±Ø¬Ù\85Ø© Ù\85Ù\8aدÙ\8aاÙ\88Ù\8aÙ\83Ù\8a] Ù\88 [https://translatewiki.net ØªØ±Ø§Ù\86سÙ\84Ù\8aت Ù\88Ù\8aÙ\83Ù\8a Ø¯Ù\88ت Ù\86ت] Ù\84Ù\88 Ù\83Ù\86ت ØªØ±ØºØ¨ Ù\81Ù\8a Ø§Ù\84Ù\85ساÙ\87Ù\85Ø© Ù\81Ù\8a ØªØ±Ø¬Ù\85Ø© Ù\85Ù\8aدÙ\8aاÙ\88Ù\8aÙ\83Ù\8a Ø§Ù\84أساسÙ\8aØ©.",
+       "allmessagestext": "Ù\87Ø°Ù\87 Ù\82ائÙ\85Ø© Ø¨Ø±Ø³Ø§Ø¦Ù\84 Ø§Ù\84Ù\86ظاÙ\85 Ø§Ù\84Ù\85تÙ\88Ù\81رة Ù\81Ù\8a Ù\86طاÙ\82 Ù\85Ù\8aدÙ\8aاÙ\88Ù\8aÙ\83Ù\8a.\nÙ\8aرجÙ\89 Ø²Ù\8aارة :\n[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] Ù\88 [https://translatewiki.net translatewiki.net]\nإازا Ù\83Ù\86ت ØªØ±ØºØ¨ Ù\81Ù\8a Ø§Ù\84Ù\85ساÙ\87Ù\85Ø© Ø¨ØªØ¹Ø±Ù\8aب Ù\85Ù\8aدÙ\8aا Ù\88Ù\8aÙ\83Ù\8a",
        "allmessagesnotsupportedDB": "هذه الصفحة لا يمكن استخدامها لأن '''$wgUseDatabaseMessages''' تم تعطيله.",
        "allmessages-filter-legend": "المرشح",
        "allmessages-filter": "رشح حسب حالة التخصيص:",
        "version-libraries-license": "الترخيص",
        "version-libraries-description": "الوصف",
        "version-libraries-authors": "المؤلفون",
-       "redirect": "تحويل حسب  الملف , المستخدم ,الصفحة , معرف الدخول",
+       "redirect": "تحويل حسب الملف أو المستخدم أو الصفحة أو معرف الدخول",
        "redirect-summary": "هذه الصفحة الخاصة تحوّل إلى ملف (باسمه) أو صفحة (برقم إحدى مراجعاتها) أو إلى صفحة مستخدم (برقمه التعريفي). الاستخدام [[{{#Special:Redirect}}/file/Example.jpg]] أو [[{{#Special:Redirect}}/revision/328429]] أو [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "حوّل",
        "redirect-lookup": "ابحث في:",
        "tags-edit-success": "طبقت التغييرات.",
        "tags-edit-failure": "التغييرات لم تطبق: $1",
        "tags-edit-nooldid-title": "مراجعة هدف غير صالحة",
+       "tags-edit-nooldid-text": "لم تحدد النسخة التي تريد تطبيق العملية عليها أو لا يوجد نسخة من الأصل.",
        "tags-edit-none-selected": "من فضلك اختر على الأقل وسما واحدا للإضافة أو الإزالة.",
        "comparepages": "قارن صفحات",
        "compare-page1": "صفحة 1",
        "logentry-protect-unprotect": "{{GENDER:$2|رفع|رفعت}} $1 الحماية عن $3",
        "logentry-protect-protect": "$1 {{GENDER:$2|حمى|حمت}} $3 $4",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|حمى|حمت}} $3 $4 [مضمنة]",
-       "logentry-protect-modify": "{{GENDER:$2|غÙ\8aر|غÙ\8aرت}} $1 Ù\85ستÙ\88Ù\89 Ø§Ù\84Ø­Ù\85اÙ\8aØ© Ù\84$3 $4",
+       "logentry-protect-modify": "{{GENDER:$2|غÙ\8aر|غÙ\8aرت}} $1 Ù\85ستÙ\88Ù\89 Ø­Ù\85اÙ\8aØ© $3 $4",
        "logentry-rights-rights": "{{GENDER:$2|غيّر|غيّرت}} $1 عضوية $3 من $4 إلى $5",
        "logentry-rights-rights-legacy": "{{GENDER:$2|غيّر|غيّرت}} $1 عضوية $3",
        "logentry-rights-autopromote": "تمت تلقائيا ترقية {{GENDER:$2|المستخدم|المستخدمة}} $1 من  $4 إلى $5",
        "searchsuggest-containing": "يحتوي...",
        "api-error-badaccess-groups": "لا يسمح لك بتحميل الملفات إلى هذه الويكي.",
        "api-error-badtoken": "خطأ داخلي: رمز مميز غير صحيح.",
+       "api-error-blocked": "لقد منعت من التحرير.",
        "api-error-copyuploaddisabled": "تم تعطيل تحميل من رابط على هذا الخادم.",
        "api-error-duplicate": "هناك {{PLURAL:$1|هو ملف آخر|كذلك$2 بعض الملفات الأخرى}} مسبقاً على الموقع بنفس المضمون.",
        "api-error-duplicate-archive": "هناك {{PLURAL:$1|كان ملف آخر |كذلك بعض الملفات الأخرى}} مسبقاً على الموقع بنفس المضمون، ولكن {{PLURAL:$1|أنه تم | إجراء}} الحذف لها.",
        "special-characters-group-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": "عربية موسعة",
        "mw-widgets-dateinput-no-date": "لا تاريخ تم اختياره",
        "mw-widgets-titleinput-description-new-page": "الصفحة غير موجودة بعد",
        "mw-widgets-titleinput-description-redirect": "تحويل إلى $1",
-       "api-error-blacklisted": "اختر عنوانا مختلفا ومفهوما.",
        "sessionmanager-tie": "لا يمكن جمع أنواع استيثاق متعددة: $1.",
        "sessionprovider-generic": "جلسات $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "جلسات قائمة على ملفات تعريف الارتباط (كوكيز)",
        "log-action-filter-rights-rights": "تغيير يدوي",
        "log-action-filter-upload-upload": "رفع جديد",
        "log-action-filter-upload-overwrite": "إعادة الرفع",
+       "authmanager-create-disabled": "إنشاء الحسابات معطل.",
+       "authmanager-create-from-login": "لإنشاء حساب، برجاء ملء الحقول أدناه.",
        "authmanager-email-label": "البريد الإلكتروني",
        "authmanager-email-help": "عنوان البريد الإلكتروني",
        "authmanager-realname-label": "الاسم الحقيقي",
index 36e80bf..6893166 100644 (file)
        "rclistfrom": "Adkintun weke kalekünun amuamugelu $3 $2",
        "rcshowhideminor": "$1 pichi wirin",
        "rcshowhidebots": "$1 kiduamukelu küdauwe",
+       "rcshowhidebots-show": "Pengelün",
        "rcshowhideliu": "$1 konkülelu kellufe",
        "rcshowhideanons": "$1 üyngenulu kellufe",
        "rcshowhidepatr": "$1 pukintulu kalekünun",
        "block-log-flags-hiddenname": "Üy kellufe ellkan",
        "move-page": "Nengümün $1",
        "move-page-legend": "Nengümün wülngiñ",
-       "movearticle": "Nengümün wülngiñ",
        "newtitle": "We üy püle",
        "move-watch": "Llaytun tüfachi pakina",
        "movepagebtn": "Nengümün pakina",
        "movelogpage": "Nengümün wirintukun",
        "revertmove": "wüñoeltun",
-       "delete_and_move": "Ñamümün ka nengümün",
        "delete_and_move_confirm": "May, ñamümün pakina",
        "export": "Wiñamün pakina",
        "allmessagesname": "Üy",
index fe87d88..dde90d0 100644 (file)
        "morenotlisted": "M519x539S14402488x485S1440a481x461S22b04503x509 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M531x531S14c30506x469S2a204508x503S2a21c470x503S14c38470x469 S38800464x496",
        "mypage": "M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
        "mytalk": "M522x522S15a37478x479S10041485x492S20600500x492",
-       "anontalk": "M522x522S15a37478x479S10041485x492S20600500x492 M536x521S2ff00482x483S10011515x491S28108515x461 M508x525S10004493x475S22a04494x510 M517x524S19220496x477S14051483x500 M534x519S1f70a475x499S1f702512x499S22f10466x481S20e00494x483S22f00509x481",
+       "anontalk": "M522x522S15a37478x479S10041485x492S20600500x492",
        "navigation": "M523x527S1ce40501x472S1ce48478x472S28800510x505S28818479x505 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
        "and": "&#32;M543x512S14c02458x489S26506496x492S18500519x494",
        "qbfind": "M546x525S2ff00482x483S16d10492x505S2e502519x502",
        "createacct-reason": "M547x518S30a00482x483S22124511x473S1c517522x483",
        "createacct-reason-ph": "M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M535x520S1f550465x505S2a208489x480S1f530511x505 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495 M547x518S30a00482x483S22124511x473S1c517522x483 S38900464x493",
        "createacct-submit": "M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M507x523S15a28494x496S26500493x477 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495",
-       "createacct-another-submit": "M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M535x520S1f550465x505S2a208489x480S1f530511x505 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495",
+       "createacct-another-submit": "M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495",
        "createacct-benefit-heading": "M533x545S14250501x455S14258468x479S2eb00518x489S2eb4c470x513 M514x533S19a20486x468S27106495x493 M508x523S10040493x493S26500493x477 M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 {{SITENAME}} S38800464x496",
        "createacct-benefit-body1": "{{PLURAL:$1|M521x532S10609498x496S10621487x512S21100500x483S2df20479x468}}",
        "createacct-benefit-body2": "{{PLURAL:$1|M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498|M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489}}",
        "thumbnail_error": "M527x521S10059473x479S10051497x479S20e00494x491S22a04493x506 M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M515x512S1f010486x488S2f900502x507 M523x564S15a20476x537S2ff00482x483S22b03490x519S16d10506x491S20500491x546 M547x518S30a00482x483S22124511x473S1c517522x483 S38900464x493 $1",
        "thumbnail_error_remote": "M518x526S2ff00482x483S19a00487x506 M523x533S1c148482x467S1c110497x472S20e00494x512S26a06509x506S26a12477x506 M530x529S10018470x471S10641507x501S26505486x480S21600500x494 $1 S38700463x496\n$2",
        "importlogpage": "M534x518S1852f466x482S18527486x483S2d60c505x505 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
-       "tooltip-pt-userpage": "M507x523S15a28494x496S26500493x477 M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
-       "tooltip-pt-mytalk": "M507x523S15a28494x496S26500493x477 M522x522S15a37478x479S10041485x492S20600500x492 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
-       "tooltip-pt-preferences": "M507x523S15a28494x496S26500493x477 M525x542S1c507500x517S20600478x519S2ff00482x483",
+       "tooltip-pt-userpage": "{{GENDER:|M507x523S15a28494x496S26500493x477 M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489}} M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "tooltip-pt-mytalk": "{{GENDER:|M507x523S15a28494x496S26500493x477}} M522x522S15a37478x479S10041485x492S20600500x492 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "tooltip-pt-preferences": "{{GENDER:|M507x523S15a28494x496S26500493x477}} M525x542S1c507500x517S20600478x519S2ff00482x483",
        "tooltip-pt-watchlist": "M524x555S15a37494x531S1f550500x538S20e00480x542S26502462x541S30a00482x483 M518x610S14402481x556S1440a474x532S22b04496x580S30a00482x483 M532x561S18049468x526S18041507x526S20500486x550S20500504x550S30a00482x483 M518x591S10609493x555S10621482x571S21100495x542S2df20474x527S30a00482x483 S38700463x496 M508x523S10040493x493S26500493x477 M526x524S10e50511x494S26500510x476S10e58475x494S26510477x476",
-       "tooltip-pt-mycontris": "M508x523S10040493x493S26500493x477 M531x521S1f437507x491S22113512x480S22115469x480S1f43f472x491 M519x539S14402488x485S1440a481x461S22b04503x509",
+       "tooltip-pt-mycontris": "{{GENDER:|M508x523S10040493x493S26500493x477}} M531x521S1f437507x491S22113512x480S22115469x480S1f43f472x491 M519x539S14402488x485S1440a481x461S22b04503x509",
        "tooltip-pt-login": "M532x519S18240508x504S18248469x504S26500512x482S26510475x482 M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493 S38700463x496 M538x517S10021495x496S10029476x496S2880a516x483S28812463x483 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M513x532S15a48488x468S10a40498x486S26524490x517",
        "tooltip-pt-logout": "M538x518S2a208496x483S15a37462x483S11530523x487S11551470x493",
        "tooltip-pt-createaccount": "M532x519S18240508x504S18248469x504S26500512x482S26510475x482 M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495 M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493 S38700463x496 M538x517S10021495x496S10029476x496S2880a516x483S28812463x483 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M513x532S15a48488x468S10a40498x486S26524490x517",
        "api-error-unknownerror": "M536x518S2ff00482x483S15a11513x486S28108513x453 M518x526S2ff00482x483S19a00487x506 S38700463x496 $1",
        "expandtemplates": "M554x524S14c40530x477S14c48446x493S26506515x490S26512468x508S20340495x490S20348487x507 M510x522S15c10490x513S16d12490x495S22a04494x478",
        "expand_templates_ok": "M515x525S17620499x475S14020485x495",
-       "log-name-pagelang": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M563x515S1dc50505x485S1dc58473x485S26606533x499S26612438x499 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513"
+       "log-name-pagelang": "M563x515S1dc50505x485S1dc58473x485S26606533x499S26612438x499 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513"
 }
index af794a8..5760e81 100644 (file)
@@ -12,7 +12,8 @@
                        "아라",
                        "Fitoschido",
                        "Macofe",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Tokvo"
                ]
        },
        "tog-underline": "Sorrayar enllaces:",
        "password-change-forbidden": "Nun se pueden camudar les contraseñes nesta wiki.",
        "externaldberror": "O hebo un fallu d'autenticación de la base de datos o nun tienes permisu p'anovar la to cuenta esterna.",
        "login": "Entrar",
+       "login-security": "Comprobación d'identidá",
        "nav-login-createaccount": "Entrar / crear cuenta",
        "userlogin": "Entrar / crear cuenta",
        "userloginnocreate": "Aniciar sesión",
        "userlogin-resetpassword-link": "¿Escaeció la contraseña?",
        "userlogin-helplink2": "Ayuda del aniciu de sesión",
        "userlogin-loggedin": "Yá anició sesión como {{GENDER:$1|$1}}.\nUtilice'l formulariu de más abaxo p'aniciar sesión como otru usuariu.",
+       "userlogin-reauth": "Tienes d'aniciar sesión de nueves pa comprobar que yes {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Crear otra cuenta",
        "createacct-emailrequired": "Direición de corréu electrónicu",
        "createacct-emailoptional": "Direición de corréu electrónicu (opcional)",
        "createacct-email-ph": "Escriba la so direición de corréu electrónicu",
        "createacct-another-email-ph": "Escriba la direición de corréu electrónicu",
        "createaccountmail": "Usar una contraseña al debalu temporal y unviala a la direición de corréu electrónicu conseñada",
+       "createaccountmail-help": "Pue usase pa crear una cuenta pa otra persona ensin saber la contraseña.",
        "createacct-realname": "Nome real (opcional)",
        "createaccountreason": "Motivu:",
        "createacct-reason": "Motivu",
        "createacct-reason-ph": "Por qué quier crear otra cuenta",
+       "createacct-reason-help": "Mensaxe que s'amuesa nel rexistru de creación de cuentes",
        "createacct-submit": "Crear la cuenta",
        "createacct-another-submit": "Crear una cuenta",
+       "createacct-continue-submit": "Siguir cola creación de la cuenta",
+       "createacct-another-continue-submit": "Siguir cola creación de la cuenta",
        "createacct-benefit-heading": "{{SITENAME}} failu xente como vusté.",
        "createacct-benefit-body1": "{{PLURAL:$1|edición|ediciones}}",
        "createacct-benefit-body2": "{{PLURAL:$1|páxina|páxines}}",
        "nocookiesnew": "La cuenta d'usuariu ta creada, pero nun anició sesión.\n{{SITENAME}} usa «cookies» pa identificar a los usuarios.\nTien les «cookies» desactivaes.\nPor favor activeles y anicie sesión col nuevu nome d'usuariu y contraseña.",
        "nocookieslogin": "{{SITENAME}} usa «cookies» pa identificar a los usuarios.\nTien les «cookies» desactivaes.\nPor favor activeles y vuelva a intentalo.",
        "nocookiesfornew": "La cuenta nun se creó porque nun pudimos confirmar l'orixe.\nComprueba que tienes activaes les «cookies», recarga esta páxina y vuelvi a intentalo.",
+       "createacct-loginerror": "La cuenta creóse correchamente, pero nun pudo aniciase sesión automáticamente. Sigui col [[Special:UserLogin|accesu manual]].",
        "noname": "Nun conseñasti un nome d'usuariu válidu.",
        "loginsuccesstitle": "Identificáu",
        "loginsuccess": "'''Aniciasti sesión en {{SITENAME}} como «$1».'''",
        "createacct-another-realname-tip": "El nome real ye opcional.\nSi decide conseñalu, va usase p'atribuir el trabayu al usuariu.",
        "pt-login": "Entrar",
        "pt-login-button": "Aniciar sesión",
+       "pt-login-continue-button": "Siguir l'aniciu de sesión",
        "pt-createaccount": "Crear una cuenta",
        "pt-userlogout": "Salir",
        "php-mail-error-unknown": "Fallu desconocíu na función mail() de PHP.",
        "botpasswords-invalid-name": "El nome d'usuariu especificáu nun contien el separador de contraseña de bot («$1»).",
        "botpasswords-not-exist": "L'usuariu «$1» nun tien una contraseña de bot llamada «$2».",
        "resetpass_forbidden": "Nun puen camudase les contraseñes",
+       "resetpass_forbidden-reason": "Les contraseñes nun pueden camudase: $1",
        "resetpass-no-info": "Tienes d'aniciar sesión pa entrar direutamente a esta páxina.",
        "resetpass-submit-loggedin": "Camudar la contraseña",
        "resetpass-submit-cancel": "Encaboxar",
        "passwordreset-emailsentusername": "Si hai una direición de corréu electrónicu asociada con esti nome d'usuariu, unviaráse un corréu electrónicu pa reaniciar la contraseña.",
        "passwordreset-emailsent-capture": "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo.",
        "passwordreset-emailerror-capture": "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo, pero falló l'unviu {{GENDER:$2|al usuariu|a la usuaria}}: $1",
+       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Unvióse'l corréu|Unviáronse los correos}} de reaniciu de contraseña. {{PLURAL:$1|El nome d'usuariu y la contraseña|La llista de nomes d'usuarios y contraseñes}} amuésase de siguío.",
+       "passwordreset-emailerror-capture2": "Nun foi posible mandar un corréu electrónicu {{Gender:$2|al usuariu|a la usuaria}}: $1 {{PLURAL:$3|El nome d'usuariu y la contraseña|La llista de nomes d'usuarios y contraseñes}} amuésase de siguío.",
+       "passwordreset-nocaller": "Tien d'apurrise un llamador",
+       "passwordreset-nosuchcaller": "El llamador nun esiste: $1",
+       "passwordreset-ignored": "Nun se llogró'l reaniciu de la contraseña. ¿Seique nun se configuró un proveedor?",
+       "passwordreset-invalideamil": "Direición de corréu inválida",
+       "passwordreset-nodata": "Nun s'apurrió nin un nome d'usuariu nin una dirección de corréu electrónicu",
        "changeemail": "Camudar o desaniciar la dirección de corréu electrónicu",
        "changeemail-header": "Completa esti formulariu pa camudar la dirección de corréu electrónicu. Si quies desaniciar l'asociación de cualquier dirección de corréu electrónicu de la to cuenta, dexa en blancu la nueva dirección de corréu electrónicu cuando unvies el formulariu.",
        "changeemail-passwordrequired": "Vas tener qu'escribir la contraseña pa confirmar esti cambéu.",
        "minoredit": "Esta ye una edición menor",
        "watchthis": "Vixilar esta páxina",
        "savearticle": "Guardar la páxina",
+       "savechanges": "Guardar los cambios",
        "publishpage": "Publicar la páxina",
+       "publishchanges": "Publicar los cambios",
        "preview": "Vista previa",
        "showpreview": "Amosar previsualización",
        "showdiff": "Amosar cambeos",
        "accmailtext": "Unvióse a $2 una contraseña xenerada al debalu pal usuariu [[User talk:$1|$1]]. Pue camudase na páxina ''[[Special:ChangePassword|camudar contraseña]]'' depués d'aniciar sesión.",
        "newarticle": "(Nuevu)",
        "newarticletext": "Siguisti un enllaz a un artículu qu'inda nun esiste.\nPa crear la páxina, empecipia a escribir nel cuadru d'embaxo (mira la [$1 páxina d'ayuda] pa más información).\nSi llegasti equí por enquivocu, calca nel botón <strong>atrás</strong> del to restolador.",
-       "anontalkpagetext": "----\n''Esta ye la páxina d'alderique pa un usuariu anónimu qu'inda nun creó una cuenta o que nun la usa.''\nPola mor d'ello ha usase la direición numbérica IP pa identificalu/la.\nTala IP pue compartise por varios usuarios.\nSi yes un usuariu anónimu y notes qu'hai comentarios irrelevantes empobinaos pa ti, por favor [[Special:CreateAccount|crea una cuenta]] o [[Special:CreateAccount|identifícate]] pa torgar futures confusiones con otros usuarios anónimos.",
+       "anontalkpagetext": "----\n''Esta ye la páxina d'alderique pa un usuariu anónimu qu'inda nun creó una cuenta o que nun la usa.''\nPola mor d'ello ha usase la direición numbérica IP pa identificalu/la.\nTala IP pue compartise por varios usuarios.\nSi yes un usuariu anónimu y notes qu'hai comentarios irrelevantes empobinaos pa ti, por favor [[Special:CreateAccount|crea una cuenta]] o [[Special:UserLogin|anicia sesiín]] pa torgar futures confusiones con otros usuarios anónimos.",
        "noarticletext": "Nestos momentos nun hai testu nesta páxina.\nPuedes [[Special:Search/{{PAGENAME}}|buscar esti títulu de páxina]] n'otres páxines,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar los rexistros rellacionaos],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear esta páxina]</span>.",
        "noarticletext-nopermission": "Nestos momentos nun hai testu nesta páxina.\nPue [[Special:Search/{{PAGENAME}}|buscar esti títulu de páxina]] n'otres páxines o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar los rexistros rellacionaos]</span>, pero nun tiene permisu pa crear esta páxina.",
        "missing-revision": "La revisión #$1 de la páxina llamada \"{{FULLPAGENAME}}\" nun esiste.\n\nDe vezu la causa d'esto ye siguir un enllaz antiguu del historial a una páxina que se desanició.\nSe puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistru de desanicios].",
        "content-model-css": "CSS",
        "content-json-empty-object": "Oxetu baleru",
        "content-json-empty-array": "Matriz balera",
+       "deprecated-self-close-category": "Páxines qu'utilicen etiquetes HTML autozarraes inválides",
+       "deprecated-self-close-category-desc": "Esta páxina contien etiquetes HTML autozarraes inválides, tales como <code>&lt;b/></code> o <code>&lt;span/></code>. El comportamientu d'estes va camudar llueu pa ser coherente cola especificación d'HTML5, polo qu'el so usu nel testu wiki ta en desusu.",
        "duplicate-args-warning": "<strong>Avisu:</strong> [[:$1]] llama a [[:$2]] con más d'un valor pal parámetru «$3». Sólo va usase l'últimu valor dau.",
        "duplicate-args-category": "Páxines con argumentos duplicaos nes llamaes a plantíes",
        "duplicate-args-category-desc": "La páxina contien llamaes a plantíes qu'usen argumentos duplicaos, como <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "rightslogtext": "Esti ye un rexistru de los cambeos nos permisos d'usuariu.",
        "action-read": "lleer esta páxina",
        "action-edit": "editar esta páxina",
-       "action-createpage": "crear páxines",
-       "action-createtalk": "crear páxines d'alderique",
+       "action-createpage": "crear esta páxina",
+       "action-createtalk": "crear esta páxina d'alderique",
        "action-createaccount": "crear esta cuenta d'usuariu",
        "action-autocreateaccount": "crear automáticamente esta cuenta d'usuariu esterna",
        "action-history": "ver l'historial d'esta páxina",
        "upload-http-error": "Hebo un error HTTP: $1",
        "upload-copy-upload-invalid-domain": "La xubida de copies nun ta disponible dende esti dominiu.",
        "upload-foreign-cant-upload": "Esta wiki nun ta configurada pa xubir ficheros al estoyu de ficheros esternu solicitáu.",
+       "upload-foreign-cant-load-config": "Falló la carga de la configuración pa xubir ficheros al estoyu esternu.",
+       "upload-dialog-disabled": "Nesta wiki tán desactivaes les xubíes de ficheros por aciu d'esti diálogu.",
        "upload-dialog-title": "Xubir ficheru",
        "upload-dialog-button-cancel": "Encaboxar",
        "upload-dialog-button-done": "Fecho",
        "trackingcategories-msg": "Categoría de siguimientu",
        "trackingcategories-name": "Nome del mensaxe",
        "trackingcategories-desc": "Criterios d'inclusión de categoría",
+       "restricted-displaytitle-ignored": "Páxines con títulos de vista inoraos",
+       "restricted-displaytitle-ignored-desc": "Esta páxina tien un <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> inoráu porque nun ye equivaliente al títulu verdaderu de la páxina.",
        "noindex-category-desc": "La páxina contien una pallabra máxica <code><nowiki>__NOINDEX__</nowiki></code> (y ta nun espaciu de nomes nel que se permite esta marca) y, poro, los robós nun la indexarán.",
        "index-category-desc": "La páxina contien una pallabra máxica <code><nowiki>__INDEX__</nowiki></code> (y ta nun espaciu de nomes nel que se permite esta marca) y, poro, los robós la indexarán anque normalmente nun lo faigan.",
        "post-expand-template-inclusion-category-desc": "El tamañu de la páxina ye mayor que <code>$wgMaxArticleSize</code> después de espander toles plantíes, de mou qu'algunes plantíes nun s'espandieron.",
        "rollbacklinkcount": "revertir $1 {{PLURAL:$1|edición|ediciones}}",
        "rollbacklinkcount-morethan": "revertir más de $1 {{PLURAL:$1|edición|ediciones}}",
        "rollbackfailed": "Falló la reversión",
+       "rollback-missingparam": "Faltan parámetros riquíos na solicitú.",
        "cantrollback": "Nun se pue revertir la edición; el postrer collaborador ye l'únicu autor d'esta páxina.",
        "alreadyrolled": "Nun se pue revertir la postrer edición de [[:$1]] fecha por [[User:$2|$2]] ([[User talk:$2|alderique]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\ndaquién más yá editó o revirtió la páxina.\n\nLa postrer edición foi fecha por [[User:$3|$3]] ([[User talk:$3|alderique]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "El resume de la edición yera: <em>$1</em>.",
        "revertpage": "Revertíes les ediciones de [[Special:Contributions/$2|$2]] ([[User talk:$2|alderique]]) hasta la cabera versión de [[User:$1|$1]]",
        "revertpage-nouser": "Revertíes les ediciones de (usuariu desaniciáu) a la cabera revisión de {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Revertíes les ediciones de $1; camudáu a la última versión de $2.",
+       "rollback-success-notify": "Revertíes les ediciones de $1 a la última revisión de $2. [$3 Ver cambeos]",
        "sessionfailure-title": "Fallu de sesión",
        "sessionfailure": "Paez qu'hai un problema cola to sesión; por precaución\ncancelóse l'aición que pidisti. Da-y al botón \"Atrás\" del\nnavegador pa cargar otra vuelta la páxina y vuelve a intentalo.",
        "changecontentmodel": "Cambiar el modelu de conteníu d'una páxina",
        "sp-contributions-username": "Direición IP o nome d'usuariu:",
        "sp-contributions-toponly": "Amosar namái les ediciones que son les caberes revisiones",
        "sp-contributions-newonly": "Amosar namái les ediciones que son creaciones de páxines",
+       "sp-contributions-hideminor": "Despintar les ediciones menores",
        "sp-contributions-submit": "Buscar",
        "whatlinkshere": "Lo qu'enllaza equí",
        "whatlinkshere-title": "Páxines qu’enllacien a «$1»",
        "whatlinkshere-prev": "{{PLURAL:$1|anterior|anteriores $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|siguiente|siguientes $1}}",
        "whatlinkshere-links": "← enllaces",
-       "whatlinkshere-hideredirs": "$1 redireiciones",
-       "whatlinkshere-hidetrans": "$1 tresclusiones",
-       "whatlinkshere-hidelinks": "$1 enllaces",
+       "whatlinkshere-hideredirs": "$1 les redireiciones",
+       "whatlinkshere-hidetrans": "$1 les tresclusiones",
+       "whatlinkshere-hidelinks": "$1 los enllaces",
        "whatlinkshere-hideimages": "$1 los enllaces al ficheru",
        "whatlinkshere-filters": "Peñeres",
        "whatlinkshere-submit": "Dir",
        "confirm-watch-top": "¿Amestar esta páxina a la to llista de vixilancia?",
        "confirm-unwatch-button": "Aceutar",
        "confirm-unwatch-top": "¿Desaniciar esta páxina de la to llista de vixilancia?",
+       "confirm-rollback-button": "Aceutar",
+       "confirm-rollback-top": "¿Revertir les ediciones a esta páxina?",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "← páxina anterior",
        "imgmultipagenext": "páxina siguiente →",
        "table_pager_limit_label": "Elementos por páxina:",
        "table_pager_limit_submit": "Dir",
        "table_pager_empty": "Nun hai resultaos",
-       "autosumm-blank": "Desaniciáu el conteníu de la páxina",
+       "autosumm-blank": "Desaniciáu'l conteníu de la páxina",
        "autosumm-replace": "Sustituyendo la páxina por '$1'",
        "autoredircomment": "Redirixendo a [[$1]]",
        "autosumm-new": "Páxina creada con «$1»",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "la páxina inda nun esiste",
        "mw-widgets-titleinput-description-redirect": "redirixir a $1",
-       "api-error-blacklisted": "Escueyi un títulu distintu, más descriptivu.",
        "sessionmanager-tie": "Nun puen combinase dellos tipos de solicitú d'identificación: $1.",
        "sessionprovider-generic": "sesiones $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesiones basaes en cookies",
        "log-action-filter-newusers": "Tipu de creación de cuenta:",
        "log-action-filter-patrol": "Tipu de patrulla:",
        "log-action-filter-protect": "Tipu de proteición:",
-       "log-action-filter-rights": "Tipu de cambéu de permisos",
-       "log-action-filter-suppress": "Tipu de supresión",
+       "log-action-filter-rights": "Tipu de cambéu de permisos:",
+       "log-action-filter-suppress": "Tipu de supresión:",
        "log-action-filter-upload": "Tipu de carga:",
        "log-action-filter-all": "Too",
        "log-action-filter-block-block": "Bloquéu",
        "log-action-filter-suppress-block": "Supresión d'usuariu por bloquéu",
        "log-action-filter-suppress-reblock": "Supresión d'usuariu por rebloquéu",
        "log-action-filter-upload-upload": "Nueva carga",
-       "log-action-filter-upload-overwrite": "Recargar"
+       "log-action-filter-upload-overwrite": "Recargar",
+       "authmanager-authn-not-in-progress": "L'autenticación nun ta en cursu o los datos de sesión perdiéronse. Por favor, vuelve de nueves al principiu.",
+       "authmanager-authn-no-primary": "Les credenciales apurríes nun pudieron autentificase.",
+       "authmanager-authn-no-local-user": "Les credenciales apurríes nun tán asociaes con nengún usuariu nesta wiki.",
+       "authmanager-authn-no-local-user-link": "Les credenciales suministraes son válides, pero nun tán venceyaes con nengún usuariu d'esta wiki. Empecipia sesión d'otra miente, o crea un usuariu nuevu, y podrás venceyar los tos credenciales anteriores a esa cuenta.",
+       "authmanager-authn-autocreate-failed": "Falló la creación automática d'una cuenta local: $1",
+       "authmanager-change-not-supported": "Les credenciales apurríes nun pueden camudase porque nun hai nada que les use.",
+       "authmanager-create-disabled": "Ta desactivada la creación de cuentes.",
+       "authmanager-create-from-login": "Pa crear la cuenta, rellena los campos de más abaxo.",
+       "authmanager-create-not-in-progress": "La creación de la cuenta nun ta progresando, o perdiéronse los datos de la sesión. Por favor, vuelve de nueves al principiu.",
+       "authmanager-create-no-primary": "Les credenciales apurríes nun pueden usase pa crear cuentes.",
+       "authmanager-link-no-primary": "Les credenciales apurríes nun pueden usase pa enllazar cuentes.",
+       "authmanager-link-not-in-progress": "L'enllazáu de la cuenta nun ta progresando, o perdiéronse los datos de la sesión. Por favor, vuelve de nueves al principiu.",
+       "authmanager-authplugin-setpass-failed-title": "Falló'l cambiu de contraseña",
+       "authmanager-authplugin-setpass-failed-message": "El complementu d'autenticación refugó'l cambéu de contraseña.",
+       "authmanager-authplugin-create-fail": "El complementu d'autenticación refugó la creación de la cuenta.",
+       "authmanager-authplugin-setpass-denied": "El complementu de autenticación nun permite cambiar contraseñes.",
+       "authmanager-authplugin-setpass-bad-domain": "Dominiu inválidu.",
+       "authmanager-autocreate-noperm": "Nun se permite la creación automática de cuentes.",
+       "authmanager-autocreate-exception": "La creación automática de cuentes desactivóse temporalmente por cuenta d'errores previos.",
+       "authmanager-userdoesnotexist": "La cuenta d'usuariu «$1» nun ta rexistrada.",
+       "authmanager-userlogin-remembermypassword-help": "Si tien de recordase la contraseña por más tiempu del que dura la sesión.",
+       "authmanager-username-help": "Nome d'usuariu pa l'autenticación.",
+       "authmanager-password-help": "Contraseña pa l'autenticación.",
+       "authmanager-domain-help": "Dominiu pa l'autenticación esterna.",
+       "authmanager-retype-help": "Otra vuelta la contraseña pa confirmar.",
+       "authmanager-email-label": "Corréu",
+       "authmanager-email-help": "Direición de corréu electrónicu",
+       "authmanager-realname-label": "Nome real",
+       "authmanager-realname-help": "Nome real del usuariu",
+       "authmanager-provider-password": "Autenticación basada en contraseña",
+       "authmanager-provider-password-domain": "Autenticación basada en contraseña y dominiu",
+       "authmanager-provider-temporarypassword": "Contraseña temporal",
+       "authprovider-confirmlink-message": "Basándose nos tos últimos intentos d'aniciar sesión, les siguientes cuentes pueden venceyase a la to cuenta na wiki. Venceyales permite aniciar sesión al traviés d'eses cuentes. Escueye cuáles tienen de venceyase.",
+       "authprovider-confirmlink-request-label": "Cuentes que tienen de venceyase",
+       "authprovider-confirmlink-success-line": "$1: Enllazada correutamente.",
+       "authprovider-confirmlink-failed": "L'enllaz de cuentes nun foi totalmente correutu: $1",
+       "authprovider-confirmlink-ok-help": "Siguir depués d'amosar los mensaxes de fallu nel enllazáu.",
+       "authprovider-resetpass-skip-label": "Saltar",
+       "authprovider-resetpass-skip-help": "Saltar el reaniciu de la contraseña.",
+       "authform-nosession-login": "La autenticación foi correuta, pero'l navegador nun \"s'alcuerda\" de que tuvo coneutáu.\n\n$1",
+       "authform-nosession-signup": "Creóse la cuenta, pero'l navegador nun \"s'alcuerda\" de que tuvo coneutáu.\n\n$1",
+       "authform-newtoken": "Falta token. $1",
+       "authform-notoken": "Falta token",
+       "authform-wrongtoken": "Token incorreutu",
+       "specialpage-securitylevel-not-allowed-title": "Nun ta permitío",
+       "cannotauth-not-allowed-title": "Permisu refugáu",
+       "cannotauth-not-allowed": "Nun tienes permisu pa usar esta páxina",
+       "credentialsform-account": "Nome de la cuenta:",
+       "cannotlink-no-provider-title": "Nun hai cuentes enllazables",
+       "cannotlink-no-provider": "Nun hai cuentes enllazables.",
+       "linkaccounts": "Enllazar cuentes",
+       "linkaccounts-success-text": "Enllazóse la cuenta.",
+       "linkaccounts-submit": "Enllazar cuentes",
+       "unlinkaccounts": "Desenllazar cuentes",
+       "unlinkaccounts-success": "Desenllazóse la cuenta."
 }
index 2bacf2a..dca9dfe 100644 (file)
@@ -13,9 +13,9 @@
                ]
        },
        "tog-underline": "Линкал гъоркьмухъизе",
-       "tog-hideminor": "ЧIахIиял хиса-басиязул сияхIалда дагьа-макъал хиса-басиял рахчизе",
-       "tog-showtoolbar": "Хиса-басиял гьарулеб мехалда тIасияб алатазул панель бихьизабизе",
-       "tog-editondblclick": "КIиго щелчоказдалъун гьемералъул хиса-баси гьабизе",
+       "tog-hideminor": "ЧӀахӀиял хиса-басиязул сияхӀалда дагьа-макъал хиса-басиял рахчизе",
+       "tog-showtoolbar": "Хиса-басиял гьарулеб мехалда тӀасияб алатазул панель бихьизабизе",
+       "tog-editondblclick": "КӀиго кӀутӀиялдалъун гьумералъул хиса-баси гьабизе",
        "tog-oldsig": "Гьанжесеб гъулбас",
        "underline-always": "Кидаго",
        "underline-never": "Киданиги",
        "wednesday": "АрбагӀ",
        "thursday": "Хамиз",
        "friday": "Рузман",
-       "saturday": "Шаммат",
-       "sun": "Ð\93Ñ\8cаÑ\82I",
+       "saturday": "Щамат",
+       "sun": "Ð\91акÑ\8a",
        "mon": "Итн",
        "tue": "Тал",
        "wed": "Арб",
        "thu": "Хам",
        "fri": "Руз",
        "sat": "Шам",
-       "january": "Январ",
-       "february": "Феврал",
+       "january": "Январь",
+       "february": "Февраль",
        "march": "Март",
-       "april": "Апрел",
+       "april": "Апрель",
        "may_long": "Май",
-       "june": "Июн",
-       "july": "Июл",
+       "june": "Июнь",
+       "july": "Июль",
        "august": "Август",
-       "september": "Сентябр",
-       "october": "Октябр",
-       "november": "Ноябр",
-       "december": "Декабр",
-       "january-gen": "Январ",
-       "february-gen": "Феврал",
+       "september": "Сентябрь",
+       "october": "Октябрь",
+       "november": "Ноябрь",
+       "december": "Декабрь",
+       "january-gen": "Январь",
+       "february-gen": "Февраль",
        "march-gen": "Март",
-       "april-gen": "Апрел",
+       "april-gen": "Апрель",
        "may-gen": "Май",
-       "june-gen": "Июн",
-       "july-gen": "Июл",
+       "june-gen": "Июнь",
+       "july-gen": "Июль",
        "august-gen": "Август",
-       "september-gen": "Сентябр",
-       "october-gen": "Октябр",
-       "november-gen": "Ноябр",
-       "december-gen": "Декабр",
+       "september-gen": "Сентябрь",
+       "october-gen": "Октябрь",
+       "november-gen": "Ноябрь",
+       "december-gen": "Декабрь",
        "jan": "Янв",
        "feb": "Фев",
        "mar": "Мар",
        "oct": "Окт",
        "nov": "Ноя",
        "dec": "Дек",
-       "january-date": "Январ $1",
-       "february-date": "Феврал $1",
+       "january-date": "Январь $1",
+       "february-date": "Февраль $1",
        "march-date": "Март $1",
-       "april-date": "Апрел $1",
+       "april-date": "Апрель $1",
        "may-date": "Май $1",
-       "june-date": "Июн $1",
-       "july-date": "Июл $1",
+       "june-date": "Июнь $1",
+       "july-date": "Июль $1",
        "august-date": "Август $1",
-       "september-date": "Сентябр $1",
-       "october-date": "Октябр $1",
-       "november-date": "Ноябр $1",
-       "december-date": "Декабр $1",
+       "september-date": "Сентябрь $1",
+       "october-date": "Октябрь $1",
+       "november-date": "Ноябрь $1",
+       "december-date": "Декабрь $1",
        "pagecategories": "{{PLURAL:$1|1=Категория|Категориял}}",
        "category_header": "Категориялда «$1» гьумер",
-       "subcategories": "Ð\9fодкатегориял",
+       "subcategories": "Ð\93Ñ\8aоÑ\80кÑ\8cкатегориял",
        "category-media-header": "Категориялда «$1» файл",
-       "category-empty": "\"ГьабсагIаталъ гьаб категория чIобого буго.\"",
+       "category-empty": "<em>ГьабсагӀаталъ гьаб категория чӀобого буго.</em>",
        "hidden-categories": "{{PLURAL:$1|1=Бахчараб категория|Рахчарал категориял}}",
        "hidden-category-category": "Рахчарал категориял",
        "listingcontinuesabbrev": "(жеги)",
-       "about": "Программаялъул хIакъалъулъ",
-       "cancel": "НахъчIвазе",
+       "about": "Программаялъул хӀакъалъулъ",
+       "newwindow": "&nbsp;(цӀияб гордоялда)",
+       "cancel": "НахъчӀвазе",
        "moredotdotdot": "Жеги...",
-       "morenotlisted": "Гьаб сияхI цIураб гьечIо",
+       "morenotlisted": "Гьаб сияхӀ цӀураб гьечӀо",
        "mypage": "Гьумер",
-       "mytalk": "Бахlс",
+       "mytalk": "БахӀс",
        "navigation": "Навигация",
        "and": "&#32;ва",
-       "qbfind": "ЦIехезе",
+       "qbfind": "ЦӀехезе",
        "qbbrowse": "Балагьизе",
        "qbedit": "Хисизабизе",
        "qbpageoptions": "Гьемералъул рекъезаби",
        "qbmyoptions": "Дур рекъезаби",
        "faq": "FAQ",
-       "errorpagetitle": "Гъалатl",
+       "namespaces": "ЦӀаразул сияхӀ",
+       "variants": "БатIи-батIиял",
+       "navigation-heading": "Навигация",
+       "errorpagetitle": "ГъалатӀ",
        "tagline": "{{grammar:genitive|{{SITENAME}}}} сайталдасан материал",
        "help": "Кумек",
-       "search": "ЦIеÑ\85езе",
-       "searchbutton": "ЦIеÑ\85езе",
+       "search": "Ð¥Ñ\8aиÑ\80Ñ\89изе",
+       "searchbutton": "Ð¥Ñ\8aиÑ\80Ñ\89изе",
        "go": "Ине",
        "searcharticle": "Ине",
        "history": "Хиса-басазул тарих",
        "history_short": "Тарих",
-       "printableversion": "Ð\9aÑ\83Ñ\82Ó\80изе версия",
-       "permalink": "Ð\9aидагоÑ\8fб линк",
-       "print": "Ð\9a\83Ñ\82Iизе",
+       "printableversion": "Ð\91аÑ\81малÑ\8aÑ\83л версия",
+       "permalink": "Ð\94аимаб линк",
+       "print": "Ð\91аÑ\81маÑ\8fлда Ð±Ð°Ñ\85Ñ\8aизе",
        "view": "Балагьи",
        "view-foreign": "$1 сайталда балагьизе",
        "edit": "Хисизабизе",
        "create": "Гьабизе",
        "editthispage": "Гьаб гьубер хисизабизе",
        "create-this-page": "Гьаб гьаб гьумер гьабизе",
-       "delete": "Ð\91аÑ\86\86Iине",
-       "deletethispage": "Ð\93Ñ\8cаб Ð³Ñ\8cÑ\83меÑ\80 Ð±Ð°Ñ\86Iине",
+       "delete": "Ð\9dаÑ\85Ñ\8aе Ð±Ð°Ñ\86Ó\80Ñ\86Ó\80ине",
+       "deletethispage": "Ð\93Ñ\8cаб Ð³Ñ\8cÑ\83меÑ\80 Ð½Ð°Ñ\85Ñ\8aе Ð±Ð°Ñ\86Ó\80Ñ\86Ó\80ине",
        "undeletethispage": "Гьаб гьумер цӀигьабизе",
        "undelete_short": "{{PLURAL:$1|$1 хиса-баси|1=Хиса-баси}} цӀигьабизе",
-       "viewdeleted_short": "{{PLURAL:$1|$1 бацӀцӀараб хиса-баси|$1 рацӀцӀарал хиса-басиязда|бацӀцӀараб хиса-баси}} балагьизе",
+       "viewdeleted_short": "{{PLURAL:$1|$1 бацӀцӀараб хиса-баси|бацӀцӀараб хиса-баси|$1 рацӀцӀарал хиса-басиязда}} балагьизе",
        "protect": "Хиса-басияздасан цIунизе",
        "protect_change": "хисизе",
+       "protectthispage": "Гьаб гьумер цIунизе",
        "unprotect": "ЦӀуни хисизе",
        "unprotectthispage": "Гьаб гьумералъул цӀуни хисизабизе",
        "newpage": "ЦIияб гьумер",
        "specialpage": "Хъулухъияб гьумер",
        "personaltools": "Дур алатал",
        "articlepage": "Балагьизе макъалаялда",
-       "talk": "Бахlс",
+       "talk": "БахІс",
        "views": "Балагьиял",
        "toolbox": "Алатал",
        "userpage": "ГӀахьалчиясул гьумер",
+       "projectpage": "Проекталъул гьумералъухъ балагьизе",
        "imagepage": "Файлалъул гьумер балагьизе",
        "mediawikipage": "Кагъаталъул гьумер балагьизе",
        "otherlanguages": "Цоги мацӀазда",
+       "redirectedfrom": "(«$1» гьемералдасан гьаниб битӀана)",
        "redirectpagesub": "Цоги гьумералда сверизабураб гьумер",
+       "redirectto": "Редирект:",
        "lastmodifiedat": "Ахирисеб нухалъ гьаб гьумералъул хиса-баси гьабуна:  $2, $1.",
        "protectedpage": "ЦӀунараб гьумер",
        "jumpto": "КӀанцӀизе:",
-       "jumptonavigation": "Ð\9dавигация",
-       "jumptosearch": "Ñ\86IеÑ\85езе",
+       "jumptonavigation": "навигация",
+       "jumptosearch": "Ñ\85Ñ\8aиÑ\80Ñ\89изе",
        "pool-errorunknown": "Лъалареб гъалатӀ",
-       "aboutsite": "{{grammar:genitive|{{SITENAME}}}} хӀакъалъулъ",
+       "aboutsite": "{{SITENAME}} хӀакъалъулъ",
+       "aboutpage": "Project:ХӀакъалъулъ",
        "currentevents": "Жакъасел лъугьа-бахъинал",
+       "currentevents-url": "Project:Гьанжесел лъугьа-бахъинал",
+       "disclaimers": "Жавабчилъиялдасан инкар гьаби",
+       "disclaimerpage": "Project:Жавабчилъиялдасан инкар гьаби",
        "edithelp": "Хисизабиялъе кумек",
+       "helppage-top-gethelp": "Кумек",
        "mainpage": "БетӀераб гьумер",
        "mainpage-description": "БетӀераб гьумер",
        "policy-url": "Project:КъагӀидаби",
-       "portal": "Ð\96амагIаÑ\82алÑ\8aÑ\83л портал",
+       "portal": "Ð\96амгÓ\80иÑ\8fб портал",
        "portal-url": "Project:Майдан",
        "privacy": "Конфиденциальносталъул сиясат",
        "privacypage": "Project:Конфиденциальносталъул сиясат",
        "confirmable-yes": "У",
        "confirmable-no": "Гуро",
        "viewdeleted": "$1 балагьизеищ?",
+       "site-atom-feed": "$1 — Atom-сияхӀ",
+       "red-link-title": "$1 (гьединаб гьумер гьечӀо)",
        "nstab-main": "Гьумер",
-       "nstab-user": "ГIахьалчи",
+       "nstab-user": "ГӀахьалчи",
        "nstab-media": "Мультимедиа",
        "nstab-special": "Хъулухъияб гьумер",
-       "nstab-project": "Проект хIакъалъулъ",
+       "nstab-project": "Проекталъул хӀакъалъулъ",
        "nstab-image": "Файл",
        "nstab-mediawiki": "Кагъат",
        "nstab-template": "Шаблон",
        "nstab-help": "Кумек",
        "nstab-category": "Категория",
-       "error": "Гъалатl",
-       "databaseerror-error": "ГъалатI: $1",
-       "internalerror": "Жанисеб гъалатl",
-       "badtitle": "Бегьулареб цIар",
+       "mainpage-nstab": "БетІераб",
+       "error": "ГъалатӀ",
+       "databaseerror": "Баяназул кьучIалъул гъалатI",
+       "databaseerror-function": "Функция: $1",
+       "databaseerror-error": "ГъалатӀ: $1",
+       "laggedslavemode": "КIвар кье: гьумералда рукIинчIого рукIине бегьула ахирисел хиса-басиял",
+       "readonly": "Баяназул кьучI рахан буго",
+       "missingarticle-rev": "(цIидасан хал гьаби#: $1)",
+       "missingarticle-diff": "(БатIалъи: $1, $2)",
+       "internalerror": "Жанисеб гъалатӀ",
+       "internalerror_info": "Жанисеб гъалатӀ: $1",
+       "badtitle": "Бегьулареб цӀар",
        "viewsource": "Вики-текст балагьизе",
        "viewsource-title": "$1 гьумералъул вики-текст балагьизе",
-       "exception-nologin": "Мун жаниве лъугьун гьечIо",
+       "exception-nologin": "Мун жаниве лъугьун гьечӀо",
        "exception-nologin-text": "Жаниве лъугьине ккола.",
        "yourname": "ХӀалтӀизабулчиясул цӀар:",
        "userlogin-yourname": "ХӀалтӀизабулчиясул цӀар",
-       "userlogin-yourname-ph": "Ð\94Ñ\83Ñ\80 Ð°ÐºÐºÐ°Ñ\83нÑ\82алÑ\8aÑ\83л Ñ\86Ó\80аÑ\80 Ñ\85Ñ\8aвае",
+       "userlogin-yourname-ph": "Ð\94Ñ\83Ñ\80 Ð°ÐºÐºÐ°Ñ\83нÑ\82алÑ\8aÑ\83л Ñ\86Ó\80аÑ\80 Ñ\85Ñ\8aвай",
        "createacct-another-username-ph": "ГӀахьалчиясул цӀар хъвай",
        "yourpassword": "Пароль:",
        "userlogin-yourpassword": "Пароль",
-       "userlogin-yourpassword-ph": "Ð\94Ñ\83Ñ\80 Ð¿Ð°Ñ\80олÑ\8c Ñ\85Ñ\8aвае",
-       "createacct-yourpassword-ph": "Ð\94Ñ\83Ñ\80 Ð¿Ð°Ñ\80олÑ\8c Ñ\85Ñ\8aвае",
+       "userlogin-yourpassword-ph": "Ð\94Ñ\83Ñ\80 Ð¿Ð°Ñ\80олÑ\8c Ñ\85Ñ\8aвай",
+       "createacct-yourpassword-ph": "Ð\94Ñ\83Ñ\80 Ð¿Ð°Ñ\80олÑ\8c Ñ\85Ñ\8aвай",
        "yourpasswordagain": "Пароль такрар гьабе:",
-       "userlogin-remembermypassword": "Системалда чӀезе",
+       "createacct-yourpasswordagain": "Пароль ритIухъ гьабе",
+       "createacct-yourpasswordagain-ph": "Пароль цоги нухалъ хъвай",
+       "remembermypassword": "Дир цIарги парольги гьаб компьютералда цIунизе (гIицIго $1 {{PLURAL:$1|къоялъ}})",
+       "userlogin-remembermypassword": "Системаялда чӀезе",
        "yourdomainname": "Дур домен:",
+       "password-change-forbidden": "Гьаб викиялда пароль хисизабун бажаруларо дуда.",
        "login": "Жаниве лъугьине",
        "nav-login-createaccount": "Жаниве лъугьине / аккаунт гьабизе",
        "userlogin": "Жаниве лъугьине / аккаунт гьабизе",
        "userloginnocreate": "Жаниве лъугьине",
-       "logout": "Къватlиве вачIизе",
-       "userlogout": "Къватlиве лъугьине",
-       "notloggedin": "Мун жаниве лъугьун гьечIо",
-       "userlogin-noaccount": "Дур аккаунт гьечIебищ?",
-       "nologin": "Дур аккаунт гьечIебищ? $1.",
+       "logout": "КъватӀиве лъугьине",
+       "userlogout": "КъватӀиве лъугьине",
+       "notloggedin": "Мун жаниве лъугьун гьечӀо",
+       "userlogin-noaccount": "Дур аккаунт гьечӀебищ?",
+       "userlogin-joinproject": "Проекталда гӀахьаллъизе",
+       "nologin": "Дур аккаунт гьечӀебищ? $1.",
        "nologinlink": "Аккаунт гьабизе",
        "createaccount": "Аккаунт гьабизе",
-       "gotaccount": "Ð\94Ñ\83Ñ\80 Ð°ÐºÐºÐ°Ñ\83нÑ\82 Ð±Ñ\83гиÑ\88? $1.",
+       "gotaccount": "Ð\94Ñ\83Ñ\80 Ð°ÐºÐºÐ°Ñ\83нÑ\82 Ð±Ñ\83гебиÑ\89? $1.",
        "gotaccountlink": "Жаниве лъугьине",
+       "userlogin-resetlink": "Жаниве лъугьине рихьизарулел баяналищ кIочарал?",
+       "userlogin-resetpassword-link": "Паролищ кIочараб?",
+       "userlogin-helplink2": "Жаниве лъугьине кумек",
+       "userlogin-loggedin": "Мун жаниве лъугьана {{GENDER:$1|$1}} хIисабалда.\nГъоркьехун бугеб форма хIалтIизабе, цоги цIаралда гъоркь жаниве лъугьине.",
+       "userlogin-createanother": "Цоги аккаунт гьабизе",
+       "createacct-emailrequired": "Электронияб почтаялъул адрес",
+       "createacct-emailoptional": "Электронияб почтаялъул адрес (чара гьечIого къваригIунеб гуро)",
+       "createacct-email-ph": "Дурго электронияб почтаялъул адрес хъвай",
+       "createacct-another-email-ph": "Электронияб почтаялъул адрес хъвай",
+       "createacct-realname": "Унго-унгояб цIар (чара гьечIого къваригIунеб гуро)",
+       "createaccountreason": "ГIилла:",
+       "createacct-reason": "ГIилла",
+       "createacct-reason-ph": "Щай дуца цогияб аккаунт гIуцIулеб бугеб",
+       "createacct-submit": "Аккаунт гIуцIизе",
+       "createacct-another-submit": "Цоги аккаунт гIуцIизе",
+       "createacct-benefit-heading": "{{SITENAME}} гӀуцӀун буго нужго гӀадинал гӀадамаца.",
+       "createacct-benefit-body1": "{{PLURAL:$1|хиса-баси}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|гьумер}}",
+       "createacct-benefit-body3": "Ахирисеб заманаялда жаниб {{PLURAL:$1|гIахьалчи}}",
+       "badretype": "Дуца рихьизарурал паролал данде кколел гьечIо",
+       "userexists": "Бихьизабураб гIахьалчиясул цIар цогияс хIалтIизабулеб буго.\nБегьулеб батани, дуего батIияб цIар бище.",
        "loginsuccesstitle": "Жаниве лъугьана",
+       "loginlanguagelabel": "МацӀ: $1",
+       "pt-login": "Жаниве лъугьине",
+       "pt-login-button": "Жаниве лъугьине",
+       "pt-createaccount": "Аккаунт рагьизе",
+       "pt-userlogout": "КъватӀиве инзе",
+       "passwordreset": "Парол хисизе",
        "resettokens-tokens": "Токенал:",
+       "italic_sample": "Курсивалъулаб хъвай",
+       "italic_tip": "Курсивалъулаб хъвай",
+       "link_sample": "Линкалъул бетӀер",
+       "link_tip": "Жанисаб линк",
+       "headline_sample": "БетIералъул текст",
+       "headline_tip": "2-еб даражаялъул бетIер",
        "media_tip": "Файлалъе линк",
        "sig_tip": "Дур гъулбас ва гьабсагӀаталъ заман",
-       "summary": "ХиÑ\81а-баÑ\81иÑ\8fзÑ\83л ÐºÑ\83Ñ\86:",
+       "summary": "Ð\94Ñ\83Ñ\86а Ð³Ñ\8cаÑ\80Ñ\83Ñ\80ал Ñ\85иÑ\81а-баÑ\81иÑ\8fл:",
        "subject": "Тема/бетӀер",
        "minoredit": "Дагьа-макъаб хиса-баси",
        "watchthis": "Гьаб гьумералда хадуб хал кквезе",
        "savearticle": "Хъвай-хъвай цӀунизе",
-       "preview": "ЦIебесеб",
+       "preview": "Цебесеб",
        "showpreview": "Цин балагьизе",
-       "showdiff": "Хисараб жо балагьизе",
+       "showdiff": "Гьарурал хиса-басиял",
+       "loginreqlink": "Жаниве лъугьине",
+       "newarticle": "(ЦIияб)",
        "updated": "(ЦӀигьабуна)",
        "note": "<strong>ХӀужа:</strong>",
        "previewnote": "<strong>КӀочоге, мун гьабсагӀаталъ балагьула вуго макъалаялъул букӀине бугеб куцалъухъ.</strong>\nДуца гьарурал хиса-басиял цӀунун гьечӀо!",
-       "continue-editing": "Ð\96егиги Ñ\85иÑ\81изабизе",
+       "continue-editing": "ЧIезе Ñ\82еÑ\87Iого Ð¶ÐµÐ³Ð¸Ð³Ð¸ Ñ\85иÑ\81а-баÑ\81иÑ\8fл Ð³Ñ\8cаÑ\80и",
        "editing": "Хисизаби $1",
        "creating": "Гьабула буго цӀияб гьумер - $1",
        "editingsection": "$1 (бутӀа) хисизаби",
        "editconflict": "Хисизабиялул дагӀба:",
        "yourdiff": "БатӀалъи",
        "template-protected": "(цӀунун буго)",
-       "template-semiprotected": "(цо-цо бакӀал цунун руго)",
-       "next": "хадуб",
-       "last": "цебе",
+       "template-semiprotected": "(цо-цо бакӀал цIунун руго)",
+       "content-model-wikitext": "вики-текст",
+       "content-model-text": "гIадатияб текст",
+       "content-model-javascript": "JavaScript",
+       "content-json-empty-object": "ЧIобогояб бакI",
+       "revisionasof": "$1 версия",
+       "previousrevision": "← Цебесеб",
+       "nextrevision": "Хадусеб →",
+       "currentrevisionlink": "Гьанжесеб версия",
+       "cur": "гьанжес.",
+       "next": "хадус.",
+       "last": "цебес.",
        "page_first": "тӀоцебесеб",
        "page_last": "ахирисеб",
+       "history-show-deleted": "ГIицIго нахъе рацIцIарал",
        "histfirst": "некӀсиял",
        "histlast": "бищун цӀиял",
-       "historysize": "($1 {{PLURAL:$1|байт|байт|байт}})",
+       "historysize": "($1 {{PLURAL:$1|байт}})",
        "historyempty": "(чӀобого буго)",
        "history-feed-title": "Хиса-басиязул тарих",
+       "rev-delundel": "бихьизабизе/бахчизе",
        "rev-showdeleted": "бихьизабизе",
+       "revisiondelete": "Нахъе бацIцIине / букIахъе гьабизе гьумералъул версиял",
        "revdelete-show-file-submit": "У",
-       "revdelete-reasonotherlist": "Цоги гӀила",
-       "mergehistory-reason": "ГӀила:",
-       "editundo": "нахъчIвазе",
+       "revdelete-hide-image": "Файлалъул жаниб бугеб жо бахчизе",
+       "revdelete-radio-set": "Бахчараб",
+       "revdelete-radio-unset": "Бихьулеб",
+       "pagehist": "Гьумералъул тарих",
+       "deletedhist": "Нахъе рацIцIиназул тарих",
+       "revdelete-reasonotherlist": "Цоги гӀилла",
+       "mergehistory-reason": "ГӀилла:",
+       "difference-title": "$1 — версиязда гьоркьо батӀалъи",
+       "lineno": "Мухъ $1:",
+       "editundo": "нахъчӀвазе",
        "diff-empty": "(БатӀалъи гьечӀо)",
+       "searchresults": "ЦӀех-рехалъул хӀасилал",
+       "prevn": "{{PLURAL:$1|1=цебесалаб|цересел}} $1",
+       "nextn": "{{PLURAL:$1|1=хадусалаб|хадусел}} $1",
+       "prev-page": "Цебесеб гьумер",
+       "next-page": "Хадусеб гьумер",
+       "nextn-title": "{{PLURAL:$1|Хадусеб $1 хъвай-хъвагӀай|Хадусел $1 хъвай-хъвагӀаял}}",
+       "searchmenu-new": "<strong>«[[:$1]]»-абураб цӀияб гьумер гьабе гьаб вики-проекталда!</strong>\n{{PLURAL:$2|0=|Гь. дуца цӀехон батараб гьумералда балагье|Гь. балагье дур цӀех-рехалъул хӀасилазда.}}",
+       "searchprofile-articles": "Аслиял гьумерал",
+       "searchprofile-images": "Мультимедиа",
+       "searchprofile-everything": "Киса-кибего",
+       "searchprofile-articles-tooltip": "$1-алда хъирщизе",
+       "searchprofile-images-tooltip": "Файлал ратизе",
+       "searchprofile-everything-tooltip": "Киналго гьумеразда хъирщизе (бахӀсазул гьумераздагицин)",
+       "search-result-size": "$1 ({{PLURAL:$2|$2 рагӀи|$2 рагӀи|$2 рагӀи}})",
+       "searchall": "киналго",
+       "powersearch-toggleall": "Киналго",
+       "powersearch-togglenone": "Щибниги",
+       "search-external": "КъватIисеб цIехей",
        "preferences": "Рекъезаби",
        "mypreferences": "Рекъезаби",
-       "localtime": "Бакlалъул заман",
+       "saveprefs": "ЦIунизе",
+       "timezonelegend": "СагIтил рачел:",
+       "localtime": "БакIалъул заман",
+       "timezoneregion-africa": "Африка",
+       "timezoneregion-america": "Америка",
+       "timezoneregion-antarctica": "Антарктика",
+       "timezoneregion-arctic": "Арктика",
+       "timezoneregion-asia": "Азия",
+       "timezoneregion-atlantic": "Атлантикияб океан",
+       "timezoneregion-australia": "Австралия",
+       "timezoneregion-europe": "Европа",
+       "timezoneregion-indian": "Гьиндустаналъул океан",
+       "timezoneregion-pacific": "ГІодоцараб океан",
+       "prefs-searchoptions": "Хъирщизе",
+       "prefs-files": "Файлал",
+       "yourlanguage": "МацI:",
+       "email": "Электронияб адрес",
+       "prefs-signature": "Гъулбас",
+       "prefs-dateformat": "Къо-моцIалъул формат",
+       "userrights": "ГІахьалчиясул ихтиярал",
        "userrights-user-editname": "ГӀахьалчиясул цӀар хъвай:",
+       "right-edit": "Гьумерал хисизари",
+       "right-upload": "Файлал цІазе",
+       "action-edit": "Гьаб гьумер хисизабизе",
+       "action-upload": "гьаб файл жанибе цIазе",
+       "enhancedrc-history": "тарих",
        "recentchanges": "ЦӀиял хиса-басиял",
+       "recentchanges-label-newpage": "Гьаб хиса-басигун цӀияб гьумер рагьана.",
+       "recentchanges-label-minor": "Гьаб буго дагьа-макъаб хиса-баси",
+       "recentchanges-label-bot": "Гьаб хиса-баси ботас гьабуна",
        "rcshowhideminor": "$1 гӀиси-микъинал хиса-басиял",
        "rcshowhideminor-show": "Бихьизабизе",
        "rcshowhideminor-hide": "Бахчизе",
        "rcshowhidemine-show": "Бихьизабизе",
        "rcshowhidemine-hide": "Бахчизе",
        "diff": "батӀалъи",
+       "hist": "тарих",
        "hide": "Бахчизе",
        "show": "Бихьизабизе",
        "minoreditletter": "гӀ.-м.",
        "newpageletter": "ЦӀ",
+       "boteditletter": "б",
+       "rc-change-size-new": "Хисизабун хадуб лъугьараб роцен: $1 {{PLURAL:$1|байт}}",
        "recentchangeslinked": "Рухьарал хиса-басиял",
        "recentchangeslinked-feed": "Рухьарал хиса-басиял",
        "recentchangeslinked-toolbox": "Рухьарал хиса-басиял",
-       "upload": "Файл цIазе",
+       "recentchangeslinked-page": "Гьумералъул цӀар:",
+       "upload": "Файл цӀазе",
        "uploadnologin": "Дуца цӀар бицун гьечӀо",
+       "filedesc": "Къокъаб баян",
+       "upload-dialog-button-save": "ЦIунизе",
+       "upload-dialog-button-upload": "ЦІазе",
+       "imgfile": "файл",
+       "file-anchor-link": "Файл",
+       "filehist": "Файлалъул тарих",
+       "filehist-current": "гьанже",
+       "filehist-datetime": "Къо-моцI/заман",
+       "filehist-thumb": "Миниатюра",
+       "filehist-user": "ГIахьалчи",
+       "filehist-dimensions": "Роценал",
+       "filehist-comment": "Комментарий",
+       "imagelinks": "Файл хӀалтӀизаби",
        "randompage": "Цебе ккараб гьумер",
+       "nbytes": "$1 {{PLURAL:$1|байт}}",
        "shortpages": "Къокъал макъалаби",
-       "longpages": "Кlудиял гьумерал",
-       "listusers": "Гlахьалчагlазул сияхl",
-       "newpages": "ЦIиял гьумерал",
+       "longpages": "Халатал гьумерал",
+       "listusers": "ГӀахьалчагӀазул сияхӀ",
+       "newpages": "ЦӀиял гьумерал",
+       "booksources": "ТӀахьазул ицц",
+       "booksources-search": "Хъирщизе",
        "specialloguserlabel": "ГӀахьалчи:",
+       "log": "Журналал",
        "allarticles": "Киналго макъалаби",
-       "watchlist": "Дур халгьабиялъул сияхl",
+       "allpagessubmit": "Инзе",
+       "categories": "Категориял",
+       "watchlist": "Халгьабиялъул сияхӀ",
+       "mywatchlist": "Халгьабиялъул сияхӀ",
        "watch": "Хал кквезе",
+       "namespace": "ЦӀаразул сияхӀ:",
+       "blanknamespace": "(Аслияб)",
        "contributions": "{{GENDER:$1|ГӀахьалчиясул}} хӀалтӀи",
-       "mycontris": "Дур гlахьаллъи",
+       "mycontris": "Дур хӀалтӀи",
+       "sp-contributions-userrights": "ГІахьалчиясул ихтиярал",
        "whatlinkshere": "Гьанире линкал",
-       "move-page-legend": "Гьумералъул цlар хисизе",
-       "movearticle": "Гьумералъул цӀар хисизе:",
-       "movepagebtn": "Гьумералъул цlар хисизе",
+       "whatlinkshere-title": "«$1» гьумералда бухьен гьабулел гьумерал",
+       "whatlinkshere-page": "Гьумер:",
+       "isredirect": "редирект-гьумер",
+       "isimage": "файлалъул линк",
+       "whatlinkshere-prev": "{{PLURAL:$1|1=цебесеб|цересел}} $1",
+       "whatlinkshere-next": "{{PLURAL:$1|1=хадусеб|хадусел}} $1",
+       "whatlinkshere-links": "← линкал",
+       "whatlinkshere-hideredirs": "$1 редиректал",
+       "whatlinkshere-hidelinks": "$1 линкал",
+       "whatlinkshere-filters": "Фильтрал",
+       "blockip": "ГІахьалчи блокалда лъезе",
+       "ipbsubmit": "Гьав гІахьалчи/адрес блокалда лъезе",
+       "ipb-confirmhideuser": "Нужеда ракІалда буго гІахьалчи блокалда лъезе ва гьесул цмар бахчизе. Гьеб загьирлъуларо сияхІазда ва журналазда. Гьеб гьабизе бокьун бугищ нужее?",
+       "blocklink": "Блокалда лъезе",
+       "contribslink": "хӀалтӀи",
+       "move-page-legend": "Гьумералъул цӀар хисизе",
+       "movepagebtn": "Гьумералъул цӀар хисизе",
+       "movelogpage": "ЦӀарал хисиялъул журнал",
+       "thumbnail-more": "КӀодолъизабизе",
+       "tooltip-pt-userpage": "Дур гӀахьалчиясул гьумер",
+       "tooltip-pt-mytalk": "Дур бахӀсалъул гьумер",
+       "tooltip-pt-preferences": "Дур рекъезабиял",
+       "tooltip-pt-mycontris": "Дуца гьарурал хиса-басиязул сияхӀ",
+       "tooltip-pt-login": "Гьаниб бегьула регистрация гьабизе, амма гьеб тӀадаб жо гуро.",
+       "tooltip-pt-logout": "КъватӀиве инзе",
+       "tooltip-pt-createaccount": "Нужеда тӀадаб гьечӀо, амма гьаниб аккаунт рагьани, нужеего лъикӀ букӀина.",
+       "tooltip-ca-talk": "Аслияб гьумералда тӀасан бахӀс",
+       "tooltip-ca-edit": "Гьаб гьумер хисизабизе",
+       "tooltip-ca-viewsource": "Гьаб гьумер кинаб бугониги хиса-баси гьабиялдаса цӀунараб буго, амма дуе кӀола гьелда балагьизе яги гьелъул тексталъул копия гьабизе.",
+       "tooltip-ca-history": "Гьумералда хиса-басиял гьариялъул журнал",
+       "tooltip-ca-move": "Гьумералъул цӀар хисизе",
+       "tooltip-ca-watch": "Гьаб гьумер ххал гьабиялъул сияхӀалда жубазе.",
+       "tooltip-search": "{{grammar:prepositional|{{SITENAME}}}}-алда хъирщизе",
+       "tooltip-search-go": "ГӀицӀго гьединаб цӀар бугеб гьумер батизе.",
+       "tooltip-search-fulltext": "Дуца хъвараб тексталда рекъон гьумерал ратизе",
+       "tooltip-p-logo": "БетӀераб гьумералда ине",
+       "tooltip-n-mainpage": "БетӀераб гьумер рагьизе",
+       "tooltip-n-mainpage-description": "БетӀераб гьумер рагьизе",
+       "tooltip-n-currentevents": "Гьанжесел лъугьа-бахъиназул хӀакъалъулъ информация",
+       "tooltip-n-recentchanges": "Ахирисел хиса-басиязул сияхӀ",
+       "tooltip-n-randompage": "Цебе ккараб гьумералда балагьизе",
+       "tooltip-n-help": "Баянал росизе кӀолеб бакӀ",
+       "tooltip-t-whatlinkshere": "Гьаб гьумералда линк гьабулелщинал гьумеразул сияхӀ",
+       "tooltip-t-upload": "Файлал цІазе",
+       "tooltip-t-specialpages": "Хъулухъиял гьумеразул сияхӀ",
+       "tooltip-t-print": "Гьаб гьумералъул басмаялъул сверел",
+       "tooltip-ca-nstab-main": "Аслияб гьумер бихьизабизе",
+       "tooltip-ca-nstab-user": "ГӀахьалчиясул гьумер",
+       "tooltip-ca-nstab-special": "Гьаб буго хъулухъияб гьумер. Гьаб хисизабизе данде кколаро.",
+       "tooltip-ca-nstab-image": "Файлалъул гьумер",
+       "tooltip-save": "Дуца гьарурал хиса-басиял цӀунизе",
+       "tooltip-summary": "Къокъаб баян хъвае",
        "lastmodifiedatby": "Ахирисеб нухалъ гьаб гьумералъул хиса-баси гьабуна:  $2, $1. Хисизабуна гьас: $3.",
-       "specialpages": "Хассал гьумерал"
+       "pageinfo-toolboxlink": "Гьумералъул хӀакъалъулъ",
+       "nextdiff": "Хадусеб хиса-баси →",
+       "file-nohires": "ЦӀикӀкӀун расширение бугеб версия гьечӀо.",
+       "show-big-image": "Аслияб файл",
+       "show-big-image-size": "$1 × $2 пикселал",
+       "metadata": "Метабаян",
+       "exif-software": "Программабазул обеспечение",
+       "exif-exifversion": "Exif версия",
+       "exif-orientation-1": "Нормалияб",
+       "namespacesall": "киналго",
+       "monthsall": "киналго",
+       "hijri-calendar-m1": "МухІаррам",
+       "hijri-calendar-m3": "РабигІул-Аввал",
+       "hijri-calendar-m4": "РабигІу Ссани",
+       "hijri-calendar-m5": "Жумада ал-уля",
+       "hijri-calendar-m6": "Жумада ас-сани",
+       "hijri-calendar-m7": "Ражаб",
+       "hijri-calendar-m8": "ШагІбан",
+       "hijri-calendar-m9": "Рамазан",
+       "hijri-calendar-m10": "Шаввал",
+       "hijri-calendar-m11": "Зул-КъагІда",
+       "hijri-calendar-m12": "Зул-ХІижжа",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|бахӀс]])",
+       "specialpages": "Хасал гьумерал",
+       "logentry-move-move": "$1 {{GENDER:$2|гӀахьалчияс $3 гьемералъул цӀар $4-абун хисизабуна|гӀахьалчиясчӀужуялъ $3 гьемералъул цӀар $4-абун хисизабуна}}",
+       "searchsuggest-search": "Хъирщизе",
+       "special-characters-group-latin": "Латин",
+       "special-characters-group-greek": "Грек",
+       "special-characters-group-cyrillic": "Кириллияб",
+       "special-characters-group-arabic": "ГIараб",
+       "special-characters-group-persian": "Перс"
 }
index 10b4a94..abdc239 100644 (file)
        },
        "tog-underline": "باغلانتی‌لارین آلتینی خطله:",
        "tog-hideminor": "سوْن دییشیکلیکلرده کیچیکلری گیزلت",
-       "tog-hidepatrolled": "سوْن دییشیکلیکلرده نظارتلنمیش دَییشیکلیکلری گیزلت",
+       "tog-hidepatrolled": "سوْن دییشیکلیک‌لرده گؤزدن گئچیریلمیش دَییشیکلیکلری گیزلت",
        "tog-newpageshidepatrolled": "یوْخلانمیش صفحه‌لری یئنی صفحه‌لر لیستیندن گیزلت",
-       "tog-extendwatchlist": "ایزله‌دیک‌لری، یالنیز یئنی‌لر اۆچون یوْخ، بۆتون دییشیک‌لیک‌لری گؤرستمک اۆچون، گنیشلندیر.",
+       "tog-hidecategorization": "صفحه بؤلمه‌لرینی گیزلت",
+       "tog-extendwatchlist": "ایزله‌دیک‌لری تکجه یئنی‌لر اۆچون دئییل، بۆتون دییشیک‌لیک‌لری گؤسترمک اۆچون گئنیشلندیر.",
        "tog-usenewrc": "دَییشیک‌لیک‌لری سوْن دَییشیک‌لیک‌لر صفحه‌سینده ایزله‌دیک‌لر صفحه‌سینده قروپ‌لا (جاوااسکریپت گرک‌دیر)",
        "tog-numberheadings": "باشلیق‌لاری اوْتوماتیک نۆمره‌له",
        "tog-showtoolbar": "دَییشدیرمه آراج-چۇبوغونو گؤستر",
@@ -36,6 +37,7 @@
        "tog-watchdefault": "دَییشدیردیگیم صفحه‌‌لری و فايل‌لاری، ایزله‌دیک‌لریمه آرتیر",
        "tog-watchmoves": "داشیدیغیم صفحه‌‌لری و فايللاری ایزله‌دیکلریمه آرتیر",
        "tog-watchdeletion": "سیلدیگیم صفحه‌‌لری و فايللاری ایزله‌دیکلریمه آرتیر",
+       "tog-watchuploads": "یئنی یۆکله‌دیگیم فایل‌لاری ایزله‌دیک‌لریمه آرتیر",
        "tog-watchrollback": "قایتاریلمیش صفحه‌لری ایزله‌دیکلریمه آرتیر",
        "tog-minordefault": "دیفالت اوْلاراق، بۆتون دَییشدیر‌مه‌لری کیچیک کیمی علامتله",
        "tog-previewontop": "اؤن‌گؤستریشی، يازماق قۇتوسوندان قاباق گؤستر",
        "tog-uselivepreview": "دیری اؤن‌گؤستریش ایشلت (تِست مرحله‌سینده)",
        "tog-forceeditsummary": "دَییشیکلیک قیساسی بوْش قالمیشسا منه بیلیندیر",
        "tog-watchlisthideown": "منیم دَییشیک‌لیک‌لریمی ایزله‌دیک‌لردن گیزلت",
-       "tog-watchlisthidebots": "بÙ\88Ù\92ت دَییشیک‌لیک‌لرینی ایزله‌دیک‌لردن گیزلت",
+       "tog-watchlisthidebots": "رÙ\88Ù\92بات دَییشیک‌لیک‌لرینی ایزله‌دیک‌لردن گیزلت",
        "tog-watchlisthideminor": "کیچیک دَییشیک‌لیک‌لری ایزله‌دیک‌لردن گیزلت",
        "tog-watchlisthideliu": "گیریش ائتمیش ایشلدن‌لرین دَییشیک‌لیک‌لرینی ایزله‌دیک‌لردن گیزلت",
        "tog-watchlisthideanons": "تانینمامیش ایشلدن‌لرین دَییشیک‌لیک‌لرینی ایزله‌دیک‌لردن گیزلت",
        "tog-watchlisthidepatrolled": "نظارتلنمیش دَییشیکلیکلری گؤزله‌دیکلردن گیزلت",
+       "tog-watchlisthidecategorization": "صفحه‌لرین بؤلمه‌‌لرینی گیزلت",
        "tog-ccmeonemails": "باشقا ایشلدن‌لره گؤندردیگیم ایمئیل‌لرین کوْپی‌لرینی منه گؤندر",
        "tog-diffonly": "مۆقایسه‌لر آلتیندا صفحه‌نین ایچینده‌کیلرینی گؤسترمه",
        "tog-showhiddencats": "گیزلی بؤلمه‌لری گؤستر",
        "october-date": "اوْکتوبرون $1-ی",
        "november-date": "نوْوامبرین $1-ی",
        "december-date": "دسامبرین $1-ی",
+       "period-am": "صۆبح",
+       "period-pm": "آخشام",
        "pagecategories": "{{PLURAL:$1|بؤلمه|بؤلمه‌لر}}",
        "category_header": "«$1» بؤلمه‌سینده صفحه‌لر",
        "subcategories": "آلت‌بؤلمه‌لر",
        "morenotlisted": "بۇ لیست کامل دئییل.",
        "mypage": "صفحه",
        "mytalk": "دانیشیق",
-       "anontalk": "بÙ\88 Ø¢Û\8câ\80\8cÙ¾Û\8c Ø¢Ø¯Ø±Ø³Û\8cÙ\86Ù\87 Ø¯Ø§Ù\86Û\8cØ´Û\8cÙ\82",
+       "anontalk": "دانیشیق",
        "navigation": "دوْلانماق",
        "and": "&#32;و",
        "qbfind": "تاپ",
        "viewhelppage": "یاردیم صحیفه‌سینه باخ",
        "categorypage": "بؤلمه صحیفه‌‌سینه باخ",
        "viewtalkpage": "دانیشیغا باخ",
-       "otherlanguages": "باشÙ\82ا دیل‌لرده",
+       "otherlanguages": "Ø¢Û\8cرÛ\8c دیل‌لرده",
        "redirectedfrom": "($1-دن يوْل‌لاندیریلمیش)",
        "redirectpagesub": "یوْللاندیرما صفحه‌سی",
        "redirectto": "مسیزپرین دَییشیب:",
        "site-atom-feed": "$1 آتوم فید",
        "page-rss-feed": "«$1» آراِس‌اِس فید",
        "page-atom-feed": "«$1» آتوم فید",
-       "red-link-title": "$1 (صفحه یوْخدور)",
+       "red-link-title": "$1 (صفحه یوْخدور)",
        "sort-descending": "آزالان سیرالاماق",
        "sort-ascending": "چوْخالان سیرالاماق",
        "nstab-main": "صفحه",
        "virus-scanfailed": "یوخلاماق باشا چاتمادی (کود $1)",
        "virus-unknownscanner": "تانینمامیش آنتی‌ویروس:",
        "logouttext": "<strong>سیز ایندی سیستِم‌دن چیخدینیز.</strong>\n\nبونا دیقت ائدین کی وب حافیظه نیزی سیلمه ین،بعضی صحیفه‌لر کَش-ینیزی سیلمه‌میش کیمی، هله ده سیزین گیریش ائتدیگینیز کیمی گؤستریله‌جکلر.",
+       "cannotlogoutnow-title": "ایندی چیخیش اوْلونمازدیر",
+       "cannotlogoutnow-text": "$1-ی ایشلدرکن چیخیش اوْلونمازدیر.",
        "welcomeuser": "خوش گلمیسینیز، $1!",
        "welcomecreation-msg": "حسابینیز آچیلدی.\n[[Special:Preferences|{{SITENAME}}ترجیحلر]] دییشدیرمیی اونوتمایین.",
-       "yourname": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c آدی:",
+       "yourname": "اÛ\8cØ´Ù\84دÙ\86 آدی:",
        "userlogin-yourname": "ایشلدن آدی",
        "userlogin-yourname-ph": "ایشلدن آدینیزی یازین",
        "createacct-another-username-ph": "ایشلدن آدینیزی یازین",
        "remembermypassword": "بو بیلگی‌سایاردا منیم گیریشیمی (چوخو $1 {{PLURAL:$1|گون}}ه قدر) یاددا ساخلا",
        "userlogin-remembermypassword": "منی ایچری‌ده ساخلا",
        "userlogin-signwithsecure": "آرخایین باغلانتی ایشلدین",
+       "cannotloginnow-title": "ایندی گیریش اوْلونمازدیر",
+       "cannotloginnow-text": "$1-ی ایشلدرکن گیریش اوْلونمازدیر",
        "yourdomainname": "سیزین دامنه:",
        "password-change-forbidden": "بو ویکی‌ده رمزلری دَییشه بیلنمه‌سینیز.",
        "externaldberror": "بیر دیتابیس دوغرولاما خطاسی اولدو، یوخسا سیزین ائشیک حسابینیزی گونجل‌لدمگه ایجازه‌نیز یوخدور.",
        "login": "گیریش",
+       "login-security": "کیملیگینیزی تائید ائدین",
        "nav-login-createaccount": "گیریش / حساب یارات",
        "userlogin": "گیریش / حساب یارات",
        "userloginnocreate": "گیریش",
        "userlogin-resetpassword-link": "رمزینیزی اونوتموسوز مو؟",
        "userlogin-helplink2": "گیریش ایله کؤمک",
        "userlogin-loggedin": "سیر حال حاضیردا {{GENDER:$1|$1}} عونوانیندا گیریش ائدیب سیز.\nآشاغیداکی فورمودان بیر آیری ایشلدن عونوانیندا گیریش اوچون ایشلدین.",
+       "userlogin-reauth": "{{GENDER:$1|$1}} اوْلدوغونوزو تأیید ائتمک اۆچون یئنه گیرمه‌لیسینیز.",
        "userlogin-createanother": "بیر باشقا حساب یارات",
        "createacct-emailrequired": "ایمیل آدرسی",
        "createacct-emailoptional": "ایمیل آدرسی (ایستگه باغلی)",
        "createaccountreason": "نَدَن‌لیک:",
        "createacct-reason": "سبب",
        "createacct-reason-ph": "ندن سیز باشقا حساب یارادیرسینیز",
+       "createacct-reason-help": "حساب یاراتماق لیستینده گؤستریلن مساژ",
        "createacct-submit": "حسابینیزی یارادین",
        "createacct-another-submit": "حساب یارات",
+       "createacct-continue-submit": "حساب یاراتماغین دالی‌سینی توت",
+       "createacct-another-continue-submit": "حساب یاراتماغی داوام ائت",
        "createacct-benefit-heading": "{{SITENAME}} سیزین کیمی آدام‌لارین الی ایله یارانیب‌دیر.",
        "createacct-benefit-body1": "{{PLURAL:$1|دَییشیکلیک}}",
        "createacct-benefit-body2": "{{PLURAL:$1|صفحه}}",
        "nocookieslogin": "{{SITENAME}} ایشلدنلری گیردیرمک اوچون، کوکی‌لری ایشلدیر.\nسیزین کوکی‌لریز باغلانیب‌دیر.\nلوطفا اونلاری آچین و یئنی‌دن چالیشین.",
        "nocookiesfornew": "قایناغینی دوغرو اولدوغونو بیلمه‌مک اوچون، ایشلدن حسابی یارادیلمادی.\nکوکی‌لرینیزین آچیق اولدوغون دان آرخایین اولوب، بو یارپاغی یئنی‌دن یوکله‌ییب، یئنی‌دن چالیشین.",
        "noname": "گئچرلی ایستیفاده‌چی آدی وئرمه‌دینیز.",
-       "loginsuccesstitle": "گیریش اوغورلو",
+       "loginsuccesstitle": "گیریلدینیز",
        "loginsuccess": "'''سیز ایندی {{SITENAME}} سایتینا، «$1» آدی‌له گیرمیسینیز.'''",
        "nosuchuser": "«$1» آدلا ایستیفاده‌چی یوخدور.\nایستیفاده‌چی آدلاری، حرفلرین بؤیوک/کیچیک‌لیگینه حساس‌دیلار.\nیازدیغینیزا یئنی‌دن باخین، یوخسا [[Special:CreateAccount|یئنی بیر حساب آچین]].",
        "nosuchusershort": "\"$1\" آدلا ایستیفاده‌چی یوخدور.\nدوزگون یازدیغینیزدان آرخایین اولون.",
        "nouserspecified": "بیر ایستیفاده‌چی آدی وئرمه‌لیسینیز.",
        "login-userblocked": "بو ایستیفاده چی باغلانیب‌دیر. گیریشه ایجازه یوخدور.",
-       "wrongpassword": "یانلیش رمز وئریلدی.\nیئنی‌دن یازین.",
+       "wrongpassword": "غلط رمز وئریلدی.\nیئنی‌دن یازین.",
        "wrongpasswordempty": "بوش رمز وئردینیز.\nیئنی‌دن یازین.",
        "passwordtooshort": "رمز، آزی {{PLURAL:$1|بیر|$1}} کاراکتئر اولمالی‌دیر.",
        "passwordtoolong": "رمز،سوزو چوخلوغو {{PLURAL:$1|۱ سوز|$1 سوز}} کاراکتئر اولمامالی‌دیر.",
        "noemail": "«$1» ایستیفاده‌چی‌یه ایمیل آدرسی قئید اولماییب‌دیر.",
        "noemailcreate": "دوزگون بیر ایمیل آدرسی وئرمه‌لیسینیز",
        "passwordsent": "«$1»-نا قئید اولونان ایمیل آدرسینه، یئنی بیر رمز گؤندریلدی.\nاونا آلان‌دان سونرا یئنی‌دن گیرین.",
-       "blocked-mailpassword": "سÛ\8cزÛ\8cÙ\86 Ø¢Û\8câ\80\8cÙ¾Û\8c Ø¢Ø¯Ø±Ø³Û\8cÙ\86Û\8cزÛ\8cÙ\86 Ø¯Û\8cÛ\8cشدÛ\8cرÙ\85Ù\87 Ø§Ø¦Ø¯Ù\87 Ø¨Û\8cÙ\84Ù\85Ù\87â\80\8cسÛ\8c Ø¨Ø§ØºÙ\84اÙ\86Ù\85Û\8cشدÛ\8cر. Ø³Ù\88ءاÛ\8cستÛ\8cÙ\81ادÙ\87 Ù\82ارشÛ\8câ\80\8cسینی آلماق اۆچون، رمزی یئنی‌دن اله گتیرمک ایمکانینا ایجازه‌نیز یوْخدور.",
+       "blocked-mailpassword": "سÛ\8cزÛ\8cÙ\86 Ø¢Û\8câ\80\8cÙ¾Û\8c Ø¢Ø¯Ø±Ø³Û\8cÙ\86Û\8cزÛ\8cÙ\86 Ø¯Û\8cÛ\8cشدÛ\8cرÙ\85Ù\87 Ø§Ø¦Ø¯Ù\87 Ø¨Û\8cÙ\84Ù\85Ù\87â\80\8cسÛ\8c Ø¨Ø§ØºÙ\84اÙ\86Ù\85Û\8cشدÛ\8cر. Ø³Ù\88ءاÛ\8cستÛ\8cÙ\81ادÙ\87 Ù\82اباغینی آلماق اۆچون، رمزی یئنی‌دن اله گتیرمک ایمکانینا ایجازه‌نیز یوْخدور.",
        "eauthentsent": "سیزین سئچیلمیش ایمیل آدرسینه، دوغرولاماق اوچون بیر ایمیل گؤندریلدی.\nهر یئنی بیر ایمیل گؤندرمک‌دن اؤنجه، بو حسابین دوغرودان سیزین اولدوغونو گؤسترمک اوچون، او ایمیل‌ده‌کی ایشلری گؤرمه‌لیسینیز.",
        "throttled-mailpassword": "سون {{PLURAL:$1|ساعات|$1 ساعات}}‌دا سیزه بیر رمز یئنیله‌مه ایمیلی گؤندریلیب‌دیر.\nسوءاستفاده قاباغین آلماق اوچون، هر {{PLURAL:$1|ساعات|$1 ساعات}}‌دا یالنیز بیر رمز یئنیله‌مه ایمیلی گؤندریلر.",
        "mailerror": "ایمیل گؤندرمه خطاسی: $1",
        "createacct-another-realname-tip": "اصلی آد ایستگینیزه باغلی‌دیر.\nاگر اونو وئرماغی سئچسز، سیزین ایشلرینیزی سیزه مونتسب ائدن‌ده، بو اصلی آد ایشلنه‌جک‌دیر.",
        "pt-login": "گیریش ائت",
        "pt-login-button": "گیریش ائت",
+       "pt-login-continue-button": "گیریشین دالینی توت",
        "pt-createaccount": "حساب یارات",
        "pt-userlogout": "چیخیش",
        "php-mail-error-unknown": "پی‌اچ‌پی‌نین mail() فونکسیاسیندا تانینمامیش خطا.",
        "resetpass_submit": "رمز یارادین و گیریش ائدین",
        "changepassword-success": "رمزینیز باجارییلا دَییشدیرلدی!",
        "changepassword-throttled": "سیزین چوخ گیریش چالیشماغینیز اولوب‌دور.\nلوطفاً یئنی‌دن چالیشماق‌دان اؤنجه $1 دؤزون.",
+       "botpasswords": "روبات رمزی",
+       "botpasswords-disabled": "روبات پسووْردلاری ایشلدن سالینیبدیر.",
+       "botpasswords-createnew": "روبات رمزی یارات",
+       "botpasswords-label-appid": "روبات آدی:",
        "botpasswords-label-create": "یارات",
+       "botpasswords-label-update": "آپدیت ائت",
        "botpasswords-label-cancel": "وازگئچ",
        "botpasswords-label-delete": "سیل",
+       "botpasswords-label-resetpassword": "رمزی یئنی‌له",
+       "botpasswords-label-grants-column": "وئریلدی",
+       "botpasswords-bad-appid": "\"$1\" روْبات آدی اعتیبارلی دئییلدیر.",
+       "botpasswords-created-title": "روْبات پسووْردو یارادیلدی.",
+       "botpasswords-updated-title": "روْبات پسووْردو آپدئیت اوْلوندو.",
+       "botpasswords-deleted-title": "روْبات پسووْردو سیلیندی",
        "resetpass_forbidden": "رمزلر دَییشیلمز",
        "resetpass-no-info": "بو صحیفه‌نی دوغرو گؤردوگونوز اوچون سیستمه گیرمه‌لیسینیز.",
        "resetpass-submit-loggedin": "رمزی دَییشدیر",
        "resetpass-abort-generic": "رمز دَییشدیرمک، بیر اوزانتی ایله یاریدا کسیلیب‌دیر.",
        "resetpass-expired": "گیریش رمزینیز بایات اولوب.لطفا گیریشینیز اوچون یئنی بیر گیریش رمزی سئچین.",
        "resetpass-expired-soft": "گیریش رمزینیز بایات اولوب و یئنی دن تنظیم اولونمالی دیر. لوطفا ایندی بیر یئنی رمز سئچیب یا دا یئنی دن تنظیم ائتمک اوچون سونرالیقدا\"{{int:authprovider-resetpass-skip-label}}\" دویمه سین باسین.",
-       "resetpass-validity-soft": "گیریش رمزینیز دوز دئیییل:$1\nلوطفا ایندی بیر یئنی گیریش رمزی سئچین یا دا\"{{int:authprovider-resetpass-skip-label}}\" باسین کی سونرا اونو یئنی دن سئچرسیز.",
+       "resetpass-validity-soft": "گیریش رمزینیز دۆز دئییل:$1\nلۆطفاً ایندی یئنی بیر گیریش رمزی سئچین یا دا داها سوْنرا اوْنو یئنیدن سئچمه‌نیز اۆچون \"{{int:authprovider-resetpass-skip-label}}\" اۆستونده کیلیک ائدین.",
        "passwordreset": "رمزی یئنی‌له",
        "passwordreset-text-one": "رمزینیزی صیفیرلاماق اوچون بو فورمو باشا چاتدیرین.",
        "passwordreset-text-many": "{{PLURAL:$1|رمزینیزی صیفیرلاماق اوچون، بیرینی دولدورون.}}",
        "minoredit": "بو بیر کیچیک دَییشدیرمه‌دیر",
        "watchthis": "بو صفحه‌نی ایزله",
        "savearticle": "صفحه‌نی ذخیره ائت",
+       "savechanges": "دَییشیکلیکلری ذخیره ائت",
+       "publishchanges": "دَییشیکلیکلری یای",
        "preview": "اؤن‌گؤستریش",
        "showpreview": "سیناق گؤستریش",
        "showdiff": "دَییشیکلیکلری گؤستر",
        "blankarticle": "<strong>دیققت:</strong>سیز بیر بوش صفحه نین یاراتماق حالیندا سیز .\nایر«{{int:savearticle}}» بیر ده باسایلا،بوش صفحه یاراناجاق.",
-       "anoneditwarning": "<strong>دیقت:</strong> سیز سیستئمه گیرمه‌میسینیز. سیزین آی‌پی آدرسینیز بو صفحه‌نین دییشیک تاریخچه‌سین‌ده یازیلب و گورسنجک.هر دَییشدیرمه ائتسز.<strong>[$1 گیریش ائتسز]</strong> یا <strong>[$2 بیر ایشلدن حسابی آچاسیز]</strong>, دَییشدیرمه لرینیز سیزین ایشلدن حساب آدینیزا نیسبت وئریلجک و آرتیق مزیت لرله.",
-       "anonpreviewwarning": "''سیستمه گیرمه‌میسینیز. قئید ائتمک‌له، سیزین آی‌پی آدرسینیز بو صحیفه‌نین گئچمیشین‌ده ثبت اولوناجاقدیر.''",
+       "anoneditwarning": "<strong>دیقت:</strong> سیز سیستمه گیرمه‌میسینیز. سیزین آی‌پی آدرسینیز بۇ صفحه‌نین دییشیک گئچمیشینده یازیلب و گؤروشه‌جک.هر دَییشدیرمه ائتسز.<strong>[$1 گیریش ائتسز]</strong> یا <strong>[$2 بیر ایشلدن حسابی آچاسیز]</strong>, دَییشدیرمه‌لرینیز سیزین ایشلدن حساب آدینیزا نیسبت وئریله‌جک و آرتیق مزیتلرله.",
+       "anonpreviewwarning": "<em> سیستمه گیرمه‌میسینیز. ذخیره ائتمک‌له، سیزین آی‌پی آدرسینیز بو صفحه‌نین گئچمیشینده ثبت اولوناجاقدیر.</em>",
        "missingsummary": "'''یادا سالما:''' سیز بیر دَییشیکلیک قیساسی یازمامیسینیز. «{{int:savearticle}}» دویمه‌سینی تیک‌لاسازسا، دَییشیکلیگینیز، قیسا شرح‌سیز اولاراق قئید اولوناجاق.",
        "selfredirect": "<strong>دیققت:</strong>سیز صفحه نین یولون اوزونه دَییشدیریمک حالیندا سیز.\nایمکانی وار یانلیش سون بیر یئری یولون دَییشمک اوچون سئچیب سیز،یا دا صفحه نی یانلیش دَییشدیرسیز.\nایر\"{{int:savearticle}}\" اوستون یئنی دن باساسینیز یولون دَییشیکلیگی دوزلجک.",
        "missingcommenttext": "لوطفاً آشاغی‌دا بیر یوروم یازین.",
        "accmailtitle": "رمز گؤندریلدی",
        "accmailtext": "[[User talk:$1|$1]] اوچون بیر راست‌گله رمز یارادیلیب و $2-ه گؤندریلدی.\n\nبو یئنی حسابین رمزی، گیرندن سونرا <em>[[Special:ChangePassword|رمز دَییشدیرمه]]</em> صحیفه‌سیندن دَییشیله بیلر.",
        "newarticle": "(یئنی)",
-       "newarticletext": "مؤوجود اوْلمايان صحیفه‌‌يه اوْلان کئچیدی ایزله‌دینیز. \nآشاغیداکی ساحه‌‌يه مظمونونو يازاراق بۇ صحیفه‌‌نی '''سیز''' يارادا بیلرسینیز. (علاوه‌‌ معلومات اۆچون [$1 کؤمک صحیفه‌‌سینه] باخین). اگر بۇ صحیفه‌‌يه سهون گلمیسینیزسه ساده‌جه اوْلاراق براوزئرین '''گئری''' دۆيمه‌سینه وۇرون.",
+       "newarticletext": "مووجود اوْلمايان صفحه‌‌يه اوْلان لینکی ایزله‌دینیز. \nآشاغیداکی یئره یازیلارینیزی يازیب، بۇ صفحه‌‌نی '''سیز''' يارادا بیلرسینیز. (آرتیق معلومات اۆچون [$1 کؤمک صفحه‌‌سینه] باخین). اگر بۇ صفحه‌‌يه ایشتباه گلمیسینیزسه تکجه براوزرین '''قایید''' دۆيمه‌سینه وۇرون.",
        "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-nopermission": "بو صحیفه‌‌ ایندی بوشدور. \nباشقا صحیفه‌‌لرده عینی آددا صحیفه‌‌نی  [[Special:Search/{{PAGENAME}}| آختار]], علاقه‌‌لی قئيدلره \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} باخا],\nو يا صحیفه‌‌نی  [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktə]</span> ائده بیلرسینیز.",
        "edit-no-change": "سیزین دییشدیر قئیده آلینمامیش‌دیر. بئله کی، متنده هئچ بیر دییشدیر ائدیلممیش‌دیر.",
        "postedit-confirmation-created": "بۇ صفحه یارانیب‌دیر.",
        "postedit-confirmation-restored": "صفحه گئری یوکلندی.",
-       "postedit-confirmation-saved": "سیزین دَییشدیرمه‌نیز قئید اولونوب‌دور.",
+       "postedit-confirmation-saved": "سیزین دَییشدیرمه‌نیز ذخیره اولدو.",
        "edit-already-exists": "یئنی صحیفنی یاراتماق مومکون دئییل.\nبئله کی، بو آددا صحیفه آرتیق مؤوجوددور.",
        "defaultmessagetext": "دفالت دانیشیق متنی",
        "content-failed-to-parse": "تجزیه محتوای $2  مدل اوچون $1: $3 موفقیت اله گلمه دی",
        "mergehistory-comment": "[[:$1]]، [[:$2]] ایله بیرلشدیریلدی: $3",
        "mergehistory-same-destination": "قایناق و مقصد صحیفه‌لر، بیر اولانمازلار",
        "mergehistory-reason": "ندن",
-       "mergelog": "بیرلشدیرمه سیاهی‌سی",
+       "mergelog": "بیرلشدیرمه ژورنالی",
        "revertmerge": "آيیر",
-       "mergelogpagetext": "آشاغدی‌دا، ان سون صحیفه بیرلشدیریلمه‌لری گؤستریلیر.",
+       "mergelogpagetext": "آشاغیدا، ان سون صفحه گئچمیشلری بیرلشدیریلمه‌لری سیرالانیر.",
        "history-title": "«$1»-ین گئچمیشی",
-       "difference-title": "«$1» نوسخه‌لرینین آراسینداکی فرقلری",
+       "difference-title": "«$1» نوسخه‌لرینین آراسینداکی فرقلری",
        "difference-title-multipage": "«$1» و «$2» صحیفه‌لرین آراسینداکی فرقلر",
        "difference-multipage": "(صفحه‌لر آراسینداکی فرق‌لر)",
        "lineno": "خط $1:",
        "diff-multi-otherusers": "({{PLURAL:$1|۱ میانی نوسخه لر|$1 میانی نوسخه لر}} دَییک اولونموش {{PLURAL:$2|۱ ایشلدچی|$2 ایشلدچی}}طرفیندن گوستریلمیر)",
        "diff-multi-manyusers": "{{PLURAL:$2|بیر|$2}}-دن چوخ ایستیفاده‌چی یارادان {{PLURAL:$1|بیر|$1}} نوسخه، گؤستریلمه‌ییب‌دیر",
        "difference-missing-revision": "بو فرقین ($1) {{PLURAL:$2|بیر|$2}} نوسخه‌سی تاپیلانمادی.\n\nعموماً بو خطا، سیلینن بیر صحیفه‌یه واختی گئچمیش بیر فرق باغلانتی‌سیلا گلمک ایله آرا گلر.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}سیلمک سیاهی‌سی]ندا باشقا بیلگیلر اولا بیلر.",
-       "searchresults": "آختاریش سونوجلاری",
-       "searchresults-title": "«$1» اوچون آختاریش سونوجلاری",
+       "searchresults": "آختاریش نتیجه‌لری",
+       "searchresults-title": "«$1» اوچون آختاریش نتیجه‌لری",
        "titlematches": "صحیفه‌‌ آدی عینیدیر",
        "textmatches": "یازی عینی‌دیر",
        "notextmatches": "هئچ بیر بنزر صحیفه یازی‌سی تاپیلمادی",
-       "prevn": "اؤنجه‌کی {{PLURAL:$1|$1}}",
+       "prevn": "قاباقکی {{PLURAL:$1|$1}}",
        "nextn": "سونراکی {{PLURAL:$1|$1}}",
-       "prev-page": "قاباغکی صحیفه",
+       "prev-page": "قاباقکی صفحه",
        "next-page": "سونراکی صفحه",
        "prevn-title": "قاباقکی {{PLURAL:$1|بیر|$1}} نتیجه",
        "nextn-title": "سونراکی {{PLURAL:$1|بیر|$1}} سونوج",
        "preferences": "ترجیحلر",
        "mypreferences": "ترجیحلر",
        "prefs-edits": "دَییشمه‌لرین سایی:",
-       "prefsnologintext2": "خواهیش اولونور تنظیملرینیزی دَییشمک اوچون گیریش ائدین.",
+       "prefsnologintext2": "لوطفا تنظیملرینیزی دَییشمک اوچون گیریش ائدین.",
        "prefs-skin": "قابیق",
        "skin-preview": "اؤن‌گؤستریش",
        "datedefault": "سئچیم‌سیز",
-       "prefs-labs": "آزÙ\85اÛ\8cÛ\8cØ´Û\8c Ø§Ø¤Ø²Ù\84â\80\8cÙ\84Û\8cÚ©لر",
+       "prefs-labs": "تست Ø®Û\86صÛ\87صÛ\8cتلر",
        "prefs-user-pages": "ایستیفاده‌چی صحیفه‌لری",
-       "prefs-personal": "اÛ\8cØ´Ù\84دÙ\86 Ù\88ئرÛ\8câ\80\8cÙ\84ری",
+       "prefs-personal": "اÛ\8cØ´Ù\84دÙ\86 Ù¾Ø±Ù\88Ù\81اÛ\8cÙ\84ی",
        "prefs-rc": "سوْن دَییشیکلیکلر",
        "prefs-watchlist": "ایزله‌دیکلر",
        "prefs-editwatchlist": "ایزله‌دیکلریم صفحه‌‌لری دَییشدیر",
        "prefs-editwatchlist-edit": "ایزلدیکلرینیزدن گورمک هابئله باشلیق لارین سیلمک",
        "prefs-editwatchlist-raw": "ایزله‌دیگیم خام لیستی دَییشدیر",
        "prefs-editwatchlist-clear": "ایزله دیگیم لیستی سیلمک",
-       "prefs-watchlist-days": "اÛ\8cزÙ\84Ù\87â\80\8cدÛ\8cÚ©â\80\8cÙ\84رÛ\8cÙ\85دÙ\87 Ú¯Ø¤Ø±Ø³Ø¯Û\8cÙ\84Ù\86 Ú¯Û\86Ù\86â\80\8cÙ\84ر",
+       "prefs-watchlist-days": "اÛ\8cزÙ\84Ù\87â\80\8cدÛ\8cÚ©â\80\8cÙ\84رÛ\8cÙ\85دÙ\87 Ú¯Ø¤Ø³ØªØ±Û\8cÙ\84Ù\86 Ú¯Û\86Ù\86Ù\84ر:",
        "prefs-watchlist-days-max": "چوخو {{PLURAL:$1|بیر|$1}} گون",
-       "prefs-watchlist-edits": "گنیشلنمیش ایزله‌ دیک لرده گؤرسدیلن دَییشیک‌لیک‌لرین چوْخو:",
+       "prefs-watchlist-edits": "گئنیشلنمیش ایزله‌‌دیک‌لرده گؤستریلن دَییشیک‌لیک‌لرین ان چوْخو:",
        "prefs-watchlist-edits-max": "چوخ سایی: ۱۰۰۰",
        "prefs-watchlist-token": "ایزله‌دیک‌لر آدرسی:",
        "prefs-misc": "باشقا",
        "columns": "سوتون‌لار",
        "searchresultshead": "آختار",
        "stub-threshold": "<a href=\"#\" class=\"stub\">باغلانتی‌سیز لینکی</a> دییشدیرمک اوچون حدود (بایت‌لارلا):",
+       "stub-threshold-sample-link": "میثال",
        "stub-threshold-disabled": "چالیشمایان",
-       "recentchangesdays": "سÙ\88Ù\92Ù\86 Ø¯Û\8cÛ\8cØ´Û\8cÚ©â\80\8câ\80\8cÙ\84ردÙ\87 Ú¯Ø¤Ø±Ø³Ø¯Û\8cÙ\84Ù\86 Ú¯Û\86Ù\86â\80\8cلر:",
+       "recentchangesdays": "سÙ\88Ù\92Ù\86 Ø¯Û\8cÛ\8cØ´Û\8cÚ©â\80\8câ\80\8cÙ\84ردÙ\87 Ú¯Ø¤Ø³ØªØ±Û\8cÙ\84Ù\86 Ú¯Û\86Ù\86لر:",
        "recentchangesdays-max": "ماکسیموم $1 {{PLURAL:$1|گون |گون}}",
        "recentchangescount": "سوْن ديَیشیک‌لیک‌لرده باشلیق سايی:",
        "prefs-help-recentchangescount": "بورایا یئنی دییشیک‌لیک‌لر، صحیفه‌لرین و ژورنال‌لارین تاریخچه‌سی داخیل‌دیر.",
        "timezoneregion-europe": "اوروپا",
        "timezoneregion-indian": "هیند اوقیانوسو",
        "timezoneregion-pacific": "بؤیوک اوقیانوس",
-       "allowemail": "باشÙ\82ا Ø§Û\8cØ´Ù\84دÙ\86â\80\8cÙ\84ردÙ\86 Ø§Û\8cÙ\85یل آلماغی آچ",
+       "allowemail": "Ø¢Û\8cرÛ\8c Ø§Û\8cØ´Ù\84دÙ\86Ù\84ردÙ\86 Ø§Û\8cÙ\85ئیل آلماغی آچ",
        "prefs-searchoptions": "آختار",
        "prefs-namespaces": "آدلار فضاسی:",
        "default": "فرض ائدیلن",
        "yourvariant": "دیل واریانتی:",
        "prefs-help-variant": "بو ویکی‌نین ایچینده‌کیلری‌نین گؤستریلدیگی اوچون سئچدیگینیز واریانت یوخسا اورتوقرافی.",
        "yournick": "یئنی ایمضا:",
-       "prefs-help-signature": "دانیشیق صحیفه‌لرینده یاخیشلار گرک «<nowiki>~~~~</nowiki>» ایله ایمضالانالار. بو نیشان اوتوماتیک‌جه سیزین آدینیز و تاریخه دؤنه‌جک‌دیر.",
+       "prefs-help-signature": "دانیشیق صفحه‌لرینده یازیلان باخیشلار گرک «<nowiki>~~~~</nowiki>» ایله ایمضالانا. بۇ علامت اوتوماتیک‌ شیکلده سیزین آدینیزلا تاریخه دؤنه‌جکدیر.",
        "badsig": "یانلیش خام ایمضا.\nاچ‌تی‌ام‌ال تگ‌لرینی یوخلایین.",
        "badsiglength": "ایمضانیز چوخ اوزون‌دور.\nاو گرک {{PLURAL:$1|بیر|$1}} حرف‌دن اوزون اولمایا.",
        "yourgender": "ترجیح وئریرسینیز نئجه توصیف اولونسون؟",
        "gender-unknown": "ترجیح وئریرم بیلیندیرمییم",
        "gender-male": "کیشی",
-       "gender-female": "خانیم",
-       "prefs-help-gender": "بÙ\88 ØªØ±Ø¬Û\8cØ­ Ø§Û\8cستگÙ\87 Ø¨Ø§ØºÙ\84Û\8câ\80\8cدÛ\8cر.\nبÙ\88Ù\86Ù\88Ù\86 Ù\85Û\8cÙ\82دارÛ\8cØ\8c Ø³Û\8cزÛ\8c Ø¨Ø§Ø´Ù\82اÙ\84ارا Ø¯Ù\88زگÙ\88Ù\86 Ø¢Ø¯Ø±Ø³ Ù\88ئرÙ\85Ú© Ø§Ù\88Ú\86Ù\88Ù\86 Ø§Û\8cØ´Ù\84Ù\86Ù\87â\80\8cجکدÛ\8cر.\nبÙ\88 Ø¨Û\8cÙ\84Ú¯Û\8c، عمومی اولاجاق‌دیر.",
+       "gender-female": "قادین",
+       "prefs-help-gender": "بÙ\88 ØªØ±Ø¬Û\8cØ­ Ø§Û\8cستگÙ\87 Ø¨Ø§ØºÙ\84Û\8câ\80\8cدÛ\8cر.\nبÙ\88Ù\86Ù\88Ù\86 Ù\85Û\8cÙ\82دارÛ\8cØ\8c Ø³Û\8cزÛ\8c Ø¢Û\8cرÛ\8cÙ\84ارÙ\84ا Ø¯Ù\88زگÙ\88Ù\86 Ø¢Ø¯Ø±Ø³ Ù\88ئرÙ\85Ú© Ø§Ù\88Ú\86Ù\88Ù\86 Ø§Û\8cØ´Ù\84Ù\86Ù\87â\80\8cجکدÛ\8cر.\nبÙ\88 Ø§Û\8cØ·Ù\84اعات، عمومی اولاجاق‌دیر.",
        "email": "ایمیل",
        "prefs-help-realname": "اصلی آد ایختیاری دیر.\nاگر اونو وئرماغی سئچسز، سیزین ایشلرینیزی سیزه مونتسب ائدن‌ده، بو اصلی آد ایشلنه‌جک‌دیر.",
        "prefs-help-email": "ایمیل آدرسی ایستگه باغلی‌دیر، آنجاق رمزینیزی اونوتدوغونوز واخت، سیزه يئنی رمز گؤندرمگه گرکلی‌دیر.",
        "prefs-help-email-others": "سیز هم‌ده آیری ایستیفاده‌چیلره ایجازه وئره بیلرسیز، سیزین ایستیفاده‌چی یا دانیشیق صحیفه‌نیزده بیر باغلانتی ایله، سیزله ایلگی قورسونلار.\nآیری ایستیفاده‌چیلر سیزینله ایلگی قوراندا، سیزین ایمیل آدرسیز گؤستریلمه‌یه‌جک‌دیر.",
        "prefs-help-email-required": "ایمیل آدرس گرکلی‌دیر.",
        "prefs-info": "کؤک بیلگی‌لر",
-       "prefs-i18n": "اولوسلارآراسی‌لاشدیرما",
+       "prefs-i18n": "میلتلرآراسیلاشدیرماق",
        "prefs-signature": "ایمضا",
        "prefs-dateformat": "تاریخ فورمتی",
        "prefs-timeoffset": "چاغ بؤلگه‌سینین فرقی",
        "userrights-unchangeable-col": "ديَیشدیره بیلمه‌دیگینیز قروپلار",
        "userrights-conflict": "ایستیفاده‌چی حاقلاری توققوشماسی! لوطفاً گوزله ین و دَییشدیرمه‌لرینیزی یئنی‌دن ائدین.",
        "userrights-removed-self": "سیز باشاریلیق‌لا اؤز حاق‌لارینیزی قالدیردینیز. اونا گؤره داها بو صحیفه‌یه یول تاپماغا قادیر دئییل‌سینیز.",
-       "group": "قروپ:",
+       "group": "گروه:",
        "group-user": "ایستفاده‌چیلر",
        "group-autoconfirmed": "اوتوماتیک دوغرولانمیش ایستیفاده‌چیلر",
        "group-bot": "بوتلار",
        "right-override-export-depth": "ایچری باغلانتیلاری اولان صحیفه‌لری، چوخو ۵ درجه درینلیگی ایله، ایخراج ائت",
        "right-sendemail": "باشقا ایستیفاده‌چیلره ایمیل گؤندر",
        "right-passwordreset": "رمز یئنی‌له‌مه ایمیل‌لرینه باخ",
-       "newuserlogpage": "ایشلدن یارادیلما قئیدی",
+       "grant-group-email": "ایمئیل گؤندر",
+       "newuserlogpage": "ایشلدن یارادیلما ژورنالی",
        "newuserlogpagetext": "بۇ ایشلدن یارادماق لیستی‌دیر.",
-       "rightslog": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c Ø­Ø§Ù\82Ù\84ارÛ\8c Ø³Û\8cاÙ\87Û\8câ\80\8cسی",
-       "rightslogtext": "بÙ\88Ø\8c Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c Ø­Ø§Ù\82Ù\84ارÛ\8cÙ\86ا Ø§Ù\88Ù\84اÙ\86 Ø¯Ù\8eÛ\8cÛ\8cØ´Û\8cÚ©Ù\84Û\8cÚ©Ù\84ر Ø³Û\8cاÙ\87Û\8câ\80\8cسÛ\8câ\80\8cدÛ\8cر.",
+       "rightslog": "اÛ\8cØ´Ù\84دÙ\86 Ø­Ø§Ù\82Ù\84ارÛ\8c Ú\98Ù\88رÙ\86اÙ\84ی",
+       "rightslogtext": "بÙ\88Ø\8c Ø§Û\8cØ´Ù\84دÙ\86 Ø­Ø§Ù\82Ù\84ارÛ\8cÙ\86ا Ø§Ù\88Ù\84اÙ\86 Ø¯Ù\8eÛ\8cÛ\8cØ´Û\8cÚ©Ù\84Û\8cÚ©Ù\84ر Ú\98Ù\88رÙ\86اÙ\84Û\8cدÛ\8cر.",
        "action-read": "بو صحیفه‌نی اوخو",
        "action-edit": "بو صحیفه‌نی دَییشدیر",
        "action-createpage": "صفحه یارات",
        "recentchanges": "سوْن دَییشیکلیکلر",
        "recentchanges-legend": "سون دَییشیکلیکلر سئچمه‌لری",
        "recentchanges-summary": "بۇ صفحه‌ده، بۇ ویکیده وئریلن ان سوْن دَییشیکلیکلری ایزله‌یین.",
-       "recentchanges-noresult": "وئریلمیش دؤنم‌ده، بو معیارلارا تطبیق اولان دَییشدیرمه یوخدور.",
+       "recentchanges-noresult": "وئریلمیش مودتده، بو معیارلارا تطبیق اولان دَییشدیرمه یوخدور.",
        "recentchanges-feed-description": "ویکی‌ده‌کی ان سون ديَیشیکلیک‌لری بو يايیم کانالیندان ایزله‌يین.",
        "recentchanges-label-newpage": "بو دییشیک یئنی بیر صفحه یاراتدی",
        "recentchanges-label-minor": "بو بیر کیچیک دَییشدیرمه‌دیر",
-       "recentchanges-label-bot": "بو دییشیک بیر بوت طرفیندن ائدیلیب‌دیر",
+       "recentchanges-label-bot": "بۇ دَییشیک بیر روْبات طرفیندن ائدیلیب‌دیر",
        "recentchanges-label-unpatrolled": "بو دییشیکلیک هله گؤزدن گئچیریلمه‌ییب‌دیر",
        "recentchanges-label-plusminus": "صفحه‌نین اؤلچوسو بایت میقداری ایله تعیین ائدیلیر",
        "recentchanges-legend-heading": "<strong>قیسالتمالار:</strong>",
        "rcshowhideminor": "کیچیک دَییشیکلری $1",
        "rcshowhideminor-show": "گؤستر",
        "rcshowhideminor-hide": "گیزلت",
-       "rcshowhidebots": "بÙ\88تلاری $1",
+       "rcshowhidebots": "رÙ\88باتلاری $1",
        "rcshowhidebots-show": "گؤستر",
        "rcshowhidebots-hide": "گیزلت",
        "rcshowhideliu": "یازیلمیش ایشلدنلری $1",
        "rcshowhidemine": "منیم دَییشیکلریمی $1",
        "rcshowhidemine-show": "گؤستر",
        "rcshowhidemine-hide": "گیزلت",
+       "rcshowhidecategorization": "صفحه‌لر بؤلمه‌لندیرمه‌سی $1",
        "rcshowhidecategorization-hide": "گیزلت",
        "rclinks": "سون $2 گون عرضینده‌کی سون  $1 ديَیشیکلیگی گؤستر <br />$3",
        "diff": "فرق",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|بیر|$1}} ایزله‌ین ایستیفاده‌چی]",
        "rc_categories": "بؤلمه‌لره محدودلاشدیر («|» ایله آییر)",
        "rc_categories_any": "سئچیلمیشلرین هر بیریسی",
-       "rc-change-size-new": "دَییشیکلیک‌دن سونرا {{PLURAL:|بیر|$1}} بایت",
+       "rc-change-size-new": "دÙ\8eÛ\8cÛ\8cØ´Û\8cÚ©Ù\84Û\8cÚ©â\80\8cدÙ\86 Ø³Ù\88Ù\92Ù\86را {{PLURAL:|بÛ\8cر|$1}} Ø¨Ø§Û\8cت",
        "newsectionsummary": "/* $1 */ یئنی بؤلمه",
        "rc-enhanced-expand": "تفصیل‌لری گؤستر",
        "rc-enhanced-hide": "تفصیل‌لری گیزلت",
        "rc-old-title": "ایلک‌جه «$1» آدی‌له یارانمیشدیر",
-       "recentchangeslinked": "باغلی دَییشیکلیکلر",
-       "recentchangeslinked-feed": "باغلی دَییشیکلیکلر",
-       "recentchangeslinked-toolbox": "باغلی دَییشیکلیکلر",
-       "recentchangeslinked-title": "''$1'' Ø§Û\8cÙ\84Ù\87 Ø§Û\8cÙ\84Ú¯Û\8câ\80\8cلی دییشیکلر",
+       "recentchangeslinked": "باغلی دَییشیکلیکلر",
+       "recentchangeslinked-feed": "باغلی دَییشیکلیکلر",
+       "recentchangeslinked-toolbox": "باغلی دَییشیکلیکلر",
+       "recentchangeslinked-title": "''$1'' Ø§Û\8cÙ\84Ù\87 Ø¨Ø§Øºلی دییشیکلر",
        "recentchangeslinked-summary": "آشاغیداکی سیياهی، قئيد اوْلونان صحیفه‌‌يه (و يا قئيد اوْلونان کاتئقوْرياداکی صحیفه‌‌لره) داخیلی کئچید وئرن صحیفه‌‌لرده ائدیلمیش سوْن ديَیشیکلیکلرین سیياهیسیدیر. \n[[Special:Watchlist|ایزله‌مه سیياهینیزداکی]] صحیفه‌‌لر '''قالین''' شریفتله گؤستریلمیشدیر.",
        "recentchangeslinked-page": "صفحه آدی:",
        "recentchangeslinked-to": "قئيد اوْلونان صحیفه‌‌ده‌کی دئيیل، اوْنا داخیلی کئچید وئرن صحیفه‌‌لرده‌کی ديَیشیکلیکلری گؤستر",
        "upload-permitted": "{{PLURAL:$2|تیپ|تیپ لر}} مجاز پرونده لر: $1.",
        "upload-preferred": "ترجیح وئریلن فايل تیپلری{{PLURAL:$2|تیپ|تیپ لر}}: $1.",
        "upload-prohibited": "ایجازه وئریلمه‌ين فايل تیپلری{{PLURAL:$2|تیپ|تیپ لر}}: $1.",
-       "uploadlogpage": "یوکلمه قئیدلری",
-       "uploadlogpagetext": "آشاغÛ\8cدا Ø§Ù\86 Ø³Ù\88Ù\86 Û\8cÙ\88Ú©Ù\84Ù\87â\80\8cÙ\86Û\8cÙ\84Ù\86 Ù\81اÛ\8cÙ\84â\80\8cÙ\84ارÛ\8cÙ\86 Ù\84Û\8cستÛ\8c Ú¯Ø¤Ø³ØªØ±Û\8cÙ\84Û\8cر.\nداÙ\87ا Ú¯Ø¤Ø±Ù\88Ù\86Ù\88Ø´â\80\8cÙ\84Ù\88 Ú¯Ø¤Ø³ØªØ±Ù\85Ú© Ø§Ù\88Ú\86Ù\88Ù\86Ø\8c [[Special:NewFiles|Û\8cئÙ\86Û\8c Ù\81اÛ\8cÙ\84â\80\8cÙ\84ار Ú¯Ø§Ù\84ئری‌سینه]] باخین.",
+       "uploadlogpage": "یۆکله‌مه‌لر ژورنالی",
+       "uploadlogpagetext": "آشاغÛ\8cدا Ø§Ù\86 Ø³Ù\88Ù\92Ù\86 Û\8cÙ\88Ú©Ù\84Ù\87â\80\8cÙ\86Û\8cÙ\84Ù\86 Ù\81اÛ\8cÙ\84Ù\84ارÛ\8cÙ\86 Ù\84Û\8cستÛ\8c Ú¯Ø¤Ø³ØªØ±Û\8cÙ\84Û\8cر.\nداÙ\87ا Ú¯Ø¤Ø±Ù\88Ù\86Ù\88Ø´â\80\8cÙ\84Ù\88 Û\8cÙ\88Ù\92Ø®Ù\84اÙ\85اÙ\82 Ø§Ù\88Ú\86Ù\88Ù\86Ø\8c [[Special:NewFiles|Û\8cئÙ\86Û\8c Ù\81اÛ\8cÙ\84Ù\84ار Ù\82اÙ\84ری‌سینه]] باخین.",
        "filename": "فایل آدی",
        "filedesc": "قیساسی",
        "fileuploadsummary": "قیساسی:",
        "upload_source_url": "(سیز دوزگون، هر کسین داخیل اولا بیلجیی اورل سئچدینیز)",
        "upload_source_file": "(بیلگی‌سایارینیزدان بیر فایل سئچیلیب دیر)",
        "listfiles-delete": "سیل",
-       "listfiles-summary": "بۇ اؤزل صحیفه، بۆتون یۆکله‌نیلن فایل‌لاری گؤستریر.",
+       "listfiles-summary": "بۇ اؤزل صفحه، بۆتون یۆکله‌نیلن فایل‌لاری گؤستریر.",
        "listfiles_search_for": "مئدیا آدی اوچون آختار:",
        "listfiles-userdoesnotexist": "«$1» ایشلدن حسابی ثبت اولونماییب‌دیر.",
        "imgfile": "فایل",
        "listfiles": "فایل لیستی",
-       "listfiles_thumb": "Ú©Û\8cÚ\86Û\8cÚ© Ø´Ú©Û\8cÙ\84",
+       "listfiles_thumb": "Ú©Û\8cÚ\86Û\8cÚ© Ø¹Ú©Ø³",
        "listfiles_date": "تاریخ",
        "listfiles_name": "آد",
        "listfiles_user": "ایشلدن",
        "listfiles_size": "اؤلچو",
        "listfiles_description": "شرح",
        "listfiles_count": "نوسخه‌لر",
-       "listfiles-show-all": "عکسلرین اسکی نۆسخه‌لرینی ایچینه آل.",
+       "listfiles-show-all": "عکسلرین قاباقکی نۆسخه‌لرینی ایچینه آل.",
        "listfiles-latestversion": "ایندیکی نۆسخه",
        "listfiles-latestversion-yes": "بلی",
        "listfiles-latestversion-no": "یوخ",
        "filehist-revert": "قایتار",
        "filehist-current": "ایندیکی",
        "filehist-datetime": "تاریخ/واخت",
-       "filehist-thumb": "Ú©Û\8cÚ\86Û\8cÚ© Ø´Ú©Û\8cÙ\84",
+       "filehist-thumb": "Ú©Û\8cÚ\86Û\8cÚ© Ø¹Ú©Ø³",
        "filehist-thumbtext": "$1 تاریخینده‌کی سۆروموندن کیچیک گؤرونتوسو",
        "filehist-nothumb": "کیچیک شکیل یوخدو",
        "filehist-user": "ایشلدن",
        "unusedtemplateswlh": "باشقا باغلانتیلار",
        "randompage": "تصادوفی صفحه",
        "randompage-nopages": "بو {{PLURAL:$2|آدفضاسیندا|آدفضالاریندا}} هئچ صحیفه یوخدور: $1.",
-       "randomincategory": "بؤÙ\84Ù\85Ù\87â\80\8cدÙ\87 Ø±Ø§Ø³Øªâ\80\8cÚ¯Ù\84Ù\87 ØµØ­Û\8cÙ\81ه",
+       "randomincategory": "بؤÙ\84Ù\85Ù\87â\80\8cدÙ\87 ØªØµØ§Ø¯Ù\88Ù\81Û\8c ØµÙ\81Ø­ه",
        "randomincategory-invalidcategory": "«$1» بیر گئچرلی بؤلمه آدی دئییل.",
        "randomincategory-nopages": "[[:Category:$1|$1]] بؤلمه‌سین‌ده، هئچ صحیفه یوخدور.",
        "randomincategory-category": "بؤلمه:",
        "statistics-header-pages": "صفحه آمارلاری",
        "statistics-header-edits": "دَییشمه آمارلاری",
        "statistics-header-users": "ایشلدن‌لر آمارلاری",
-       "statistics-header-hooks": "باشÙ\82ا آمارلار",
+       "statistics-header-hooks": "Ø¢Û\8cرÛ\8c آمارلار",
        "statistics-articles": "مقاله‌لر",
        "statistics-pages": "صفحه‌لر:",
        "statistics-pages-desc": "بۇ ویکی‌ده بۆتون صفحه‌لر، او جومله‌دن دانیشیق صفحه‌لری، یوْل‌لاندیرمالار و غیره.",
        "statistics-users": "یازیلمیش [[Special:ListUsers|ایشلدنلر]]",
        "statistics-users-active": "چالیشقان ایشلدنلر",
        "statistics-users-active-desc": "سوْن {{PLURAL:$1|بیر|$1}} گۆن‌ده بیر ایش گؤرن ایشلدنلر",
-       "pageswithprop": "صحیفه اؤزل‌لیگی اولان صحیفه‌لر",
-       "pageswithprop-legend": "صحیفه اؤزل‌لیگی اولان صحیفه‌لر",
+       "pageswithprop": "صفحه خصوصیتی اولان صفحه‌لر",
+       "pageswithprop-legend": "صفحه خصوصیتی اولان صفحه‌لر",
        "pageswithprop-text": "بو صحیفه‌ده، بیر خاص صحیفه اؤزل‌لیگی ایشلدن صحیفه‌لرین لیستی واردیر.",
        "pageswithprop-prop": "اؤزل‌لیک آدی:",
        "pageswithprop-submit": "گئت",
        "brokenredirects-edit": "دَییشدیر",
        "brokenredirects-delete": "سیل",
        "withoutinterwiki": "دیل باغلانتیلاری اولمایان صحیفه‌لر",
-       "withoutinterwiki-summary": "آشاغیداکی صحیفه‌لر، باشقا دیل‌لره باغلانتیلاری یوخدور.",
+       "withoutinterwiki-summary": "آشاغیداکی صفحه‌لر، آیری دیل‌لره باغلانتیلاری یوخدور.",
        "withoutinterwiki-legend": "اؤن‌اَک",
        "withoutinterwiki-submit": "گؤستر",
        "fewestrevisions": "ان آز دَییشدیریلن صفحه‌لر",
        "nimagelinks": "$1 ده{{PLURAL:$1|صحیفه‌ده}}ایستیفاده اولونمور",
        "ntransclusions": "$1 ده{{PLURAL:$1|صحیفه‌ده}}ایستیفاده اولونور",
        "specialpage-empty": "بو صحیفه بوشدور",
-       "lonelypages": "يئتیم صحیفه‌‌لر",
+       "lonelypages": "يئتیم صفحه‌‌لر",
        "lonelypagestext": "آشاغی‌داکی صحیفه‌لره {{SITENAME}} سایتین‌داکی دیگر صحیفه‌لردن علاقه وئریلممیش یا دا چارپاز داخیل ائدیلممیش.",
        "uncategorizedpages": "بؤلمه‌سیز صفحه‌لر",
        "uncategorizedcategories": "بؤلمه‌سیز بؤلمه‌لر",
        "uncategorizedimages": "بؤلمه‌سیز فایللار",
        "uncategorizedtemplates": "بؤلمه‌سیز شابلونلار",
-       "unusedcategories": "اÛ\8cستÛ\8cÙ\81ادÙ\87 Ø§Ø¦دیلمه‌میش بؤلمه‌لر",
-       "unusedimages": "ایشلنمه‌میش فایل‌لار",
+       "unusedcategories": "اÛ\8cØ´Ù\84دیلمه‌میش بؤلمه‌لر",
+       "unusedimages": "ایشلدیلمه‌میش فایل‌لار",
        "wantedcategories": "یسته نن بؤلمه‌لر",
-       "wantedpages": "ایسته‌نیلن صحیفه‌لر",
+       "wantedpages": "ایسته‌نیلن صفحه‌لر",
        "wantedpages-badtitle": "مراجعت زامانتی يانلیش باشلیق: $1",
-       "wantedfiles": "ایسته نن فایللار",
+       "wantedfiles": "ایسته‌نیلن فایللار",
        "wantedfiletext-cat": "آشاغیداکی فایل‌لار ایشله‌نیبلر اما یوخدورلار. ائشیک آنباردا اولان فایل‌لار دا اولدوقلارینا باخمایاراق، لیست‌ده گلیبلر. ائله یانلیش باخیشلار <del>خطلنه‌جکلر</del>. هم‌ده، اولمایان فایل‌لاری ایشلدن صحیفه‌لر ده [[:$1]]-ده لیست اولونوبلار.",
        "wantedfiletext-cat-noforeign": "آشاغی دا کی اولان فایل لار ایستفاده اولونور سانکی یوخدولار. بوندان اونجه فایل لاری اولموش صفحه لر [[:$1]] ده لیست اولوب لار.",
        "wantedfiletext-nocat": "اشاغی داکی فایل لار ایستفاده اولور سانکی یوخدولار.حتی مومکین دیر خارجی حویض مخزن لریندن اولماق  ایله بو ردا فهرست اولا . وهر مثب رتبه سی یانلیش <del> خط یئمیش اولاجاق.</del>",
        "wantedfiletext-nocat-noforeign": "آشاغی داکی فایل لار ایشلنیلیر سانکی یوخدورلار.",
-       "wantedtemplates": "ایسته نن شابلونلار",
+       "wantedtemplates": "ایسته‌نیلن شابلونلار",
        "mostlinked": "ان چوخ کئچیدلنن صحیفه‌‌لر",
        "mostlinkedcategories": "ان چوخ مقاله‌سی اولان بولمه لر",
        "mostlinkedtemplates": "ان چوخ ایستیفاده اولونان صفحه لر",
        "prefixindex": "بوتون اؤن‌اَکلی صحیفه‌لر",
        "prefixindex-namespace": "بوتون صفحه لر (آد فضاسی$1) قاباق دان یاپیشیقی وار",
        "prefixindex-strip": "لیست‌ده، اؤن‌اَکی قوْپارت",
-       "shortpages": "قیسا صحیفه‌‌لر",
+       "shortpages": "قیسا صفحه‌‌لر",
        "longpages": "اۇزون صفحه‌‌لر",
        "deadendpages": "کئچید وئرمه‌ين صحیفه‌‌لر",
        "deadendpagestext": "آشاغیداکی صحیفه‌‌لردن بو ویکیپئدیياداکی دیگر صحیفه‌‌لره هئچ بیر کئچید يوخدور.",
        "apihelp": "API یاردیمی",
        "apihelp-no-such-module": "«$1» ماژول تاپیلمادی.",
        "apisandbox-reset": "تمیزله",
-       "apisandbox-examples": "میثال",
+       "apisandbox-examples": "میثاللار",
        "apisandbox-results": "نتیجه",
        "apisandbox-request-time": "زامان ایستمک:$1",
        "booksources": "کیتاب قایناقلاری",
        "booksources-invalid-isbn": "وئریلن ISBN اعتبارسیز کیمی گؤرونور؛ اورجینال قایناق‌دان کوپیالاما اشکالار اوچون نظارت ائدین.",
        "specialloguserlabel": "ائدن:",
        "speciallogtitlelabel": "مقصد(باشلیق یوْخسا {{ns:user}}:ایشلدن اۆچون ایشلدن آدی):",
-       "log": "قئیدلر",
-       "all-logs-page": "بÙ\88تÙ\88Ù\86 Ø§Ø¬ØªÙ\85اعÛ\8c Ù\82ئÙ\8aدÙ\84ر",
-       "alllogstext": "{{SITENAME}} اوچون بوتون مؤوجود قئیدلرین بیرگه گؤستریشی.\nقئید نؤوو، ایستیفاده‌چی آدی و یا تأثیر ائدیلمیش صحیفنی سئچمکله داها ایسپئسیفیک اولا بیلرسینیز.",
-       "logempty": "Ú\98Ù\88رÙ\86اÙ\84دا Ø§Ù\88Ù\8aغÙ\88Ù\86 Ù\82ئÙ\8aد تاپیلمادی.",
+       "log": "ژورناللار",
+       "all-logs-page": "بÙ\88تÙ\88Ù\86 Ø¹Ù\85Ù\88Ù\85Û\8c Ú\98Ù\88رÙ\86اÙ\84Ù\84ار",
+       "alllogstext": "{{SITENAME}} اوچون بوتون مؤوجود ژورناللارین بیر یئرده گؤستریشی.\nژورنال نوعو، ایشلدن آدی یوخسا دییشدیریلمیش صفحه لری سئچمکله داها محدودلاشدیرا بیلرسینیز.",
+       "logempty": "Ú\98Ù\88رÙ\86اÙ\84دا Ø¨Û\8cر Ù\86تÛ\8cجÙ\87 تاپیلمادی.",
        "log-title-wildcard": "بو متنله باشلایان باش‌لیق‌لاری آختار",
        "showhideselectedlogentries": "گؤستریش/گیزلمه سییاهه ده سئچیلمیش‌لر اوچون",
-       "allpages": "بوتون صحیفه‌لر",
-       "nextpage": "سونراکی صحیفه‌‌ ($1)",
-       "prevpage": "اولکی صحیفه ($1)",
-       "allpagesfrom": "بو حرفله باشلایان صحیفه‌لری گؤستر:",
-       "allpagesto": "بو حرفله باشلایان صحیفه لری گؤستر:",
-       "allarticles": "بوتون صحیفه‌لر",
+       "allpages": "بوتون صفحه‌لر",
+       "nextpage": "سونراکی صفحه‌‌ ($1)",
+       "prevpage": "قاباقکی صفحه ($1)",
+       "allpagesfrom": "بو حرفله باشلایان صفحه‌لری گؤستر:",
+       "allpagesto": "بو حرفله قورتولان صفحه لری گؤستر:",
+       "allarticles": "بوتون صفحه‌لر",
        "allinnamespace": "بوتون صحیفه‌لر ($1 صحیفه‌لری)",
        "allpagessubmit": "گئت",
        "allpagesprefix": "بورا یازدیغینیز حرف‌لرله باشلایان صحیفه‌لری سیاهی‌سینی:",
        "listgrouprights": "ایستیفاده‌چی قروپ حاقلاری",
        "listgrouprights-summary": "آشاغیدا، بو ویکی‌ده تانیلان ایستیفاده‌چی گروپلاری و اونلارین حاقلاری گؤستریلیر.\nتک حاقلار اوچون ده، [[{{MediaWiki:Listgrouprights-helppage}}|آرتیق بیلگیلر]] اولا بیلر.",
        "listgrouprights-key": "یوْل گؤستری:\n* <span class=\"listgrouprights-granted\">وئریلمیش حاق</span>\n* <span class=\"listgrouprights-revoked\">قایتاریلمیش حاق</span>",
-       "listgrouprights-group": "قروپ",
+       "listgrouprights-group": "گروه",
        "listgrouprights-rights": "حاقلار",
        "listgrouprights-helppage": "Help:قروپ حاقلاری",
        "listgrouprights-members": "(عضولرین لیستی)",
        "nowikiemailtext": "بو ایستیفاده‌چی، باشقا ایستیفاده‌چیلردن ایمیل آلماماغینی بیلدیریب‌دیر.",
        "emailnotarget": "آلان اوچون، اولمایان یوخسا گئچرسیز ایستیفاده‌چی آدی.",
        "emailtarget": "آلانین ایستیفاده‌چی آدینی دَییشدیر",
-       "emailusername": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c آدی:",
+       "emailusername": "اÛ\8cØ´Ù\84دÙ\86 آدی:",
        "emailusernamesubmit": "گؤندر",
        "email-legend": "باشقا {{SITENAME}} ایستیفاده‌چیسینه ایمیل گؤندر",
        "emailfrom": "کیم‌دن:",
        "wlheader-showupdated": "سون گؤروشونوزدن سوْنرا ائدیلن دییشیکلیکلر '''قالین''' گؤرسدیلیب‌دیر.",
        "wlnote": "آشاغیداکی {{PLURAL:$1|بیر ديَیشیک‌لیک|<strong>$1</strong> ديَیشیک‌لیک}}  سون {{PLURAL:$2|ساعتدا|<strong>$2</strong> ساعتدا}} ائدیلمیشدیر. $3، $4",
        "wlshowlast": "سون $1 ساعات $2 گون گؤستر",
+       "watchlist-hide": "گیزلت",
+       "wlshowtime": "بو تاریخه قدر گؤستر:",
+       "wlshowhideminor": "کیچیک دَییشدیرمه‌لر",
+       "wlshowhideliu": "یازیلمیش ایشلدنلر",
+       "wlshowhidemine": "منیم دَییشدیرمه‌لریم",
+       "wlshowhidecategorization": "صفحه‌ بؤلمه‌لندیرمه‌سی",
        "watchlist-options": "ایزله‌دیکلر سئچمه‌لری",
        "watching": "ایزله‌نیلیر...",
        "unwatching": "ایزله‌مه...",
        "actioncomplete": "چالیشما سوناچاتدی",
        "actionfailed": "چالیشما اوغورسوز اولدو",
        "deletedtext": "\"$1\" سیلیندی.\nسونونجو سیلینمه‌لره باخ: $2.",
-       "dellogpage": "سیلمه قئیدی",
-       "dellogpagetext": "اÙ\86 Ø³Ù\88Ù\86 Ø³Û\8cÙ\84Û\8cÙ\86Ù\85Û\8cØ´ ØµØ­Û\8cÙ\81Ù\87â\80\8cÙ\84رÛ\8cÙ\86 Ø³Û\8cاÙ\87Û\8câ\80\8cسÛ\8c.",
+       "dellogpage": "سیلمه ژورنالی",
+       "dellogpagetext": "بÙ\88Ø\8c Ø§Ù\86 Ø³Ù\88Ù\86 Ø³Û\8cÙ\84Û\8cÙ\86Ù\85Û\8cØ´ ØµÙ\81Ø­Ù\87â\80\8cÙ\84رÛ\8cÙ\86 Ù\84Û\8cستÛ\8cدÛ\8cر.",
        "deletionlog": "سیلمه سییاهه‌سی",
        "reverted": "داها اوولکی وئرسیا برپا ائدیلدی",
        "deletecomment": "ندن:",
        "changecontentmodel-reason-label": "ندن:",
        "logentry-contentmodel-change-revertlink": "قایتار",
        "logentry-contentmodel-change-revert": "قایتار",
-       "protectlogpage": "قوروما قئیدلری",
+       "protectlogpage": "قوروما ژورنالی",
        "protectlogtext": "آشاغی‌داکی، صحیفه قوروما‌لارینا دییشیک‌لیک‌لرین بیر سیاهی‌سی‌دیر.\nحال-حاضردا تطبیق اولونان صحیفه قوروما‌لاری اوچون [[Special:ProtectedPages| قوروما آلتینا آلینمیش صحیفه‌لر سیاهی‌سینا]] باخا بیلرسینیز.",
        "protectedarticle": "«[[$1]]» قوْروندو",
        "modifiedarticleprotection": "\"[[$1]]\" صحیفه‌سی اوچون محافظه سویه‌سی دییشیلدی",
        "protect-locked-dblock": "وئریلن‌لر بازاسی کیلیدلی اولدوغو اوچون محافظه سویه‌سی دییشیله بیلمز.\n'$1 صحیفه‌سینده حال-حاضردا ائده بیلجیینیز عملیات‌لار بون‌لاردیر:",
        "protect-locked-access": "سیزین حسابینیزین محافظه سویه‌سینی دییشمه‌یه ایختیاری یوخ‌دور.\n'$1 صحیفه‌سینده حال-حاضردا ائده بیلجیینیز عملیات‌لار بون‌لاردیر:",
        "protect-cascadeon": "بو صحیفه محافظه‌لی‌دیر، چونکی بو صفحه {{PLURAL:$1|باشقا بیر}} صفحه‌دن کاسکاد محافظه ائدیلمیش‌دیر. سیز بو صفحه‌نین محافظه سویه‌سینی دییشدیره بیلرسینیز، بو کاسکاد محافظه‌یه تأثیر ائتمه‌یه‌جک.",
-       "protect-default": "بÙ\88تÙ\88Ù\86 Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8câ\80\8cلره ایجازه وئر",
+       "protect-default": "بÙ\88تÙ\88Ù\86 Ø§Û\8cØ´Ù\84دÙ\86لره ایجازه وئر",
        "protect-fallback": "یالنیز «$1» ایجازه‌سی اولان ایستیفاده‌چیلره ایجازه وئر",
        "protect-level-autoconfirmed": "تکجه اوْتوماتیک تأیید اوْلموش ایشلدن‌لره ایجازه وئر",
        "protect-level-sysop": "یالنیز ایداره‌چیلره ایجازه وئر",
        "anoncontribs": "چالیشمالار",
        "contribsub2": "{{GENDER:$3|$1}} اوچون ($2)",
        "contributions-userdoesnotexist": "«$1» ایشلدن حسابی ثبت اولونماییب‌دیر.",
-       "nocontribs": "بÙ\88 Ù\85Ù\88شخصاتا Ø§Ù\88Û\8cغÙ\88Ù\86 Ø¯Û\8cÛ\8cشدÛ\8cر ØªØ§Ù¾Û\8cÙ\84Ù\85ادÛ\8c",
+       "nocontribs": "بÙ\88 Ù\85Ù\88شخصاتا Ø§Ù\88Û\8cاÙ\86 Ø¯Û\8cÛ\8cØ´Û\8cÚ©Ù\84Û\8cÚ© ØªØ§Ù¾Û\8cÙ\84Ù\85ادÛ\8c.",
        "uctop": "(ایندیکی)",
        "month": "بۇ آی‌دان (و قاباقجا):",
        "year": "بۇ ایل‌دن (و قاباقجا):",
        "sp-contributions-newbies": "تکجه یئنی ایشلدنلرین چالیشمالارینی گؤستر",
        "sp-contributions-newbies-sub": "یئنی ایستیفاده‌چی‌لر اوچون",
        "sp-contributions-newbies-title": "یئنی حساب‌لار اوچون ایستیفاده‌چی فالیت‌لری",
-       "sp-contributions-blocklog": "باغلاما قئیدلری",
+       "sp-contributions-blocklog": "باغلاما ژورنالی",
        "sp-contributions-suppresslog": "باسدیریلمیش ایشلدن فعالیت‌لری",
        "sp-contributions-deleted": "سیلینمیش ایشلدن چالیشمالاری",
        "sp-contributions-uploads": "یوکله‌نَنلر",
        "sp-contributions-newonly": "تکجه صفحه یاراتماق دَییشیکلیکلرینی گؤستر",
        "sp-contributions-submit": "آختار",
        "whatlinkshere": "بۇ صفحه‌‌يه باغلانتیلار",
-       "whatlinkshere-title": "«$1»-ه باغلانان صحیفه‌لر",
+       "whatlinkshere-title": "«$1»-ه باغلانان صفحه‌لر",
        "whatlinkshere-page": "صفحه:",
        "linkshere": "آشاغیداکی صفحه‌لر '''[[:$1]]'''-ه باغلانیب:",
-       "nolinkshere": "'''[[:$1]]'''-ه هئچ بیر صحیفه باغلانماییب‌دیر.",
+       "nolinkshere": "<strong>[[:$1]]</strong>-ه هئچ بیر صفحه باغلانماییب‌دیر.",
        "nolinkshere-ns": "سئچیلمیش آدفضاسیندا، هئچ صحیفه '''[[:$1]]'''-ه باغلانتی‌سی یوخدور.",
        "isredirect": "یوللاندیرما صفحه‌سی",
        "istemplate": "داخیل اولموش",
        "whatlinkshere-prev": "{{PLURAL:$1|قاباقکی|قاباقکی $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|سونراکی|سونراکی $1}}",
        "whatlinkshere-links": "← باغلانتیلار",
-       "whatlinkshere-hideredirs": "یول‌لاندیرمالاری $1",
-       "whatlinkshere-hidetrans": "علاوه‌لری $1",
-       "whatlinkshere-hidelinks": "باغلانتیلاری $1",
+       "whatlinkshere-hideredirs": "$1 یول‌لاندیرمالاری",
+       "whatlinkshere-hidetrans": "$1 علاوه‌لری",
+       "whatlinkshere-hidelinks": "$1 باغلانتیلاری",
        "whatlinkshere-hideimages": "فایل باغلانتیلارینی $1",
        "whatlinkshere-filters": "سۆزگَجلر",
        "autoblockid": "اوتوماتیک باغلانما #$1",
        "blockip": " {{GENDER:$1|ایشلدن}}ی باغلا",
        "blockip-legend": "ایستیفادچی نی باغلا",
        "blockiptext": "آشاغی‌داکی فورمو ایستیفاده ائده‌رک مۆعیّن بیر آی‌پی‌نین و یا قئیدیات‌دان کئچمیش ایستیفاده‌چی‌نین دییشیک‌لیک ائتمه‌سینی مانعه تؤره‌ده بیلرسینیز. بۇ یالنیز واندالیزمین قارشی‌سینی آلماق اۆچون و [[{{MediaWiki:Policy-url}}|قایدا‌لارا]] اۇیغون اوْلا‌راق ائدیلمه‌لی. آشاغی‌یا مۆطلق قاداغا ایله علاقه‌دار بیر شرح یازین. (اؤرنک:-بۇ-صفحه‌لرده واندالیزم ائتمیشدیر).",
-       "ipaddressorusername": "آی-پی عونوانی و یا ایستیفاده‌چی آدی",
+       "ipaddressorusername": "آی‌پی آدرسی یوخسا ایشلدن آدی",
        "ipbexpiry": "بیتمه مدتی:",
        "ipbreason": "ندن:",
        "ipbreason-dropdown": "*باغلانما سبب‌لری:\n** یالان معلومات‌لارین علاوه ائدیلمه‌سی\n** صحیفه‌نین مزمونونون سیلینمه‌سی\n** خاریجی سایت‌لارا ایسپام-کئچیدلر\n** صحیفه‌یه معنا‌سیز و یارارسیز علاوه‌لره گؤره\n** حده و تعقیب‌لره گؤره\n** تحقیره گؤره\n** چوخسای‌لی حساب‌دان سوی ایستیفاده‌یه گؤره\n** قاداغان اولونموش ایستیفاده‌چی آدینا گؤره",
        "unblocked-range": "$1-نین بلوکو گؤتورولدو",
        "unblocked-id": "$1-نین بلوکو گؤتورولدو",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] قاداغاسی قالدیریلدی.",
-       "blocklist": "بلوکلانمیش ایستیفاده‌چیلر",
-       "ipblocklist": "باغÙ\84اÙ\86Ù\85Û\8cØ´ Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8cلر",
-       "ipblocklist-legend": "بلوکلانمیش ایستیفاده‌چینی آختار",
+       "blocklist": "باغلانمیش ایشلدنلر",
+       "ipblocklist": "باغÙ\84اÙ\86Ù\85Û\8cØ´ Ø§Û\8cØ´Ù\84دÙ\86لر",
+       "ipblocklist-legend": "باغلانمیش ایشلدنی آختار",
        "blocklist-userblocks": "حساب بلوکلارینی گیزلت",
        "blocklist-tempblocks": "مووققتی بلوکلاری گیزله",
        "blocklist-addressblocks": "تک ای‌پی بلوکلارینی گیزله",
        "blocklist-rangeblocks": "ایندیکی بلوکلاری گیزله",
        "blocklist-timestamp": "واخت",
        "blocklist-target": "هدف",
-       "blocklist-expiry": "بیتیش تاریخی",
-       "blocklist-by": "بلوکلامیش ایداره‌چی",
-       "blocklist-params": "بلوک پارامئترلری",
+       "blocklist-expiry": "قورتولما تاریخی",
+       "blocklist-by": "باغلایان ایداره‌چی",
+       "blocklist-params": "باغلاما معیارلاری",
        "blocklist-reason": "نَدَن‌لیک",
        "ipblocklist-submit": "آختار",
        "ipblocklist-localblock": "يئرلی بلوک",
        "contribslink": "چالیشمالار",
        "emaillink": "ایمیل گؤندر",
        "autoblocker": "یاخینلیقدا سیزین آی‌پی آدرسیز «[[User:$1|$1]]» ایله ایشلدیلمک اوچون، اوتوماتیک اولاراق باغلانیلمیسیز.\n$1-ین وئریلمیش باغلانماق سببی: «$2»",
-       "blocklogpage": "باغلاما قئیدلری",
+       "blocklogpage": "باغلاما ژورنالی",
        "blocklog-showlog": "بو ایستیفاده‌چی داها اول بلوکلانمیش‌دیر. بلوکلاما گونده‌لیگی رئفئرانس اوچون آشاغیدا گؤستریلیب:",
        "blocklog-showsuppresslog": "بو ایستیفاده‌چی داها اول باغلانمیش‌دیر. باغلانما گونده‌لیگی رئفئرانس اوچون آشاغیدا گؤستریلیب:",
        "blocklogentry": "[[$1]]-ی $2 واختینه قدر بلوْکلادی $3",
        "reblock-logentry": "[[$1]] اوچون سون تاریخی $2 $3 اولماق اوزره بلوک پارامئترلری دییشدیریلدی",
-       "blocklogtext": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8câ\80\8cÙ\84رÛ\8cÙ\86 Ø¨Ø§ØºÙ\84اÙ\86Ù\85اسÛ\8c Ù\88 Ø¨Ø§ØºÙ\84اÙ\86Ù\85اÙ\82Û\8cÙ\86 Ú¯Ø¤ØªÙ\88رÙ\88Ù\84Ù\85Ù\87â\80\8cسÛ\8c Ø³Û\8cاÙ\87Û\8câ\80\8cسÛ\8c.\nØ¢Ù\88تÙ\88Ù\85اتÛ\8cÚ© Ø¨Ø§ØºÙ\84اÙ\86Ù\85Û\8cØ´ Ø§Û\8c Ù¾Û\8c-عÙ\86Ù\88اÙ\86â\80\8cÙ\84ار Ø¨Ù\88رادا Ú¯Ø¤Ø³ØªØ±Û\8cÙ\84Ù\85Û\8cر.\nحاÙ\84\87ازÛ\8cرکÛ\8c [[Special:BlockList|Ù\82اداغاâ\80\8cÙ\84ارÛ\8cÙ\86 Ù\88 Ø¨Ù\84Ù\88Ú©Ù\84اÙ\85اâ\80\8cÙ\84ارÛ\8cÙ\86 Ø³Û\8cاÙ\87Û\8câ\80\8cسÛ\8c]]Ù\86ا Ø¨Ø§Ø®.",
+       "blocklogtext": "بÛ\87 Ø§Û\8cØ´Ù\84دÙ\86Ù\84رÛ\8cÙ\86 Ø¨Ø§ØºÙ\84اÙ\86Ù\85ا Ø§Û\8cÙ\84Ù\87 Ø¢Ú\86Û\8cÙ\84Ù\85ا Ù\84Û\8cستÛ\8câ\80\8cدÛ\8cر.\nاÙ\88Ù\92تÙ\88Ù\85اتÛ\8cÚ© Ø¨Ø§ØºÙ\84اÙ\86Ù\85Û\8cØ´ Ø¢Û\8câ\80\8cÙ¾Û\8c Ø¢Ø¯Ø±Ø³Ù\84رÛ\8c Ø¨Û\87رادا Ø³Û\8cراÙ\84اÙ\86Ù\85اÛ\8cÛ\8cبâ\80\8cدÛ\8cر.\nاÛ\8cÙ\86دÛ\8cÚ©Û\8c ØªØ­Ø±Û\8cÙ\85Ù\84ر Ø§Û\8cÙ\84Ù\87 Ø¨Ø§ØºÙ\84اÙ\86Ù\85اÙ\84ار Ù\84Û\8cستÛ\8c Ø§Û\86Ú\86Ù\88Ù\86 [[Special:BlockList|باغÙ\84اتÙ\85ا Ù\84Û\8cستÛ\8cÙ\86Ù\87]]  Ø¨Ø§Ø®Û\8cÙ\86.",
        "unblocklogentry": "$1 اوزرین‌دکی آچیلدی",
        "block-log-flags-anononly": "\nتکجه تایید اوْلونمامیش ایشلدنلر",
        "block-log-flags-nocreate": "حساب یاراتماق اولماز",
        "movepage-page-moved": "$1 صحیفه‌سی $2 صحیفه‌سینه کؤچورولوب.",
        "movepage-page-unmoved": "$1 صحیفه‌سی $2 صحیفه‌سینه کؤچوروله بیلینمیر.",
        "movepage-max-pages": "ان چوخ $1 {{PLURAL:$1|صحیفه |صحیفه}} داشیندی و داها چوخو آوتوماتیک اولا‌راق تاشیناماز.",
-       "movelogpage": "آد Ø¯Ù\8aÛ\8cشدÛ\8cرÙ\85Ú© Ù\82ئÛ\8cدی",
+       "movelogpage": "آد Ø¯Ù\8eÙ\8aÛ\8cشدÛ\8cرÙ\85Ú© Ú\98Ù\88رÙ\86اÙ\84ی",
        "movelogpagetext": "آشاغی‌دا اوْلان لیست آدی دَییشدیریلمیش صفحه‌لری سیرالاییر.",
        "movesubpage": "{{PLURAL:$1|آلتینداکی صحیفه}}",
        "movesubpagetext": "بو صحیفه‌نین آشاغیدا گؤستریلن $1 {{PLURAL:$1 | آلت صحیفه سی | آلت صحیفه اسی}} وار.",
        "export": "صفحه‌‌لری ائشیگه چیخارت",
        "exporttext": "مویین بیر صحیفه و یا صحیفه کومانداسینین متنی و دییشدیرمه کئچمیشینی خمل ایله ساری‌لی اولا‌راق خاریجه کؤچوره بیلرسینیز.\nبو، مئدیاویکی ایستیفاده باشقا بیر ویکی [[Special:Import|ایچه کؤچورمه صحیفه‌سی]] ایله ایچه کؤچوروله بیلر.\n\nصحیفه‌لری خاریجه کؤچورمک اوچون، باش‌لیق‌لاری آشاغی‌داکی متن قوتوسونا داخیل ائدین، هر سطره بیر دنه، و کؤهنه سوروملئرلئ بیرلیکده ایندیکی وئرسیاسی، صحیفه کئچمیشی سطرلرینی، یا دا سون دییشیک‌لیک ملوماتییلا بیرلیکده آکتوال وئرسیاسی ایسته‌ییب ایستمدیگینیزی قئید ائدین.\n\nسونونجو حالدا، بیر لینک ده ایستیفاده ائده بیلرسینیز، هؤر: \"[[{{MediaWiki:Mainpage}}]]\" صحیفه‌سی اوچون [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].",
        "exportall": "بوتون صحیفه‌لری خاریجه کؤچور",
-       "exportcuronly": "بوتون تاریخچنی دئییل، یالنیز حال-هازیرکی نوسخه نی داخیل ائت",
+       "exportcuronly": "بوتون گئچمیشی یوخ، تکجه ایندیکی نوسخه نی گیردیر",
        "exportnohistory": "هدف‌لنن قایناق صحیفه‌سی (ایسته‌یه باغ‌لی):",
        "exportlistauthors": "هر صحیفه‌‌ اوچون دَییشدیرمه ائدن سیياهیسینی اؤزونده ساخلايین",
-       "export-submit": "ایخراج",
-       "export-addcattext": "صحیفه‌لری بو بولمه دن علاوه ائت:",
+       "export-submit": "ائشیگه چیخارت",
+       "export-addcattext": "صفحه‌لری بو بؤلمه‌دن آرتیر:",
        "export-addcat": "آرتیر",
        "export-addnstext": "صحیفه‌لری آدلار فزاسین‌دان علاوه ائت:",
        "export-addns": "آرتیر",
-       "export-download": "فایلی قئید ائت",
-       "export-templates": "شابلون‌لاری داخیل ائت",
+       "export-download": "فایل کیمی ذخیره ائت",
+       "export-templates": "شابلونلاری گیردیر",
        "export-pagelinks": "باغ‌لی صحیفه‌لری داخیل درین‌لیک:",
+       "export-manual": "ال ایله صفحه‌لری آرتیر:",
        "allmessages": "سیستئم معلومات‌لاری",
        "allmessagesname": "آد",
        "allmessagesdefault": "دفالت دانیشیق متنی",
        "import-options-wrong": "{{PLURAL:$2|جزئیات| جزئیات}} یانلیش: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "وئریلن کؤک صحیفه‌‌سی اعتبارسیز آددیر.",
        "import-rootpage-nosubpage": "آد فضا سی  \"$1\" آنا باسئ ٔآلت صحیفه اوچون اجازه وئرمیر.",
-       "importlogpage": "Ú\86Û\8cخارÛ\8cÙ\84Ù\85ا Ú¯Ù\88Ù\86دÙ\87â\80\8cÙ\84Û\8cÚ¯ی",
+       "importlogpage": "Ú\86Û\8cخارÛ\8cÙ\84Ù\85ا Ú\98Ù\88رÙ\86اÙ\84ی",
        "importlogpagetext": "آیری ویکیلردن، دَییشیکلیک گئچمیشلریله بیرلیک‌ده گتیریلمیش صفحه‌لر.",
        "import-logentry-upload-detail": "{{PLURAL:$1|بیر|$1}} نوسخه ایچری گتیریلدی",
        "import-logentry-interwiki-detail": "$2-دن {{PLURAL:$1|بیر|$1}} نوسخه ایچری گتیریلدی",
        "tooltip-feed-atom": "بو صحیفه‌‌ اوچون آتوم يايیمی",
        "tooltip-t-contributions": "{{GENDER:$1|بۇ ایشلدنین}} وئردیگی دییشیکلر لیستی",
        "tooltip-t-emailuser": "بو ایستیفاده‌چی‌یه بیر ایمیل گؤندر",
-       "tooltip-t-info": "بÙ\88 ØµÙ\81Ø­Ù\87â\80\8cÛ\8cÙ\87 Ú¯Ø¤Ø±Ù\87 Ø¢Ø±ØªÛ\8cÙ\82 Ø¨Û\8cÙ\84Ú¯Û\8c",
+       "tooltip-t-info": "بÙ\88 ØµÙ\81Ø­Ù\87â\80\8cÛ\8cÙ\87 Ú¯Ø¤Ø±Ù\87 Ø¢Ø±ØªÛ\8cÙ\82 Ø§Û\8cØ·Ù\84اعات",
        "tooltip-t-upload": "فایل‌لار یوکله",
        "tooltip-t-specialpages": "بوتون اؤزل صفحه‌لرین لیستی",
        "tooltip-t-print": "بو صفحه‌‌نین چاپ ائدیلن سۆرومو",
        "spam_blanking": "$1-ه باغلانتیلاری اولان بوتون نوسخه‌لر، بوشادیلیر",
        "spam_deleting": "$1-ه باغلانتیلاری اولان بوتون نوسخه‌لر، سیلینیر",
        "simpleantispam-label": "ضد اِسپم یوخلاماسی.\nبورانی <strong>دولدورمایین</strong>!",
-       "pageinfo-title": "«$1» Ø§Ù\88Ú\86Ù\88Ù\86 Ø¨Û\8cÙ\84Ú¯Û\8cÙ\84ر",
+       "pageinfo-title": "«$1» Ø§Ù\88Ú\86Ù\88Ù\86 Ø§Û\8cØ·Ù\84اعات",
        "pageinfo-not-current": "تأسفله بو بیلگیلری اسکی نوسخه‌لره وئرمک اولانماز بیر ایش‌دیر.",
-       "pageinfo-header-basic": "اساس Ù\85عÙ\84Ù\88Ù\85اتâ\80\8cÙ\84ار",
-       "pageinfo-header-edits": "تارÛ\8cØ®Ú\86Ù\87 Ù\86Û\8c Ø¯Û\8cÛ\8cشدÛ\8cر",
-       "pageinfo-header-restrictions": "صفحه دن محافظت ائله مک",
+       "pageinfo-header-basic": "اصÙ\84Û\8c Ø§Û\8cØ·Ù\84اعات",
+       "pageinfo-header-edits": "دÙ\8eÛ\8cÛ\8cشدÛ\8cرÙ\85Ù\87 Ú¯Ø¦Ú\86Ù\85Û\8cØ´Û\8c",
+       "pageinfo-header-restrictions": "صفحه قوْروماسی",
        "pageinfo-header-properties": "صفحه خصوصیتلری",
        "pageinfo-display-title": "گؤستریلن باشلیق",
        "pageinfo-default-sort": "فرض ائدیلن سیرالاما آچاری",
-       "pageinfo-length": "صحیفه‌‌ اوزونلوغو (بايت)",
-       "pageinfo-article-id": "صحیفه آی‌دی-سی",
-       "pageinfo-language": "صحیفه مضمونونون دیلی",
+       "pageinfo-length": "صفحه‌‌ اوزونلوغو (بايت)",
+       "pageinfo-article-id": "صفحه آی‌دی-سی",
+       "pageinfo-language": "صفحه مضمونونون دیلی",
        "pageinfo-robot-policy": "بوتلارلا ایندِکسلنیر",
        "pageinfo-robot-index": "ایجازه‌لی",
        "pageinfo-robot-noindex": "ایجازه‌سیز",
-       "pageinfo-watchers": "صحیفه‌نین تاماشا‌چی سایی",
+       "pageinfo-watchers": "صفحه‌نین تاماشا‌چی سایی",
        "pageinfo-few-watchers": "$1-دن آز {{PLURAL:$1|ایزله‌ین}}",
        "pageinfo-redirects-name": "بو صحیفه‌یه یول‌لاندیرما سایی‌سی",
        "pageinfo-subpages-name": "بو صحیفه‌نین آلت‌صحیفه‌لری",
        "pageinfo-subpages-value": "$1 ({{PLURAL:$2|بیر|$2}} یول‌لاندیرما؛ {{PLURAL:$3|بیر|$3}} قِیری-یول‌لاندیرما)",
-       "pageinfo-firstuser": "صحیفنی یارا‌دان",
-       "pageinfo-firsttime": "صحیفه‌نین یارانما تاریخی",
+       "pageinfo-firstuser": "صفحه‌نی یارا‌دان",
+       "pageinfo-firsttime": "صفحه‌نین یارانما تاریخی",
        "pageinfo-lastuser": "سونونجو دییشدیرن",
        "pageinfo-lasttime": "سونونجو دییشدیر‌نین تاریخی",
        "pageinfo-edits": "دییشدیر‌لرین سایی",
        "pageinfo-authors": "فرق‌لی مؤلف‌لرین سایی",
-       "pageinfo-recent-edits": "سÙ\88Ù\86 Ø²Ø§Ù\85اÙ\86Ù\84ارداکÛ\8c ØªÙ\86زÛ\8cÙ\85Ù\84Ù\87â\80\8cÙ\85Ù\87â\80\8cÙ\84ر (سون $1)",
-       "pageinfo-recent-authors": "فرقلی يازارلارین سون سايی",
+       "pageinfo-recent-edits": "سÙ\88Ù\86 Ø¯Ù\8eÛ\8cÛ\8cشدÛ\8cرÙ\85Ù\87â\80\8cÙ\84ر Ø³Ø§Û\8cÛ\8c (سون $1)",
+       "pageinfo-recent-authors": "فرقلی يازانلارین سون سايی",
        "pageinfo-magic-words": "سیحیرلی {{PLURAL:$1|بیر|$1}} سؤزجوک ($1)",
        "pageinfo-hidden-categories": "گیزلی {{PLURAL:$1|بؤلمه|بؤلمه‌لر}} ($1)",
        "pageinfo-templates": "ایشله‌دیلمیش {{PLURAL:$1|بیر|$1}} شابلون ($1)",
        "markedaspatrollederror-noautopatrol": "اؤز دییشیک‌لیک‌لرینیزی یوخلاییب ایشاره‌له‌یه بیلمزسینیز.",
        "markedaspatrollednotify": "$1-اوستونده ديَیشیکلیک قئيد ائدیلمیشدیر، نئجه کی پاترول کئشیگی چکدی.",
        "markedaspatrollederrornotify": "دولانماق برچسبی مووفقیت سیز اولدو",
-       "patrol-log-page": "پاترول گونده‌لیگی",
-       "patrol-log-header": "بÙ\88 Û\8cÙ\88Ø®Ù\84اÙ\86Ù\85Û\8cØ´ Ø¯Û\8cÛ\8cØ´Û\8cÚ©â\80\8cÙ\84Û\8cÚ©â\80\8cÙ\84رÛ\8cÙ\86 Ú¯Ù\88Ù\86دÙ\87â\80\8cÙ\84Û\8cÚ¯ی‌دیر.",
+       "patrol-log-page": "دولانما ژورنالی",
+       "patrol-log-header": "بÙ\88 Û\8cÙ\88Ø®Ù\84اÙ\86Ù\85Û\8cØ´ Ø¯Û\8cÛ\8cØ´Û\8cÚ©â\80\8cÙ\84Û\8cÚ©â\80\8cÙ\84رÛ\8cÙ\86 Ú\98Ù\88رÙ\86اÙ\84ی‌دیر.",
        "log-show-hide-patrol": "$1 پاترول گونده‌لیگی",
+       "log-show-hide-tag": "اِتیکت ژورنالی $1",
        "deletedrevision": "کؤهنه نوسخه لری سیلیندی $1.",
        "filedeleteerror-short": "فایل سیلینرکن ختا: $1",
        "filedeleteerror-long": "فایل سیلینرکن اوزه چیخان ختا‌لار:\n\n$1",
        "file-info-png-frames": "$1 {{PLURAL:$1|فرامئ|چرچیوه}}",
        "file-no-thumb-animation": "'''قئید:تئکنیکی مسئله‌لر سببیندن قاباق دان گورسنمه فایل متحرک شکیلی گؤرستمیر .",
        "file-no-thumb-animation-gif": "'''قئید:فنی مسائیله گوره GIF  فایلارین و اونا تای اولانان لار  قالباق دان گورستمه پروقرمی متحرک حالیندا گورسدیلمیجک.'''",
-       "newimages": "یئنی فایل‌لارین سیاهی‌سی",
+       "newimages": "یئنی فایللارین لیستی",
        "imagelisttext": "آشاغی‌داکی سیاهی '$2 گؤره دوزولموش {{PLURAL:$1|ادد فایلی| ادد فای‌لی}} گؤستریر.",
        "newimages-summary": "بو خصوصی صحیفه، ان سون یوک‌لنن فایل‌لاری گؤستریر.",
        "newimages-legend": "سۆزگَج",
        "newimages-label": "فایلین (و یا اونون بیر حیسه‌سی‌نین) آدی:",
-       "newimages-showbots": "بÙ\88ت یوکله‌مه‌لرینی گؤستر",
+       "newimages-showbots": "رÙ\88بات یوکله‌مه‌لرینی گؤستر",
        "noimages": "هئچ نیی گؤرممک.",
        "ilsubmit": "آختار",
        "bydate": "تاریخین اوستوندن",
        "confirmrecreate-noreason": "[[User:$1|$1]] ([[User talk:$1|دانیشیق]]) آدلی ایستیفاده‌چی، سیز ديَیشیکلیک ائتمه‌يه باشلادیقدان سونرا بو صحیفه‌‌نی سیلدی. خاهیش ائدیریک بو صحیفه‌‌نی حقیقتن يئنیدن ياراتماق ایسته‌دیگینیزی تسدیق ائدین.",
        "recreate": "يئنیله‌مک",
        "confirm_purge_button": "اولدو",
-       "confirm-purge-top": "بو صحیفه‌‌ کئشدن (cache) سیلینسین؟",
-       "confirm-purge-bottom": "بیر صحیفه‌‌نی لغو ائتمک کئشی تمیزله‌ير و ان آکتوال دیستریبوتیوین گؤرونمه‌سینه مجبور ائدر.",
+       "confirm-purge-top": "بۇ صفحه‌‌ کشدن (cache) سیلینسین‌می؟",
+       "confirm-purge-bottom": "بیر صفحه‌‌نی یئنی‌له‌مک کشی تمیزله‌ير و سوْن نوسخه‌نین گؤرولمه‌سینه مجبور ائدیر.",
        "confirm-watch-button": "اولدو",
        "confirm-watch-top": "بو صفحه‌نی ایزله‌دیکلرینیزه آرتیریلدی",
        "confirm-unwatch-button": "اولدو",
        "confirm-unwatch-top": "بو صفحه‌نی ایزله‌دیگینیز صفحه‌لردن قالدیریلدی",
        "quotation-marks": "«$1»",
-       "imgmultipageprev": "&larr; اولکی صحیفه‌‌",
-       "imgmultipagenext": "سونراکی صحیفه‌‌ &rarr;",
+       "imgmultipageprev": "&rarr; قاباقکی صفحه‌‌",
+       "imgmultipagenext": "سونراکی صفحه‌‌ &larr;",
        "imgmultigo": "گئت!",
        "imgmultigoto": "$1 صحیفه‌‌يه گئت",
        "img-lang-default": "(وارساییلان دیل)",
        "ascending_abbrev": "آرتما سیراسینا گؤره",
        "descending_abbrev": "آزالما سیراسینا گؤره",
        "table_pager_next": "سوْنراکی صفحه",
-       "table_pager_prev": "قاباغکی صحیفه",
-       "table_pager_first": "اÛ\8cÙ\84Ú© ØµØ­Û\8cÙ\81ه‌‌",
-       "table_pager_last": "سون صحیفه‌‌",
+       "table_pager_prev": "قاباقکی صفحه",
+       "table_pager_first": "بÛ\8cرÛ\8cÙ\86جÛ\8c ØµÙ\81Ø­ه‌‌",
+       "table_pager_last": "سون صفحه‌‌",
        "table_pager_limit": "صحیفه‌‌ده $1 مؤوقئ سرگیله",
-       "table_pager_limit_label": "هر صحیفه‌ده اولان موردلر سایی‌سی",
+       "table_pager_limit_label": "هر صفحه‌ده اولان موردلر سایی‌سی",
        "table_pager_limit_submit": "گئت",
        "table_pager_empty": "نتیجه سیز",
        "autosumm-blank": "صفحه‌‌نی بوْشالتدی",
        "watchlistedit-clear-legend": "ایزلدیکلریمین لیستین سیل",
        "watchlistedit-clear-titles": "باشلیق‌لار:",
        "watchlisttools-clear": "ایزلدیکلریمین لیستین سیل",
-       "watchlisttools-view": "اÛ\8cÙ\84Ú¯Û\8cلی دَییشیکلیکلره باخین",
+       "watchlisttools-view": "باغلی دَییشیکلیکلره باخین",
        "watchlisttools-edit": "ایزله‌دیکلره باخ و اونلاری دَییشدیر",
        "watchlisttools-raw": "چیی ایزله‌دیکلری دَییشدیر",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|دانیشیق]])",
        "fileduplicatesearch-noresults": "\"$1\" آدیندا فایل تاپیلمادی.",
        "specialpages": "اؤزل صفحه‌لر",
        "specialpages-note": "* نورمال اؤزل صفحه‌لر.\n* <span class=\"mw-specialpagerestricted\">محدودلاشدیریلمیش اؤزل صفحه‌لر.</span>",
-       "specialpages-group-maintenance": "ساخلانیش راپورتلاری",
+       "specialpages-group-maintenance": "ساخلانیش گوزاریشلری",
        "specialpages-group-other": "آیری اؤزل صفحه‌لر",
        "specialpages-group-login": "گیریش / حساب یارات",
        "specialpages-group-changes": "سون دییشیک‌لیک‌لر و قئیدلر",
        "specialpages-group-highuse": "ان چوْخ ایشلدیلمیش صفحه‌لر",
        "specialpages-group-pages": "صفحه‌لرین لیست‌لری",
        "specialpages-group-pagetools": "صفحه آلتلری",
-       "specialpages-group-wiki": "بÛ\8cÙ\84Ú¯Û\8cÙ\84ر و آلتلر",
+       "specialpages-group-wiki": "دئÛ\8cتا و آلتلر",
        "specialpages-group-redirects": "مخصوص یوْللاندیرما صفحه‌لری",
        "specialpages-group-spam": "هرزه یازماق آلت‌لری",
        "blankpage": "بوش صفحه",
        "tag-filter": "[[Special:Tags|اِتیکِت]] سۆزگُجی:",
        "tag-filter-submit": "سۆزگَج",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|اِتیکِت|اِتیکِتلر}}]]: $2)",
-       "tags-title": "یاپیشقان",
-       "tags-intro": "بو صحیفه، یازیلیم دَییشدیرمه‌لری نیشانلایان اِتیکِتلری و اونلارین آنلاملارینی گؤستریر.",
-       "tags-tag": "یاپیشقان آدی",
-       "tags-display-header": "ديَیشیکلیک لیستئلئریندئکی گؤرونوش",
-       "tags-description-header": "آنلامینین تام آچیقلاماسی",
+       "tags-title": "اِتیکتلر",
+       "tags-intro": "بو صفحه، نرم افزار دَییشدیرمه‌لری علامتله‌ین اِتیکِتلری و اونلارین معنالارینی گؤستریر.",
+       "tags-tag": "اِتیکت آدی",
+       "tags-display-header": "ديَیشیکلیک لیستلرینده گؤرونوشو",
+       "tags-description-header": "معنانین بوتون توضیحی",
        "tags-source-header": "قایناق",
-       "tags-active-header": "چالیشقلان؟",
-       "tags-hitcount-header": "یاپیشقانلی دییشیک‌لیک‌لر",
+       "tags-active-header": "چالیشقان؟",
+       "tags-hitcount-header": "اِتیکتلی دَییشیک‌لیک‌لر",
        "tags-actions-header": "چالیشمالار",
        "tags-active-yes": "بلی",
        "tags-active-no": "یوْخ",
        "revdelete-restricted": "ایداره‌چیلره محدودیت قویدو",
        "revdelete-unrestricted": "ایداره‌چیلرین محدودیتلرینی گؤتوردو",
        "logentry-block-block": "$1 {{GENDER:$4|$3}}-نی {{GENDER:$2|باغلادی}}. قۇرتارماق تاریخی: $5 $6",
-       "logentry-block-unblock": "$1 {{GENDER:$4|$3}}-نین {{GENDER:$2|بلوکلاماغینی قالدیردی}}",
+       "logentry-block-unblock": "$1 {{GENDER:$4|$3}}-نین {{GENDER:$2|باغلانماغینی گؤتوردو}}",
        "logentry-import-upload": "$1 $3-نی فایل یوکله‌مه یولو ایله {{GENDER:$2|ایچری گتیردی}}",
        "logentry-import-upload-details": "$1 $3-نی فایل یوکله‌مه یولو ایله {{GENDER:$2|ایچری گتیردی}} ($4 {{PLURAL:$4|نوسخه}})",
        "logentry-import-interwiki-details": "$1 $3-نی $5-دن {{GENDER:$2|ایچری گتیردی}} ($4 {{PLURAL:$4|نوسخه}})",
+       "logentry-merge-merge": "$1  $3  ایله  $4-نی {{GENDER:$2| بیرلشدیردی}} ($5-جن نوسخه)",
        "logentry-move-move": "$1، $3 صفحه‌سینی $4-ه {{GENDER:$2|آپاردی}}",
        "logentry-move-move-noredirect": "$1، $3 صفحه‌سینی، یوْل‌لاندیرما قوْیماماق‌لا، $4-ه {{GENDER:$2|آپاردی}}",
        "logentry-move-move_redir": "$1، $3 صفحه‌سینی، $4-ده یوْل‌لاندیرما اۆستونه {{GENDER:$2|آپاردی}}",
        "logentry-rights-rights-legacy": "$1، $3-ین قروپ عوضولوگونو {{GENDER:$2|دَییشدیردی}}",
        "logentry-rights-autopromote": "$1-ین مقامی اوتوماتیک $4-دن $5-ه {{GENDER:$2|آرتیریلدی}}",
        "logentry-upload-upload": "$1 $3 را {{GENDER:$2|یوکلندیردی}}",
+       "log-name-managetags": "اِتیکت ایداره گئچمیشی",
+       "log-name-tag": "اِتیکت ژورنالی",
        "rightsnone": "(هئچ)",
        "revdelete-summary": "دَییشدیرمه قیساسی",
        "feedback-adding": "صحیفه‌یه گئری-بیلدیریم آرتیریلیر...",
        "duration-centuries": "{{PLURAL:$1|بیر|$1}} یوز-ایل",
        "duration-millennia": "{{PLURAL:$1|بیر|$1}} مین‌ایل",
        "rotate-comment": "عکس $1 {{PLURAL:$1|درجه}} ساعات عقربه‌لری ایستیقامتینده فیرلاندیریلب‌دیر",
+       "expandtemplates": "شابلونلاری گئنیشلتمه",
        "expand_templates_output": "سوْنوج",
        "expand_templates_ok": "اوْلسون",
        "expand_templates_remove_comments": "باخیش‌لاری سیل",
        "special-characters-title-minus": "منفی علامتی",
        "mw-widgets-dateinput-no-date": "تاریخ سئچیلمه‌ییب",
        "mw-widgets-titleinput-description-new-page": "صفحه هله‌لیک یوخدور",
-       "mw-widgets-titleinput-description-redirect": "$1-ه داشی"
+       "mw-widgets-titleinput-description-redirect": "$1-ه داشی",
+       "log-action-filter-block": "باغلانما نوعو:",
+       "log-action-filter-managetags": "ایداره نوعو:",
+       "log-action-filter-move": "حرکت نوعو:",
+       "log-action-filter-upload": "یۆکله‌مه نوعو",
+       "log-action-filter-managetags-create": "اِتیکت یاراتما",
+       "log-action-filter-managetags-delete": "اِتیکت سیلمه",
+       "log-action-filter-managetags-activate": "اِتیکت چالیشدیرما",
+       "log-action-filter-managetags-deactivate": "اِتیکت دَییشدیرمه",
+       "log-action-filter-upload-upload": "یئنی یۆکله‌مه",
+       "log-action-filter-upload-overwrite": "یئنیدن یۆکله‌مه"
 }
index 1241f6b..89dbf65 100644 (file)
        "createacct-email-ph": "Электрон почта адресығыҙҙы яҙығыҙ",
        "createacct-another-email-ph": "Электрон почта адресығыҙҙы яҙығыҙ",
        "createaccountmail": "Осраҡлы рәүештә хасил ителгән ваҡытлыса серһүҙҙе файҙаланырға һәм уны миңә ошо электрон почтаһы адресына ебәрергә",
+       "createaccountmail-help": "Серһүҙен һорамайынса, башҡа кешегә иҫәп яҙмаһын төҙөү өсөн ҡулланыла ала.",
        "createacct-realname": "Ысын исемегеҙ (мотлаҡ түгел)",
        "createaccountreason": "Сәбәп:",
        "createacct-reason": "Сәбәп",
        "createacct-reason-ph": "Икенсе иҫәп яҙмаһы һеҙгә ни өсөн кәрәк?",
+       "createacct-reason-help": "Иҫәп яҙмаһын төҙөү журналында күренгән хәбәр",
        "createacct-submit": "Иҫәп яҙмаһын булдырырға",
        "createacct-another-submit": "Иҫәп яҙмаһын булдырырға",
        "createacct-continue-submit": "Иҫәп яҙмаһын булдырыуҙы дауам итергә",
        "nocookiesnew": "Иҫәп яҙыуы яһалды, ләкин һеҙ танылмағанһығыҙ. {{SITENAME}} ҡатнашыусыны таныу өсөн «cookies» ҡуллана. Һеҙҙә «cookies» тыйылған. Зинһар, уларға рөхсәт бирегеҙ, шунан яңынан ҡатнашыусы исеме һәм серһүҙ менән танылығыҙ.",
        "nocookieslogin": "{{SITENAME}} ҡатнашыусыны таныу өсөн «cookies» ҡуллана. Һеҙҙә «cookies» тыйылған. Зинһар, уға рөхсәт бирегеҙ һәм яңынан керегеҙ.",
        "nocookiesfornew": "Иҫәп яҙмаһы булдырылманы, сөнки уның сығанағын тикшереү мөмкин түгел.\n\"Сookies\" эшләй икәнлеген тикшерегеҙ, битте яңыртығыҙ  һәм яңынан ҡабатлап ҡарағыҙ.",
+       "createacct-loginerror": "Иҫәп яҙмаһы уңышлы төҙөлдө, әммә һеҙ автоматик рәүештә системаға инә алманығыҙ. [[Special:UserLogin|Ҡулдан авторлаштырыуҙы үтегеҙ]].",
        "noname": "Ғәмәлдә булған ҡатнашыусы исемен керетмәнегеҙ.",
        "loginsuccesstitle": "Танышыу уңышлы үтте",
        "loginsuccess": "Хәҙер һеҙ $1 исеме менән эшләйһегеҙ.",
        "passwordreset-emailsentusername": "Әгәр был ҡатнашыусының исеменә бәйле  электрон почтаһының адресы булһа, ул саҡта  серһүҙҙе тергеҙеү өсөн  хат ебәреләсәк.",
        "passwordreset-emailsent-capture": "Серһүҙҙе ташлау тураһындағы мәғлүмәт менән электрон хат ебәрелде, уның тексы түбәндә бирелә:",
        "passwordreset-emailerror-capture": "Серһүҙҙе ташлау тураһында хәбәр итеүсе электрон хат булдырылғайны, ләкин уны  {{GENDER:$2|kullanıcıya}} түбәндәге сәбәп арҡаһында ебәреп булманы: $1",
+       "passwordreset-invalideamil": "Электрон почта адресы ҡабул ителмәй",
        "changeemail": "Электрон почта адресын үҙгәртергә",
        "changeemail-header": "Электрон почта адресын үҙгәртеү",
        "changeemail-passwordrequired": "Әлеге үҙгәрештәрҙе раҫлау өсөн, Һеҙгә ҡулланыусының серһүҙен яҙырға кәрәк",
        "minoredit": "Әҙ генә үҙгәрештәр",
        "watchthis": "Күҙәтеү исемлегенә",
        "savearticle": "Яҙҙырып ҡуйырға",
+       "publishpage": "Битте баҫтырырға",
        "preview": "Ҡарап сығыу",
        "showpreview": "Ҡарап сығырға",
        "showdiff": "Индерелгән үҙгәрештәр",
        "right-override-export-depth": "5-се тәрәнлеккә тиклем бәйле биттәре менән бергә биттәрҙе сығарыу",
        "right-sendemail": "Башҡа ҡатнашыусыларға электрон почта аша хат ебәреү",
        "right-passwordreset": "Серһүҙҙе яңыртыу осраҡтарын ҡарау",
-       "right-managechangetags": "[[Special:Tags|билдÓ\99лÓ\99Ñ\80]] Ð¼Ó\99Ò\93лүмÓ\99Ñ\82Ñ\82Ó\99Ñ\80 Ð±Ð°Ð·Ð°Ò»Ñ\8bнда Ñ\82Ó©Ò\99Ó©Ò¯ Ò»Ó\99м Ñ\8eйÑ\8bÑ\83",
+       "right-managechangetags": "[[Special:Tags|Ð\91илдÓ\99лÓ\99Ñ\80Ò\99е]] Ñ\82Ó©Ò\99Ó©Ò¯ Ò»Ó\99м (де)акÑ\82иваÑ\86иÑ\8f",
        "right-applychangetags": " [[Special:Tags|тамғаһын]] үҙегеҙҙең төҙөтеү менән ҡулланырға",
        "right-changetags": "Айырым үҙгәртеүҙәрҙә һәм журнал яҙмаланыда[[Special:Tags|тамғаһын]] өҫтәү һәм юйыу",
        "right-deletechangetags": "[[Special:Tags|билдәләр]] мәғлүмәттәр базаһында төҙөү һәм юйыу",
        "action-viewmyprivateinfo": "һеҙҙең шәхси мәғлүмәтте байҡау",
        "action-editmyprivateinfo": "һеҙҙең шәхси мәғлүмәтте мөхәррирләү",
        "action-editcontentmodel": "Биттең контент моделен мөхәррирләү",
-       "action-managechangetags": "Ð\9cÓ\99Ò\93лүмÓ\99Ñ\82 Ð±Ð°Ð·Ð°Ò»Ñ\8bнда Ñ\82амÒ\93а Ð±Ñ\83лдÑ\8bÑ\80Ñ\8bÑ\83 Ò»Ó\99м Ñ\8eйÑ\8bÑ\83",
+       "action-managechangetags": "билдÓ\99лÓ\99Ñ\80Ò\99е Ñ\82Ó©Ò\99Ó©Ò¯ Ò»Ó\99м (де)акÑ\82иваÑ\86иÑ\8f",
        "action-applychangetags": "Һеҙҙең үҙгәрештәр ТЕГын булдырырға",
        "action-changetags": "Айырым үҙгәртеүҙәрҙә һәм журнал яҙмаланыда тег өҫтәү һәм юйыу",
+       "action-deletechangetags": "билдәләрҙе мәғлүмәт базаһынан юйыу",
        "nchanges": "$1 {{PLURAL:$1|үҙгәртәү|үҙгәртеүҙәр}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|һеҙҙең һуңғы визит}}",
        "enhancedrc-history": "тарих",
        "whatlinkshere-links": "← һылтанмалар",
        "whatlinkshere-hideredirs": "$1 йүнәлтеүҙәре",
        "whatlinkshere-hidetrans": "Ҡушылғандарҙы $1",
-       "whatlinkshere-hidelinks": "Һылтанмаларҙы $1",
-       "whatlinkshere-hideimages": "файл һылтанмаларын $1",
+       "whatlinkshere-hidelinks": "$1 һылтанмалар",
+       "whatlinkshere-hideimages": "$1 файл һылтанмалары",
        "whatlinkshere-filters": "Һайлау",
        "whatlinkshere-submit": "Күсергә",
        "autoblockid": "Автобикләү #$1",
        "exif-webstatement": "Интернеттағы авторлыҡ хоҡуҡтары тураһындағы белдереү",
        "exif-originaldocumentid": "Сығанаҡ документтың уникаль идентификаторы",
        "exif-licenseurl": "Авторлыҡ рөхсәтнәмәһенең URL",
-       "exif-morepermissionsurl": "Альтернатив рөхсәтнәмә мәғлүмәттәре",
+       "exif-morepermissionsurl": "Альтернатив рөхсәтнамә мәғлүмәттәре",
        "exif-attributionurl": "Был эште ҡулланғанда, зинһар, ошонда һылтанма яһағыҙ",
        "exif-preferredattributionname": "Был эште ҡулланғанда, зинһар, ошоларҙы белдерегеҙ",
        "exif-pngfilecomment": "PNG файл өсөн иҫкәрмә",
        "searchsuggest-containing": "эстәлегендә...",
        "api-error-badaccess-groups": "Һеҙгә был викиға файлдар күсереү рөхсәт ителмәй",
        "api-error-badtoken": "Эске хата: дөрөҫ булмаған токен",
+       "api-error-blocked": "Мөхәррирләү һеҙҙең өсөн бикләнде.",
        "api-error-copyuploaddisabled": "Был серверҙа URL адрес буйынса йөкләү өҙөлгән",
        "api-error-duplicate": "Бындай эстәлекле {{PLURAL:$1|файл}}  бар.",
        "api-error-duplicate-archive": "Сайтта бындай эстәлекле {{PLURAL:$1|башҡа файл}} бар ине инде, ләкин {{PLURAL:$1|1=ул юйылды|улар юйылды}}",
        "mw-widgets-dateinput-no-date": "Дата һайланмаған",
        "mw-widgets-titleinput-description-new-page": "Был бит юҡ",
        "mw-widgets-titleinput-description-redirect": "$1 йүнәлтеү",
-       "api-error-blacklisted": "Башҡа аңлайышлы исем һайлағыҙ.",
        "sessionmanager-tie": "Бер юлы бер нисә ғаризаның төп нөсхәһен тикшереп булмай: $1.",
        "sessionprovider-generic": "$1 сессия",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "куки нигеҙендә сессиялар",
        "log-action-filter-block-block": "Бикләргә",
        "log-action-filter-block-reblock": "Бикте үҙгәртеү",
        "log-action-filter-block-unblock": "Бикте алырға",
+       "log-action-filter-contentmodel-change": "Эстәлек моделен үҙгәртергә",
        "log-action-filter-delete-delete": "Битте юйыуҙар",
        "log-action-filter-delete-restore": "Битте тергеҙеү",
        "log-action-filter-delete-event": "Журналды юйыу",
        "log-action-filter-delete-revision": "Версияны алып ташларға",
        "log-action-filter-import-interwiki": "Трансвики импорты",
+       "log-action-filter-managetags-create": "Тег төҙөү",
+       "log-action-filter-managetags-delete": "Тегты юйыу",
+       "log-action-filter-newusers-autocreate": "Автоматик төҙөү",
        "log-action-filter-patrol-patrol": "Ҡулдан патруль яһау",
        "log-action-filter-patrol-autopatrol": "Автоматик патруль",
        "log-action-filter-protect-protect": "Һаҡлау",
        "log-action-filter-protect-modify": "Яңынан тейәү",
        "log-action-filter-protect-unprotect": "Һаҡты алып ташлау",
+       "log-action-filter-protect-move_prot": "Һаҡлауҙы күсереү",
+       "log-action-filter-rights-rights": "Ҡулдан үҙгәртеү",
+       "log-action-filter-rights-autopromote": "Автоматик үҙгәртеү",
        "log-action-filter-upload-upload": "Яңы күсереү",
        "log-action-filter-upload-overwrite": "Ҡабаттан тейәү",
+       "authmanager-create-disabled": "Иҫәп яҙмаһын булдырыу бикләнгән.",
+       "authmanager-authplugin-setpass-failed-title": "Серһүҙҙе үҙгәртеү хатаһы",
        "authmanager-userdoesnotexist": "\"$1\" иҫәп яҙмаһы теркәлмәгән.",
+       "authmanager-domain-help": "Тышҡы аутентификация домены (өҫтәмә).",
        "authmanager-email-label": "Электрон почта адресы",
        "authmanager-email-help": "Электрон почта адресы",
        "authmanager-realname-label": "Ысын исемегеҙ",
        "changecredentials-submit": "Иҫәп мәғлүмәттәрен үҙгәртеү",
        "removecredentials": "Иҫәп мәғлүмәттәрен юйырға",
        "removecredentials-submit": "Иҫәп мәғлүмәттәрен юйырға",
-       "credentialsform-account": "Ð\98Ò«Ó\99п Ñ\85Ñ\83жаһÑ\8b"
+       "credentialsform-account": "Ð\98Ò«Ó\99п Ñ\8fÒ\99маһÑ\8b Ð¸Ñ\81еме:"
 }
diff --git a/languages/i18n/ban.json b/languages/i18n/ban.json
new file mode 100644 (file)
index 0000000..76dcb87
--- /dev/null
@@ -0,0 +1,535 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Adi Mayndra",
+                       "Andru",
+                       "BASAbali",
+                       "M. Adiputra",
+                       "Naval Scene",
+                       "Nemo bis",
+                       "NoiX180",
+                       "아라"
+               ]
+       },
+       "tog-underline": "isinin garis ring beten pranala",
+       "tog-hideminor": "engkebang suntingan ring gentosan sane pinih anyar",
+       "tog-hidepatrolled": "engkebang suntingan mapatrol ring gentosan sane pinih anyar",
+       "tog-newpageshidepatrolled": "engkebang lembar mapatrol saking saking kepahan lembar anyar",
+       "tog-extendwatchlist": "kembangang kepahan pangiwasan antuk nampilang samian panguwahan, nenten sane anyar kewanten",
+       "tog-usenewrc": "aniang suntingan ring tampilan pagentosan sane pinih anyar lan kepahan pangiwasan manutin lembar",
+       "tog-numberheadings": "isinin nomor murda anggen cara otomatis",
+       "tog-showtoolbar": "tampilang pekakas panyuntingan",
+       "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-watchdefault": "imbuhin lembar panyuntingansane sunting titiang ring kepahan pangiwasan",
+       "tog-watchmoves": "imbuhang lembar sane kakisidang titiang ring kepahan pangiwasan",
+       "tog-watchdeletion": "imbuhin lembar sane kaapus ring kepahan pangiwasan",
+       "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",
+       "tog-enotifwatchlistpages": "kirimang titiang email yening wenten lembar utawi pupulan ring kepahan sane magentos",
+       "tog-enotifusertalkpages": "kirimang titiang email yening lembar wacan titiang magentos",
+       "tog-enotifminoredits": "taler kirimang titiang email ring panguwahan alit",
+       "tog-enotifrevealaddr": "kirimang titiang alamat email ring catetan email",
+       "tog-shownumberswatching": "tampilang akehnyane sane ngiwasin",
+       "tog-oldsig": "tanda tangan mangkin",
+       "tog-fancysig": "dadosang tanda tangan dados teks wiki (nenten pranala otomatis)",
+       "tog-uselivepreview": "anggen pratayang langsung(experimental)",
+       "tog-forceeditsummary": "elingang titiang yening kotak ringkesan suntingan kari kosong",
+       "tog-watchlisthideown": "engkebang panguwahan titiang saking kepahan pangiwasan",
+       "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-watchlisthideanons": "engkebangsuntingan penganggen tan maadan ring kepahan pangiwasan",
+       "tog-watchlisthidepatrolled": "engkebang panguwahan mapatrol kepahan pangiwasan",
+       "tog-ccmeonemails": "kirimang titiang salinan email sane kirimang titiang ring anak lianan",
+       "tog-diffonly": "sampunang katampilang daging lembar ring ungkur binanne suntingan",
+       "tog-showhiddencats": "tampilang golongan sane kaengkebang",
+       "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",
+       "underline-always": "setata",
+       "underline-never": "nenten naenin",
+       "underline-default": "kulit utawi penjelajah paaban",
+       "editfont-style": "model aksara ring kotak panyuntingan",
+       "editfont-default": "penjelajah paaban",
+       "editfont-monospace": "aksara monospace",
+       "editfont-sansserif": "aksara sans-serif",
+       "editfont-serif": "aksara serif",
+       "sunday": "Redité",
+       "monday": "Soma",
+       "tuesday": "Anggara",
+       "wednesday": "Buda",
+       "thursday": "Wraspati",
+       "friday": "Sukra",
+       "saturday": "Saniscara",
+       "sun": "Red",
+       "mon": "Som",
+       "tue": "Ang",
+       "wed": "Bud",
+       "thu": "Wrs",
+       "fri": "Suk",
+       "sat": "San",
+       "january": "Januari",
+       "february": "Pébruari",
+       "march": "Maret",
+       "april": "April",
+       "may_long": "mungkin - minab",
+       "june": "Juni",
+       "july": "Juli",
+       "august": "Agustus",
+       "september": "Séptémber",
+       "october": "Oktober",
+       "november": "november",
+       "december": "Désémber",
+       "january-gen": "Januari",
+       "february-gen": "Pébruari",
+       "march-gen": "Maret",
+       "april-gen": "April",
+       "may-gen": "Méi",
+       "june-gen": "Juni",
+       "july-gen": "Juli",
+       "august-gen": "Agustus",
+       "september-gen": "Séptémber",
+       "october-gen": "Oktober",
+       "november-gen": "Nopémber",
+       "december-gen": "Désémber",
+       "jan": "Jan",
+       "feb": "Péb",
+       "mar": "Mar",
+       "apr": "Apr",
+       "may": "Méi",
+       "jun": "Jun",
+       "jul": "Jul",
+       "aug": "Ags",
+       "sep": "Sép",
+       "oct": "Okt",
+       "nov": "Nop",
+       "dec": "Dés",
+       "january-date": "Januari $1",
+       "february-date": "Februari $1",
+       "march-date": "Maret $1",
+       "may-date": "Mei $1",
+       "june-date": "Juni $1",
+       "july-date": "Juli $1",
+       "august-date": "Agustus $1",
+       "october-date": "Oktober $1",
+       "december-date": "Desember $1",
+       "pagecategories": "{{PLURAL:$1|golongan}}",
+       "category_header": "lembar ring golongan \"$1\"",
+       "subcategories": "sub golongan",
+       "category-media-header": "lembar ring golongan \"$1\"",
+       "category-empty": "\"mangkin, nenten madaging lembar utawi pekakas ring golongan puniki\"",
+       "hidden-categories": "{{plural:$1|punduhan sane kaengkebang| punduhan sane kaengkebang}}",
+       "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-file-count": "{{PLURAL:$2|golongan puniki madue{{PLURAL:$1|$1 lembar}}, saking total $2.}}",
+       "listingcontinuesabbrev": "samb.",
+       "noindex-category": "lembar sane nenten maindeks",
+       "about": "paindikan",
+       "newwindow": "bukak ring jendela anyar",
+       "cancel": "buwungang",
+       "mytalk": "Wicara",
+       "navigation": "pengarah",
+       "qbedit": "mecikang",
+       "faq": "FAQ (pitaken sane jagi katakonang)",
+       "faqpage": "Project: FAQ(pitaken sane jagi katakonang)",
+       "actions": "parilaksana",
+       "namespaces": "Genah pesengan",
+       "variants": "kawentenan sane lianan",
+       "errorpagetitle": "kaluputan",
+       "returnto": "mabalik ring $1",
+       "tagline": "Saka {{SITENAME}}",
+       "help": "Tulung",
+       "search": "Rereh",
+       "searchbutton": "Rereh",
+       "searcharticle": "lanturang",
+       "history": "sejarah pupulan",
+       "history_short": "kawentenan sane lawas",
+       "printableversion": "kawentenan lian sane macetak",
+       "permalink": "pranala ajeg",
+       "edit": "Becikang",
+       "create": "ngawe",
+       "delete": "apus",
+       "protect": "nyaga",
+       "protect_change": "gentos",
+       "newpage": "lembar anyar",
+       "talkpagelinktext": "Wicara",
+       "personaltools": "pekakas pribadi",
+       "talk": "rembug\n\nngarembug (kata kerja)",
+       "views": "Pekantenan",
+       "toolbox": "Pekakas",
+       "viewhelppage": "cingak lembar pamitutlung",
+       "otherlanguages": "Basa tiosan",
+       "redirectedfrom": "(kaalihang saking $1)",
+       "lastmodifiedat": "lembar puniki kaping untat kaubah rikala  $2, $1",
+       "jumpto": "lanturang ke:",
+       "jumptonavigation": "pengarah",
+       "jumptosearch": "Rereh",
+       "aboutsite": "Indik {{SITENAME}}",
+       "aboutpage": "Project:indik",
+       "copyrightpage": "{{ns:project}}:hak cipta",
+       "currentevents": "kawentenane mangkin",
+       "currentevents-url": "Project:kawentenane mangkin",
+       "disclaimers": "nungkas",
+       "disclaimerpage": "Project:Pengelidan lumrah",
+       "edithelp": "pamitulung panguwahan",
+       "mainpage": "Kaca Utama",
+       "mainpage-description": "lembar utama",
+       "portal": "Pintu nuju sekha",
+       "portal-url": "Project:pamedal sekha",
+       "privacy": "kawicaksanaan padewekan",
+       "privacypage": "Project:kawicaksanan tanpaiket",
+       "retrievedfrom": "kapolihang saking \"$1\"",
+       "youhavenewmessages": "{{PLURAL:$3|ida dane maduwe}} $1 ($2)",
+       "editsection": "gentos",
+       "editold": "mecikang",
+       "viewsourceold": "cingak witnyane",
+       "editlink": "mecikang",
+       "viewsourcelink": "cingak witnyane",
+       "editsectionhint": "ubah kepahan$1",
+       "toc": "kepahan dagingnyane",
+       "site-atom-feed": "$1 \"atom feed\"",
+       "page-atom-feed": "$1 \"atom feed\"",
+       "red-link-title": "$1 (kaca tan wénten)",
+       "nstab-main": "Kaca",
+       "nstab-user": "sane nganggo",
+       "nstab-special": "lembar sane kautamayang",
+       "nstab-project": "lembar proyek",
+       "nstab-image": "pupulan",
+       "nstab-template": "templat",
+       "nstab-help": "lembar pamitutlung",
+       "nstab-category": "golongan",
+       "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",
+       "missingarticle-rev": "(pabenahan#:$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",
+       "viewsource": "cingak witnyane",
+       "yourname": "pesengan penganggen",
+       "yourpassword": "kruna sandi",
+       "yourpasswordagain": "jumunin kruna sandi",
+       "remembermypassword": "elingang kruna sandi padewekan ring computer niki ( suwennyane $1{{PLURAL:$1|dina}})",
+       "login": "malebu ring log",
+       "nav-login-createaccount": "malebu log / ngawe pepalihan",
+       "userlogin": "malebu log / ngawe pepalihan",
+       "userlogout": "medal saking Log",
+       "nologin": "durung madue akun?$1",
+       "nologinlink": "ngajuang akun anyar",
+       "createaccount": "ngajuang akun anyar",
+       "gotaccount": "durung madue akun?$1",
+       "gotaccountlink": "malebu ring log",
+       "userlogin-resetlink": "Lali rerincian anggen mlebu ring log ida dane?",
+       "mailmypassword": "nyumu ngaryanin kruna sandi",
+       "loginlanguagelabel": "Basa: $1",
+       "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 pupulan-pupulan",
+       "sig_tip": "tanda tangan ida dane sareng tanda waktu",
+       "hr_tip": "garis horizontal",
+       "summary": "pamicutet",
+       "minoredit": "niki panguwahan kidik",
+       "watchthis": "tinjo lembar puniki",
+       "savearticle": "simpen lembar",
+       "preview": "tayangan sadurungnyane",
+       "showpreview": "cingak sane lintang",
+       "showdiff": "cingak pagentosan",
+       "anoneditwarning": "\"Pingetan\" ida dane nenten kacatet malebu. Alamat IP ida dane jagi kacatet ring sejarah (indik sane dumunan) ring lembar puniki.",
+       "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}}|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>.",
+       "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>.",
+       "previewnote": "\"elingang yening puniki wantah sane lintang.\" Panguwahan ida dane durung kasimpen!",
+       "editing": "panguwahan $1",
+       "editingsection": "nguwah $1 (bagian)",
+       "templatesused": "{{PLURAL:$1|Templat}} sane kaanggen ring lembar niki:",
+       "template-protected": "nyayubang",
+       "template-semiprotected": "(semi-penyaga)",
+       "hiddencategories": "lembar niki inggih punika krama saking {{PLURAL:$1|1 golongan sane mengkeb|$1 golongan sane mengkeb}}",
+       "permissionserrorstext-withaction": "ida dane nenten madue kuasa malebu anggen $2, riantukan {{PLURAL:$1|alasan}} 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": "lembar puniki sampun kaapus. anggen pewarah, puniki log pangapus lan pengisidan lembar puniki",
+       "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",
+       "viewpagelogs": "cingak log ring lembar puniki",
+       "currentrev-asof": "pabecikan sane anyar ring pinanggal$1",
+       "revisionasof": "ngabecikang per $1",
+       "revision-info": "panguwahan per $1;$2",
+       "previousrevision": "← pabenahan sane dumun",
+       "nextrevision": "panguwahan salanturnyane→",
+       "currentrevisionlink": "panguwahan mangkin",
+       "cur": "mangkin",
+       "last": "sadurung",
+       "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": "napakin versi sane dumunan",
+       "history-show-deleted": "wantah sane kaapus",
+       "histfirst": "pinih suwe",
+       "histlast": "pinih anyar",
+       "history-feed-item-nocomment": "$1 ring $2",
+       "rev-delundel": "gentos pangatonan",
+       "revdel-restore": "gentos pangatonan",
+       "revertmerge": "tansida nyarengin",
+       "history-title": "sajer panguwahan saking $1",
+       "lineno": "baris$1",
+       "compareselectedversions": "bandingang penguwahan sane kapilih",
+       "editundo": "nguliang",
+       "searchresults": "asil pangrereh",
+       "searchresults-title": "asil pangrereh anggen \"$1\"",
+       "prevn": "{{PLURAL:$1|$1}} sadurungne",
+       "nextn": "{{PLURAL:$1|$1}} selanturnyane",
+       "prevn-title": "$1 {{PLURAL:$1|asil}} sadurunge",
+       "nextn-title": "$1 {{PLURAL:$1|asil}} selanturnyane",
+       "shown-title": "ngantenang $1{{PLURAL:$1|asil}} sabilang lembar",
+       "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}}",
+       "searchprofile-articles": "lembar puniki",
+       "searchprofile-images": "multimedia",
+       "searchprofile-everything": "samian",
+       "searchprofile-advanced": "lanturane",
+       "searchprofile-articles-tooltip": "ngarereh ring $1",
+       "searchprofile-images-tooltip": "pangrereh ring pupulan",
+       "searchprofile-everything-tooltip": "pangrereh ring samian isi (taler lembar wecana)",
+       "searchprofile-advanced-tooltip": "pangrereh ring genah pesengan sane kasinahang",
+       "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": "(panglikuan $1)",
+       "search-section": "(kepahan$1)",
+       "search-suggest": "minab sane kearsaang $1",
+       "searchrelated": "paiketan",
+       "searchall": "samian",
+       "search-nonefound": "nenten wenten asil sane caklek ring arsa",
+       "mypreferences": "Preferensi",
+       "youremail": "E-mail",
+       "yourrealname": "pesengan sujati",
+       "prefs-help-email": "alamat email sane mawatek mamilih, nanging ngamerluang anggen nyumunin sandi yening ida dane lali",
+       "prefs-help-email-others": "ida dane prasida milih anggen ngalugrain anak lianan ngubungin ida dane majalaran lembar penganggen utawi pangraos nenten ja perlu ngagah indik padewekan ida dane",
+       "newuserlogpage": "log penganggo anyar",
+       "action-edit": "benahang lembar puniki",
+       "nchanges": "$1{{PLURAL:$1|panguwahan|uwah-uwahan}}",
+       "recentchanges": "pagentosan sane anyar",
+       "recentchanges-legend": "pilihan panguwahan sane anyar",
+       "recentchanges-feed-description": "molihang pagentosan anyar ring wiki ring \"umpan\" puniki",
+       "recentchanges-label-newpage": "panguwahan puniki ngaryanin lembar anyar",
+       "recentchanges-label-minor": "niki panguwahan kidik",
+       "recentchanges-label-bot": "penguwahan puniki kalaksanayang antuk bot",
+       "recentchanges-label-unpatrolled": "panguwahan puniki durung kapatroli",
+       "rcnotefrom": "ring beten puniki inggih punika panguwahan saking <strong>$2</strong> (kaedengang ngantos <strong>$1</strong> panguwahan).",
+       "rclistfrom": "edengang  penguwahan sane anyar wit saking $3 $2",
+       "rcshowhideminor": "$1 uwahan kidik",
+       "rcshowhidebots": "$1 bot",
+       "rcshowhideliu": "$1 penganggo - penganggo terdaftar",
+       "rcshowhideanons": "$1 penganggo tan meadan",
+       "rcshowhidepatr": "$1 suntingan sane kapatroli",
+       "rcshowhidemine": "$1 uwahan titiang",
+       "rclinks": "edengang sane untat $1 gentosan anyar $2 dina kaping untat <br />$3",
+       "diff": "bina",
+       "hist": "kawentenan sane lian",
+       "hide": "engkebang",
+       "show": "edengang",
+       "minoreditletter": "M",
+       "newpageletter": "n",
+       "boteditletter": "B",
+       "rc-enhanced-expand": "edengang rerincian",
+       "rc-enhanced-hide": "engkebang rerincian",
+       "recentchangeslinked": "pangentos sane wenten paiketane",
+       "recentchangeslinked-toolbox": "pangentos sane wenten paiketane",
+       "recentchangeslinked-title": "panguwahan sane mapaiketan ring $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 masurat tebel",
+       "recentchangeslinked-page": "adan lembar",
+       "recentchangeslinked-to": "edengang panguwahan sakin lembar-lembar sane mapaiket antuk lembar-lembar sane kaedengang",
+       "upload": "ngunggahang berkas",
+       "uploadlogpage": "Log pangunggahan",
+       "filedesc": "pacutetan",
+       "license": "kepahan lugra",
+       "license-header": "kepahan lugra",
+       "file-anchor-link": "pupulan",
+       "filehist": "sejarah pupulan",
+       "filehist-help": "klik ring pinanggal/galah anggen nyingakin pupulan niki rikala punika",
+       "filehist-revert": "buwungang",
+       "filehist-current": "sane mangkin",
+       "filehist-datetime": "pinanggal/galah",
+       "filehist-thumb": "Miniatur",
+       "filehist-thumbtext": "miniatur anggen versi ring $1",
+       "filehist-user": "sane nganggo",
+       "filehist-dimensions": "ukuran",
+       "filehist-comment": "tureksa",
+       "imagelinks": "penganggen berkas",
+       "linkstoimage": "nyarengin {{PLURAL:$1|pranala|$1pranala}} ring pupulan puniki",
+       "nolinkstoimage": "nenten wenten lembar sane medue pranala ring pupulan puniki",
+       "sharedupload-desc-here": "pupulan puniki mawit saking $1 lan minab kaanggen olih proyek-proyek sane lianan. Deskripsi saking [$2 lebar deskripsinyane] kaarahin ring ungkur puniki",
+       "randompage": "lembar acak",
+       "statistics": "Statistik",
+       "nbytes": "$1{{PLURAL:$1|bit}}",
+       "nmembers": "$1 {{PLURAL:$1|krama}}",
+       "prefixindex": "samian lembar anggen pangater",
+       "usercreated": "{{GENDER:$3|kakaryanin}} ring $1 galah $2",
+       "newpages": "lembar anyar",
+       "move": "kisidang",
+       "pager-newer-n": "{{PLURAL:$1|1 lewih anyar|$1 lewih anyar}}",
+       "pager-older-n": "{{PLURAL:$1|1 lewih suwe|$1 lewih anyar}}",
+       "booksources": "pawiwitan buku",
+       "booksources-search-legend": "rereh ring sumber buku",
+       "log": "log",
+       "allpages": "samian lembar",
+       "allarticles": "samian lembar",
+       "allpagessubmit": "lanturang",
+       "categories": "Golongan",
+       "linksearch-line": "$1 masambung saking $2",
+       "listgrouprights-members": "kepahan krama",
+       "emailuser": "email sane nganggo niki",
+       "watchlist": "kepahan peninjoan",
+       "mywatchlist": "kepahan peninjoan",
+       "watchlistfor2": "anggen $1 $2",
+       "watch": "cingak",
+       "unwatch": "tan sida maninjo",
+       "watchlist-details": "{{PLURAL:$1|$1 lembar}} ring paninjoan ida dane, nenten sareng lembar wacana.",
+       "wlshowlast": "edengang $1 jam $2 dina kaping untat",
+       "watchlist-options": "milih kepahan peninjo",
+       "actioncomplete": "pelaksanan sampun wusan",
+       "actionfailed": "pelaksana luput",
+       "dellogpage": "log pangapus",
+       "rollbacklink": "mabalik",
+       "protectlogpage": "log penyaga",
+       "protectedarticle": "nyaga \"[[$1]]\"",
+       "undeletelink": "cingak/uliang",
+       "undeleteviewlink": "cingak",
+       "namespace": "Genah pesengan",
+       "invert": "uliang pilihan",
+       "blanknamespace": "utama",
+       "contributions": "kawigunan {{GENDER:$1|penganggo}}",
+       "contributions-title": "Kontribusi pangangge anggen $1",
+       "mycontris": "kawigunan",
+       "contribsub2": "antuk {{GENDER:$3|$1}} ($2)",
+       "uctop": "sane mangkin",
+       "month": "mawit saking sasih (lan sadurungnyane)",
+       "year": "mawit saking warsa (lan sadurungnyane)",
+       "sp-contributions-newbies": "wantah saking penganggo anyar",
+       "sp-contributions-blocklog": "log pemblokiran",
+       "sp-contributions-uploads": "unggahang",
+       "sp-contributions-logs": "log",
+       "sp-contributions-talk": "Wicara",
+       "sp-contributions-search": "rereh anggen kawigunanne",
+       "sp-contributions-username": "Alamat IP utawi pesengan panganggo:",
+       "sp-contributions-toponly": "tampilang wantah panguwahan sane anyar",
+       "sp-contributions-submit": "rereh",
+       "whatlinkshere": "Pranala balik",
+       "whatlinkshere-title": "lembar-lembar sane maduwe pranala kaping \"$1\"",
+       "whatlinkshere-page": "lembar",
+       "linkshere": "lembar puniki maduwe pranala ke '''[[:$1]]'''",
+       "nolinkshere": "lembar puniki maduwe pranala ke '''[[:$1]]'''",
+       "isredirect": "lembar pangalihan",
+       "istemplate": "sareng kasurat",
+       "isimage": "pranala pupulan-pupulan",
+       "whatlinkshere-prev": "{{PLURAL:$1|sadurungnyane|$1 sadurungnyane}}",
+       "whatlinkshere-next": "{{PLURAL:$1|selanturnyane}}",
+       "whatlinkshere-links": "← pranala",
+       "whatlinkshere-hideredirs": "$1 pangalihan",
+       "whatlinkshere-hidetrans": "$1 transklusi",
+       "whatlinkshere-hidelinks": "$1 Pranala",
+       "whatlinkshere-hideimages": "$1 pranala pupulan",
+       "whatlinkshere-filters": "Panyaring",
+       "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",
+       "ipblocklist": "ngempetin sane nganggo",
+       "blocklink": "ngempetin",
+       "unblocklink": "ngicalang kaempetan",
+       "change-blocklink": "gentosin empetin",
+       "contribslink": "haturan",
+       "blocklogpage": "log pemblokiran",
+       "blocklogentry": "mlokir [[$1]] anggen pangwates galah $2$3",
+       "block-log-flags-nocreate": "ngawe akun kaicalang",
+       "movelogpage": "log pangisidang",
+       "revertmove": "buwungang",
+       "export": "ekspor lembar",
+       "allmessagesname": "pesengan",
+       "allmessagesdefault": "teks lingga",
+       "thumbnail-more": "ngedenang",
+       "thumbnail_error": "luput ngaryanin bentuk cenik $1",
+       "tooltip-pt-userpage": "lembar sane kaanggen ida dane",
+       "tooltip-pt-mytalk": "lembar wicara ida dane",
+       "tooltip-pt-preferences": "Preferensi titiang",
+       "tooltip-pt-watchlist": "kepahan-kepahan lembar sane katinjo titiang",
+       "tooltip-pt-mycontris": "kepahan-kepahan kawigunan ida dane",
+       "tooltip-pt-login": "ida dane kaaturang malebu log, nanging nenten kaswadarmayang",
+       "tooltip-pt-logout": "medal saking Log",
+       "tooltip-ca-talk": "pabligbagan indik dagingnyane",
+       "tooltip-ca-edit": "Sunting kaca iki. Nganggen tombol pratayang sadurunge nyimpen.",
+       "tooltip-ca-addsection": "nyumunin kepahan anyar",
+       "tooltip-ca-viewsource": "lembar puniki kasayubang. ida dane wantah prasida nyingakin witnyane",
+       "tooltip-ca-history": "pabenahang sadurungnyane saking lembar puniki",
+       "tooltip-ca-protect": "jaga lembar puniki",
+       "tooltip-ca-delete": "benahang lembar puniki",
+       "tooltip-ca-move": "magingsir saking lembar niki",
+       "tooltip-ca-watch": "imbuhin lembar niki ring daftar paninjoan ida dane",
+       "tooltip-ca-unwatch": "apus lembar niki ring daftar paninjoan ida dane",
+       "tooltip-search": "rereh ring {{SITENAME}} puniki",
+       "tooltip-search-go": "rereh lembar anggen adan sane pateh sekadi puniki yening wenten",
+       "tooltip-search-fulltext": "rereh lembar sane maduwe wacana sekadi puniki",
+       "tooltip-p-logo": "cingakin lembar utama",
+       "tooltip-n-mainpage": "nuju lembar sane utama",
+       "tooltip-n-mainpage-description": "nuju lembar sane utama",
+       "tooltip-n-portal": "indik proyek, napi sane prasida kalaksanayang, ring dija antuk ngarereh indik-indik",
+       "tooltip-n-currentevents": "molihang warta indik kawentenan kawentenan sane pinih anyar",
+       "tooltip-n-recentchanges": "(.....) gentosan anyar ring wiki",
+       "tooltip-n-randompage": "edengang polah-palih lembar",
+       "tooltip-n-help": "genah anggen ngarereh",
+       "tooltip-t-whatlinkshere": "kepahan sami lembar wiki sane maduwe pranala nuju lembar puniki",
+       "tooltip-t-recentchangeslinked": "pagentosan sane anyar lembar-lembar sane maduwe pranala nuju lembar puniki",
+       "tooltip-feed-atom": "\"atom feed\" anggen lembar puniki",
+       "tooltip-t-contributions": "cingak kepahan kawigunan penganggo niki",
+       "tooltip-t-emailuser": "kirim email majeng ring penganggo puniki",
+       "tooltip-t-upload": "ngunggahang file",
+       "tooltip-t-specialpages": "kepahan sami lembar istimewa",
+       "tooltip-t-print": "kawentenan lian sane macetak ring lembar puniki",
+       "tooltip-t-permalink": "Pranala ajeg kaanggen ngubah lembar puniki",
+       "tooltip-ca-nstab-main": "cingak dagingnyane lembar puniki",
+       "tooltip-ca-nstab-user": "cingak lembar penganggo",
+       "tooltip-ca-nstab-special": "puniki lembar sane pinih utama sane nenten prasida kauwah",
+       "tooltip-ca-nstab-project": "cingak dagingnyane lembar puniki",
+       "tooltip-ca-nstab-image": "cingak lembar berkas",
+       "tooltip-ca-nstab-template": "cingak templat",
+       "tooltip-ca-nstab-help": "cingak lembar pamitutlung",
+       "tooltip-ca-nstab-category": "cingak lembar kategori",
+       "tooltip-minoredit": "pingetin puniki dados panguwahan kidik",
+       "tooltip-save": "simpen pagentosan ida dane",
+       "tooltip-preview": "pagentosan sane dumun duwen ida dane, mangda anggen niki sadurung jagi nyimpen!",
+       "tooltip-diff": "cingak pagentosan sane sampun ida dane laksanayang",
+       "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-summary": "ngalebuang silih sinunggil ringkesan",
+       "previousdiff": "← Benahin sadurungnyane",
+       "nextdiff": "panguwahan sane pinih anyar →",
+       "file-info-size": "$1x$2 piksel, ukuran pupulan: $3, tipe MIME:$4",
+       "file-nohires": "tan kasayagaang ukuran sane lewih ageng",
+       "svg-long-desc": "pupulan SVG, nominal $1 × $2 piksel, geden pupulan: $3",
+       "show-big-image": "pupulan sujati",
+       "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": "metadata",
+       "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": "bidang metadata gambar sane kacantumang ring pesen puniki jagi kalebuang ring tampilan lembar gambar rikala tabel metadata kacenikang.\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",
+       "watchlisttools-view": "edengang panguwahan sane mapaiket",
+       "watchlisttools-edit": "edengang lan uwahin kepangan paninjo",
+       "watchlisttools-raw": "uwah kepahan paninjo mentah",
+       "duplicate-defaultsort": "pingetan: sereg pangurutan lingga \"$2\" nyampahang sereg pangurutan lingga sadurunge \"$1\"",
+       "specialpages": "lembar melulu",
+       "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]]:"
+}
index a0c09a2..bca0616 100644 (file)
        "pt-login-continue-button": "Працягваць уваход",
        "pt-createaccount": "Стварыць рахунак",
        "pt-userlogout": "Выйсьці",
-       "php-mail-error-unknown": "УзÑ\8cнÑ\96кла Ð½ÐµÐ²Ñ\8fдомаÑ\8f Ð¿Ð°Ð¼Ñ\8bлка Ñ\9e Ñ\84Ñ\83нкÑ\86Ñ\8bÑ\96 PHP mail()",
-       "user-mail-no-addy": "Спроба даслаць электронны ліст без адрасу дастаўкі",
+       "php-mail-error-unknown": "Ð\9dевÑ\8fдомаÑ\8f Ð¿Ð°Ð¼Ñ\8bлка Ñ\9e PHP-Ñ\84Ñ\83нкÑ\86Ñ\8bÑ\96 mail().",
+       "user-mail-no-addy": "Спроба даслаць электронны ліст бяз адрасу дастаўкі.",
        "user-mail-no-body": "Спроба даслаць ліст з пустым або надзвычай кароткім зьместам.",
        "changepassword": "Зьмяніць пароль",
        "resetpass_announce": "Для завяршэньня ўваходу ў сыстэму Вы мусіце ўвесьці новы пароль.",
        "botpasswords-label-update": "Абнавіць",
        "botpasswords-label-cancel": "Скасаваць",
        "botpasswords-label-delete": "Выдаліць",
-       "botpasswords-label-resetpassword": "Ð\90Ñ\87Ñ\8bÑ\81Ñ\8cÑ\86Ñ\96ць пароль",
+       "botpasswords-label-resetpassword": "СкÑ\96нÑ\83ць пароль",
        "botpasswords-label-grants": "Прыдатныя дазволы:",
        "botpasswords-help-grants": "Кожны дазвол дае доступ да правоў удзельніка, якія ўжо мае рахунак удзельніка. Глядзіце [[Special:ListGrants|табліцу дазволаў]] дзеля дадатковых зьвестак.",
        "botpasswords-label-restrictions": "Абмежаваньні на выкарыстаньне:",
        "passwordreset-emailsent-capture": "Ліст пра скіданьне паролю быў дасланы, што паказана ніжэй.",
        "passwordreset-emailerror-capture": "Ліст пра скіданьне паролю быў створаны і паказаны ніжэй, але не ўдалося адправіць яго {{GENDER:$2|ўдзельніку|ўдзельніцы}}: $1",
        "passwordreset-emailsent-capture2": "{{PLURAL:$1|Электронны ліст|Электронныя лісты}} скіданьня паролю {{PLURAL:$1|быў дасланы|былі дасланыя}}. {{PLURAL:$1|Імя ўдзельніка і пароль|Сьпіс імёнаў удзельнікаў і паролі}} паказаныя ніжэй.",
+       "passwordreset-emailerror-capture2": "Не атрымалася даслаць {{GENDER:$2|удзельніку|удзельніцы}} ліст электроннай поштай: $1 {{PLURAL:$3|Імя ўдзельніка і пароль|Сьпіс імёнаў удзельнікаў і паролі}} паказаныя ніжэй.",
+       "passwordreset-nocaller": "Мусіць быць пададзены той, хто робіць выклік",
+       "passwordreset-nosuchcaller": "Аўтар выкліку не існуе: $1",
+       "passwordreset-ignored": "Скіданьне паролю не адбылося. Магчыма, ня быў наладжаны пастаўшчык?",
+       "passwordreset-invalideamil": "Няслушны адрас электроннай пошты",
+       "passwordreset-nodata": "Не былі пададзеныя ні імя ўдзельніка, ні адрас электроннай пошты",
        "changeemail": "Зьмяніць або выдаліць адрас электроннай пошты",
        "changeemail-header": "Запоўніце гэтую форму, каб зьмяніць ваш адрас электроннай пошты. Калі вы жадаеце выдаліць адрас электроннай пошты, далучаны да вашага рахунку, пакіньце поле новага адрасу электроннай пошты пустым пры запаўненьні формы.",
        "changeemail-passwordrequired": "Вам трэба будзе ўвесьці ваш пароль, каб пацьвердзіць гэтую зьмену.",
        "minoredit": "Гэта дробная праўка",
        "watchthis": "Назіраць за гэтай старонкай",
        "savearticle": "Захаваць старонку",
+       "savechanges": "Захаваць зьмены",
        "publishpage": "Апублікаваць старонку",
+       "publishchanges": "Апублікаваць зьмены",
        "preview": "Папярэдні прагляд",
        "showpreview": "Праглядзець",
        "showdiff": "Паказаць зьмены",
        "content-model-css": "CSS",
        "content-json-empty-object": "Пусты аб’ект",
        "content-json-empty-array": "Пусты масіў",
+       "deprecated-self-close-category": "Старонкі зь няслушнымі самазакрытымі HTML-тэгамі",
+       "deprecated-self-close-category-desc": "Старонка ўтрымлівае няслушныя самазакрытыя HTML-тэгі, такія як <code>&lt;b/></code> ці <code>&lt;span/></code>. Іх паводзіны ў хуткім часе будуць зьмененыя ў адпаведнасьці з спэцыфікацыяй HTML5, таму іх ўжываньне ў вікітэксьце лічыцца састарэлым.",
        "duplicate-args-warning": "<strong>Папярэджаньне:</strong> [[:$1]] выклікае [[:$2]] з больш чым адным значэньнем парамэтру «$3». Толькі апошняе з пададзеных значэньняў будзе ўжытае.",
        "duplicate-args-category": "Старонкі, на якіх у шаблёнах выкарыстоўваюцца парамэтры-дублікаты",
        "duplicate-args-category-desc": "Старонкі, якія ўтрымліваюць шаблёны з парамэтрамі-дублікатамі, напрыклад, <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> або <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "rightslogtext": "Гэта журнал зьменаў правоў удзельнікаў.",
        "action-read": "чытаньне гэтай старонкі",
        "action-edit": "рэдагаваньне гэтай старонкі",
-       "action-createpage": "стварэньне старонак",
-       "action-createtalk": "стварэньне старонак абмеркаваньняў",
+       "action-createpage": "стварэньне гэтай старонкі",
+       "action-createtalk": "стварэньне гэтай старонкі абмеркаваньня",
        "action-createaccount": "стварэньне гэтага рахунку ўдзельніка",
        "action-autocreateaccount": "аўтаматычнае стварэньне гэтага рахунку вонкавага ўдзельніка",
        "action-history": "прагляд гісторыі гэтай старонкі",
        "action-managechangetags": "стварэньне і (дэ)актывацыю метак",
        "action-applychangetags": "дадаваньне метак пры рэдагаваньні",
        "action-changetags": "дадаваньне і выдаленьне адвольных метак да асобных вэрсіяў і запісаў у журнале падзеяў",
+       "action-deletechangetags": "выдаленьне метак з базы зьвестак",
        "nchanges": "$1 {{PLURAL:$1|зьмена|зьмены|зьменаў}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|з апошняга візыту}}",
        "enhancedrc-history": "гісторыя",
        "upload-http-error": "Узьнікла памылка HTTP: $1",
        "upload-copy-upload-invalid-domain": "Капіяваньне загрузак не дазволенае ў гэтым дамэне.",
        "upload-foreign-cant-upload": "Гэтая вікі не наладжаная для загрузкі файлаў у запытанае вонкавае сховішча файлаў.",
+       "upload-foreign-cant-load-config": "Не атрымалася загрузіць канфігурацыю для загрузкі файлаў у вонкавае сховішча.",
+       "upload-dialog-disabled": "Загрузка файлаў з дапамогай гэтага дыялёгу адключаная ў гэтай вікі.",
        "upload-dialog-title": "Загрузка файла",
        "upload-dialog-button-cancel": "Адмяніць",
        "upload-dialog-button-done": "Зроблена",
        "listgrouprights-namespaceprotection-namespace": "Прастора назваў",
        "listgrouprights-namespaceprotection-restrictedto": "Правы, якія дазваляюць удзельніку рэдагаваць",
        "listgrants": "Дазволы",
+       "listgrants-summary": "Ніжэй прыведзены сьпіс дазволаў і адпаведных правоў карыстальнікаў, да якіх яны даюць доступ. Удзельнікі могуць дазваляць праграмам ужываць іх рахунак, але з абмежаванымі правамі, якія грунтуюцца на дазволах, дадзеных удзельнікам. Праграмы, якія дзейнічаюць ад імя ўдзельніка, ня могуць карыстацца правамі, якіх ня мае ўдзельнік. Пра асобныя правы можна атрымаць [[{{MediaWiki:Listgrouprights-helppage}}|дадатковую інфармацыю]].",
        "listgrants-grant": "Дазвол",
        "listgrants-rights": "Правы",
        "trackingcategories": "Катэгорыі, якія патрабуюць увагі",
        "trackingcategories-msg": "Катэгорыя, якая патрабуе ўвагі",
        "trackingcategories-name": "Назва паведамленьня",
        "trackingcategories-desc": "Крытэр уключэньня ў катэгорыю",
+       "restricted-displaytitle-ignored": "Старонкі, дзе ігнаруюцца назвы для адлюстраваньня",
+       "restricted-displaytitle-ignored-desc": "Старонка ігнаруе <code><nowiki>{{DISPLAYTITLE}}</nowiki></code>, бо ён не супадае зь цяперашняй назвай старонкі.",
        "noindex-category-desc": "Гэтая старонка не індэксуецца пошукавымі робатамі, таму што на ёй маецца магічнае слова <code><nowiki>__NOINDEX__</nowiki></code>, а старонка знаходзіцца ў прасторы назваў, дзе дазволны гэты сьцяг.",
        "index-category-desc": "На старонцы знаходзіцца магічнае слова <code><nowiki>__INDEX__</nowiki></code> (пры гэтым старонка знаходзіцца ў прасторы назваў, дзе дазволены гэты сьцяг), таму яна індэксуецца пошукавымі робатамі ў тых выпадках, калі звычайна гэтага не адбываецца.",
        "post-expand-template-inclusion-category-desc": "Памер старонкі перавысіў <code>$wgMaxArticleSize</code> пасьля разгортваньня ўсіх шаблёнаў, таму некаторыя шаблёны не былі паказаныя цалкам.",
        "rollbacklinkcount": "адкаціць $1 {{PLURAL:$1|рэдагаваньне|рэдагаваньні|рэдагаваньняў}}",
        "rollbacklinkcount-morethan": "адкаціць больш за $1 {{PLURAL:$1|рэдагаваньне|рэдагаваньні|рэдагаваньняў}}",
        "rollbackfailed": "Памылка адкату",
+       "rollback-missingparam": "У запыце адсутнічаюць абавязковыя парамэтры.",
        "cantrollback": "Немагчыма адкаціць зьмену; апошні рэдактар — адзіны аўтар гэтай старонкі.",
        "alreadyrolled": "Немагчыма адкаціць апошнюю зьмену [[:$1]], якую {{GENDER:$2|зрабіў|зрабіла}} [[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-nouser": "Рэдагаваньні схаванага ўдзельніка скасаваныя да папярэдняй вэрсіі {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Адмененыя рэдагаваньні $1;\nвернутая папярэдняя вэрсія $2.",
+       "rollback-success-notify": "Адмененыя праўкі $1;\nвернутая папярэдняя вэрсія $2. [$3 Паказаць зьмены]",
        "sessionfailure-title": "Памылка сэсіі",
        "sessionfailure": "Магчыма ўзьніклі праблемы ў Вашым цяперашнім сэансе працы;\nгэта дзеяньне было скасавана для прадухіленьня перахопу сэансу.\nКалі ласка, націсьніце «назад» і перазагрузіце старонку, зь якой Вы прыйшлі, і паспрабуйце ізноў.",
        "changecontentmodel": "Зьмена мадэлі зьместу старонкі",
        "changecontentmodel-success-text": "Тып зьместу [[:$1]] быў зьменены.",
        "changecontentmodel-cannot-convert": "Зьмест [[:$1]] ня можа быць ператвораны ў тып $2.",
        "changecontentmodel-nodirectediting": "Мадэль зьместу $1 не падтрымлівае наўпроставае рэдагаваньне",
+       "changecontentmodel-emptymodels-title": "Няма даступных мадэляў зьместу",
+       "changecontentmodel-emptymodels-text": "Зьмест на [[:$1]] ня можа быць ператвораны ні ў які тып.",
        "log-name-contentmodel": "Журнал зьменаў мадэляў зьместу",
        "log-description-contentmodel": "Падзеі, зьвязаныя з мадэлямі зьместу старонак",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|стварыў|стварыла}} старонку $3 з дапамогай нестандартнай мадэлі зьместу «$5»",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} мадэль зьместу старонкі $3 з «$4» на «$5»",
        "logentry-contentmodel-change-revertlink": "адкаціць",
        "logentry-contentmodel-change-revert": "адкат",
        "sp-contributions-username": "IP-адрас альбо імя ўдзельніка/ўдзельніцы:",
        "sp-contributions-toponly": "Паказваць толькі зьмены, якія зьяўляюцца апошнімі вэрсіямі",
        "sp-contributions-newonly": "Паказваць толькі праўкі, якімі былі створаныя старонкі",
+       "sp-contributions-hideminor": "Схаваць дробныя праўкі",
        "sp-contributions-submit": "Шукаць",
        "whatlinkshere": "Спасылкі на старонку",
        "whatlinkshere-title": "Старонкі, якія спасылаюцца на $1",
        "ipb-unblock": "Разблякаваць рахунак ўдзельніка ці IP-адрас",
        "ipb-blocklist": "Паказаць існуючыя блякаваньні",
        "ipb-blocklist-contribs": "Унёсак $1",
+       "ipb-blocklist-duration-left": "засталося $1",
        "unblockip": "Разблякаваць удзельніка",
        "unblockiptext": "Карыстайцеся пададзенай ніжэй формай для аднаўленьня магчымасьці рэдагаваньня для раней заблякаванага IP-адрасу альбо рахунку ўдзельніка.",
        "ipusubmit": "Зьняць гэта блякаваньне",
        "block-log-flags-hiddenname": "імя ўдзельніка схаванае",
        "range_block_disabled": "Адміністратарам забаронена блякаваць дыяпазоны.",
        "ipb_expiry_invalid": "Няслушны тэрмін блякаваньня.",
+       "ipb_expiry_old": "Час сканчэньня ўжо мінуў.",
        "ipb_expiry_temp": "Блякаваньні са схаваньнем імя ўдзельніка павінны быць бестэрміновымі.",
        "ipb_hide_invalid": "Немагчыма схаваць гэты рахунак; зь яго зроблена больш чым {{PLURAL:$1|$1 рэдагаваньне|$1 рэдагаваньні|$1 рэдагаваньняў}}.",
        "ipb_already_blocked": "«$1» ужо заблякаваны",
        "lockdbsuccesstext": "База зьвестак была заблякаваная.<br />\nНе забудзьцеся [[Special:UnlockDB|зьняць блякаваньне]] пасьля сканчэньня абслугоўваньня.",
        "unlockdbsuccesstext": "База зьвестак была разблякаваная.",
        "lockfilenotwritable": "Немагчыма запісаць у файл блякаваньняў базы зьвестак.\nБлякаваньне ці разблякаваньне базы зьвестак патрабуе, каб вэб-сэрвэр меў дазвол на запіс у гэты файл.",
+       "databaselocked": "База зьвестак ужо заблякаваная.",
        "databasenotlocked": "База зьвестак не заблякаваная.",
        "lockedbyandtime": "($1 $2 у $3)",
        "move-page": "Перанесьці $1",
        "tooltip-ca-nstab-category": "Паказаць старонку катэгорыі",
        "tooltip-minoredit": "Пазначыць гэтую зьмену як дробную",
        "tooltip-save": "Захаваць Вашы зьмены",
+       "tooltip-publish": "Апублікаваць вашыя зьмены",
        "tooltip-preview": "Праглядзець Вашы зьмены. Калі ласка, выкарыстоўвайце гэтую магчымасьць перад тым, як захаваць старонку!",
        "tooltip-diff": "Паказаць зробленыя Вамі зьмены ў тэксьце",
        "tooltip-compareselectedversions": "Пабачыць розьніцу паміж дзьвюма абранымі вэрсіямі гэтай старонкі.",
        "confirmemail_body_set": "Нехта, магчыма Вы, з IP-адраса $1,\nустанавіў адрас электроннай пошты для рахунку «$2» у {{GRAMMAR:месны|{{SITENAME}}}}.\n\nКаб пацьвердзіць, што гэты рахунак сапраўды належыць Вам, і каб актывізаваць падтрымку электроннай пошты ў {{GRAMMAR:месны|{{SITENAME}}}}, адкрыйце гэтую спасылку у Вашым браўзэры:\n\n$3\n\nКалі рахунак Вам *не* належыць, перайдзіце па гэтай спасылцы\nкаб скасаваць пацьверджаньне па электроннай пошце:\n\n$5\n\nГэты код пацьверджаньня дзейнічае да $4.",
        "confirmemail_invalidated": "Пацьверджаньне адрасу электроннай пошты адмененае",
        "invalidateemail": "Скасаваць пацьверджаньне адрасу электроннай пошты",
+       "notificationemail_subject_changed": "Адрас электроннай пошты на сайце {{SITENAME}} быў зьменены",
+       "notificationemail_subject_removed": "Адрас электроннай пошты на сайце {{SITENAME}} быў выдалены",
+       "notificationemail_body_changed": "Некім, магчыма вамі, з IP-адрасу $1,\nбыў зьменены адрас электроннай пошты «$2» на «$3» на сайце {{SITENAME}}.\n\nКалі гэта былі ня вы, неадкладна зьвяжыцеся з адміністратарам.",
        "scarytranscludedisabled": "[Улучэньне інтэрвікі было адключанае]",
        "scarytranscludefailed": "[Памылка атрыманьня шаблёну $1]",
        "scarytranscludefailed-httpstatus": "[Памылка атрыманьня шаблёну $1: HTTP $2]",
        "confirm-watch-top": "Дадаць гэтую старонку ў Ваш сьпіс назіраньня?",
        "confirm-unwatch-button": "Добра",
        "confirm-unwatch-top": "Выдаліць гэтую старонку з Вашага сьпісу назіраньня?",
+       "confirm-rollback-button": "Так",
+       "confirm-rollback-top": "Адкаціць праўкі на гэтай старонцы?",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "← папярэдняя старонка",
        "imgmultipagenext": "наступная старонка →",
        "redirect-page": "Ідэнтыфікатар старонкі",
        "redirect-revision": "Вэрсіі старонкі",
        "redirect-file": "Імя файла",
+       "redirect-logid": "ID журнала",
        "redirect-not-exists": "Значэньне ня знойдзена",
        "fileduplicatesearch": "Пошук дублікатаў файлаў",
        "fileduplicatesearch-summary": "Пошук аднолькавых файлаў на падставе іх хэшаў.",
        "tags-delete-not-found": "Метка «$1» не існуе.",
        "tags-delete-too-many-uses": "Метка «$1» выкарыстаная ў больш чым $2 {{PLURAL:$2|вэрсіі|вэрсіях}}, адпаведна, яна ня можа быць выдаленая.",
        "tags-delete-warnings-after-delete": "Метка «$1» была выдаленая, але {{PLURAL:$2|1=атрыманае наступнае папярэджаньне|атрыманыя наступныя папярэджаньні}}:",
+       "tags-delete-no-permission": "У вас няма дазволу на выдаленьне метак зьменаў.",
        "tags-activate-title": "Актываваць метку",
        "tags-activate-question": "Вы зьбіраецеся актываваць метку «$1».",
        "tags-activate-reason": "Прычына:",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
        "mw-widgets-titleinput-description-new-page": "старонка яшчэ не існуе",
        "mw-widgets-titleinput-description-redirect": "перанакіраваньне на $1",
-       "api-error-blacklisted": "Калі ласка, выбярыце іншую, апісальную назву.",
-       "randomrootpage": "Выпадковая карэнная старонка"
+       "randomrootpage": "Выпадковая карэнная старонка",
+       "changecredentials": "Зьмена ўліковых зьвестак",
+       "removecredentials": "Выдаленьне ўліковых зьвестак",
+       "removecredentials-submit": "Выдаліць уліковыя зьвесткі",
+       "credentialsform-provider": "Тып уліковых зьвестак:",
+       "credentialsform-account": "Назва рахунку:"
 }
index 96f712b..91b2939 100644 (file)
        "password-change-forbidden": "Вы не можаце змяняць паролі на гэтай Вікі.",
        "externaldberror": "Або памылка вонкавай аўтэнтыкацыі ў базе дадзеных, або вам не дазволена абнаўляць свой вонкавы рахунак.",
        "login": "Увайсці ў сістэму",
+       "login-security": "Праверыць вашу асобу",
        "nav-login-createaccount": "Увайсці ў сістэму / стварыць рахунак",
        "userlogin": "Увайсці ў сістэму / стварыць рахунак",
        "userloginnocreate": "Увайсці",
        "userlogin-resetpassword-link": "Забылі пароль?",
        "userlogin-helplink2": "Даведка па прадстаўленні сістэме",
        "userlogin-loggedin": "Вы ўжо ўвайшлі ў сістэму як {{GENDER:$1|$1}}.\nСкарыстайцеся формай ніжэй, каб прадставіцца сістэме як іншы ўдзельнік.",
+       "userlogin-reauth": "Вы павінны ўвайсці ў сістэму зноў, каб пераканацца, што Вы {{GENDER:$1|$1}}",
        "userlogin-createanother": "Стварыць яшчэ адзін уліковы запіс",
        "createacct-emailrequired": "Адрас электроннай пошты",
        "createacct-emailoptional": "Адрас электроннай пошты (неабавязкова)",
        "createacct-email-ph": "Увядзіце ваш адрас электроннай пошты",
        "createacct-another-email-ph": "Увядзіце адрас электроннай пошты",
        "createaccountmail": "Ужыць часовы выпадковы пароль і даслаць яго праз эл.пошту",
+       "createaccountmail-help": "Можа быць выкарыстаны для стварэння ўліковага запісу для іншага чалавека без пазнання пароля.",
        "createacct-realname": "Сапраўднае імя (неабавязкова)",
        "createaccountreason": "Прычына:",
        "createacct-reason": "Прычына",
        "createacct-reason-ph": "Чаму вы ствараеце іншы ўліковы запіс",
+       "createacct-reason-help": "Паведамленне паказана ў логу стварэння ўліковага запісу",
        "createacct-submit": "Стварыць уліковы запіс",
        "createacct-another-submit": "Стварыць уліковы запіс",
        "createacct-continue-submit": "Працягнуць стварэнне ўліковага запісу",
+       "createacct-another-continue-submit": "Працягнуць стварэнне ўліковага запісу",
        "createacct-benefit-heading": "{{SITENAME}} зроблены такімі ж людзьмі, як вы.",
        "createacct-benefit-body1": "{{PLURAL:$1|праўка|праўкі|правак}}",
        "createacct-benefit-body2": "{{PLURAL:$1|старонка|старонкі|старонак}}",
        "nocookiesnew": "Рахунак быў створаны, але ў сістэму вы не ўвайшлі. {{SITENAME}} карыстаецца квіткамі (кукі), каб апрацоўваць уваходы ўдзельнікаў, а гэтая функцыянальнасць адключана ў вашым браўзеры. Уключыце квіткі ў браўзеры, тады ўваходзьце са сваімі новымі імем удзельніка і паролем.",
        "nocookieslogin": "{{SITENAME}} карыстаецца квіткамі (кукі), каб пазнаваць удзельнікаў. У вашым браўзеры квіткі не дазволены. Дазвольце іх працу і паспрабуйце ізноў.",
        "nocookiesfornew": "Уліковы запіс карыстальніка не быў створаны, бо мы не змаглі пацвердзіць яго крыніцы. \nУпэўніцеся, што кукі ўключаныя, абнавіце старонку і паспрабуйце яшчэ раз.",
+       "createacct-loginerror": "Уліковы запіс быў паспяхова створаны, але Вы не змаглі аўтарызавацц аўтаматычна. Калі ласка, перайдзіце да старонкі [[Адмысловае:Імя_ўдзельніка|ручной аўтарызацыі]].",
        "noname": "Вы не вызначылі правільнага імя ўдзельніка.",
        "loginsuccesstitle": "Паспяховы ўваход у сістэму",
        "loginsuccess": "<strong>Цяпер Вы ўвайшлі на {{SITENAME}} як \"$1\".</strong>",
        "minoredit": "Дробная праўка",
        "watchthis": "Назіраць за гэтай старонкай",
        "savearticle": "Запісаць",
+       "savechanges": "Запісаць змены",
        "publishpage": "Апублікаваць старонку",
+       "publishchanges": "Апублікаваць змены",
        "preview": "Перадпаказ",
        "showpreview": "Як будзе",
        "showdiff": "Розніца",
        "right-override-export-depth": "Экспартаваць старонкі, у тым ліку звязаныя, да глыбіні спасылак 5.",
        "right-sendemail": "Адпраўляць электронныя лісты іншым удзельнікам",
        "right-passwordreset": "Бачыць электронныя лісты аб змяненні пароля",
-       "right-managechangetags": "Ствараць і выдаляць [[Special:Tags|біркі]] з базы даных",
+       "right-managechangetags": "Ствараць і (дэ)актываваць [[Special:Tags|біркі]]",
        "right-applychangetags": "Прымяняць [[Special:Tags|біркі]] са сваімі праўкамі",
        "right-changetags": "Дадаваць і выдаляць адвольныя [[Special:Tags|біркі]] да асобных версій і запісаў у журнале падзей",
        "right-deletechangetags": "Выдаляць [[Special:Tags|біркі]] з базы даных",
        "rollback-success": "Адкочаны праўкі $1; вернута апошняя версія $2.",
        "sessionfailure-title": "Памылка сеансу",
        "sessionfailure": "Магчыма, ёсць праблемы з вашым сеансам працы ў сістэме. Таму вам было адмоўлена ў выкананні дзеяння, каб засцерагчыся ад захопу сеанса.\n\nВярніцеся на папярэднюю старонку, перазагрузіце яе і тады паспрабуйце зноў.",
+       "changecontentmodel-legend": "Змяніць мадэль змесціва",
        "changecontentmodel-title-label": "Назва старонкі",
        "changecontentmodel-model-label": "Новая мадэль змесціва",
        "changecontentmodel-reason-label": "Прычына:",
        "whatlinkshere-prev": "{{PLURAL:$1|папярэдняя|папярэднія $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|наступная|наступныя $1}}",
        "whatlinkshere-links": "← спасылкі",
-       "whatlinkshere-hideredirs": "$1 перанакіраваньні",
-       "whatlinkshere-hidetrans": "$1 уключэньні",
+       "whatlinkshere-hideredirs": "$1 перасылкі",
+       "whatlinkshere-hidetrans": "$1 уключэнні",
        "whatlinkshere-hidelinks": "$1 спасылкі",
        "whatlinkshere-hideimages": "$1 спасылкі на выявы",
        "whatlinkshere-filters": "Фільтры",
        "special-characters-group-khmer": "Кхмерскія",
        "special-characters-title-endash": "кароткі працяжнік",
        "special-characters-title-emdash": "доўгі працяжнік",
-       "special-characters-title-minus": "мінус"
+       "special-characters-title-minus": "мінус",
+       "log-action-filter-all": "Усе",
+       "log-action-filter-block-block": "заблакаваць",
+       "log-action-filter-block-reblock": "Змена блакіроўкі",
+       "log-action-filter-block-unblock": "Разблакаваць",
+       "log-action-filter-contentmodel-change": "Змяненне Contentmodel",
+       "log-action-filter-contentmodel-new": "Стварэнне старонкі з нестандартным Contentmodel",
+       "log-action-filter-delete-delete": "Выдаленне старонкі",
+       "log-action-filter-delete-restore": "Узнаўленне старонкі",
+       "log-action-filter-delete-event": "Выдаленне лога",
+       "log-action-filter-delete-revision": "Выдаленне перагляду",
+       "log-action-filter-import-interwiki": "Імпарт Transwiki",
+       "log-action-filter-import-upload": "Імпарт выгрузкай XML",
+       "log-action-filter-managetags-create": "Стварэнне тэгаў",
+       "log-action-filter-managetags-delete": "Выдаленне тэгаў",
+       "log-action-filter-managetags-activate": "Актывацыя тэга",
+       "log-action-filter-managetags-deactivate": "Адключэнне тэга",
+       "log-action-filter-move-move": "Перайсці без перазапісу рэдырэктаў",
+       "log-action-filter-move-move_redir": "Перамясціць з заменай рэдырэктаў",
+       "log-action-filter-newusers-create": "Стварэнне ананімным удзельнікам",
+       "log-action-filter-newusers-create2": "Стварэнне зарэгістраваным удзельнікам",
+       "log-action-filter-newusers-autocreate": "Аўтаматычнае стварэнне",
+       "log-action-filter-newusers-byemail": "Стварэнне паролем, высланым па электроннай пошце",
+       "log-action-filter-patrol-patrol": "Ручны догляд",
+       "log-action-filter-patrol-autopatrol": "Аўтаматычны догляд",
+       "log-action-filter-protect-protect": "Абарона",
+       "log-action-filter-protect-modify": "Мадыфікацыя абароны",
+       "log-action-filter-protect-unprotect": "Зняцце абароны",
+       "log-action-filter-protect-move_prot": "Ахова старонкі",
+       "log-action-filter-rights-rights": "Ручное змяненне",
+       "log-action-filter-rights-autopromote": "Аўтаматычнае змяненне",
+       "log-action-filter-upload-upload": "Новая перадача",
+       "log-action-filter-upload-overwrite": "Выкладванне",
+       "authmanager-authn-not-in-progress": "Праверка сапраўднасці не выконваецца або сесія перадачы дадзеных была страчана. Калі ласка, пачніце зноў з самага пачатку.",
+       "authmanager-authn-no-primary": "Прадастаўленыя ўліковыя дадзеныя не могуць быць завераны.",
+       "authmanager-authn-no-local-user": "Прадастаўленыя ўліковыя дадзеныя не звязаныя з нікодным удзельнікам на гэтай Вікі.",
+       "authmanager-authn-no-local-user-link": "Прадастаўленыя ўліковыя дадзеныя сапраўдныя, але не звязаныя з ніводным удзельнікам гэтай Вікі. Увайдзіце іншым спосабам або стварыце новы акаўнт і ў вас з'явіцца магчымасць звязаць свае папярэднія ўліковыя дадзеныя для гэтага ўліковага запісу.",
+       "authmanager-authn-autocreate-failed": "Аўтаматычнае стварэнне лакальнага ўліковага запісу не ўдалося: $1",
+       "authmanager-change-not-supported": "Прадастаўленыя ўліковыя дадзеныя не могуць быць зменены, як нішто не будзе іх выкарыстоўваць.",
+       "authmanager-create-disabled": "стварэнне рахунка не дазволена",
+       "authmanager-create-from-login": "Каб стварыць уліковы запіс, калі ласка, запоўніце палі ніжэй.",
+       "authmanager-create-not-in-progress": "Праверка сапраўднасці не выконваецца або сесія перадачы дадзеных была страчана. Калі ласка, пачніце зноў з самага пачатку.",
+       "authmanager-create-no-primary": "Прадастаўленыя ўліковыя дадзеныя не могуць быць выкарыстаны для стварэння ўліковага запісу.",
+       "authmanager-link-no-primary": "Прадастаўленыя ўліковыя дадзеныя не могуць быць выкарыстаны для прывязкі рахунку.",
+       "authmanager-link-not-in-progress": "Звязванне ўліковага запісу не выконваецца або сесія перадачы дадзеных была страчана. Калі ласка, пачніце зноў з самага пачатку.",
+       "authmanager-authplugin-setpass-failed-title": "Памылка змены пароля",
+       "authmanager-authplugin-setpass-failed-message": "Убудова аўтэнтыфікацыі адмоўлена па змене пароля.",
+       "authmanager-authplugin-create-fail": "Убудова аўтэнтыфікацыі адмоўлена ў рэгістрацыі.",
+       "authmanager-authplugin-setpass-denied": "Убудова праверкі сапраўднасці не дазваляе змяняць паролі.",
+       "authmanager-authplugin-setpass-bad-domain": "Недапушчальны дамен.",
+       "authmanager-autocreate-noperm": "Аўтаматычнае стварэнне уліковых запісаў не дапускаецца.",
+       "authmanager-autocreate-exception": "Аўтаматычнае стварэнне уліковых запісаў часова адключана з-за памылак папярэдніх.",
+       "authmanager-userdoesnotexist": "Уліковы запіс удзельніка \"$1\" не зарэгістраваны.",
+       "authmanager-username-help": "Імя карыстальніка для праверкі сапраўднасці.",
+       "authmanager-password-help": "Пароль для праверкі сапраўднасці.",
+       "authmanager-domain-help": "Дамен для знешняй праверкі сапраўднасці.",
+       "authmanager-retype-help": "Пароль яшчэ раз для пацверджання.",
+       "authmanager-email-label": "Эл.пошта",
+       "authmanager-email-help": "Адрас электроннай пошты:",
+       "authmanager-realname-label": "Сапраўднае імя:",
+       "authmanager-realname-help": "Рэальнае імя карыстальніка",
+       "authmanager-provider-password": "Праверка сапраўднасці на аснове пароляў",
+       "authmanager-provider-temporarypassword": "Тымчасовы пароль:",
+       "authprovider-confirmlink-message": "Грунтуючыся на апошніх спробах падлучэння, наступныя уліковыя запісы могуць быць звязаныя з Вашым ўліковым запісам Вікі. Калі ласка, выберыце, якія з іх павінны быць звязаныя паміж сабой.",
+       "authprovider-confirmlink-request-label": "Рахункі, якія павінны быць звязаныя",
+       "authprovider-confirmlink-success-line": "$1: звязаны паспяхова.",
+       "authprovider-confirmlink-failed": "Прывязка акаўнта не атрымалася ў поўнай меры: $1",
+       "authprovider-confirmlink-ok-help": "Працягнуць пасля вываду паведамленняў аб памылках прывязкі.",
+       "authprovider-resetpass-skip-label": "Прапусціць",
+       "authprovider-resetpass-skip-help": "Прапусціць скід пароля.",
+       "authform-nosession-login": "Праверка сапраўднасці прайшла паспяхова, але ваш браўзэр не можа \"запомніць\" уваход у сістэму.\n\n$1",
+       "authform-nosession-signup": "Уліковы запіс быў створаны, але ваш браўзэр не можа \"запомніць\" у сістэму.\n\n$1",
+       "authform-newtoken": "Адсутнічае маркер. \n\n$1",
+       "authform-notoken": "Адсутнічае маркер",
+       "authform-wrongtoken": "Няправільны маркер",
+       "specialpage-securitylevel-not-allowed-title": "Не дапускаецца",
+       "specialpage-securitylevel-not-allowed": "Прабачце, вам не дазволена выкарыстоўваць гэтую старонку, таму што ваша асоба не можа быць праверана.",
+       "authpage-cannot-login": "Не атрымалася запусціць лагін.",
+       "authpage-cannot-login-continue": "Можаце працягваць аўтарызацыю. Сеанс хутчэй за ўсе скончыўся.",
+       "authpage-cannot-create": "Немагчыма пачаць стварэнне рахунку.",
+       "authpage-cannot-create-continue": "Немагчыма працягнуць стварэнне акаўнта. Сеанс хутчэй за ўсе скончыўся.",
+       "authpage-cannot-link": "Не атрымалася запусціць прывязку акаўнта.",
+       "authpage-cannot-link-continue": "Немагчыма працягваць звязванне ўліковага запісу. Сеанс хутчэй за ўсе скончыўся.",
+       "cannotauth-not-allowed-title": "Доступ забаронены.",
+       "cannotauth-not-allowed": "Вам не дазволена выкарыстоўваць гэтую старонку",
+       "changecredentials": "Змяненне уліковых дадзеных",
+       "changecredentials-submit": "Змяненне уліковых дадзеных",
+       "changecredentials-invalidsubpage": "$1 не з'яўляецца дапушчальным тыпам уліковых дадзеных.",
+       "changecredentials-success": "Вашы дадзеныя былі змененыя.",
+       "removecredentials": "Выдаліць ўліковыя дадзеныя",
+       "removecredentials-submit": "Выдаліць ўліковыя дадзеныя",
+       "removecredentials-invalidsubpage": "$1 не з'яўляецца дапушчальным тыпам уліковых дадзеных.",
+       "removecredentials-success": "Вашы ўліковыя дадзеныя былі выдаленыя.",
+       "credentialsform-provider": "Калі ласка, увядзіце ўліковыя дадзеныя:",
+       "credentialsform-account": "Імя ўліковага запісу:",
+       "cannotlink-no-provider-title": "Няма рахункаў, якія трэба звязваць",
+       "cannotlink-no-provider": "Няма рахункаў, якія трэба звязваць",
+       "linkaccounts": "Звязаць акаўнты",
+       "linkaccounts-success-text": "Акаўнт быў звязаны.",
+       "linkaccounts-submit": "Звязаць акаўнты",
+       "unlinkaccounts": "Адмяніць сувязь уліковых запісаў",
+       "unlinkaccounts-success": "Сувязь акаўнтаў была выдалена."
 }
index 40c60bf..a5a984b 100644 (file)
@@ -34,7 +34,8 @@
                        "Xð",
                        "Miroslav35232",
                        "Ket",
-                       "Ricordo.tenerissimo"
+                       "Ricordo.tenerissimo",
+                       "Plamen"
                ]
        },
        "tog-underline": "Подчертаване на препратките:",
        "newpassword": "Нова парола:",
        "retypenew": "Повтори новата парола:",
        "resetpass_submit": "Избиране на парола и влизане",
-       "changepassword-success": "Ð\9fаÑ\80олаÑ\82а Ð²Ð¸ Ð±ÐµÑ\88е Ð¿Ñ\80оменена Ñ\83Ñ\81пеÑ\88но!",
+       "changepassword-success": "Паролата беше променена успешно!",
        "changepassword-throttled": "Направили сте твърде много опити да въведете паролата за тази сметка.\nНеобходимо е да изчакате $1 преди да опитате отново.",
+       "botpasswords-createnew": "Създаване на нова бот парола",
+       "botpasswords-editexisting": "Редактиране на съществуваща бот парола",
        "botpasswords-label-appid": "Име на бота:",
        "botpasswords-label-create": "Създаване",
        "botpasswords-label-update": "Обновяване",
        "passwordreset-emailsentusername": "Ако това потребителско име е свързано с електронна поща, е изпратено писмо за възстановяване на паролата.",
        "passwordreset-emailsent-capture": "По-долу е показано електронното писмо за възстановяване на паролата, което беше изпратено.",
        "passwordreset-emailerror-capture": "По-долу е показано създадено електронно писмо за възстановяване на паролата, което не беше изпратено на {{GENDER:$2|потребителя}}: $1",
+       "passwordreset-invalideamil": "Неправилен email адрес",
        "changeemail": "Промяна или премахване на адреса за е-поща",
        "changeemail-header": "Промяна на адреса за е-поща на сметката",
        "changeemail-passwordrequired": "Трябва да въведете паролата си, за да потвърдите тази промяна.",
        "deletecomment": "Причина:",
        "deleteotherreason": "Друга/допълнителна причина:",
        "deletereasonotherlist": "Друга причина",
-       "deletereason-dropdown": "*СÑ\82андаÑ\80Ñ\82ни Ð¿Ñ\80иÑ\87ини Ð·Ð° Ð¸Ð·Ñ\82Ñ\80иване\n** Ð¡Ð¿Ð°Ð¼\n** Ð\9fо Ð¼Ð¾Ð»Ð±Ð° Ð½Ð° Ð°Ð²Ñ\82оÑ\80а\n** Ð\9dаÑ\80Ñ\83Ñ\88ение Ð½Ð° Ð°Ð²Ñ\82оÑ\80Ñ\81ки Ð¿Ñ\80ава\n** Ð\92андализÑ\8aм\n** Ð\9fо Ð¶ÐµÐ»Ð°Ð½Ð¸Ðµ на автора\n** Грешно пренасочване",
+       "deletereason-dropdown": "*СÑ\82андаÑ\80Ñ\82ни Ð¿Ñ\80иÑ\87ини Ð·Ð° Ð¸Ð·Ñ\82Ñ\80иване\n** Ð¡Ð¿Ð°Ð¼\n** Ð\92андализÑ\8aм\n** Ð\9dаÑ\80Ñ\83Ñ\88ение Ð½Ð° Ð°Ð²Ñ\82оÑ\80Ñ\81ки Ð¿Ñ\80ава\n** Ð\9fо Ð¼Ð¾Ð»Ð±Ð° на автора\n** Грешно пренасочване",
        "delete-edit-reasonlist": "Редактиране на причините за изтриване",
        "delete-toobig": "Тази страница има голяма редакционна история с над $1 {{PLURAL:$1|версия|версии}}. Изтриването на такива страници е ограничено, за да се предотвратят евентуални поражения на {{SITENAME}}.",
        "delete-warning-toobig": "Тази страница има голяма редакционна история с над $1 {{PLURAL:$1|версия|версии}}. Възможно е изтриването да наруши някои операции в базата данни на {{SITENAME}}; необходимо е особено внимание при продължаване на действието.",
        "whatlinkshere-prev": "{{PLURAL:$1|предишна|предишни $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|следваща|следващи $1}}",
        "whatlinkshere-links": "← препратки",
-       "whatlinkshere-hideredirs": "$1 Ð½Ð° Ð¿Ñ\80енаÑ\81оÑ\87ваÑ\89и Ñ\81Ñ\82Ñ\80аниÑ\86и",
-       "whatlinkshere-hidetrans": "$1 Ð½Ð° Ð²ÐºÐ»Ñ\8eÑ\87ени Ñ\81Ñ\82Ñ\80аниÑ\86и",
-       "whatlinkshere-hidelinks": "$1 Ð½Ð° Ð¿Ñ\80епÑ\80аÑ\82ки",
+       "whatlinkshere-hideredirs": "$1 Ð¿Ñ\80енаÑ\81оÑ\87ваниÑ\8f",
+       "whatlinkshere-hidetrans": "$1 Ð²ÐºÐ»Ñ\8eÑ\87ваниÑ\8f",
+       "whatlinkshere-hidelinks": "$1 препратки",
        "whatlinkshere-hideimages": "$1 на препратки към файла",
        "whatlinkshere-filters": "Филтри",
        "whatlinkshere-submit": "Отваряне",
        "confirm-watch-top": "Добавяне на страницата в списъка ви за наблюдение?",
        "confirm-unwatch-button": "Потвърждаване",
        "confirm-unwatch-top": "Премахване на страницата от списъка ви за наблюдение?",
+       "confirm-rollback-button": "OK",
        "quotation-marks": "„$1“",
        "imgmultipageprev": "← предишна страница",
        "imgmultipagenext": "следваща страница →",
        "watchlistedit-clear-titles": "Заглавия:",
        "watchlistedit-clear-submit": "Изчистване на списъка за наблюдение (Необратимо!)",
        "watchlistedit-clear-done": "Списъкът за наблюдение беше изчистен.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 заглавие беше премахнато|$1 заглавия бяха премахнати}}:",
        "watchlisttools-clear": "Изчистване на списъка за наблюдение",
        "watchlisttools-view": "Преглед на списъка за наблюдение",
        "watchlisttools-edit": "Преглед и редактиране на списъка за наблюдение",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
        "mw-widgets-titleinput-description-new-page": "страницата все още не съществува",
        "mw-widgets-titleinput-description-redirect": "пренасочване към $1",
-       "api-error-blacklisted": "Моля, изберете различно, описателно заглавие.",
        "randomrootpage": "Случайна начална страница",
        "log-action-filter-protect": "Тип защита:",
        "log-action-filter-upload": "Тип качване:",
        "log-action-filter-block-reblock": "Промяна на блокирането",
        "log-action-filter-block-unblock": "Отблокиране",
        "log-action-filter-upload-upload": "Ново качване",
-       "log-action-filter-upload-overwrite": "Повторно качване"
+       "log-action-filter-upload-overwrite": "Повторно качване",
+       "authmanager-authplugin-setpass-bad-domain": "Невалиден домейн.",
+       "authmanager-retype-help": "Парола (повторно) за потвърждение.",
+       "authmanager-email-label": "Е-поща",
+       "authmanager-email-help": "Електронна поща",
+       "authmanager-realname-label": "Истинско име",
+       "authmanager-realname-help": "Истинско име на потребителя",
+       "authmanager-provider-temporarypassword": "Временна парола",
+       "authprovider-resetpass-skip-label": "Пропусни",
+       "specialpage-securitylevel-not-allowed-title": "Не е позволено",
+       "cannotauth-not-allowed-title": "Достъпът е отказан"
 }
index 5eaea02..14c32f3 100644 (file)
        "createaccountreason": "কারণ:",
        "createacct-reason": "কারণ",
        "createacct-reason-ph": "কেন আপনি আরেকটি অ্যাকাউন্ট তৈরি করছেন",
+       "createacct-reason-help": "অ্যাকাউন্ট তৈরির লগে দেখানো বার্তা",
        "createacct-submit": "আপনার অ্যাকাউন্ট তৈরি করুন",
        "createacct-another-submit": "অ্যাকাউন্ট তৈরি করুন",
+       "createacct-continue-submit": "অ্যাকাউন্ট তৈরি চালিয়ে যান",
+       "createacct-another-continue-submit": "অ্যাকাউন্ট তৈরি চালিয়ে যান",
        "createacct-benefit-heading": "{{SITENAME}} আপনার মত লোকের দ্বারাই তৈরি।",
        "createacct-benefit-body1": "{{PLURAL:$1|টি সম্পাদনা}}",
        "createacct-benefit-body2": "{{PLURAL:$1|টি পাতা}}",
        "createacct-another-realname-tip": "আসল নাম ঐচ্ছিক।\nআপনি যদি তা দিতে চান, তাহলে তা ব্যবহারকারীকে তাদের কাজের জন্য স্বীকৃতিদানে ব্যবহার করা হবে।",
        "pt-login": "প্রবেশ",
        "pt-login-button": "প্রবেশ",
+       "pt-login-continue-button": "প্রবেশ অব্যাহত রাখুন",
        "pt-createaccount": "অ্যাকাউন্ট তৈরি করুন",
        "pt-userlogout": "প্রস্থান",
        "php-mail-error-unknown": "পিএইচপির mail() কার্যে অজ্ঞাত ত্রুটি।",
        "resetpass-abort-generic": "পাসওয়ার্ড পরিবর্তন একটি এক্সটেনশনের কারণে স্থগিত করা হয়েছে।",
        "resetpass-expired": "আপনার পাসওয়ার্ডের মেয়াদ উত্তীর্ণ হয়েছে। অনুগ্রহ করে নতুন পাসওয়ার্ড নির্ধারণ করুন।",
        "resetpass-expired-soft": "আপনার পাসওয়ার্ডের মেয়াদ উত্তীর্ণ হয়েছে এবং আপনাকে একটি নতুন পাসওয়ার্ড নির্ধারণ করতে হবে। অনুগ্রহ করে এখনই একটি নতুন পাসওয়ার্ড নির্ধারণ করুন অথবা পরে পরিবর্তন করতে চাইলে \"{{int:authprovider-resetpass-skip-label}}\" বাটনে ক্লিক করুন।",
-       "resetpass-validity-soft": "দয়া করে একটি নতুন পাসওয়ার্ড নির্ধারণ করুন অথবা পরে করার জন্য \"{{int:authprovider-resetpass-skip-label}}\" ক্লিক করুন।",
+       "resetpass-validity-soft": "à¦\86পনার à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦¬à§\88ধ à¦¨à¦¯à¦¼: $1\n\nদয়া à¦\95রà§\87 à¦\8fà¦\95à¦\9fি à¦¨à¦¤à§\81ন à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦¨à¦¿à¦°à§\8dধারণ à¦\95রà§\81ন à¦\85থবা à¦ªà¦°à§\87 à¦\95রার à¦\9cনà§\8dয \"{{int:authprovider-resetpass-skip-label}}\" à¦\95à§\8dলিà¦\95 à¦\95রà§\81ন।",
        "passwordreset": "পাসওয়ার্ড রিসেট",
        "passwordreset-text-one": "আপনার পাসওয়ার্ড পুনরায় সেট করতে এই ফর্মটি পূরণ করুন।",
        "passwordreset-text-many": "{{PLURAL:$1|ইমেইলের মাধ্যমে একটি অস্থায়ী পাসওয়ার্ড পেতে ঘরগুলির একটি পূরণ করুন।}}",
        "passwordreset-emailsentusername": "যদি এই ব্যবহারকারী নামের সাথে ই-মেইল ঠিকানা সংযুক্ত করা থাকে, তাহলে একটি পাসওয়ার্ড বদলের ইমেইল পাঠানো হবে।",
        "passwordreset-emailsent-capture": "স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল করা হয়েছে, যা নিচে দেখানো হচ্ছে।",
        "passwordreset-emailerror-capture": "স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচ্ছে, তবে $1 {{GENDER:$2|ব্যবহারকারীকে}} এটি পাঠানো যায়নি!",
+       "passwordreset-nocaller": "একটি আহ্বানকারী প্রদান করা আবশ্যক",
+       "passwordreset-nosuchcaller": "আহ্বানকারীর অস্তিত্ব নেই: $1",
        "passwordreset-invalideamil": "ভুল ইমেইল ঠিকানা",
+       "passwordreset-nodata": "একটি ব্যবহারকারীর নাম বা একটি ইমেল ঠিকানা দুটির একটিও সরবরা দেয়া হয়নি",
        "changeemail": "ই-মেইল ঠিকানা পরিবর্তন বা বাতিল",
        "changeemail-header": "আপনার ইমেল ঠিকানা পরিবর্তন করতে এই ফরমটি পূরণ করুন। আপনি যদি আপনার একাউন্ট থেকে যে কোন ইমেল ঠিকানার এসোসিয়েশন অপসারণ করতে চান, তাহলে ফরমটি জমা দেওয়ার সময় নতুন ইমেইল ঠিকানা খালি রাখুন।",
        "changeemail-passwordrequired": "এই পরিবর্তন নিশ্চিত করতে আপনাকে আপনার পাসওয়ার্ড লিখতে হবে।",
        "minoredit": "এটি একটি অনুল্লেখ্য সম্পাদনা",
        "watchthis": "এই পাতাটি নজরে রাখুন",
        "savearticle": "সংরক্ষণ",
+       "savechanges": "পরিবর্তন সংরক্ষণ",
        "publishpage": "পাতা প্রকাশ করুন",
+       "publishchanges": "পরিবর্তন প্রকাশ করুন",
        "preview": "প্রাকদর্শন",
        "showpreview": "প্রাকদর্শন",
        "showdiff": "পরিবর্তনসমূহ",
        "sectioneditnotsupported-text": "এই সম্পাদনা পাতায় অনুচ্ছেদ সম্পাদনা সমর্থন করে না",
        "permissionserrors": "অনুমতি ত্রুটিসমূহ",
        "permissionserrorstext": "আপনার এটা করার অনুমতি নেই, নিচের {{PLURAL:$1|টি কারণের|টি কারণের}} জন্য:",
-       "permissionserrorstext-withaction": "আপনার $2 করার অনুমতি নেই, যার {{PLURAL:$1|কারণ|কারণসমূহ}}:",
+       "permissionserrorstext-withaction": "আপনার $2 করার অনুমতি নেই, যার {{PLURAL:$1|কারণ|কারণসমূহ}} হল:",
        "recreate-moveddeleted-warn": "'''সতর্কীকরণ: আপনি এমন একটি পাতা পুনরায় তৈরি করছেন যা পূর্বে অপসারণ করা হয়েছিল।'''\n\nআপনি পাতাটি সম্পাদনা চালিয়ে যাওয়া ঠিক হবে কিনা, তা বিবেচনা করুন।\nআপনার সুবিধার্থে পাতাটির অপলুপ্তি লগ এখানে দেয়া হলো:",
        "moveddeleted-notice": "এই পাতাটি অপসারণ করা হয়েছে।\nসূত্র হিসেবে নিচে এ পাতার অবলুপ্তি লগ দেওয়া হলো।",
        "moveddeleted-notice-recent": "দুঃখিত, এই পাতাটি সাম্প্রতি অপসারিত হয়েছে (সর্বশেষ ২৪ ঘণ্টায়)।\nসূত্র হিসেবে নিচে এই পাতা অপসারণ ও স্থানান্তর লগ দেয়া হয়েছে।",
        "content-model-css": "সিএসএস",
        "content-json-empty-object": "খালি বস্তু",
        "content-json-empty-array": "খালি অ্যারে",
+       "deprecated-self-close-category": "অবৈধ স্ব-বন্ধকৃত এইচটিএমএল ট্যাগ ব্যবহার করা পাতা",
+       "deprecated-self-close-category-desc": "এই পাতাটি অবৈধ স্ব-বন্ধকৃত এইচটিএমএল ট্যাগ ধারন করে, যেমন <code>&lt;b/></code> বা <code>&lt;span/></code>। এইচটিএমএল৫-এর নির্দিষ্টকরণের সঙ্গে সামঞ্জস্যপূর্ণ হতে এইসবের আচরণ শীঘ্রই পরিবর্তন করা হবে, তাই উইকিপাঠ্যে তাদের ব্যবহার অবচিত হয়েছে।",
        "duplicate-args-warning": "<strong>সতর্কীকরণ:</strong> \"$3\" প্যারামিটারের জন্য একের অধিক মানসহ [[:$1]] [[:$2]] কে আহ্বান করছে। শুধুমাত্র প্রদত্ত শেষ মান ব্যবহৃত হবে।",
        "duplicate-args-category": "টেমপ্লেট আহ্বানে সদৃশ আর্গুমেন্ট ব্যবহার করা পাতা",
        "duplicate-args-category-desc": "এই পাতায় টেমপ্লেট আহ্বান উপস্থিত রয়েছে যা সদৃশ আর্গুমেন্ট ব্যবহার করেছে, যেমন <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> বা <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>।",
        "revdelete-submit": "নির্বাচিত {{PLURAL:$1|সংশোধনে|সংশোধসমূহে}} প্রয়োগ করো",
        "revdelete-success": "সংশোধনের দৃশ্যমানতা হালনাগাদ করা হয়েছে।",
        "revdelete-failure": "সংশোধনের দৃশ্যমানতা হালনাগাদ করা যায়নি:\n$1",
-       "logdelete-success": "'''ঘটনা দৃশ্যমানতা সফলভাবে স্থাপন করা হয়েছে।'''",
+       "logdelete-success": "দৃশ্যমানতা নির্ধারনের লগ।",
        "logdelete-failure": "'''লগ-এর দৃশ্যমানতা নির্ধারণ সম্ভব হচ্ছে না:'''\n$1",
        "revdel-restore": "দৃশ্যমানতা পরিবর্তন করো",
        "pagehist": "পাতার ইতিহাস",
        "right-editmyprivateinfo": "আপনার ব্যক্তিগত তথ্য সম্পাদনা করুন (যেমন ইমেইল ঠিকানা, আসল নাম)",
        "right-editmyoptions": "আপনার পছন্দসমূহ পরিবর্তন করুন",
        "right-rollback": "একটি নির্দিষ্ট পাতার সর্বশেষ ব্যবহারকারীর সম্পদনা পূর্বাবস্থায় ফিরিয়ে আনুন",
-       "right-markbotedits": "রà§\8bলড-বà§\8dযাà¦\95 à¦¸à¦®à§\8dপাদনাসমà§\82হà¦\95à§\87 à¦¬à¦\9f à¦¸à¦®à§\8dপাদনা à¦¹à¦¿à¦¸à§\87বà§\87 à¦\9aিহà§\8dনিত à¦\95রà§\8b",
+       "right-markbotedits": "ফà§\87রত à¦\86না à¦¸à¦®à§\8dপাদনাসমà§\82হà¦\95à§\87 à¦¬à¦\9f à¦¸à¦®à§\8dপাদনা à¦¹à¦¿à¦¸à§\87বà§\87 à¦\9aিহà§\8dনিত à¦\95রà§\87",
        "right-noratelimit": "রেট লিমিটের ভিত্তিতে পরিবর্তন হবে না",
        "right-import": "অন্য উইকি থেকে পাতা আমদানী করো",
        "right-importupload": "ফাইল আপলোড থেকে এই পাতাগুলো আমদানী করো",
        "right-override-export-depth": "৫ম স্তর পর্যন্ত সংযুক্তিসহ একটি পাতা রপ্তানী করুন",
        "right-sendemail": "অন্য ব্যবহারকারীকে ইমেইল পাঠান",
        "right-passwordreset": "পাসওয়ার্ড পুনঃস্থাপনের ইমেইল দেখুন",
-       "right-managechangetags": "ডাটাবেস থেকে [[Special:Tags|ট্যাগ]] তৈরি ও অপসারণ করুন",
+       "right-managechangetags": "[[Special:Tags|ট্যাগ]] তৈরি ও সক্রিয়/নিষ্ক্রিয় করুন",
        "right-applychangetags": "সম্পাদনার সাথে [[Special:Tags|ট্যাগ]] যুক্ত করুন",
        "right-changetags": "নির্দিষ্ট সংস্করণ এবং দীর্ঘ সম্পাদনাগুলোতে [[Special:Tags|ট্যাগ]] সংযোজন ও অপসারণ করুন",
+       "right-deletechangetags": "ডাটাবেজ থেকে [[Special:Tags|ট্যাগ]] অপসারণ করা",
        "grant-group-email": "ইমেইল পাঠান",
+       "grant-group-other": "বিবিধ কার্যকলাপ",
        "grant-createaccount": "অ্যাকাউন্ট তৈরি করুন",
        "grant-createeditmovepage": "পাতা তৈরি, সম্পাদনা এবং স্থানান্তর করুন",
        "grant-editmycssjs": "আপনার সিএসএস/জাভাস্ক্রিপ্ট সম্পাদনা করুন",
        "rightslogtext": "এটি ব্যবহারকারী অধিকারে আনা পরিবর্তনগুলির একটি লগ।",
        "action-read": "এই পাতাটি পড়ুন",
        "action-edit": "এই পাতাটি সম্পাদনা",
-       "action-createpage": "পাতা à¦¤à§\88রি à¦\95রà§\8b",
-       "action-createtalk": "à¦\86লাপà§\87র à¦ªà¦¾à¦¤à¦¾ à¦¤à§\88রি à¦\95রà§\8b",
+       "action-createpage": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¤à§\88রি",
+       "action-createtalk": "à¦\8fà¦\87 à¦\86লাপà§\87র à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¤à§\88রি",
        "action-createaccount": "এই ব্যবহারকারী একাউন্টটি তৈরি করো",
        "action-history": "এই পাতার ইতিহাস দেখাও",
        "action-minoredit": "এই সম্পাদনাটি অনুল্লেখ্য হিসেবে চিহ্নিত করো",
        "action-viewmyprivateinfo": "আপনার ব্যক্তিগত তথ্য দেখুন",
        "action-editmyprivateinfo": "আপনার ব্যক্তিগত তথ্য সম্পাদনা করুন",
        "action-editcontentmodel": "পাতার কন্টেন্ট মডেল সম্পাদনা করুন",
-       "action-managechangetags": "ডাà¦\9fাবà§\87স à¦¥à§\87à¦\95à§\87 à¦\9fà§\8dযাà¦\97 à¦¤à§\88রি à¦\93 à¦\85পসারণ à¦\95রà§\81ন",
+       "action-managechangetags": "à¦\9fà§\8dযাà¦\97 à¦¤à§\88রি à¦\93 à¦¸à¦\95à§\8dরিয়/নিষà§\8dà¦\95à§\8dরিয়",
        "action-applychangetags": "আপনার পরিবর্তনগুলোর সাথে ট্যাগ সংযোজন করুন",
        "action-changetags": "নির্দিষ্ট সংস্করণ এবং দীর্ঘ সম্পাদনাগুলোতে ট্যাগ সংযোজন ও অপসারণ করুন",
        "nchanges": "$1টি {{PLURAL:$1|পরিবর্তন}}",
        "upload-too-many-redirects": "এই ইউআরএলটিতে অনেক বেশি পুনর্নির্দেশনা রয়েছে",
        "upload-http-error": "একটি এইচটিটিপি ত্রুটি দেখা দিয়েছে: $1",
        "upload-copy-upload-invalid-domain": "এই ডোমেইন থেকে আপলোড সম্ভব নয়।",
+       "upload-dialog-disabled": "এই ডায়ালগ ব্যবহার করে ফাইল আপলোড করা এই উইকিতে নিষ্ক্রিয় করা হয়েছে।",
        "upload-dialog-title": "ফাইল আপলোড করুন",
        "upload-dialog-button-cancel": "বাতিল",
        "upload-dialog-button-done": "সম্পন্ন",
        "upload-dialog-button-upload": "আপলোড",
        "upload-form-label-infoform-title": "বিস্তারিত",
        "upload-form-label-infoform-name": "নাম",
+       "upload-form-label-infoform-name-tooltip": "ফাইলের জন্য একটি অদ্বিতীয় বিবরণমূলক শিরোনাম, যেটি ফাইলের নাম হিসাবে পরিবেশন হবে। আপনি ফাঁকা স্থান সহ সমতল ভাষা ব্যবহার করতে পারেন। ফাইল এক্সটেনশন অন্তর্ভুক্ত করবেন না।",
        "upload-form-label-infoform-description": "বিবরণ",
+       "upload-form-label-infoform-description-tooltip": "সংক্ষেপে কাজটি সম্পর্কে উল্লেখযোগ্য সবকিছু বর্ণনা করুন।\nএকটি ছবির জন্য, এতে থাকা প্রধান বিষয়, অনুষ্ঠান, বা জায়গা উল্লেখ করুন।",
        "upload-form-label-usage-title": "ব্যবহার",
        "upload-form-label-usage-filename": "ফাইলের নাম",
        "upload-form-label-own-work": "এটি আমার নিজের কাজ",
        "apihelp": "এপিআই সাহায্য",
        "apihelp-no-such-module": "মডিউল \"$1\" পাওয়া যায়নি।",
        "apisandbox": "এপিআই খেলাঘর",
+       "apisandbox-jsonly": "API খেলাঘর ব্যবহার করতে জাভাস্ক্রিপ্ট প্রয়োজন।",
        "apisandbox-api-disabled": "এপিআই এই সাইটে নিষ্ক্রিয় করা আছে।",
        "apisandbox-fullscreen": "প্যানেল সম্প্রসারণ করুন",
+       "apisandbox-fullscreen-tooltip": "ব্রাউজারের উইন্ডো পূরণ করতে খেলাঘরের প্যানেল প্রসারিত করুন।",
        "apisandbox-unfullscreen": "পাতা দেখাও",
        "apisandbox-submit": "অনুরোধ রাখুন",
        "apisandbox-reset": "পরিস্কার",
        "enotif_body": "প্রিয় $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nসম্পাদকের সারাংশ: $PAGESUMMARY $PAGEMINOREDIT\n\nসম্পাদকের সাথে যোগাযোগের উপায়:\nইমেইল: $PAGEEDITOR_EMAIL\nউইকি: $PAGEEDITOR_WIKI\n\nপাতাটির পরবর্তী পরিবর্তনগুলো জন্য আর কোন বিজ্ঞপ্তি পাঠানো হবে না, যতক্ষণ না আপনি প্রবেশ করার সময় এই পাতায় ব্রাউজ করবেন। এছাড়া আপনি আপনার নজরতালিকায় রাখা সবগুলি পাতা জন্য বিজ্ঞপ্তি ফ্ল্যাগ শুরুর অবস্থায় ফিরিয়ে নিতে পারেন।\n\nআপনার বন্ধুত্বপূর্ণ {{SITENAME}} বিজ্ঞপ্তি ব্যবস্থা\n\n--\nইমেইল বিজ্ঞপ্তি সেটিং পরিবর্তনের জন্য দেখুন\n{{canonicalurl:{{#special:Preferences}}}}\n\nআপনার নজরতালিকা সেটিংস পরিবর্তন করতে চাইলে দেখুন, \n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nনজরতালিকা থেকে কোন পাতা অপসারণ করতে চাইলে এখানে যান:\n$UNWATCHURL\n\nপ্রতিক্রিয়া জানাতে ও আরও সহযোগিতার জন্য:\n$HELPPAGE",
        "created": "তৈরী হয়েছিল",
        "changed": "পরিবর্তিত",
-       "deletepage": "পাতাটি মুছে ফেলা হোক",
+       "deletepage": "পাতা মুছুন",
        "confirm": "নিশ্চিত করুন",
        "excontent": "বিষয়বস্তু ছিল: '$1'",
        "excontentauthor": "বিষয়বস্তু ছিল: \"$1\", এবং একমাত্র অবদানকারী ছিলেন \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|আলাপ]])",
        "sp-contributions-username": "আইপি (IP) ঠিকানা অথবা ব্যবহারকারীর নাম:",
        "sp-contributions-toponly": "শুধুমাত্র সেই সম্পাদনাগুলি দেখাও যেগুলো সাম্প্রতিক সংস্করণের অন্তর্ভুক্ত",
        "sp-contributions-newonly": "শুধুমাত্র পাতা সৃষ্টি করা সম্পাদনাগুলি দেখাও",
+       "sp-contributions-hideminor": "অনুল্লেখ্য পরিবর্তন আড়াল করুন",
        "sp-contributions-submit": "অনুসন্ধান",
        "whatlinkshere": "সংযোগকারী পাতাসমূহ",
        "whatlinkshere-title": "যে পাতাগুলি থেকে \"$1\"-এর প্রতি সংযোগ আছে",
        "movereason": "কারণ:",
        "revertmove": "পূর্বাবস্থায় ফেরত নেওয়া হোক",
        "delete_and_move_text": "\"[[:$1]]\" শিরোনামের গন্তব্য পাতাটি ইতিমধ্যেই বিদ্যমান। আপনি কি স্থানান্তর সফল করার জন্য পাতাটি মুছে দিতে চান?",
-       "delete_and_move_confirm": "হà§\8dযাà¦\81, à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦®à§\81à¦\9bà§\87 à¦«à§\87লা à¦¹à§\8bà¦\95",
+       "delete_and_move_confirm": "হà§\8dযাà¦\81, à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦®à§\81à¦\9bà§\81ন",
        "delete_and_move_reason": "\"[[$1]]\" থেকে স্থানান্তরের স্বার্থে মুছে ফেলা হয়েছে",
        "selfmove": "উৎস ও গন্তব্য পাতা একই শিরোনামের; কোন পাতা একই শিরোনামের আরেক পাতায় সরানো যাবে না।",
        "immobile-source-namespace": "পাতাটি \"$1\" নামস্থানে স্থানান্তর সম্ভব নয়",
        "import-nonewrevisions": "কোনো সংস্করণ আমদানী করা হয়নি।",
        "xml-error-string": "$1 যে লাইনে $2, কলামে $3 (বাইট $4): $5",
        "import-upload": "XML ডাটা আপলোড",
-       "import-token-mismatch": "সà§\87শন à¦¡à¦¾à¦\9fা à¦¹à¦¾à¦°à¦¿à¦¯à¦¼à§\87 à¦\97িয়à§\87à¦\9bà§\87।\nà¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 à¦ªà§\81নরায় à¦\9aà§\87ষà§\8dà¦\9fা à¦\95রà§\81ন।",
+       "import-token-mismatch": "সà§\87শন à¦¡à¦¾à¦\9fা à¦¹à¦¾à¦°à¦¿à¦¯à¦¼à§\87 à¦\97à§\87à¦\9bà§\87।\n\nà¦\86পনি à¦¸à¦®à§\8dভবত à¦¸à¦\82যà§\8bà¦\97 à¦¹à¦¾à¦°à¦¿à¦¯à¦¼à§\87à¦\9bà§\87ন। <strong>দয়া à¦\95রà§\87 à¦¯à¦¾à¦\9aাà¦\87 à¦\95রà§\81ন à¦¯à§\87 à¦\86পনি à¦\8fà¦\96নà¦\93 à¦ªà§\8dরবà§\87শরত à¦°à¦¯à¦¼à§\87à¦\9bà§\87ন à¦\8fবà¦\82 à¦\86বার à¦\9aà§\87ষà§\8dà¦\9fা à¦\95রà§\81ন</strong>। à¦¯à¦¦à¦¿ à¦\8fà¦\9fি à¦\8fà¦\96নà¦\93 à¦\95াà¦\9c à¦¨à¦¾ à¦\95রà§\87, à¦¤à¦¾à¦¹à¦²à§\87 à¦¦à¦¯à¦¼à¦¾ à¦\95রà§\87 [[Special:UserLogout|à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¥à§\87à¦\95à§\87 à¦ªà§\8dরসà§\8dথান à¦\95রà§\81ন]] à¦\8fবà¦\82 à¦\86বার à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦ªà§\8dরবà§\87শ à¦\95রà§\87 à¦\9aà§\87ষà§\8dà¦\9fা à¦\95রà§\81ন à¦\8fবà¦\82 à¦\8fবà¦\82 à¦ªà¦°à§\80à¦\95à§\8dষা à¦\95রà§\81ন à¦¯à§\87 à¦\86পনার à¦¬à§\8dরাà¦\89à¦\9cার à¦\8fà¦\87 à¦¸à¦¾à¦\87à¦\9fà§\87 à¦\95à§\81à¦\95ি à¦¬à§\8dযবহারà§\87র à¦\85নà§\81মতি à¦¦à§\87য়।",
        "import-invalid-interwiki": "নির্ধারিত উইকি থেকে আমদানী করা যাবে না।",
        "import-error-edit": "\"$1\" পাতাটি আমদানি করা যায়নি কারণ আপনার এটি সম্পাদনা করার অনুমতি নেই।",
        "import-error-create": "\"$1\" পাতাটি আমদানি করা যায়নি কারণ আপনার এটি তৈরী করার অনুমতি নেই।",
        "mw-widgets-dateinput-placeholder-month": "বববব-মম",
        "mw-widgets-titleinput-description-new-page": "পাতা এখনো বিদ্যমান নয়",
        "mw-widgets-titleinput-description-redirect": "$1-এ পুনঃনির্দেশিত",
-       "api-error-blacklisted": "অনুগ্রহ করে অপর কোনো বর্ণনামূলক নাম ব্যবহার করুন।",
        "sessionmanager-tie": "একাধিক অনুরোধের প্রমাণীকরণের ধরন একত্রিত করা যাবে না: $1।",
        "sessionprovider-generic": "$1টি সেশন",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "কুকি-ভিত্তিক সেশন",
        "log-action-filter-delete-restore": "পাতা পুনঃরুদ্ধার",
        "log-action-filter-delete-event": "লগ অপসারণ",
        "log-action-filter-delete-revision": "সংশোধন অপসারণ",
+       "log-action-filter-import-interwiki": "আন্তঃউইকি আমদানি",
+       "log-action-filter-import-upload": "XML আপলোড কর্তৃক আমদানি",
+       "log-action-filter-newusers-create": "বেনামী ব্যবহারকারী দ্বারা সৃষ্টি",
+       "log-action-filter-newusers-create2": "নিবন্ধিত ব্যবহারকারী দ্বারা সৃষ্টি",
+       "log-action-filter-newusers-autocreate": "স্বয়ংক্রিয় সৃষ্টি",
+       "log-action-filter-newusers-byemail": "ই-মেইলে পাসওয়ার্ড প্রেরণের দ্বারা সৃষ্টি",
        "log-action-filter-patrol-patrol": "ম্যানুয়াল টহল",
        "log-action-filter-patrol-autopatrol": "স্বয়ংক্রিয় টহল",
        "log-action-filter-protect-protect": "সুরক্ষা",
        "log-action-filter-protect-modify": "সুরক্ষা পরিমার্জন",
        "log-action-filter-protect-unprotect": "অসুরক্ষা",
+       "log-action-filter-protect-move_prot": "সুরক্ষা স্থানান্তরিত",
+       "log-action-filter-rights-rights": "ম্যানুয়াল পরিবর্তন",
        "log-action-filter-rights-autopromote": "স্বয়ংক্রিয় পরিবর্তন",
        "log-action-filter-upload-upload": "নতুন আপলোড",
        "log-action-filter-upload-overwrite": "পুনঃআপলোড",
+       "authmanager-authplugin-setpass-failed-title": "পাসওয়ার্ড পরিবর্তন ব্যর্থ হয়েছে",
+       "authmanager-authplugin-setpass-bad-domain": "অবৈধ ডোমেইন।",
+       "authmanager-autocreate-noperm": "স্বয়ংক্রিয় অ্যাকাউন্ট সৃষ্টি মঞ্জুরিপ্রাপ্ত নয়।",
        "authmanager-userdoesnotexist": "ব্যবহারকারী অ্যাকাউন্ট \"$1\" অনিবন্ধিত।",
+       "authmanager-email-label": "ইমেইল",
        "authmanager-email-help": "ইমেইল ঠিকানা",
+       "authmanager-realname-label": "প্রকৃত নাম",
+       "authmanager-realname-help": "ব্যবহারকারীর প্রকৃত নাম",
+       "authmanager-provider-temporarypassword": "অস্থায়ী পাসওয়ার্ড",
+       "authprovider-confirmlink-success-line": "$1: সংযোগ করা সফল হয়েছে।",
        "authprovider-resetpass-skip-label": "উপেক্ষা করো",
        "authprovider-resetpass-skip-help": "পাসওয়ার্ড পুনঃস্থাপন করা উপেক্ষা করুন।",
        "authform-wrongtoken": "ভুল টোকেন",
+       "specialpage-securitylevel-not-allowed-title": "অনুমতি নেই",
+       "cannotauth-not-allowed-title": "অনুমতি অস্বীকৃত",
+       "cannotauth-not-allowed": "আপনি এই পাতাটি ব্যবহার করতে অনুমতিপ্রাপ্ত নন।",
+       "changecredentials": "পরিচয়পত্র পরিবর্তন করুন",
+       "changecredentials-submit": "পরিচয়পত্র পরিবর্তন করুন",
+       "changecredentials-invalidsubpage": "$1 বৈধ পরিচয়পত্রের ধরন নয়।",
+       "changecredentials-success": "আপনার পরিচয়পত্র পরিবর্তিত হয়েছে।",
+       "removecredentials": "পরিচয়পত্র সরান",
        "removecredentials-submit": "পরিচয়পত্র সরান",
+       "removecredentials-invalidsubpage": "$1 বৈধ পরিচয়পত্রের ধরন নয়।",
+       "removecredentials-success": "আপনার পরিচয়পত্র সরানো হয়েছে।",
+       "credentialsform-provider": "পরিচয়পত্রের ধরন:",
        "credentialsform-account": "অ্যাকাউন্টের নাম:",
        "linkaccounts": "অ্যাকাউন্ট সংযোগ করুন"
 }
index 2a94971..482c3ba 100644 (file)
        "unwatch": "མི་བལྟ་བ།",
        "unwatchthispage": "བལྟ་བ་མཚམས་འཇོག",
        "wlshowlast": "འདས་བའི་དུས་ཚོད་ $1 ནང་ཚུན་  ཉིན་མ་ $2 ནང་ཚུན་  སྟོན།",
-       "watchlistall2": "ཚང་མ།",
        "watchlist-options": "ལྟ་ཐོའི་འདེམས་ཚན།",
        "watching": "ལྟ་ཐོར་འཇུག་བཞིན་པ་་་",
        "unwatching": "ལྟ་ཐོ་ལས་འདོར་བཞིན་པ་་་",
index fe4fbfe..cdf6cb1 100644 (file)
        "history-feed-item-nocomment": "$1 u $2",
        "history-feed-empty": "Tražena stranica ne postoji.\nMoguće da je izbrisana sa wikija, ili preimenovana.\nPokušajte [[Special:Search|pretražiti wiki]] za slične stranice.",
        "history-edit-tags": "Uredi oznake izabranih verzija",
-       "rev-deleted-comment": "(uklonjen sažetak izmjene)",
+       "rev-deleted-comment": "(sažetak izmjene uklonjen)",
        "rev-deleted-user": "(korisničko ime uklonjeno)",
        "rev-deleted-event": "(stavka zapisa obrisana)",
        "rev-deleted-user-contribs": "[korisničko ime ili IP adresa uklonjeni - izmjena sakrivena u spisku doprinosa]",
        "rev-suppressed-text-unhide": "Ova revizija stranice je '''uklonjena'''.\nMožete pogledati detalje u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} zapisu uklanjanja].\nVi je i dalje možete [$1 vidjeti ovu reviziju] ako želite.",
        "rev-deleted-text-view": "Revizija ove stranice je '''obrisana'''.\nVi je možete vidjeti; detalji o tome se mogu vidjeti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisu brisanja].",
        "rev-suppressed-text-view": "Ova revizija stranice je '''uklonjena'''.\nVi je možete vidjeti; možete pogledati detalje u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} zapisu uklanjanja].",
-       "rev-deleted-no-diff": "Ne možete vidjeti ove razlike jer je jedna od revizija '''obrisana'''.\nMožete pregledati detalje u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisima brisanja].",
+       "rev-deleted-no-diff": "Ne možete vidjeti ovu razliku jer je jedna od izmjena '''obrisana'''.\nDetalji se nalaze u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].",
        "rev-suppressed-no-diff": "Ne možete vidjeti ove razlike jer je jedna od revizija '''obrisana'''.",
        "rev-deleted-unhide-diff": "Jedna od revizija u ovom pregledu razlika je '''obrisana'''.\nMožete pregledati detalje u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].\nVi još uvijek možete [$1 vidjeti ove razlike] ako želite da nastavite.",
        "rev-suppressed-unhide-diff": "edna od revizija ove razlike je '''uklonjena'''.\nMožete pogledati detalje u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} zapisniku uklanjanja].\nVi i dalje možete [$1 vidjeti ove razlike] ako želite da nastavite.",
        "listusersfrom": "Prikaži korisnike koji počinju sa:",
        "listusers-submit": "Prikaži",
        "listusers-noresult": "Nije pronađen korisnik.",
-       "listusers-blocked": "(blokiran)",
+       "listusers-blocked": "({{GENDER:$1|blokiran|blokirana|blokiran}})",
        "activeusers": "Spisak aktivnih korisnika",
        "activeusers-intro": "Ovo je spisak korisnika koji su imali neku aktivnost u {{PLURAL:$1|posljednji $1 dan|posljednja $1 dana|posljednjih $1 dana}}.",
        "activeusers-count": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}} u {{PLURAL:$3|posljednji $3 dan|posljednja $3 dana|posljednjih $3 dana}}",
        "sp-contributions-username": "IP adresa ili korisničko ime:",
        "sp-contributions-toponly": "Prikaži samo najnovije izmjene",
        "sp-contributions-newonly": "Prikaži samo izmjene kojima su napravljene nove stranice",
+       "sp-contributions-hideminor": "Sakrij manje izmjene",
        "sp-contributions-submit": "Traži",
        "whatlinkshere": "Šta vodi ovamo",
        "whatlinkshere-title": "Stranice koje vode na \"$1\"",
        "logentry-suppress-revision-legacy": "$1 je tajno {{GENDER:$2|promijenio|promijenila}} vidljivost izmjena na stranici $3",
        "revdelete-content-hid": "sadržaj je sakriven",
        "revdelete-summary-hid": "sažetak izmjene je sakriven",
-       "revdelete-uname-hid": "sažetak izmjene je sakriven",
+       "revdelete-uname-hid": "korisničko ime je sakriveno",
        "revdelete-content-unhid": "sadržaj je otkriven",
        "revdelete-summary-unhid": "sažetak izmjene je otkriven",
        "revdelete-uname-unhid": "korisničko ime je otkriveno",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "simboli",
        "special-characters-group-greek": "grčki",
+       "special-characters-group-greekextended": "prošireni grčki",
        "special-characters-group-cyrillic": "ćirilica",
        "special-characters-group-arabic": "arapski",
        "special-characters-group-arabicextended": "prošireni arapski",
        "mw-widgets-dateinput-no-date": "Nikakav datum nije izabran",
        "mw-widgets-titleinput-description-new-page": "stranica još ne postoji",
        "mw-widgets-titleinput-description-redirect": "preusmjerava na $1",
-       "api-error-blacklisted": "Molimo izaberite drugačiji, deskriptivniji naziv.",
        "randomrootpage": "Slučajna root stranica",
        "log-action-filter-block": "Vrsta blokiranja:",
        "log-action-filter-delete": "Vrsta brisanja:",
index 474a143..bf8c180 100644 (file)
        "createaccountreason": "Rason:",
        "createacct-reason": "Rason",
        "createacct-reason-ph": "Tauno ta muya mong gumibo sa ibang account",
-       "createacct-imgcaptcha-ph": "Ibutang a tekstong nababayad mo sa ibabow",
        "createacct-submit": "Gumibo sa sadiring account",
        "createacct-another-submit": "Gumibo sa ibang account",
        "createacct-benefit-heading": "Gibo ka mga tawo pareho mo ading {{SITENAME}}.",
        "resetpass-submit-cancel": "Kanselaron",
        "resetpass-temp-password": "Temporaryong password:",
        "passwordreset": "Balyowan a password",
-       "passwordreset-legend": "Balyowan a password",
        "passwordreset-domain": "Nasasakupan:",
        "passwordreset-email": "Email address:",
        "changeemail": "Ribayan a email adres",
        "ipbreason": "Rason:",
        "ipblocklist-submit": "Pag-anapon",
        "lockconfirm": "Amo, muya kong ikandado a database.",
-       "delete_and_move": "Puraon anggan ilipat",
        "delete_and_move_confirm": "Amo, puraon ading pahina",
        "export-addcattext": "Irugang a mga pahina galin sa kategorya:",
        "export-addnstext": "Irugang a mga pahina galin sa bubutangan:",
index a332a75..85468aa 100644 (file)
        "password-change-forbidden": "No podeu canviar les contrasenyes en aquest wiki.",
        "externaldberror": "Hi ha hagut un error en la base de dades d'autenticació o bé no teniu permís per a actualitzar el vostre compte extern.",
        "login": "Inici de sessió",
+       "login-security": "Verificació de la identitat",
        "nav-login-createaccount": "Inicia una sessió / crea un compte",
        "userlogin": "Inicia una sessió / crea un compte",
        "userloginnocreate": "Inici de sessió",
        "createaccountreason": "Motiu:",
        "createacct-reason": "Motiu",
        "createacct-reason-ph": "Per què creeu un altre compte",
+       "createacct-reason-help": "Missatge mostrat en el registre de creació de comptes",
        "createacct-submit": "Crea el meu compte",
        "createacct-another-submit": "Crea un compte",
+       "createacct-continue-submit": "Continua amb la creació del compte",
+       "createacct-another-continue-submit": "Continua amb la creació del compte",
        "createacct-benefit-heading": "{{SITENAME}} és feta per gent com tu.",
        "createacct-benefit-body1": "{{PLURAL:$1|edició|edicions}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pàgina|pàgines}}",
        "nocookieslogin": "{{SITENAME}} utilitza galetes per a enregistrar usuaris. Teniu les galetes desactivades. Activeu-les i torneu a provar.",
        "nocookiesfornew": "No s'ha creat el compte d'usuari, ja que no es podia confirmar el seu origen.\nVerifiqueu que teniu habilitades les galetes al vostre navegador, torneu a carregar aquesta pàgina i intenteu-lo de nou.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
+       "createacct-loginerror": "El vostre compte ha estat creat correctament, però la vostra sessió podria no iniciar-se automàticament. Si us plau, realitzeu l'inici de [[Special:UserLogin|sessió manual]].",
        "noname": "No heu especificat un nom vàlid d'usuari.",
        "loginsuccesstitle": "Sessió iniciada",
        "loginsuccess": "Heu iniciat la sessió a {{SITENAME}} com a «$1».",
        "botpasswords-created-title": "S'ha creat la contrasenya del bot",
        "botpasswords-created-body": "S'ha creat la contrasenya per al bot «$1» de l'usuari «$2».",
        "botpasswords-updated-title": "Contrasenya de bot actualitzada",
+       "botpasswords-deleted-title": "S'ha eliminat la contrasenya del bot",
+       "botpasswords-deleted-body": "La contrasenya del bot \"$1\", pertanyent a l'usuari \"$2\", ha estat eliminada.",
+       "botpasswords-newpassword": "La nova contrasenya per a iniciar sessió amb <strong>$1</strong> és <strong>$2</strong>. Si us plau, guardeu-la de cara al futur.",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider no està disponible.",
+       "botpasswords-restriction-failed": "Les restriccions de contrasenyes de bots impedeixen aquest inici de sessió.",
        "botpasswords-not-exist": "L'usuari «$1» no té una contrasenya de bot anomenada «$2».",
        "resetpass_forbidden": "No poden canviar-se les contrasenyes",
+       "resetpass_forbidden-reason": "Les contrasenyes no es poden canviar: $1",
        "resetpass-no-info": "Heu d'estar registrats en un compte per a poder accedir directament a aquesta pàgina.",
        "resetpass-submit-loggedin": "Canvia la contrasenya",
        "resetpass-submit-cancel": "Cancel·la",
        "passwordreset-emailtext-user": "L'usuari $1 de {{SITENAME}} ha demanat una reinicialització de la vostra contrasenya per al projecte {{SITENAME}} ($4). {{PLURAL:$3|El següent compte d'usuari està associat|Els següents comptes d'usuari estan associats}} amb aquesta adreça de correu electrònic:\n\n$2\n\n{{PLURAL:$3|Aquesta contrasenya temporal caducarà|Aquestes contrasenyes temporals caducaran}} en {{PLURAL:$5|un dia|$5 dies}}.\nHauríeu d'entrar ara per fixar una nova contrasenya. Si algú que no sou vós és qui ha fet aquesta petició o si heu recordat la contrasenya original i ja no la voleu canviar, podeu ignorar aquest missatge i seguir utilitzant la vostra antiga contrasenya.",
        "passwordreset-emailelement": "Nom d'usuari: \n$1\n\nContrasenya temporal: \n$2",
        "passwordreset-emailsentemail": "Si aquesta adreça electrònica està associada al vostre compte, s’enviarà un missatge de restabliment de contrasenya.",
+       "passwordreset-emailsentusername": "Si existeix una adreça electrònica associada a aquest nom d'usuari, s’hi enviarà un missatge de reestabliment de contrasenya.",
        "passwordreset-emailsent-capture": "S'ha enviat un correu electrònic de reinicialització de contrasenya, tal com es mostra a continuació.",
        "passwordreset-emailerror-capture": "S'ha generat un correu electrònic de renovació de contrasenya, que es mostra a continuació, però ha fallat l'enviament a {{GENDER:$2:l'usuari|la usuària}}: $1",
        "passwordreset-emailsent-capture2": "{{PLURAL:$1|S'ha enviat el correu|S'han enviat els correus}} de restabliment de {{PLURAL:$1|contrasenya|contrasenyes}}. A continuació es mostra {{PLURAL:$1|l'usuari i contrasenya|la llista d'usuaris i contrasenyes}}.",
        "passwordreset-invalideamil": "Adreça de correu electrònic no vàlida",
+       "passwordreset-nodata": "No s'ha proporcionat cap nom d'usuari ni adreça electrònica",
        "changeemail": "Canvia o elimina l’adreça electrònica",
        "changeemail-header": "Empleneu aquest formulari per canviar la vostra adreça electrònica. Si voleu eliminar qualssevol associacions d’adreces electròniques del vostre compte, deixeu en blanc el camp i envieu el formulari.",
        "changeemail-passwordrequired": "Cal que introduïu la vostra contrasenya per confirmar el canvi.",
        "minoredit": "Aquesta és una modificació menor",
        "watchthis": "Vigila aquesta pàgina",
        "savearticle": "Desa la pàgina",
+       "savechanges": "Desa els canvis",
        "publishpage": "Publica la pàgina",
+       "publishchanges": "Publica els canvis",
        "preview": "Previsualització",
        "showpreview": "Mostra una previsualització",
        "showdiff": "Mostra els canvis",
        "right-override-export-depth": "Exportar pàgines incloent aquelles enllaçades fins a una fondària de 5",
        "right-sendemail": "Enviar missatges de correu electrònic a altres usuaris",
        "right-passwordreset": "Veure les sol·licituds de restabliment de contrasenya per correu electrònic",
-       "right-managechangetags": "Crear i suprimir [[Special:Tags|etiquetes]] des de la base de dades",
+       "right-managechangetags": "Crear, activar i desactivar [[Special:Tags|etiquetes]]",
        "right-applychangetags": "Aplica les [[Special:Tags|etiquetes]] juntament amb els canvis propis",
        "right-changetags": "Afegeix i suprimeix [[Special:Tags|etiquetes]] en revisions individuals i entrades de registre",
+       "right-deletechangetags": "Suprimir [[Special:Tags|etiquetes]] des de la base de dades",
        "grant-group-page-interaction": "Interacció amb pàgines",
        "grant-group-file-interaction": "Interacció amb fitxes multimèdia",
        "grant-group-watchlist-interaction": "Interacció amb la vostra llista de seguiment",
        "grant-createeditmovepage": "Crea, modifica i reanomena pàgines",
        "grant-delete": "Suprimeix pàgines, revisions i entrades de registre",
        "grant-editinterface": "Modifica l'espai de noms MediaWiki i els CSS/JavaScript d'usuari",
+       "grant-editmyoptions": "Editeu les vostres preferències d'usuari",
        "grant-editmywatchlist": "Modifica la llista de seguiment",
        "grant-editpage": "Modifica les pàgines existents",
        "grant-editprotected": "Modifica pàgines protegides",
        "rightslogtext": "Aquest és un registre de canvis dels permisos d'usuari.",
        "action-read": "llegir aquesta pàgina",
        "action-edit": "modificar aquesta pàgina",
-       "action-createpage": "crear pàgines",
-       "action-createtalk": "crear pàgines de discussió",
+       "action-createpage": "crear aquesta pàgina",
+       "action-createtalk": "crear aquesta pàgina de discussió",
        "action-createaccount": "crear aquest compte d'usuari",
        "action-autocreateaccount": "crea automàtica aquest compte d'usuari extern",
        "action-history": "mostra l'historial de la pàgina",
        "action-managechangetags": "crear i (des)activar etiquetes",
        "action-applychangetags": "aplica les etiquetes juntament amb els canvis",
        "action-changetags": "afegeix i elimina etiquetes a les revisions i les entrades de registre individuals",
+       "action-deletechangetags": "eliminar etiquetes des de la base de dades",
        "nchanges": "$1 {{PLURAL:$1|canvi|canvis}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|des de la darrera visita}}",
        "enhancedrc-history": "historial",
        "upload-too-many-redirects": "L'URL conté massa redireccions",
        "upload-http-error": "Ha ocorregut un error HTTP: $1",
        "upload-copy-upload-invalid-domain": "Les càrregues de còpia no són disponibles des d'aquest domini.",
+       "upload-dialog-disabled": "La càrrega de fitxers utilitzant aquest quadre de diàleg està desactivada en aquest wiki.",
        "upload-dialog-title": "Carrega un fitxer",
        "upload-dialog-button-cancel": "Cancel·la",
        "upload-dialog-button-done": "Fet",
        "upload-form-label-infoform-name": "Nom",
        "upload-form-label-infoform-name-tooltip": "Un únic títol descriptiu pel fitxer, que servirà com a nom del fitxer. Podeu utilitzar llenguatge senzill amb espais. No hi inclogueu l'extensió del fitxer.",
        "upload-form-label-infoform-description": "Descripció",
+       "upload-form-label-infoform-description-tooltip": "Descriviu breument tot el que sigui notable d'aquesta obra.\nSi es tracta d'una fotografia, esmenteu els principals elements que hi ha representats o bé l'esdeveniment o lloc en qüestió.",
        "upload-form-label-usage-title": "Ús",
        "upload-form-label-usage-filename": "Nom del fitxer",
        "upload-form-label-own-work": "Això és el meu propi treball",
        "upload-form-label-infoform-categories": "Categories",
        "upload-form-label-infoform-date": "Data",
+       "upload-form-label-own-work-message-generic-local": "Confirmo que estic carregant aquest fitxer seguint les condicions d'ús i polítiques de concessió de llicències a {{SITENAME}}.",
+       "upload-form-label-not-own-work-message-generic-local": "Si no podeu carregar aquest fitxer sota les polítiques de {{SITENAME}}, si us plau, tanqueu aquest quadre de diàleg i proveu amb un altre mètode.",
        "upload-form-label-not-own-work-local-generic-local": "També podeu provar [[Special:Upload|la pàgina de càrrega per defecte]].",
        "upload-form-label-own-work-message-generic-foreign": "Entenc que esteu carregant el fitxer en un repositori compartit. Confirmo que ho estic fent seguint les condicions d'ús i les polítiques de llicenciament que s'hi apliquen.",
+       "upload-form-label-not-own-work-message-generic-foreign": "Si no podeu carregar aquest fitxer sota les polítiques del repositori lliure, si us plau, tanqueu aquest quadre de diàleg i proveu amb un altre mètode.",
+       "upload-form-label-not-own-work-local-generic-foreign": "També us recomanem que utilitzeu [[Special:Upload|la pàgina de càrrega a {{SITENAME}}]] si aquest fitxer es pot carregar seguint les seves polítiques.",
        "backend-fail-stream": "No s'ha pogut transmetre el fitxer $1.",
        "backend-fail-backup": "No s'ha pogut fer una còpia de seguretat del fitxer $1.",
        "backend-fail-notexists": "El fitxer $1 no existeix.",
        "uploadstash-summary": "Aquesta pàgina permet accedir als fitxers que han estat carregats (o estan en procés de ser carregats), però que encara no s'han publicat al wiki. Aquests fitxers només són visibles per a l'usuari que els ha carregats.",
        "uploadstash-clear": "Esborra els fitxers en reserva",
        "uploadstash-nofiles": "No teniu fitxers en reserva",
-       "uploadstash-badtoken": "No s'ha pogut realitzar l'acció, possiblement perquè han caducat la vostra identificació. Intenteu-ho de nou.",
+       "uploadstash-badtoken": "No s'ha pogut realitzar l'acció, possiblement perquè ha caducat la vostra identificació. Intenteu-ho de nou.",
        "uploadstash-errclear": "S'estan netejant els fitxers que han fallat.",
        "uploadstash-refresh": "Actualitza la llista de fitxers",
        "uploadstash-thumbnail": "mostra una miniatura",
        "confirm-watch-top": "Voleu afegir aquesta pàgina a la llista de seguiment?",
        "confirm-unwatch-button": "D'acord",
        "confirm-unwatch-top": "Voleu treure aquesta pàgina de la llista de seguiment?",
+       "confirm-rollback-button": "D'acord",
+       "confirm-rollback-top": "Voleu revertir les modificacions a la pàgina?",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "← pàgina anterior",
        "imgmultipagenext": "pàgina següent →",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "la pàgina no existeix encara",
        "mw-widgets-titleinput-description-redirect": "redirigeix a $1",
-       "api-error-blacklisted": "Trieu un títol diferent, més descriptiu.",
        "sessionmanager-tie": "No es poden combinar diferents tipus de sol·licituds d'autenticació: $1.",
        "sessionprovider-generic": "$1 sessions",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sessions basades en galetes",
        "randomrootpage": "Pàgina arrel aleatòria",
        "log-action-filter-block": "Tipus de blocatge:",
        "log-action-filter-delete": "Tipus de supressió:",
+       "log-action-filter-import": "Tipus d'importació:",
+       "log-action-filter-managetags": "Tipus d'acció de gestió d'etiquetes:",
+       "log-action-filter-move": "Tipus de reanomenament:",
+       "log-action-filter-newusers": "Tipus de creació de compte:",
        "log-action-filter-patrol": "Tipus de patrullatge:",
        "log-action-filter-protect": "Tipus de protecció:",
+       "log-action-filter-rights": "Tipus de canvi de permisos:",
+       "log-action-filter-suppress": "Tipus de supressió:",
        "log-action-filter-upload": "Tipus de càrrega:",
        "log-action-filter-all": "Tota",
        "log-action-filter-block-block": "Bloca",
        "log-action-filter-protect-unprotect": "Desprotecció",
        "log-action-filter-upload-upload": "Nova càrrega",
        "log-action-filter-upload-overwrite": "Torna a carregar",
+       "authmanager-authn-not-in-progress": "L'autenticació no està en curs o les dades de sessió s'han perdut. Comenceu de nou des del principi.",
+       "authmanager-authn-no-primary": "Les dades credencials no s'han pogut autenticar.",
+       "authmanager-authn-autocreate-failed": "Ha fallat la creació automàtica d'un compte local: $1",
        "authmanager-realname-label": "Nom real",
-       "authmanager-realname-help": "Nom real de l'usuari"
+       "authmanager-realname-help": "Nom real de l'usuari",
+       "authmanager-provider-temporarypassword": "Contrasenya temporal",
+       "authprovider-resetpass-skip-label": "Omet",
+       "authpage-cannot-login-continue": "No es pot continuar amb l'inicio de sessió. Probablement la vostra sessió ha expirat.",
+       "authpage-cannot-create-continue": "No es pot prosseguir la creació del compte. Probablement la vostra sessió ha expirat.",
+       "changecredentials": "Canvi de dades credencials",
+       "changecredentials-submit": "Canvia les dades credencials",
+       "credentialsform-provider": "Tipus de dades credencials:",
+       "credentialsform-account": "Nom del compte:",
+       "linkaccounts-submit": "Enllaça els comptes",
+       "unlinkaccounts": "Desenllaça els comptes",
+       "unlinkaccounts-success": "El compte s'ha desenllaçat.",
+       "authenticationdatachange-ignored": "No s'ha gestionat el canvi de dades d'autenticació. Potser no s'ha configurat cap proveïdor?"
 }
index cde060e..2a856d9 100644 (file)
        "qbedit": "修改",
        "qbpageoptions": "茲蜀頁",
        "qbmyoptions": "我其頁面",
-       "faq": "ç\93稠碰著其問題",
+       "faq": "ç\9c\9f稠碰著其問題",
        "faqpage": "Project:稠問其問題",
        "actions": "動作",
        "namespaces": "命名空間",
        "linkstoimage": "下底{{PLURAL:$1|$1頁鏈接}}遘茲文件:",
        "nolinkstoimage": "無鏈接遘茲蜀萆文件其頁面。",
        "uploadnewversion-linktext": "上傳蜀萆新版本其茲萆文件。",
+       "shared-repo-name-wikimediacommons": "Wikimedia Commons",
        "download": "下載",
        "unwatchedpages": "無監視其頁面",
        "listredirects": "重定向其單單",
index daef26f..0655819 100644 (file)
@@ -15,7 +15,7 @@
                ]
        },
        "tog-underline": "КӀел сиз хьакха хьажорган:",
-       "tog-hideminor": "Ð\9aÑ\8aайладаÑ\85а ÐºÐ¸Ð³Ð¸Ð¹Ñ\80а Ð½Ð¸Ñ\81даÑ\80Ñ\88 Ð¾Ñ\86 Ð¼Ð¾Ð³Ó\80ама ÐºÐµÑ\80ла Ñ\85ийÑ\86амеÑ\85Ñ\8c",
+       "tog-hideminor": "Ð\9aÑ\8aайладаÑ\85а Ð¶Ð¸Ð¼Ð° Ð½Ð¸Ñ\81даÑ\80Ñ\88 ÐºÐµÑ\80ла Ð¼Ð¾Ð³Ó\80ам Ñ\8eкÑ\8aаÑ\80а",
        "tog-hidepatrolled": "Къайладаха гӀаролладина нисдарш оц могӀама керла нисдаршкахь",
        "tog-newpageshidepatrolled": "Къайлаяха гӀароллайина агӀонаш оьцу могӀама керла агӀонашкахь",
        "tog-hidecategorization": "Къайлаяха агӀонийн категореш",
        "sp-contributions-username": "IP-адрес я декъашхочун цӀе:",
        "sp-contributions-toponly": "Гайта тӀаьххьарлера хийцамаш",
        "sp-contributions-newonly": "АгӀонаш кхоллар бен ма гайта",
+       "sp-contributions-hideminor": "Къайладаха жима нисдарш",
        "sp-contributions-submit": "Лахар",
        "whatlinkshere": "Кхуза хьажоргаш",
        "whatlinkshere-title": "«$1» тӀе хьажоргаш йолу агӀонаш",
        "tooltip-t-specialpages": "Белхан агӀонанийн могӀам",
        "tooltip-t-print": "ХӀокху агӀонна зорба туху башхо",
        "tooltip-t-permalink": "Даима йолу хьажорг хӀокху башха агӀонна",
-       "tooltip-ca-nstab-main": "Яззамна чулацам",
+       "tooltip-ca-nstab-main": "Ð\9aоÑ\8cÑ\80Ñ\82а Ñ\8fззаман чулацам",
        "tooltip-ca-nstab-user": "ХӀора декъашхочун долахь йолу агӀо ю",
        "tooltip-ca-nstab-media": "Медиа-файл",
        "tooltip-ca-nstab-special": "ХӀара белхан агӀо ю, хӀара таялуш яц",
index eda9211..4274025 100644 (file)
        "allpagesprefix": "Na'annok i påhina siha yan i kla'an mo'na:",
        "categories": "Katigoria",
        "categoriespagetext": "Guåha påhina pat media gi halom i sigiente katigoria.\n[[Special:UnusedCategories|Unused categories]] are not shown here.\nAlso see [[Special:WantedCategories|wanted categories]].",
-       "special-categories-sort-count": "såttea pot tinefong",
-       "special-categories-sort-abc": "såttea pot i atfabetu",
        "linksearch-ok": "Aligao",
        "emailuser": "Na'e-mail i muna'sesetbi este",
        "watchlist": "Listan pinilan-hu",
index 69e8949..9eee086 100644 (file)
@@ -5,7 +5,8 @@
                        "Ale Mister (on co.wikipedia.org)",
                        "Img (on co.wikipedia.org)",
                        "Paulu",
-                       "아라"
+                       "아라",
+                       "Jun Misugi"
                ]
        },
        "tog-hideminor": "Piattà e mudifiche minore in l'ultime mudifiche",
        "nstab-template": "Mudellu",
        "nstab-help": "Pagina d'aiutu",
        "nstab-category": "Categuria",
+       "mainpage-nstab": "Pàgina maestra",
        "error": "Errore",
        "missingarticle-rev": "(numeru di a versione: $1)",
        "internalerror": "Errore internu",
        "accountcreated": "Registramentu fattu",
        "accountcreatedtext": "U registramentu di l'utilizatore $1 hè statu fattu.",
        "loginlanguagelabel": "Lingua: $1",
+       "pt-login": "Cunnessione",
        "retypenew": "Scrive torna a nova parulla secreta:",
        "resetpass-submit-cancel": "Cancillà",
        "bold_sample": "Grassettu",
        "block-log-flags-nocreate": "registramentu pruibitu",
        "block-log-flags-nousertalk": "ùn pò mudificà a so propria pagina di discussione",
        "move-page-legend": "Move a pagina",
-       "movearticle": "Move a pagina",
        "move-watch": "Fighjulà issa pagina",
        "movepagebtn": "Move a pagina",
        "movelogpagetext": "Elencu di e pagine mosse.",
        "logentry-move-move": "$1 {{GENDER:$2|hà spustatu}} a pagina $3 à $4",
        "logentry-newusers-create": "U participante $3 hè statu creatu da $1",
        "rightsnone": "(nessunu)",
+       "searchsuggest-search": "Ricerca",
        "expand_templates_output": "Risultatu"
 }
index 8f376d5..9829a07 100644 (file)
@@ -4,7 +4,8 @@
                        "Capisano",
                        "Oxyzen",
                        "Reedy",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Kuritan sa idalum ang mga link",
        "cascadeprotected": "Ginprotektahan ang mini nga pahina sa pagpangilis, tungod naupod ini sa mga gasunod nga {{PLURAL:$1|pahina, nga|mga pahina, nga}} protektado upod ang \"cascading\" nga pilili-an nga naga-andar:\n$2",
        "namespaceprotected": "Wala ka sang permiso nga magliwat sang mga pahina nga ara sa namespace nga '''$1'''.",
        "ns-specialprotected": "Indi pwede bag-uhon ang mga pinasahi nga pahina.",
-       "titleprotected": "Naprotektahan ang mini nga titulo halin sa pag-ubra ni [[User:$1|$1]].\nMini ang ginhatag nga kabangdanan \"''$2''\".",
+       "titleprotected": "Naprotektahan ang mini nga titulo halin sa pag-ubra ni [[User:$1|$1]].\nMini ang ginhatag nga kabangdanan <em>$2</em>.",
        "virus-badscanner": "Sala nga konpigurasyon: wala nakilal-an nga manugsala sang virus: ''$1''",
        "virus-scanfailed": "palpak ang pagscan (code $1)",
        "virus-unknownscanner": "wala makilal-an nga pangontra-bayrus:",
        "block-log-flags-nocreate": "pag-ubra sang account ginbawalan",
        "movepagetext": "Gamit ang pormas sa idalum magala-in ang ngalan sang pahina, masaylo ang tanan nga kasaysayan niya sa bag-o niya nga pangalan.\nAng daan nga titulo mangin isa ka pahina sang pagdirekta sa bag-o nga titulo.\nPwede mo ma-update ang mga pagdirekta nga gakadto sa orihinal nga titulo sang diretso.\nKung indi mo gusto, siguraduhon nga may [[Special:DoubleRedirects|doble]] ukon [[Special:BrokenRedirects|bali nga pangdirekta]].\nIkaw ang responsable sa pagsiguro nga ang mga links nagapadayon sa pagtudlo kung sa diin sila dapat makadto.\n\nTandaan nga ang pahina '''indi''' masaylo kung may ara na sang pahina sa bag-o nga titulo, kung indi man wala mini sang unod ukon may pagdirekta kag wala mini sang nagligad nga kasayasayan sa pag-ilis.\nAnbot silingon sini nga pwede mo man ma-islan ngalan ang pahina pabalik sa kung diin mini gin-ngalanan kung nagsala ikaw, kag indi mo matapakan sulat ang mini nga na-una nga pahina.\n\n'''Paandam!'''\nMini mangin isa ka mala-in kag wala gina-ekspektaran nga pagbag-o para sa isa ka sikat nga pahina;\nsiguraduhon nga na-intyendihan mo ang paga-abtan sini antes magpadayun.",
        "movepagetalktext": "Ang na-upod nga pahina sang istoryahanay diretso nga ma-upod sa iya '''apang:'''\n*Ang indi blangko ngapahina sang istoryahanay ara na nga bal-an sa idalum sa bag-o nga ngalan, ukon\n*Wala mo nachekan ang mga kahon sa idalum.\n\nSa mga mini nga kaso, kinahanglan mo hulagon ang pahina nga ikaw mismo, kung gusto mo.",
-       "movearticle": "Sayluhon mining pahina:",
        "newtitle": "Pakadto sa bag-o nga titulo:",
        "move-watch": "Bantayan ang mini nga pahina",
        "movepagebtn": "Sayluhon mini nga pahina",
index ad7f51d..5214d3f 100644 (file)
@@ -30,7 +30,9 @@
                        "Macofe",
                        "Urbanecm",
                        "LordMsz",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Dvorapa",
+                       "Walter Klosse"
                ]
        },
        "tog-underline": "Podtrhávat odkazy:",
        "categorypage": "Prohlédnout si stránku kategorie",
        "viewtalkpage": "Prohlédnout si diskusi",
        "otherlanguages": "V jiných jazycích",
-       "redirectedfrom": "(Přesměrováno z $1)",
+       "redirectedfrom": "(přesměrováno z $1)",
        "redirectpagesub": "Přesměrování",
        "redirectto": "Přesměrování na:",
        "lastmodifiedat": "Stránka byla naposledy editována $1 v $2.",
        "minoredit": "Tato změna je malá editace.",
        "watchthis": "Sledovat tuto stránku",
        "savearticle": "Uložit změny",
+       "savechanges": "Uložit změny",
        "publishpage": "Zveřejnit stránku",
+       "publishchanges": "Zveřejnit změny",
        "preview": "Náhled",
        "showpreview": "Ukázat náhled",
        "showdiff": "Ukázat změny",
        "blankarticle": "<strong>Upozornění:</strong> Stránka, kterou se chystáte založit, je prázdná. Pokud ještě jednou kliknete na „{{int:savearticle}}“, bude založena zcela bez obsahu.",
-       "anoneditwarning": "<strong>Varování:</strong> Nejste přihlášen(a). Pokud uložíte jakoukoli editaci, bude vaše IP adresa zveřejněna v historii této stránky. Pokud se <strong>[$1 přihlásíte]</strong> nebo si <strong>[$2 vytvoříte účet]</strong>, budou vaše editace připsány vašemu uživatelskému jménu a získáte i další výhody.",
+       "anoneditwarning": "<strong>Varování:</strong> Nejste přihlášen(a). Pokud uložíte jakoukoli editaci, vaše IP adresa bude zveřejněna v historii této stránky. Pokud se <strong>[$1 přihlásíte]</strong> nebo si <strong>[$2 vytvoříte účet]</strong>, vaše editace budou připsány vašemu uživatelskému jménu a získáte i další výhody.",
        "anonpreviewwarning": "<em>Nejste přihlášen(a). Uložením zveřejníte svou IP adresu v historii této stránky.</em>",
        "missingsummary": "<strong>Připomenutí:</strong> Nezadali jste shrnutí editace. Pokud ještě jednou kliknete na „{{int:savearticle}}“, bude vaše editace zapsána bez shrnutí.",
        "selfredirect": "<strong>Upozornění:</strong> Pokoušíte se tuto stránku přesměrovat na sebe samu.\nMožná jste zadali chybný cíl přesměrování, nebo editujete špatnou stránku.\nPokud ještě jednou kliknete na „{{int:savearticle}}“, bude i přesto přesměrování vytvořeno.",
        "content-model-css": "CSS",
        "content-json-empty-object": "Prázdný objekt",
        "content-json-empty-array": "Prázdné pole",
+       "deprecated-self-close-category": "Stránky s neplatnými sebeuzavírajícími se HTML značkami",
+       "deprecated-self-close-category-desc": "Stránka obsahuje neplatné sebeuzavírající se 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.",
        "duplicate-args-category": "Stránky s duplicitními argumenty ve voláních šablon",
        "duplicate-args-category-desc": "Stránka obsahuje volání šablony, které používá duplicitní argumenty, např. <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> nebo <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "group": "Skupina:",
        "group-user": "Uživatelé",
        "group-autoconfirmed": "Automaticky schválení uživatelé",
-       "group-bot": "Boti",
+       "group-bot": "Roboti",
        "group-sysop": "Správci",
        "group-bureaucrat": "Byrokraté",
        "group-suppress": "Utajovatelé",
        "group-all": "(všichni)",
        "group-user-member": "{{GENDER:$1|uživatel|uživatelka|uživatel}}",
        "group-autoconfirmed-member": "automaticky {{GENDER:$1|schválený uživatel|schválená uživatelka|schválený uživatel}}",
-       "group-bot-member": "{{GENDER:$1|bot|botka|bot}}",
+       "group-bot-member": "{{GENDER:$1|robot|robotka}}",
        "group-sysop-member": "{{GENDER:$1|správce|správkyně|správce}}",
        "group-bureaucrat-member": "{{GENDER:$1|byrokrat|byrokratka|byrokrat}}",
        "group-suppress-member": "{{GENDER:$1|utajovatel|utajovatelka|utajovatel}}",
        "grouppage-user": "{{ns:project}}:Uživatelé",
        "grouppage-autoconfirmed": "{{ns:project}}:Automaticky schválení uživatelé",
-       "grouppage-bot": "{{ns:project}}:Boti",
+       "grouppage-bot": "{{ns:project}}:Roboti",
        "grouppage-sysop": "{{ns:project}}:Správci",
        "grouppage-bureaucrat": "{{ns:project}}:Byrokraté",
        "grouppage-suppress": "{{ns:project}}:Utajovatelé",
        "rightslogtext": "Toto je záznam změn uživatelských práv.",
        "action-read": "přečíst tuto stránku",
        "action-edit": "upravit tuto stránku",
-       "action-createpage": "vytvářet stránky",
-       "action-createtalk": "vytvářet diskusní stránky",
+       "action-createpage": "vytvořit tuto stránku",
+       "action-createtalk": "vytvořit tuto diskusní stránku",
        "action-createaccount": "vytvořit tento uživatelský účet",
        "action-autocreateaccount": "automaticky založit tento externí uživatelský účet",
        "action-history": "prohlížet si historii této stránky",
        "recentchanges-feed-description": "Na tomto kanále sledujte poslední změny na {{grammar:6sg|{{SITENAME}}}}.",
        "recentchanges-label-newpage": "Touto editací byla založena nová stránka",
        "recentchanges-label-minor": "Toto je malá editace",
-       "recentchanges-label-bot": "Tuto editaci provedl bot",
+       "recentchanges-label-bot": "Tuto editaci provedl robot",
        "recentchanges-label-unpatrolled": "Tato změna dosud nebyla prověřena",
        "recentchanges-label-plusminus": "Velikost stránky se změnila o tolik bajtů",
        "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "upload-http-error": "Došlo k chybě HTTP: $1",
        "upload-copy-upload-invalid-domain": "Načítání kopírováním není dostupné z této domény.",
        "upload-foreign-cant-upload": "Tato wiki není nakonfigurována, aby načítala soubory na požadované vzdálené úložiště souborů.",
+       "upload-foreign-cant-load-config": "Nepodařilo se nahrát konfiguraci načítání souborů na vzdálené úložiště souborů.",
+       "upload-dialog-disabled": "Načítání souborů pomocí tohoto dialogu je na této wiki vypnuto.",
        "upload-dialog-title": "Načtení souboru",
        "upload-dialog-button-cancel": "Storno",
        "upload-dialog-button-done": "Hotovo",
        "tooltip-namespace_association": "Zaškrtnutím tohoto políčka zahrnete i diskusní či obsahový jmenný prostor příslušný k vybranému jmennému prostoru",
        "blanknamespace": "(Hlavní)",
        "contributions": "Příspěvky {{GENDER:$1|uživatele|uživatelky}}",
-       "contributions-title": "Příspěvky uživatele $1",
+       "contributions-title": "Příspěvky {{GENDER:$1|uživatele|uživatelky|uživatele/uživatelky}} $1",
        "mycontris": "Příspěvky",
        "anoncontribs": "Příspěvky",
        "contribsub2": "{{GENDER:$3|uživatele|uživatelky}} $1 ($2)",
        "sp-contributions-username": "IP adresa nebo uživatelské jméno:",
        "sp-contributions-toponly": "Zobrazit pouze editace na aktuální revizi",
        "sp-contributions-newonly": "Zobrazit pouze editace zakládající stránku",
+       "sp-contributions-hideminor": "Skrýt malé editace",
        "sp-contributions-submit": "Zobrazit",
        "whatlinkshere": "Odkazuje sem",
        "whatlinkshere-title": "Stránky odkazující na „$1“",
        "tooltip-ca-nstab-user": "Zobrazit uživatelskou stránku",
        "tooltip-ca-nstab-media": "Zobrazit stránku souboru",
        "tooltip-ca-nstab-special": "Toto je speciální stránka, kterou nelze editovat.",
-       "tooltip-ca-nstab-project": "Zobrazit stránku o wiki",
+       "tooltip-ca-nstab-project": "Zobrazit stránku projektu",
        "tooltip-ca-nstab-image": "Zobrazit stránku souboru",
        "tooltip-ca-nstab-mediawiki": "Zobrazit systémovou zprávu",
        "tooltip-ca-nstab-template": "Zobrazit šablonu",
        "noscript.css": "/* Zde uvedené CSS bude ovlivňovat uživatele s vypnutým JavaScriptem */",
        "group-autoconfirmed.css": "/* Zde uvedené CSS bude ovlivňovat pouze automaticky schválené uživatele */",
        "group-user.css": "/* Zde uvedené CSS bude ovlivňovat pouze registrované uživatele */",
-       "group-bot.css": "/* Zde uvedené CSS bude ovlivňovat pouze boty */",
+       "group-bot.css": "/* Zde uvedené CSS bude ovlivňovat pouze roboty */",
        "group-sysop.css": "/* Zde uvedené CSS bude ovlivňovat pouze správce */",
        "group-bureaucrat.css": "/* Zde uvedené CSS bude ovlivňovat pouze byrokraty */",
        "common.js": "/* Zde uvedený JavaScript bude použit pro všechny uživatele při načtení každé stránky. */",
        "group-autoconfirmed.js": "/* Zde uvedený JavaScript bude použit pouze pro automaticky schválené uživatele */",
        "group-user.js": "/* Zde uvedený JavaScript bude použit pouze pro registrované uživatele */",
-       "group-bot.js": "/* Zde uvedený JavaScript bude použit pouze pro boty */",
+       "group-bot.js": "/* Zde uvedený JavaScript bude použit pouze pro roboty */",
        "group-sysop.js": "/* Zde uvedený JavaScript bude použit pouze pro správce */",
        "group-bureaucrat.js": "/* Zde uvedený JavaScript bude použit pouze pro byrokraty */",
        "anonymous": "{{PLURAL:$1|anonymního uživatele|anonymních uživatelů}} {{GRAMMAR:2sg|{{SITENAME}}}}",
        "mw-widgets-dateinput-placeholder-month": "RRRR-MM",
        "mw-widgets-titleinput-description-new-page": "stránka zatím neexistuje",
        "mw-widgets-titleinput-description-redirect": "přesměrování na $1",
-       "api-error-blacklisted": "Zvolte prosím jiný, popisný název.",
        "sessionmanager-tie": "Nelze kombinovat několik typů autentizace požadavků: $1.",
        "sessionprovider-generic": "relace pomocí $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "relace pomocí cookies",
        "linkaccounts-success-text": "Účet byl propojen.",
        "linkaccounts-submit": "Propojit účty",
        "unlinkaccounts": "Zrušení propojení účtů",
-       "unlinkaccounts-success": "Propojení účtu bylo zrušeno."
+       "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 c543504..cecccf6 100644 (file)
        "tog-hidepatrolled": "Kontrollierte Änderungen in den „Letzten Änderungen“ ausblenden",
        "tog-newpageshidepatrolled": "Kontrollierte Seiten bei den „Neuen Seiten“ ausblenden",
        "tog-hidecategorization": "Kategorisierungen von Seiten ausblenden",
-       "tog-extendwatchlist": "In der Beobachtungsliste alle und nicht nur die aktuellsten Änderungen anzeigen",
+       "tog-extendwatchlist": "Alle und nicht nur die aktuellsten Änderungen in der Beobachtungsliste anzeigen",
        "tog-usenewrc": "Änderungen auf „Letzte Änderungen“ und der Beobachtungsliste nach Seite gruppieren",
        "tog-numberheadings": "Überschriften automatisch nummerieren",
-       "tog-showtoolbar": "Bearbeiten-Werkzeugleiste anzeigen",
+       "tog-showtoolbar": "Bearbeiten-Werkzeugleiste aktivieren",
        "tog-editondblclick": "Seiten mit Doppelklick bearbeiten",
        "tog-editsectiononrightclick": "Einzelne Abschnitte per Rechtsklick bearbeiten",
        "tog-watchcreations": "Selbst erstellte Seiten und hochgeladene Dateien automatisch beobachten",
        "tog-watchdefault": "Selbst geänderte Seiten und Dateien automatisch beobachten",
        "tog-watchmoves": "Selbst verschobene Seiten und Dateien automatisch beobachten",
        "tog-watchdeletion": "Selbst gelöschte Seiten und Dateien automatisch beobachten",
-       "tog-watchuploads": "Neue hochgeladene Dateien zu meiner Beobachtungsliste hinzufügen",
+       "tog-watchuploads": "Selbst hochgeladene Dateien automatisch beobachten",
        "tog-watchrollback": "Seiten, bei denen ich eine Zurücksetzung durchgeführt habe, automatisch beobachten",
        "tog-minordefault": "Eigene Änderungen standardmäßig als geringfügig markieren",
        "tog-previewontop": "Vorschau oberhalb des Bearbeitungsfensters anzeigen",
        "tog-watchlisthidebots": "Bearbeitungen durch Bots in der Beobachtungsliste ausblenden",
        "tog-watchlisthideminor": "Kleine Bearbeitungen in der Beobachtungsliste ausblenden",
        "tog-watchlisthideliu": "Bearbeitungen angemeldeter Benutzer in der Beobachtungsliste ausblenden",
-       "tog-watchlistreloadautomatically": "Die Beobachtungsliste automatisch neu laden, wenn ein Filter geändert wurde (erfordert JavaScript)",
+       "tog-watchlistreloadautomatically": "Sofern ein Filter geändert wurde, die Beobachtungsliste automatisch neu laden (erfordert JavaScript)",
        "tog-watchlisthideanons": "Bearbeitungen anonymer Benutzer (IP-Adressen) in der Beobachtungsliste ausblenden",
        "tog-watchlisthidepatrolled": "Kontrollierte Änderungen in der Beobachtungsliste ausblenden",
-       "tog-watchlisthidecategorization": "Kategorisierungen von Seiten ausblenden",
+       "tog-watchlisthidecategorization": "Kategorisierungen von Seiten in der Beobachtungsliste ausblenden",
        "tog-ccmeonemails": "Schicke mir Kopien der E-Mails, die ich anderen Benutzern sende",
        "tog-diffonly": "Beim Versionsvergleich nur die Unterschiede und nicht die vollständige Seite anzeigen",
        "tog-showhiddencats": "Versteckte Kategorien anzeigen",
        "databaseerror-query": "Abfrage: $1",
        "databaseerror-function": "Funktion: $1",
        "databaseerror-error": "Fehler: $1",
-       "transaction-duration-limit-exceeded": "Um eine große Verzögerung in der Datenreplikation zu vermeiden, wurde diese Transaktion abgebrochen. Die Schreibdauer ($1) hat die Grenze von {{PLURAL:$2|einer Sekunde|$2 Sekunden}} überschritten. Falls du viele Objekte auf einmal änderst, versuche stattdessen, die Änderungen auf mehrere Operationen aufzuteilen.",
+       "transaction-duration-limit-exceeded": "Um eine große Verzögerung in der Datenreplikation zu vermeiden, wurde diese Transaktion abgebrochen. Die Schreibdauer ($1) hat die Grenze von $2 Sekunden überschritten. Falls du viele Objekte auf einmal änderst, versuche stattdessen, die Änderungen auf mehrere Operationen aufzuteilen.",
        "laggedslavemode": "<strong>Achtung:</strong> Die angezeigte Seite könnte unter Umständen nicht die letzten Bearbeitungen enthalten.",
        "readonly": "Datenbank gesperrt",
        "enterlockreason": "Bitte gib einen Grund ein, warum die Datenbank gesperrt werden soll und eine Abschätzung über die Dauer der Sperrung",
        "minoredit": "Nur Kleinigkeiten wurden verändert",
        "watchthis": "Diese Seite beobachten",
        "savearticle": "Seite speichern",
+       "savechanges": "Änderungen speichern",
        "publishpage": "Seite veröffentlichen",
+       "publishchanges": "Änderungen veröffentlichen",
        "preview": "Vorschau",
        "showpreview": "Vorschau zeigen",
        "showdiff": "Änderungen zeigen",
        "content-model-css": "CSS",
        "content-json-empty-object": "Leeres Objekt",
        "content-json-empty-array": "Leeres Array",
+       "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.",
        "duplicate-args-category": "Seiten, die doppelte Argumente in Vorlagenaufrufen verwenden",
        "duplicate-args-category-desc": "Die Seite enthält Vorlagenaufrufe, die Duplikate von Argumenten verwenden, wie <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> oder <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "prefs-rc": "Letzte Änderungen",
        "prefs-watchlist": "Beobachtungsliste",
        "prefs-editwatchlist": "Beobachtungsliste bearbeiten",
-       "prefs-editwatchlist-label": "Einträge auf der Beobachtungsliste bearbeiten:",
+       "prefs-editwatchlist-label": "Einträge auf der Beobachtungsliste:",
        "prefs-editwatchlist-edit": "ansehen und selektiv entfernen",
        "prefs-editwatchlist-raw": "unformatiert bearbeiten",
        "prefs-editwatchlist-clear": "vollständig entfernen",
        "prefs-namespaces": "Namensräume",
        "default": "Voreinstellung",
        "prefs-files": "Dateien",
-       "prefs-custom-css": "Benutzerdefinierte CSS",
+       "prefs-custom-css": "Benutzerdefiniertes CSS",
        "prefs-custom-js": "Benutzerdefiniertes JavaScript",
        "prefs-common-css-js": "Gemeinsames CSS/JavaScript aller Benutzeroberflächen:",
        "prefs-reset-intro": "Du kannst diese Seite verwenden, um die Einstellungen auf die Standards zurückzusetzen.\nDies kann nicht mehr rückgängig gemacht werden.",
        "rightslogtext": "Dies ist das Logbuch der Änderungen der Benutzerrechte.",
        "action-read": "die Seite zu lesen",
        "action-edit": "die Seite zu bearbeiten",
-       "action-createpage": "Seiten zu erstellen",
-       "action-createtalk": "Diskussionsseiten zu erstellen",
+       "action-createpage": "diese Seite zu erstellen",
+       "action-createtalk": "diese Diskussionsseite zu erstellen",
        "action-createaccount": "ein Benutzerkonto zu erstellen",
        "action-autocreateaccount": "automatisch dieses externe Benutzerkonto zu erstellen",
        "action-history": "die Versionsgeschichte dieser Seite anzusehen",
        "upload-http-error": "Ein HTTP-Fehler ist aufgetreten: $1",
        "upload-copy-upload-invalid-domain": "Als Kopie hochladbare Dateien sind über diese Domain nicht verfügbar.",
        "upload-foreign-cant-upload": "Dieses Wiki ist nicht konfiguriert, um Dateien auf das gewünschte fremde Dateirepositorium hochzuladen.",
+       "upload-foreign-cant-load-config": "Die Konfiguration für Dateiuploads in das fremde Dateirepositorium konnte nicht geladen werden.",
+       "upload-dialog-disabled": "Dateiuploads mit diesem Dialog sind auf diesem Wiki deaktiviert.",
        "upload-dialog-title": "Datei hochladen",
        "upload-dialog-button-cancel": "Abbrechen",
        "upload-dialog-button-done": "Schließen",
        "backend-fail-read": "Die Datei $1 konnte nicht gelesen werden.",
        "backend-fail-create": "Die Datei $1 konnte nicht gespeichert werden.",
        "backend-fail-maxsize": "Die Datei $1 konnte nicht gespeichert werden, da sie größer als {{PLURAL:$2|ein Byte|$2 Bytes}} ist.",
-       "backend-fail-readonly": "Das Speicher-Backend „$1“ befindet sich derzeit im Lesemodus. Der angegebene Grund lautet: <em>$2</em>",
-       "backend-fail-synced": "Die Datei „$1“ befindet sich, innerhalb des internen Speicher-Backends, in einem inkonsistenten Zustand.",
-       "backend-fail-connect": "Es konnte keine Verbindung zum Speicher-Backend „$1“ hergestellt werden.",
-       "backend-fail-internal": "Im Speicher-Backend „$1“ ist ein unbekannter Fehler aufgetreten.",
+       "backend-fail-readonly": "Die Datenbank „$1“ befindet sich derzeit im Lesemodus. Der Grund hierfür ist: <em>$2</em>",
+       "backend-fail-synced": "Die Datei „$1“ befindet sich, innerhalb des internen Datenbanksystems, in einem inkonsistenten Zustand.",
+       "backend-fail-connect": "Es konnte keine Verbindung zur Datenbank „$1“ hergestellt werden.",
+       "backend-fail-internal": "In der Datenbank „$1“ ist ein unbekannter Fehler aufgetreten.",
        "backend-fail-contenttype": "Der Inhaltstyp, der im Pfad „$1“ zu speichernden Datei, konnte nicht bestimmt werden.",
-       "backend-fail-batchsize": "Eine Stapelverarbeitungsdatei, die {{PLURAL:$1|eine Operation|$1 Operationen}} enthält, wurde an das Speicher-Backend gesandt. Die Begrenzung liegt allerdings bei {{PLURAL:$2|einer Operation|$2 Operationen}}.",
+       "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.",
-       "filejournal-fail-dbconnect": "Es konnte keine Verbindung zur Journaldatenbank des Speicher-Backends „$1“ hergestellt werden.",
-       "filejournal-fail-dbquery": "Die Journaldatenbank des Speicher-Backends „$1“ konnte nicht aktualisiert werden.",
+       "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.",
        "lockmanager-fail-closelock": "Die Sperrdatei für „$1“ konnte nicht geschlossen werden.",
        "lockmanager-fail-deletelock": "Die Sperrdatei für „$1“ konnte nicht gelöscht werden.",
        "licenses-edit": "Lizenzoptionen bearbeiten",
        "license-nopreview": "(es ist keine Vorschau verfügbar)",
        "upload_source_url": "(deine ausgewählte Datei von einer gültigen, öffentlich zugänglichen URL)",
-       "upload_source_file": "(deine ausgewählte Datei von deinem Computer)",
+       "upload_source_file": "(die von dir auf deinem Computer ausgewählte Datei)",
        "listfiles-delete": "löschen",
        "listfiles-summary": "Diese Spezialseite listet alle hochgeladenen Dateien auf.",
        "listfiles_search_for": "Suche nach Datei:",
        "prefixindex": "Alle Seiten (mit Präfix)",
        "prefixindex-namespace": "Alle Seiten mit Präfix (Namensraum $1)",
        "prefixindex-submit": "Anzeigen",
-       "prefixindex-strip": "Präfix in der Liste abschneiden",
+       "prefixindex-strip": "Suchpräfix ausblenden",
        "shortpages": "Kurze Seiten",
        "longpages": "Lange Seiten",
        "deadendpages": "Nicht verlinkende Seiten",
        "apisandbox": "API-Spielwiese",
        "apisandbox-jsonly": "Zur Nutzung der API-Spielwiese ist JavaScript erforderlich.",
        "apisandbox-api-disabled": "Die API wurde auf diesem Wiki deaktiviert.",
-       "apisandbox-intro": "Diese Seite kannst du für Versuche mit der <strong>MediaWiki-API</strong> verwenden.\nDie [[mw:API:Main page|Dokumentation zur API]] enthält weitere Hinweise zu ihrer Nutzung. Beispiel: [https://www.mediawiki.org/wiki/API:Main_page/de#Ein_einfaches_Beispiel Den Inhalt der Hauptseite abrufen]. Für weitere Beispiele eine der verfügbaren Aktionen auswählen.\n\nObwohl dies eine Spielwiese ist, bedenke, dass Aktionen, die du auf dieser Seite durchführst, das Wiki verändern.",
+       "apisandbox-intro": "Diese Seite kannst du für Versuche mit der <strong>MediaWiki-API</strong> verwenden.\nDie [[mw:API:Main page|Dokumentation zur API]] enthält weitere Hinweise zu ihrer Nutzung. Beispiel: [https://www.mediawiki.org/wiki/API:Main_page/de#Ein_einfaches_Beispiel Den Inhalt der Hauptseite abrufen]. Wähle für weitere Beispiele eine der verfügbaren Aktionen.\n\nObwohl dies eine Spielwiese ist, bedenke, dass Aktionen, die du auf dieser Seite durchführst, das Wiki verändern.",
        "apisandbox-fullscreen": "Panel expandieren",
        "apisandbox-fullscreen-tooltip": "Expandiert das Spielwiesen-Panel, um das Browserfenster auszufüllen.",
        "apisandbox-unfullscreen": "Seite anzeigen",
        "sp-contributions-username": "IP-Adresse oder Benutzername:",
        "sp-contributions-toponly": "Nur aktuelle Versionen zeigen",
        "sp-contributions-newonly": "Nur Seitenerstellungen anzeigen",
+       "sp-contributions-hideminor": "Kleine Bearbeitungen ausblenden",
        "sp-contributions-submit": "Suchen",
        "whatlinkshere": "Links auf diese Seite",
        "whatlinkshere-title": "Seiten, die auf „$1“ verlinken",
        "allmessagesname": "Name",
        "allmessagesdefault": "Standardtext",
        "allmessagescurrent": "Aktueller Text",
-       "allmessagestext": "Dies ist eine Liste der MediaWiki-Systemtexte.\nBitte besuche die Seiten [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki-Lokalisierung] und [https://translatewiki.net translatewiki.net], sofern du dich an der Lokalisierung von MediaWiki beteiligen möchtest.",
+       "allmessagestext": "Dies ist eine Liste der MediaWiki-Systemtexte.\nGehe auf [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki-Lokalisierung] und [https://translatewiki.net translatewiki.net], wenn du dich an der Übersetzung von MediaWiki beteiligen möchtest.",
        "allmessagesnotsupportedDB": "Diese Spezialseite steht nicht zur Verfügung, da sie über den Parameter <tt>$wgUseDatabaseMessages</tt> deaktiviert wurde.",
        "allmessages-filter-legend": "Filter",
        "allmessages-filter": "Filter für angepassten Zustand:",
        "creditspage": "Seitenzuschreibung",
        "nocredits": "Für diese Seite sind keine Zuschreibungen vorhanden.",
        "spamprotectiontitle": "Spamschutzfilter",
-       "spamprotectiontext": "Der Text, die du speichern willst, wurde vom Spamschutzfilter blockiert.\nDas liegt wahrscheinlich an einem Link auf eine externe Seite.",
+       "spamprotectiontext": "Der Text, den du speichern möchtest, wurde vom Spamschutzfilter blockiert.\nDas liegt wahrscheinlich an einem Link auf eine externe Seite.",
        "spamprotectionmatch": "'''Der folgende Text wurde vom Spamfilter gefunden: ''$1'''''",
        "spambot_username": "MediaWiki-Spam-Säuberung",
        "spam_reverting": "Letzte Version ohne Links zu $1 wiederhergestellt.",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
        "mw-widgets-titleinput-description-new-page": "Seite ist noch nicht vorhanden",
        "mw-widgets-titleinput-description-redirect": "Weiterleitung nach $1",
-       "api-error-blacklisted": "Bitte einen anderen, aussagekräftigen Titel wählen.",
        "sessionmanager-tie": "Mehrere Anfrageauthentifikationstypen konnten nicht kombiniert werden: $1.",
        "sessionprovider-generic": "$1-Sitzungen",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "cookiebasierten Sitzungen",
        "log-action-filter-newusers": "Typ der Benutzerkontenerstellung:",
        "log-action-filter-patrol": "Kontrolltyp:",
        "log-action-filter-protect": "Schutztyp:",
-       "log-action-filter-rights": "Typ der Rechteänderung",
-       "log-action-filter-suppress": "Unterdrückungstyp",
+       "log-action-filter-rights": "Typ der Rechteänderung:",
+       "log-action-filter-suppress": "Unterdrückungstyp:",
        "log-action-filter-upload": "Hochladetyp:",
        "log-action-filter-all": "Alle",
        "log-action-filter-block-block": "Sperren",
        "linkaccounts-success-text": "Das Benutzerkonto wurde verknüpft.",
        "linkaccounts-submit": "Benutzerkonten verknüpfen",
        "unlinkaccounts": "Benutzerkonten trennen",
-       "unlinkaccounts-success": "Das Benutzerkonto wurde getrennt."
+       "unlinkaccounts-success": "Das Benutzerkonto wurde getrennt.",
+       "authenticationdatachange-ignored": "Die Änderung der Authentifizierungsdaten wurde nicht bearbeitet. Vielleicht wurde kein Anbieter konfiguriert?"
 }
index 59e3f52..ff38a07 100644 (file)
@@ -63,7 +63,7 @@
        "tog-watchlisthidecategorization": "Pera kategorizasyoni bınımne",
        "tog-ccmeonemails": "E-posteyanê ke ez karberanê binan rê rışenan, mı rê kopya inan bırışe",
        "tog-diffonly": "Qıyasê versiyonan de tek ferqan bımocne, pela butıne nê",
-       "tog-showhiddencats": "Kategoriyanê dızdiye bımocne",
+       "tog-showhiddencats": "Kategoriyanê nımneya bıasne",
        "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  greyo itimadın bıkarne",
        "march-gen": "Adar",
        "april-gen": "Nisane",
        "may-gen": "Gulane",
-       "june-gen": "Hezirane",
+       "june-gen": "Heziran",
        "july-gen": "Temuze",
        "august-gen": "Tebaxe",
        "september-gen": "Keşkelun",
        "march-date": "Adar $1",
        "april-date": "Nisane $1",
        "may-date": "Gulane $1",
-       "june-date": "Hezirane $1",
+       "june-date": "{{PLURAL:$1|1=1ᵉ|$1}} Heziran",
        "july-date": "Temuze $1",
        "august-date": "Tebaxe $1",
        "september-date": "Keşkelun $1",
        "category-empty": "''Ena kategoriye de hewna qet nuştey ya zi medya çıniyê.''",
        "hidden-categories": "{{PLURAL:$1|Kategoriya nımıtiye|Kategoriyê nımıtey}}",
        "hidden-category-category": "Kategoriyê nımıtey",
-       "category-subcat-count": "{{PLURAL:$2|Na kategoriya de $1 bınkategoriyay estê.|$2 kategoriyan ra $1 bınkategoriyay asenê.}}",
-       "category-subcat-count-limited": "Na kategoriye de {{PLURAL:$1|ena kategoriya bınêne esta|enê $1 kategoriyê bınêni estê}}.",
+       "category-subcat-count": "{{PLURAL:$2|Na kategoriya de $1 bınkategoriyay estê.|$2 kategoriyan ra $1 bınkategoriyay asenê.}} \n(K) Kategori (D) Dosya (P) Pela",
+       "category-subcat-count-limited": "Na kategoriya de {{PLURAL:$1|ena kategoriya bınên est a|enê $1 kategoriyay bınêni est ê}}.",
        "category-article-count": "{{PLURAL:$2|Na kategoriye de teyna ena pele esta.|Ebe $2 ra pêro piya {{PLURAL:$1|ena pela na kategoriye dera|$1 enê peli na kategoriye derê.}}}}",
        "category-article-count-limited": "{{PLURAL:$1|Pela cêrêne|$1 Pelê cêrêni}} na kategoriye derê.",
-       "category-file-count": "<noinclude>{{PLURAL:$2|Na kategoriye tenya dosyayanê cêrênan muhtewa kena.}}</noinclude>\n*Na kategoriye de $2 dosyayan ra {{PLURAL:$1|yew dosya tenêka esta| $1 dosyey asenê}}.",
+       "category-file-count": "<noinclude>{{PLURAL:$2|Na kategoriya tenya dosyanê cêrênan muhtewa kena.}}</noinclude>\n*Na kategoriya de $2 dosyan ra {{PLURAL:$1|yew dosya tenêka esta| $1 dosyay asenê}}.",
        "category-file-count-limited": "{{PLURAL:$1|Dosya cêrêne|$1 Dosyê cêrêni}} na kategoriye derê.",
        "listingcontinuesabbrev": "dewam...",
        "index-category": "Pelê endeksıni",
        "about": "Heqa cı de",
        "article": "Pela zerreki",
        "newwindow": "(pençereyê newey de beno a)",
-       "cancel": "Bıtexelne",
+       "cancel": "Peyd ke",
        "moredotdotdot": "Vêşi...",
        "morenotlisted": "Vêşi lista nêbi...",
        "mypage": "Pele",
        "toolbox": "Haceti",
        "userpage": "Pela karberi bıvêne",
        "projectpage": "Pela proceyi bıvêne",
-       "imagepage": "Pela dosya bımocne",
-       "mediawikipage": "Pela mesaci bımocne",
-       "templatepage": "Pela şabloni bımocne",
+       "imagepage": "Pera dosya bıasne",
+       "mediawikipage": "Pera mesaci bıasne",
+       "templatepage": "Pera şabloni bıasne",
        "viewhelppage": "Pela peşti bıvêne",
-       "categorypage": "Pela kategoriye bıvêne",
+       "categorypage": "Pela kategoriya bıasne",
        "viewtalkpage": "Werênayışi bıvêne",
        "otherlanguages": "Zıwananê binan de",
-       "redirectedfrom": "(Pele da $1 ra heteneyê)",
+       "redirectedfrom": "($1 ra kırışı yê)",
        "redirectpagesub": "Pela berdışi",
        "redirectto": "Beno hetê:",
        "lastmodifiedat": "Ena pele tewr peyên roca $2, $1 de biya rocaniye.",
        "virus-scanfailed": "cıgerayiş tamam nêbı (kod $1)",
        "virus-unknownscanner": "antiviruso ke nêzanyeno:",
        "logouttext": "'''Şıma hesabra newke vicyay.'''\n\nWexta ke verhafızayê cıgerayoxê şıma pak beno no benate de taye peli de hesabe şıma akerde aseno.",
+       "cannotlogoutnow-title": "Enewke ronıştışo nêracneyêno",
        "welcomeuser": "Ğeyr amey, $1!",
        "welcomecreation-msg": "Hesabê şıma abiyo.\n[[Special:Preferences|{{SITENAME}} vurnayişê tercihanê xo]], xo vir ra mekere.",
        "yourname": "Nameyê karberi:",
        "createacct-reason-ph": "Şımaye çı xo re zewbi hesab vırazeni?",
        "createacct-submit": "Hesabê xo vıraze",
        "createacct-another-submit": "Hesab vıraze",
+       "createacct-continue-submit": "Hesab vıraştışi rê devam ke",
+       "createacct-another-continue-submit": "Hesab vıraştışi rê dewam ke",
        "createacct-benefit-heading": "{{SITENAME}} meş de merduman şi",
        "createacct-benefit-body1": "{{PLURAL:$1|vurnayış|vurnayışi}}",
        "createacct-benefit-body2": "{{PLURAL:$1|wesiqe|wesiqey}}",
        "createacct-benefit-body3": "{{PLURAL:$1|iştıraqkerdoğo nıkayên|iştıraqkerdoğê nıkayêni}}",
        "badretype": "Parolayê ke şıma nuşti yewbini nêtepışneni.",
+       "usernameinprogress": "Qandê nê karberi hesab vıraştışondewamnkeno.  Tay bıpawê",
        "userexists": "Jewna karber enê nami karneno.\nMara reca xorê jewna name bınusnê.",
        "loginerror": "Xetayê hesab ekerdışi",
        "createacct-error": "Xetaya vıraştışê hesabi",
        "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 ferqıne 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",
        "resetpass-temp-password": "parolayo muweqet:",
        "resetpass-abort-generic": "Vurnayışê parola terefê yew niçıki ra texeliya.",
+       "resetpass-expired": "Dema parolay da şıma qedya ya. Qandê cıkewtışi u patolaya newi vıraz",
+       "resetpass-expired-soft": "Wahdey patolanda şıma qedya yo u vurnayış icab keno. Xorê yu parola weçinê yana bahdo weçinayışi rê butona \"{{int:authprovider-resetpass-skip-label}}\" 'i bıploğnê",
+       "resetpass-validity-soft": "Parolay şıma ravêrdi niya: $1\n\nXorê yu parola nışan bıkerê  uana bahdo sıfır kerdışi rê grey \"{{int:authprovider-resetpass-skip-label}}\" bıploğnê.",
        "passwordreset": "Parola reset ke",
        "passwordreset-text-one": "Na form de parola reset kerdış temamiye",
        "passwordreset-text-many": "{{PLURAL:$1|Qande parola yana e-posta reset kerdışi cayanra taynın pırkeri.}}",
        "passwordreset-emaildisabled": "Na wikid hısusiyeté e-posta dewera vıcyayé",
        "passwordreset-username": "Nameyê karberi:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "neticey e-postay bımocne?",
+       "passwordreset-capture": "neticey e-postay bıasne yo?",
        "passwordreset-capture-help": "Şıma na dorek morkerê se, e-posta (idareten eposta ya) şıma rê yana karbera rê rışêno.",
        "passwordreset-email": "Adresa e-postey:",
        "passwordreset-emailtitle": "Hesab timarê {{SITENAME}}",
        "passwordreset-emailsentemail": "Eke na seba hesabê şıma yew adresa e-posteyê qeydına, yew e-posteyê parola nênkerdışi rışiyeno.",
        "passwordreset-emailsent-capture": "Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo.",
        "passwordreset-emailerror-capture": "Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo, ema {{GENDER:$2|karber}}i rê rıştış de mıwefeq nêbi: $1",
+       "passwordreset-invalideamil": "Adresê eposta raşt niya",
        "changeemail": "E-posta adresa xo wedarne",
        "changeemail-header": "E-posya adresta hesabdê xo bıvurnê",
        "changeemail-no-info": "Şıma gani bıkewê pele ke derdest bıresê na pele.",
        "minoredit": "No yew vurnayışo werdiyo",
        "watchthis": "Ena pele seyr ke",
        "savearticle": "Pele qeyd ke",
+       "savechanges": "Vurnayışan qeyd ke",
        "publishpage": "Perer bıhesırne",
+       "publishchanges": "Vurnayışa vıla ke",
        "preview": "Verqayt",
-       "showpreview": "Verqayti bımocne",
-       "showdiff": "Vurnayışan bımocne",
+       "showpreview": "Verqayti bıasne",
+       "showdiff": "Vurriyayışan bıasne",
        "anoneditwarning": "<strong>İqaz:</strong> Şıma be hesabê xo nêkewtê cı. \nAdresê şımayê IP tarixê vırnayışê na pele de do qeyd bo. Eke şıma <strong>[$1 cıkewê]</strong> ya zi <strong>[$2 hesab vırazê]</strong>, vurnayışê şıma be zewbina kare ra nameyê şıma rê bar beno.",
        "anonpreviewwarning": "\"Şıma be hesabê xo nêkewtê cı. Eke qeyd kerê, adresê şımaê IP tarixê vırnayışê na pele de do qeyd bo.\"",
        "missingsummary": "'''DİQET:''' Şıma jû xulasa nênuşte.\nEke şıma \"{{int:savearticle}}\" reyna bıtıknê, vırnayışê şıma bê xulasa qeyd beno.",
        "confirmedittext": "Eka ti wazene binusi, adresê xo e-maili confirme bike.\nAdresê xo e-maili [[Special:Preferences|user preferences]] de confirme bike.",
        "nosuchsectiontitle": "Eno qısım çıniyo",
        "nosuchsectiontext": "To waşt ke yew qısım kewê, oyo ke çıniyo.\nHeta ke werte de qısım çıniyo, ca çıniyo ke tı raştkerdışê xo qeyd bıkerê.",
-       "loginreqtitle": "Cıkewtış lazımo",
+       "loginreqtitle": "Cı kewtış icab keno",
        "loginreqlink": "cı kewe",
        "loginreqpagetext": "Eka ti wazeno peleyanê bini bivini, ti gani $1.",
        "accmailtitle": "Paralo şirawiyayo.",
        "parser-template-recursion-depth-warning": "limitê şablonê newekerdışi biyo de ($1)",
        "language-converter-depth-warning": "xoritiya çarnekarê zıwanan viyarnê ra ($1)",
        "node-count-exceeded-category": "Pela ra hetê kotya amardışê cı ravêrya",
-       "node-count-exceeded-warning": "Amariya pela ravêrya.",
+       "node-count-exceeded-category-desc": "Pela azami amora gozgıray ravêr  da.",
+       "node-count-exceeded-warning": "Pela amora gozgıra ravêr da",
        "expansion-depth-exceeded-category": "Pela dı hetê canaya zoriya herayin ravêrya",
        "expansion-depth-exceeded-warning": "Ravêriya pela xori herayêna",
        "parser-unstrip-loop-warning": "Unstrip lete vineya",
        "viewpagelogs": "Seba na pele rê qeydan bımocne",
        "nohistory": "Verê vurnayışanê na pele çıniyo.",
        "currentrev": "Çımraviyarnayışo rocane",
-       "currentrev-asof": "Revizyonanê peniyan, tarixê $1",
+       "currentrev-asof": "$1 ra tepya mewcud weziyeta pela",
        "revisionasof": "Verziyonê roca $1ine",
        "revision-info": "Vurnayışo ke $1 de terefê {{GENDER:$6|$2}}$7 ra biyo",
        "previousrevision": "← Çımraviyarnayışo kıhanêr",
        "history-feed-description": "Wiki de tarixê çımraviyarnayışê na pele",
        "history-feed-item-nocomment": "$1 miyanê $2i de",
        "history-feed-empty": "Pela cıgeyrayiye çıniya.\nBeno ke ena esteriya, ya zi namê cı vuriyo.\nSeba pelanê muhimanê newan [[Special:Search|cıgeyrayışê wiki de]] bıcerebne.",
+       "history-edit-tags": "Etiketa weçinaye rewizyoni timar ke",
        "rev-deleted-comment": "(Timarkerdışe enay hewadeyayo)",
        "rev-deleted-user": "(nameyê karberi esteriyo)",
        "rev-deleted-event": "(fealiyetê cıkewtışi esteriyo)",
        "rev-suppressed-unhide-diff": "Nê Timarkerdışi ra yewi '''çap biyo'''.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rocaneyê vındertışi] de teferru'ati esti.\nEke şıma serkari u devam bıkeri [$1 no vurnayiş şıma eşkeni bıvini].",
        "rev-deleted-diff-view": "Jew timarkerdışê ena versiyon '''wedariyayo''.\nÎdarekarî şenê ena versiyon bivîne; belki tiya de [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} wedarnayişî] de teferruat esto.",
        "rev-suppressed-diff-view": "Jew timarkerdışê ena versiyon '''Ploxneyış'' biyo.\nÎdarekarî eşkeno ena dif bivîne; belki tiya de [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ploxnayış] de teferruat esto.",
-       "rev-delundel": "bımocne/bınımne",
+       "rev-delundel": "bıasne/bınımne",
        "rev-showdeleted": "bıasene",
        "revisiondelete": "Çımraviyarnayışan bestere/peyser biya",
        "revdelete-nooldid-title": "Çımraviyarnayışo waşte nêvêreno",
        "mergehistory-into": "Pela destinasyonî",
        "mergehistory-list": "tarixê vurnayîşî ke eşkeno yew bi.",
        "mergehistory-merge": "[[:$1]] qey ney revizyonê cêrini [[:$2]] şıma ekeni piyawani. Benatê wexto muwaqqet de piyayanayişê rezizyonan de tuşa radyo bıxebitne.",
-       "mergehistory-go": "Vernayîşê yewbiyayeni bimocne",
+       "mergehistory-go": "Yew bıyaye vurriyayışa bıasne",
        "mergehistory-submit": "revizyonî yew bike",
        "mergehistory-empty": "Revizyonî yew nibenê.",
        "mergehistory-done": "$1 ra $3 {{PLURAL:$3|revizyon|revizyoni}} [[:$2]] de {{PLURAL:$3|biyo|biyê}} têmiyan.",
        "mergelog": "Qeydé zew kerdışi",
        "revertmerge": "Abırnê",
        "mergelogpagetext": "Cêr de yew liste esta ke mocnena ra, raya tewr peyêne kamci pela tarixi be a bine ra şanawa pê.",
-       "history-title": "Tarixê çımraviyarnayışê \"$1\"",
+       "history-title": "Revizyona pela \"$1\"",
        "difference-title": "Pela \"$1\" ferqê çım ra viyarnayışan",
        "difference-title-multipage": "Ferkê pelan dê \"$1\" u \"$2\"",
        "difference-multipage": "(Ferqê pelan)",
        "search-category": "(kategori $1)",
        "search-file-match": "(zerreyê dosya yewbini gêno)",
        "search-suggest": "To va: $1",
-       "search-rewritten": "Neticey $ asenê.  Herunda ney wa neticey $2  bıasê",
+       "search-rewritten": "Neticey $ ra asenê.  Herunda ney wa neticey $2 ra bıasê?",
        "search-interwiki-caption": "Proceyê bıray",
        "search-interwiki-default": "$1 ra neticey:",
        "search-interwiki-more": "(véşi)",
        "powersearch-togglelabel": "Kontrol ke:",
        "powersearch-toggleall": "Pêro",
        "powersearch-togglenone": "Çıniyo",
+       "powersearch-remember": "Cıgeyrayışanê newe tepyayan de biya xo viri",
        "search-external": "Cıgeyrayışê teberi",
        "searchdisabled": "{{SITENAME}} no keyepel de cıgerayiş muweqqet bıryayo. no benatê de şıma pê Google eşkeni zerreyê {{SITENAME}} de cıgerayiş bıkeri.",
        "search-error": "Cıgeyrayış de yew xeta emê meydan: $1",
        "prefs-personal": "Pela karberi",
        "prefs-rc": "Vurriyayışê peyêni",
        "prefs-watchlist": "Lista seyrkerdışi",
+       "prefs-editwatchlist": "Lista seyrkerdışi bıvurne",
+       "prefs-editwatchlist-label": "Listey serkerdışanê cıkewtışi timar kerê",
+       "prefs-editwatchlist-edit": "Sernamanê listey serkerdışanê xo bıasne u timar kerê",
+       "prefs-editwatchlist-raw": "Lista seyrkerdışia xame bıvurne",
+       "prefs-editwatchlist-clear": "Lista serykerdışê xo pak kerê",
        "prefs-watchlist-days": "Rocê ke lista seyrkerdışi de bêrê ramocnaene",
        "prefs-watchlist-days-max": "tewr vêşi $1 {{PLURAL:$1|roci|roci}}",
        "prefs-watchlist-edits": "tewr zêde amarê vurnayışi ke lista seyrkerdışia herakerdiye de bıasê:",
        "prefs-watchlist-token": "Lista seyrkerdışia nışani:",
        "prefs-misc": "ê bini",
        "prefs-resetpass": "Parola bıvurne",
-       "prefs-changeemail": "E-postay bıvurne",
+       "prefs-changeemail": "E-postay bıvurne yana wedarne",
        "prefs-setemail": "E-posta adresiyê xo saz kerê",
        "prefs-email": "Tercihê e-maili",
        "prefs-rendering": "Asayış",
        "rows": "Xeti:",
        "columns": "Estûni:",
        "searchresultshead": "Cı geyre",
-       "stub-threshold": "Qandé <a href=\"#\" class=\"stub\">Taslağ  formati</a> sinor (bayti):",
+       "stub-threshold": "Qandé Taslağ  formati  sinor:$1",
+       "stub-threshold-sample-link": "misal",
        "stub-threshold-disabled": "Astengın",
        "recentchangesdays": "Rocê ke vurnayışanê peyênan de bıasê:",
        "recentchangesdays-max": "Tewr zaf $1 {{PLURAL:$1|roc|roci}}",
        "prefs-help-recentchangescount": "Ney de vurnayışê peyêni, tarixê pelan u cıkewteni asenê.",
        "prefs-help-watchlist-token2": "Na pawıtış nımnayi kılta listada şımaya.\nOke kıliti zano şeno listeya tamaşann bıvino. Poğta coy ra kesiya me hesırne. \n[[Special:ResetTokens|Na kıliti reset kerdışi re tiyay bıploğne]].",
        "savedprefs": "Tecihê şıma qeyd biy.",
+       "savedrights": "Qandé {{GENDER:$1|$1}} heqê karberi qeyd  biye.",
        "timezonelegend": "Warey saete:",
        "localtime": "saeta mehelliye:",
        "timezoneuseserverdefault": "Zey karkerdışê Wiki ($1)",
        "badsig": "Îmzayê tu raşt niyo.\nEtiketê HTMLî kontrol bike.",
        "badsiglength": "İmzaya şıma zaf derga.\nA gani be $1 {{PLURAL:$1|karakter|karakteran}} ra zêde mebo.",
        "yourgender": "Şeklê xitabi?",
-       "gender-unknown": "Ez detay nivana",
+       "gender-unknown": "Çımhal tı kerdê etiket, Nusner do çekuya Nerimaki cinsiyeti de şeno bıkar no",
        "gender-male": "Perané wiki camérd deyne ezo vırnena",
        "gender-female": "Perané wiki cıni deyne eza vırnena",
        "prefs-help-gender": "Na tercih keyfiya.\nNa nustenek ercana qısan de qandé grameri karneyéna, na malumater herkes şeno bıvino .",
        "prefs-advancedrendering": "Tercihê raverberdey",
        "prefs-advancedsearchoptions": "Tercihê raverberdey",
        "prefs-advancedwatchlist": "Tercihê raverberdey",
-       "prefs-displayrc": "Tercihan bımocne",
+       "prefs-displayrc": "Tercihê asenayışi",
        "prefs-displaywatchlist": "Weçinayışê mocnayışi",
        "prefs-tokenwatchlist": "Morge",
        "prefs-diffs": "Ferqi",
        "userrights": "İdarey heqanê karberan",
        "userrights-lookup-user": "Grubanê karberi/karbere idare bıke",
        "userrights-user-editname": "Yew nameyê karberi cı kewe:",
-       "editusergroup": "Grupanê karberi/karbere bıvurne (bıbedelne)",
-       "editinguser": "'''[[User:$1|$1]]''' keno weziyetê $2'i bıvurno",
+       "editusergroup": "Grupanê {{GENDER:$1|karberi}} bıvurne",
+       "editinguser": "{{GENDER:$1|karber}} [[User:$1|$1]] heqanê $2'i vurne no",
        "userrights-editusergroup": "Grubanê karberi/karbere sero bıgureye (bıxebetiye)",
-       "saveusergroups": "Grubanê karberi qeyd bıke",
+       "saveusergroups": "Grubanê {{GENDER:$1|karberi}} qeyd bıke",
        "userrights-groupsmember": "Ezayê:",
        "userrights-groupsmember-auto": "Ezao daxıl/ezaa daxıle ê:",
        "userrights-groups-help": "şıma şenê grubanê nê karberi/na karbere, oyo/aya ke tede, bıvurnê:\n* qutiya ke nışankerdiya, mocnena ke karber/e na grube dero/dera.\n* qutiya ke nışankerdiye niya, mocnena ke karber/ na grube de niyo/niya.\n* Yew estare * mocneno ke, gruba ke şıma kerda ra ser (daxıl kerda), şıma nêşenê wedarê/hewa dê ya ki dêmlaşta/tersê cı.",
        "right-createpage": "Pele vıraze (pelê ke ê werênayışi niyê)",
        "right-createtalk": "Pela werênayışi vıraze",
        "right-createaccount": "Hesabê karberi vıraze",
+       "right-autocreateaccount": "Xarici yew name dê karberi ya ronıştış ake",
        "right-minoredit": "Vurnayışan qıckek nışan bıde.",
        "right-move": "Pele bere",
        "right-move-subpages": "Pele be bınpelanê cı ra pia bere",
        "right-override-export-depth": "Peleyanê ke tede linkanê 5 ra zafyer estê ay export bike",
        "right-sendemail": "Karberanê binî ra e-mail bişirav",
        "right-passwordreset": "E-postayanê parola reset kerdışa vineno",
+       "right-managechangetags": "[[Special:Tags|Etiketi]] vıraz u aktiv (me)ke",
+       "right-applychangetags": "[[Special:Tags|Etiketa]]  vurnayışana piya dezge fi.",
+       "grant-group-email": "e-poste bırışe",
+       "grant-group-customization": "Şexsi kerdış u tercihi",
+       "grant-group-other": "Enwayi babet aktivitey",
+       "grant-blockusers": "Karberi men ke u meni wedarne",
+       "grant-createaccount": "Hesab vıraze",
+       "grant-createeditmovepage": "Perer vırazê, bıvurnê u berê",
+       "grant-editmyoptions": "Tercihanê xo bıvurne",
+       "grant-editmywatchlist": "Listeyseyran de xo bıvırne",
+       "grant-editpage": "Peran bıvurnê",
+       "grant-editprotected": "Srar bıyaye peran bıvurnê",
+       "grant-patrol": "Perer de vurnayışa çımra ravyarn",
        "newuserlogpage": "Cıkewtışê hesabvıraştışi",
        "newuserlogpagetext": "Ena log de viraştişê karberî esta.",
        "rightslog": "Qeydê heqanê karberi",
        "enhancedrc-history": "tarix",
        "recentchanges": "Vurriyayışê peyêni",
        "recentchanges-legend": "Tercihê vurnayışanê peyênan",
-       "recentchanges-summary": "Ena pele de wiki sero vurnayışanê peyênan teqib ke.",
+       "recentchanges-summary": "wiki sero vurnayışanê peyênan ena perer ra teqib ke.",
        "recentchanges-noresult": "Goreyê kriteranê kıfşkerdeyan ra qet yew vurnayış nêvêniya.",
        "recentchanges-feed-description": "Ena feed dı vurnayişanê tewr peniyan teqip bık.",
        "recentchanges-label-newpage": "Enê vurnayışi ra yew pela newiye vıraziye",
        "recentchanges-legend-heading": "<strong>Kıtabek:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|Lista pelanê neweyan]] zi bıvêne)",
        "recentchanges-legend-plusminus": "''(±123)''",
-       "recentchanges-submit": "Bıasene",
+       "recentchanges-submit": "Bıasne",
        "rcnotefrom": "Cêr de <strong>$2</strong> ra nata vurnayışiyê asenê (tewr vêşi <strong>$1</strong> asenê).",
        "rclistfrom": "$3 $2 ra tepiya vurnayışanê neweyan bımocne",
        "rcshowhideminor": "vurnayışê werdiyi $1",
-       "rcshowhideminor-show": "Bıasene",
+       "rcshowhideminor-show": "Bıasne",
        "rcshowhideminor-hide": "Bınımne",
        "rcshowhidebots": "botan $1",
        "rcshowhidebots-show": "Bıasene",
        "rcshowhidebots-hide": "Bınımne",
        "rcshowhideliu": "karberê qeydbiyayeyi $1",
-       "rcshowhideliu-show": "Bıasene",
+       "rcshowhideliu-show": "Bıasne",
        "rcshowhideliu-hide": "Bınımne",
        "rcshowhideanons": "karberê bênameyi $1",
        "rcshowhideanons-show": "Bıasene",
        "rcshowhideanons-hide": "Bınımne",
        "rcshowhidepatr": "$1 vurnayışê ke dewriya geyrayê",
-       "rcshowhidepatr-show": "Bıasene",
+       "rcshowhidepatr-show": "Bıasne",
        "rcshowhidepatr-hide": "Bınımne",
        "rcshowhidemine": "vurnayışanê mı $1",
-       "rcshowhidemine-show": "Bıasene",
+       "rcshowhidemine-show": "Bıasne",
        "rcshowhidemine-hide": "Bınımne",
        "rcshowhidecategorization": "kategorizasyonê pele $1",
        "rcshowhidecategorization-show": "Bıasne",
        "rcshowhidecategorization-hide": "Bınımne",
-       "rclinks": "Peyniya $2 rocan de $1 vurnayışan bımocne <br />$3",
+       "rclinks": "$2 rocan de $1 vurriyayışanê peyênan bıasne <br />$3",
        "diff": "ferq",
        "hist": "verên",
        "hide": "Bınımne",
        "apihelp": "Peştiya APIyi",
        "apihelp-no-such-module": "Modulê \"$1\" çıniyo.",
        "apisandbox": "API qumdor",
+       "apisandbox-fullscreen": "Panela hera kerdışi",
        "apisandbox-submit": "Bıwazê",
        "apisandbox-reset": "Bestere",
+       "apisandbox-retry": "Fına",
        "apisandbox-examples": "Misali",
        "apisandbox-dynamic-parameters": "Parametreya debyayi",
        "apisandbox-dynamic-parameters-add-label": "Parametre dek:",
        "apisandbox-dynamic-parameters-add-placeholder": "Nmaey parametrey",
+       "apisandbox-submit-invalid-fields-title": "Tay çiy ters şı",
        "apisandbox-results": "Neticey",
        "apisandbox-sending-request": "API waştış rışêno...",
        "apisandbox-request-url-label": "URL waştış:",
-       "apisandbox-request-time": "Demê waştışi: $1",
+       "apisandbox-request-time": "Demê waştışi: {{PLURAL:$1|$1 ms}}",
        "booksources": "Çımeyê kıtaban",
        "booksources-search-legend": "Seba çımeyanê kıtaban cı geyre",
        "booksources-isbn": "ISBN:",
        "checkbox-select": "Weçinaye: $1",
        "checkbox-all": "Pêro",
        "checkbox-none": "Temam",
+       "checkbox-invert": "Doç kerdış",
        "allpages": "Peli pêro",
        "nextpage": "Pela badê cû ($1)",
        "prevpage": "Pela verêne ($1)",
-       "allpagesfrom": "Pelanê ke be ena herfe dest pêkenê bımocne",
+       "allpagesfrom": "Pera liste kerdışi bıasne:",
        "allpagesto": "Pelanê ke be ena herfe qediyenê bımocne:",
        "allarticles": "Wesiqey pêro",
        "allinnamespace": "Peli pênro ( $1 cayênameyî)",
        "listgrouprights-removegroup-self-all": "şıma hesabê xo ra eşkeni heme gruban bıveci",
        "listgrouprights-namespaceprotection-header": "Kılm kerdena nameyan",
        "listgrouprights-namespaceprotection-namespace": "Heruna nami",
+       "listgrants": "Hibey",
+       "listgrants-grant": "Hibe",
+       "listgrants-rights": "Heqi",
        "trackingcategories": "Kategoriyê teqibi",
        "trackingcategories-msg": "Kategoriya teqibi",
        "trackingcategories-name": "Namey mesaci",
        "mywatchlist": "Lista seyrkerdışi",
        "watchlistfor2": "Qandê $1 ($2)",
        "nowatchlist": "listeya temaşa kerdıişê şıma de yew madde zi çina.",
-       "watchlistanontext": "qey vurnayişê maddeya listeya temaşakerdişi $1.",
+       "watchlistanontext": "qey vurnayişê maddeya listeya temaşakerdiş ronıştış akerê",
        "watchnologin": "Şıma cıkewtış nêvıraşto",
        "addwatch": "Lista seyrkerdışi ke",
-       "addedwatchtext": "Ma pele \"[[:$1]]\" zerri [[Special:Watchlist|watchlist]]ê tı kerd de.\nEna deme ra, ma qe vurnayışan ser ena pele tı haberdar keni.",
+       "addedwatchtext": "Ma pele \"[[:$1]]\" zerri [[Special:Watchlist|listeya seyri]] tı kerd de.\nEna deme ra, ma qe vurnayışan ser ena pele tı haberdar keni.",
+       "addedwatchtext-short": "Pera $1`i çebyê listeya seyran de şıma",
        "removewatch": "Lista seyrkerdışi ra wedare",
        "removedwatchtext": "Ena pela \"[[:$1]]\" biya wedariya [[Special:Watchlist|listeyê seyr-kerdışi şıma]].",
        "watch": "Seyr ke",
        "wlshowlast": "Peyni de vurnayışan ra  $1 seata u $2 roca  bımocnê",
        "watchlist-hide": "Bınımne",
        "watchlist-submit": "Bıasene",
-       "wlshowtime": "Peyênan bımocne:",
+       "wlshowtime": "Periyoda zemani asenayışi:",
        "wlshowhideminor": "vurnayışê werdiyi",
        "wlshowhidebots": "boti",
        "wlshowhideliu": "karberê qeydıni",
        "restriction-level-sysop": "tam pawiyayo",
        "restriction-level-autoconfirmed": "nêm pawiyayo",
        "restriction-level-all": "kamci be sewiya",
-       "undelete": "Peleyê ke besterneyayê enê bımocnê",
+       "undelete": "Peranê esteryayan bıasne",
        "undeletepage": "bıewn revizyonê peli yê hewn a şiyayeyan u tepiya biyar",
        "undeletepagetitle": "'''pelo [[:$1|$1]] cêrın, wayirê revizyonê hewn a şiyayeyan o'''.",
        "viewdeletedpage": "Pelanê esteriyayeyan bımocne",
        "undeletebtn": "Timar bike",
        "undeletelink": "bıvêne/peyser biya",
        "undeleteviewlink": "bıvin",
-       "undeleteinvert": "Weçinıtışi açarne",
+       "undeleteinvert": "Weçinayışi dimlaşt ke",
        "undeletecomment": "Sebeb:",
        "undeletedrevisions": "pêro piya{{PLURAL:$1|1 qeyd|$1 qeyd}} tepiya anciya.",
        "undeletedrevisions-files": "{{PLURAL:$1|1 revizyon|$1 revizyon}} u {{PLURAL:$2|1 dosya|$2 dosya}} ameyê halê xo yê verıni",
        "undelete-show-file-confirm": "\"<nowiki>$1</nowiki>\" şıma emin î dosyaya revizyonê no $2 $3 tarixi bıvini?",
        "undelete-show-file-submit": "Eya",
        "namespace": "Heruna nameyi:",
-       "invert": "Weçinıtışi açarne",
+       "invert": "Weçinayışi dimlaşt ke",
        "tooltip-invert": "nameyo ke nışan biyo (u nameyo elekeyın zi nışanyyayo se) vurnayışan  zerrekan nımtışi re ena dore tesdiqi nışan kerê",
        "namespace_association": "Heruna nameyanê elaqedaran",
        "tooltip-namespace_association": "Herunda canemiya elekeyın nışan kerdışi sero qıse kerdışi yana zerre dekerdışi rê ena dora tesdiqi nışan kerê",
        "blanknamespace": "(Ser)",
-       "contributions": "Dekerdışê {{GENDER:$1|karber}}i",
+       "contributions": "İştiraqê {{GENDER:$1|karber}}i",
        "contributions-title": "Dekerdenê karber de $1",
        "mycontris": "İştıraqi",
        "anoncontribs": "İştıraqi",
        "pageinfo-category-pages": "Amarê pelan",
        "pageinfo-category-subcats": "Amarê bınkategoriyan",
        "pageinfo-category-files": "Amarê dosyeyan",
-       "markaspatrolleddiff": "Nişan bıke ke dewriya biyo",
-       "markaspatrolledtext": "Ena pele nişan bike ke devriye biyo",
+       "markaspatrolleddiff": "Kontrol biyayi nışan ke",
+       "markaspatrolledtext": "Ena pele kontrol biyayi nışan ke",
        "markedaspatrolled": "Nişan biyo ke verni de devriye biyo",
        "markedaspatrolledtext": "Versiyone weçinaye [[:$1]] nişan biyo ke devriye biyo",
        "rcpatroldisabled": "Dewriyaya vurnayışê peyêni nêxebetiyena",
        "file-info-png-frames": "$1 {{PLURAL:$1|çerçeve|çerçeveyi}}",
        "file-no-thumb-animation": "'''Not: Dılet tekniko limit, gırd agozneya resm de qıckek de animasyoni miyan dı nêbo.'''",
        "file-no-thumb-animation-gif": "'''Not: Dılet tekniko limit, gırd agozneya resm de qıckek de  GIF imaci de animasyon do nêbo.'''",
-       "newimages": "Galeriye Dosyan dê newan",
+       "newimages": "Galeriya dosyanê neweyan",
        "imagelisttext": "Cêr de yew listeyê '''$1''' esto {{PLURAL:$1|dosya|dosyayi}} veçiniya $2.",
        "newimages-summary": "Ena pela xasi dosyayi ke peni de bar biyayeyi mocnane.",
        "newimages-legend": "Avrêc",
        "variantname-shi": "shi",
        "metadata": "Melumato serên",
        "metadata-help": "Ena dosya dı zafyer informasyoni esto. Belki ena dosya yew kamareyo dijital ya zi skaner ra vıraziyo.\nEg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.",
-       "metadata-expand": "Detayan bımocne",
+       "metadata-expand": "Detayan bıasne",
        "metadata-collapse": "melumati bınımne",
        "metadata-fields": "Resımê meydanê metadataê ke na pele de benê lista, pela resımmocnaene de ke tabloê metadata gına waro, gureniyenê.\nÊ bini zey sayekerdoğan nımiyenê.\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-langitem": "'''$2:''' $1",
        "autosumm-replace": "Maqale pê '$1' vuriya",
        "autoredircomment": "heteneya [[$1]]",
        "autosumm-new": "Pela vıraziyê, '$1' bıvinê",
-       "size-bytes": "$1 B",
+       "size-bytes": "$1 {{PLURAL:$1|bayt|bayti}}",
        "size-kilobytes": "$1 KB",
        "size-megabytes": "$1 MB",
        "size-gigabytes": "$1 GB",
        "tags-create-tag-name": "Nameyê etiketi:",
        "tags-create-reason": "Sebeb:",
        "tags-create-submit": "Vıraze",
+       "tags-edit-reason": "Sebeb:",
        "comparepages": "Pela miqeyese ke",
        "compare-page1": "Pele 1",
        "compare-page2": "Pele 2",
        "feedback-bugcheck": "Harika! Sadece [xırabina ke $1 ] çınyayışê cı kontrol keno.",
        "feedback-bugnew": "Mı qontrol ke. Xetaya newi xeber ke",
        "feedback-bugornote": "Jew mersela teferruato teknik esta şıma reca malumatê şıma hazıro se [ $1  jew xırab rapor] bıvinê.Zewbi zi, formê cerê xo rê şenê karfiyê. Vatışê xo pela da \"[ $3  $2 ]\", namey karber dê xoya piya u wasteriya karfiye.",
-       "feedback-cancel": "Bıtexelne",
+       "feedback-cancel": "Peyd ke",
        "feedback-close": "Biya star",
        "feedback-error1": "Xeta: API ra neticey ne vıcyay",
        "feedback-error2": "Xeta: Timar kerdış nebı",
        "special-characters-title-minus": "işaretê kemiye",
        "mw-widgets-dateinput-placeholder-day": "SSSS-AA-RR",
        "mw-widgets-dateinput-placeholder-month": "SSSS-AA",
-       "mw-widgets-titleinput-description-redirect": "berd be $1",
-       "api-error-blacklisted": "Reca keme zewbina weçine, name wa şınasnaye bo."
+       "mw-widgets-titleinput-description-redirect": "berd be $1"
 }
index a51080f..30421d7 100644 (file)
        "createacct-yourpasswordagain": "पासवर्ड निश्चित गर",
        "createacct-yourpasswordagain-ph": "आजी पासवर्ड लेख",
        "userlogin-remembermypassword": "मुलाई अघाडी झान्या काम गराइराख्या",
+       "userlogin-signwithsecure": "सुक्षित जडान प्रयोग गद्द्या",
+       "cannotloginnow-title": "अईल भितर झान नाइँ पाईनो",
+       "cannotloginnow-text": "भितर जान असंभव छ जब प्रयोग $1|",
        "yourdomainname": "तमरो ज्ञानक्षेत्र(डोमेन):",
        "password-change-forbidden": "ये विकिमी पासवर्ड परिवर्तन गर्न सक्नुहुन्न।",
        "login": "प्रवेश (लगईन)",
        "createacct-reason": "कारण",
        "createacct-reason-ph": "क्याई तम नयाँ खाता खोल्ला छौ?",
        "createacct-submit": "तमरो खाता सिर्जना गर",
-       "createacct-another-submit": "दà¥\8bसरà¥\8b à¤\96ाता à¤¸à¤¿à¤°à¥\8dà¤\9cना à¤\97र",
+       "createacct-another-submit": "à¤\96ाता à¤\96à¥\8bल",
        "createacct-continue-submit": "खाता खोल्लु जारि राख",
        "createacct-another-continue-submit": "खाता खोल्लु जारि राख",
        "createacct-benefit-heading": "{{SITENAME}} तम जसाई मान्सुनले सिर्जना गरिया हो ।",
        "minoredit": "यो नानो सम्पादन हो",
        "watchthis": "यै पानाको ध्यान राख",
        "savearticle": "सङ्ग्रह गर",
+       "savechanges": "परिवर्तन सुरक्षित गर",
        "publishpage": "प्रकाशित पृष्ठ",
+       "publishchanges": "परिवर्तन प्रकाशित गर",
        "preview": "पूर्वावलोकन",
        "showpreview": "पूर्वालोकन धेकाउन्या",
        "showdiff": "परिवर्तन धेकाउन्या",
        "anoneditwarning": "<strong>चेतावनी:</strong> तमले प्रवेश अरेको नाइथिन । तमरो आइपि ठेगाना पाना सम्पादन इतिहासमि दर्ता गरिन्या छ र यो सब्बैले हेद्द सक्कान । यदि तमलाईँ <strong>[$1 लगईन]</strong> वा <strong>[$2 नयाँ खाता बनाउन्या] गर्याभण्या तमबठे गरियाको सम्पादन तमरो प्रयोगकर्तानाममि जोडिन्याछ ।",
        "missingsummary": "'''यादगर्या :''' तमीले सम्पादन सारांश दियाका छैनौ ।\nयदि तमीले \"{{int:savearticle}}\"  थिच्यौ भण्या , सारांश बिना नै सङ्ग्रहित गरिन्या छ ।",
        "selfredirect": "<strong>चेतावनी:</strong> तम यै पानालाई आफुमी पुनः निर्देशित गद्द लाग्याछौ ।\nहुनसक्छ तम अनुप्रेषितको लागि गलत लक्ष्य निर्दिष्ट गद्द लाग्याछौ, वा गलत पानाको सम्पादन गद्द लाग्याछौ ।\nतम पुनः एकपल्ट \"{{int:savearticle}}\" क्लिक गद्दाछौ, पुनः निर्देशित तसै लै बनाइन्याछ।",
-       "missingcommentheader": "'''याद गर :''' तमीले टिप्पणीमी विषय /शीर्ष पंक्ति  दियाका छैनौ ।\nतमीले फेरि \"{{int:savearticle}}\"  थिच्यौ भण्या , तमरो सम्पादन यसै रुपमी संग्रहित हुन्याछ ।",
+       "missingcommenttext": "कृपया तलतिर टिप्पणी राख ।",
+       "missingcommentheader": "'''याद गर :''' तमले टिप्पणीमी विषय /शीर्ष पंक्ति  दियाका छैनौ ।\nतमले फेरि \"{{int:savearticle}}\"  थिच्यौ भण्या , तमरो सम्पादन यसै रुपमी संग्रहित हुन्याछ ।",
        "summary-preview": "सारांश पूर्वालोकन:",
        "subject-preview": "विषय पूर्वरुप:",
        "previewerrortext": "तमरो परिवर्तनको पूर्वावलोकन बनाउन खोज्दा समस्या आयाको छ ।",
        "timezoneregion-asia": "एसिया",
        "timezoneregion-atlantic": "एट्लान्टिक महासागर",
        "timezoneregion-australia": "अष्ट्रेलिया",
+       "timezoneregion-europe": "युरोप",
        "timezoneregion-indian": "हिन्द महासागर",
+       "timezoneregion-pacific": "प्राशान्त महासागर",
+       "allowemail": "और प्रयोगकर्ताबठे पौन्या ईमेल सक्षम गर।",
+       "prefs-searchoptions": "खोज",
+       "prefs-namespaces": "नामठौर:",
+       "default": "पूर्वनिर्धारित",
        "prefs-files": "फाइलहरू",
+       "prefs-custom-css": "अनुकुलित CSS",
+       "prefs-custom-js": "अनुकुल जाभास्क्रिप्ट",
+       "prefs-common-css-js": "साझा CSS/जाभा स्क्रिप्ट सबै कि लेखा:",
+       "prefs-reset-intro": "तम ये पृष्ठलाई आफनो अभिरुचीहरू साइट पूर्वावस्थामी फर्काउनत फर्काउन प्रयोग गद्दु सकन्छौ । तै पाछा ये लाई रद्द गद्दु सकन्छौ ।",
+       "prefs-emailconfirm-label": "इ-मेल एकिन प्रक्रिया:",
        "youremail": "ईमेल",
+       "username": "{{लिंग:$1|प्रयोगकर्ता नाम}}:",
+       "prefs-memberingroups": "निम्न {{बहुबचन:$1|समूह | समूहहरू}}को {{लिंग:$2|सदस्य}} :",
+       "prefs-registration": "दर्ता समय:",
        "yourrealname": "वास्तविक नाम:",
        "yourlanguage": "भाषा",
+       "yourvariant": "लेखको भाषा संस्करण:",
        "yournick": "नयाँ हस्ताक्षर:",
        "prefs-help-signature": "कुरडी पानाका टिप्पणीहरू \"<nowiki>~~~~</nowiki>\" द्वारा दस्तखत गरिनुपडन्छ ,त्यो पछि तमरो दस्तखत र समयरेखामी रुपान्तरित हुनेछ ।",
        "badsiglength": "तमरो दस्तखत मैथै लामो छ।\nयो $1 {{PLURAL:$1|अक्षर|अक्षरहरू}} भन्दा लामो हुनु हुँदैन ।",
+       "gender-male": "उ विकि पृष्ठहरू सम्पादन गरन्छ",
+       "gender-female": "तीन विकि पृष्ठहरु गरिन्छिन",
        "email": "ईमेल",
        "prefs-help-realname": "वास्तविक नाम ऐच्छिक हो ।\nतमीले खुलायौ भण्या तमरो कामको श्रेय दिनको लेखा यैको प्रयोग गरिन्या छ ।",
        "prefs-help-email-required": "इमेल ठेगाना चाहिन्छ ।",
        "grouppage-autoconfirmed": "{{एनयस:आयोजना}}:स्वनिर्धारित प्रयोगकर्ताहरू",
        "grouppage-bot": "{{एनयस:आयोजना}}:बोटहरु",
        "grouppage-sysop": "{{एनयस:आयोजना}}:प्रबन्धकहरु",
-       "grouppage-bureaucrat": "{{à¤\8fनयस:à¤\86यà¥\8bà¤\9cना}}:पà¥\8dरशासà¤\95हरà¥\81",
+       "grouppage-bureaucrat": "{{à¤\8fनयस:à¤\86यà¥\8bà¤\9cना}}:पà¥\8dरशासà¤\95हरà¥\82",
        "grouppage-suppress": "{{एनयस:आयोजना}}:लुकौन्या",
        "right-read": "पृष्ठहरू पढ",
        "right-edit": "पृष्ठहरू सम्पादन गर",
        "right-deletedtext": "मेट्याका संशोधन बीचका मेट्याका पाठ र परिवर्तनहरू हेद्या",
        "right-suppressionlog": "व्यक्तिगत लगहरू हेद्या",
        "right-block": "अरु प्रयोगकर्तानलाई सम्पादन गद्दाकी ब्लक गर",
+       "right-unblockself": "आफुलाई खुल्ला गर ।",
        "right-editprotected": "\"{{int:protect-level-sysop}}\" को हैसियतले सुरक्षित पानाहरू सम्पादन गद्या",
        "right-editusercssjs": "अन्य प्रयोगकर्ताको सी.एस.एस. रे जाभास्क्रिप्ट फाइलहरू सम्पादन गद्या",
        "right-editusercss": "अन्य प्रयोगकर्ताको सी. एस. एस. फाइलहरू सम्पादन गद्या",
index 6620701..8e70898 100644 (file)
@@ -6,7 +6,8 @@
                        "MF-Warburg",
                        "Ushau97",
                        "Zhatre",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "Glaisher"
                ]
        },
        "tog-hideminor": "ކުދި އުނި އިތުރުތައް އެންމެފަހުގެ ބަދަލުތަކުގެ ލިސްޓުން ފޮރުއްވަވާ",
        "nav-login-createaccount": "ވަންނަވާ / މެންބަރަކަށް ވެވަޑައިގަންނަވާ",
        "userlogin": "ވަންނަވާ / މެންބަރަކަށް ވެ ވަޑައިގަންނަވާ",
        "userloginnocreate": "ވަދެވަޑައިގަންނަވާ",
-       "logout": "ބޭރަށް ވަޑައިގަންނަވާ",
+       "logout": "ބޭރަށްވަޑައިގަންނަވާ",
        "userlogout": "ބޭރަށް ވަޑައިގަންނަވާ",
        "nologin": "މެމްބަރުކަން ހާސިލް ކުރައްވާފައި ނުވޭތޯ؟ '''$1'''",
        "nologinlink": "މެމްބަރުކަން ހާސިލް ކުރައްވާ!",
        "acct_creation_throttle_hit": "މި ވިކީ އަށް ތިބޭފުޅާގެ އައިޕީ އެޑްރެސް އިން ފާއިތުވެދިޔަ 24 ގަޑިއިރު ތެރޭ {{PLURAL:$1|1 އެކައުންޓް|$1 އެކައުންޓްތައް}} ހައްދަވާފައިވެއެވެ. އެއީ މި މުއްދަތު ތެރޭގައި ހެއްދެވޭނެ އެންމެ ގިނަ ޢަދަދެވެ.\nއެހެންކަމުން މި ވަގުތު އިތުރު އެކައުންޓެއް ނުހެއްދެވޭނެއެވެ. އެހެން ވަގުތެއްގައި އަދި މަސައްކަތް ކޮށްލައްވާށެވެ.",
        "accountcreated": "އެކައުންޓް ހެދިއްޖެއެވެ.",
        "loginlanguagelabel": "ބަސް: $1",
+       "pt-userlogout": "ބޭރަށްވަޑައިގަންނަވާ",
        "changepassword": "ސިއްރުބަސް ބަދަލުކުރައްވާ",
        "resetpass_header": "އެކައުންޓްގެ ސިއްރުބަސް ބަދަލުކުރައްވާ",
        "oldpassword": "ކުރީގެ ސިއްރުބަސް:",
        "resetpass-submit-loggedin": "ސިއްރުބަސް ބަދަލުކުރައްވާ",
        "resetpass-submit-cancel": "މަންސޫޚް",
        "passwordreset": "ސިއްރުބަސް އައު ކުރައްވާ",
-       "passwordreset-legend": "ސިއްރުބަސް އައު ކުރައްވާ",
        "passwordreset-email": "އީމެއިލް އެޑްރެސް:",
        "changeemail": "އީމެއިލް އެޑްރެސް ބަދަލުކުރައްވާ",
+       "changeemail-header": "އެކައުންޓްގެ އީމެއިލް އެޑްރެސް ބަދަލުކުރައްވާ",
        "changeemail-oldemail": "މިހާރު ބޭނުންކުރާ އީމެއިލް އެޑްރެސް:",
        "changeemail-newemail": "އައު އީމެއިލް އެޑްރެސް:",
        "changeemail-password": "ތިޔަބޭފުޅާގެ {{SITENAME}} ސިއްރުބަސް:",
        "lockdb": "ކޮށާރު ބަންދުކުރައްވާ",
        "lockbtn": "ކޮށާރު ބަންދުކުރައްވާ",
        "move-page-legend": "ޞަފްޙާގެ ނަން ބަދަލުކުރައްވާ",
-       "movearticle": "ޞަފްޙާގެ ނަން/ތަން ބަދަލުކުރައްވާ",
        "newtitle": "އައު ނަމަކަށް",
        "move-watch": "މި ޞަފްހާ އަށް ނަޒަރުބަހައްޓަވާ!",
        "movepagebtn": "ޞަފްޙާގެނަން ބަދަލުކުރައްވާ",
        "articleexists": "ތިޔަ ސުރުހީގައި ކުރީއްސުރެ ވެސް ޞަފްޙައެއް ވޭ، ނުވަތަ ތިޔަ އިހުތިޔާރުކުރެއްވި ނަން ރަނގަޅެއް ނޫން، ވީމާ އެހެން ނަމެއް އިހުތިޔާރުކުރެއްވުން އެދެވިގެންވެއެވެ.",
        "movelogpagetext": "ތިރީގައި މިވަނީ ނަން/ތަން ބަދަލުކުރެވިފައިވާ ޞަފްޙާތަކުގެ ފިހުރިސްތެކެވެ.",
        "movereason": "ސަބަބު",
-       "delete_and_move": "ފޮހެލައްވާފައި އެހެންނަމަކަށްބަދަލުކުރައްވާ",
        "delete_and_move_confirm": "އާދެ، މި ޞަފްޙާ ފޮހެލައްވާ",
        "delete_and_move_reason": "އެހެންނަމަކަށް ބަދަލުކުރުމަށްޓަކައި ފޮހެލެވިއްޖެ",
        "allmessages": "ނިޒާމުގެ މެސެޖުތައް",
index aadacab..4bfec97 100644 (file)
@@ -48,7 +48,8 @@
                        "Gts-tg",
                        "Nemo bis",
                        "Αντιγόνη",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Ανώνυμος Βικιπαιδιστής"
                ]
        },
        "tog-underline": "Υπογράμμιση συνδέσμων:",
@@ -90,7 +91,7 @@
        "tog-ccmeonemails": "Να μου αποστέλλονται αντίγραφα των μηνυμάτων ηλεκτρονικού ταχυδρομείου που στέλνω σε άλλους χρήστες",
        "tog-diffonly": "Να μην εμφανίζεται περιεχόμενο σελίδων κάτω από τις διαφορές των εκδόσεων",
        "tog-showhiddencats": "Εμφάνιση κρυμμένων κατηγοριών",
-       "tog-norollbackdiff": "ΠαÏ\81άλειÏ\88η Î´Î¹Î±Ï\86οÏ\81άÏ\82 μετά την εκτέλεση επαναφοράς",
+       "tog-norollbackdiff": "ΠαÏ\81άλειÏ\88η ÎµÎ¼Ï\86άνιÏ\83ηÏ\82 Î´Î¹Î±Ï\86οÏ\81Ï\8eν μετά την εκτέλεση επαναφοράς",
        "tog-useeditwarning": "Προειδοποίηση όταν εγκαταλείπω μία σελίδα επεξεργασίας χωρίς να έχω πρώτα αποθηκεύσει τις αλλαγές",
        "tog-prefershttps": "Να γίνεται πάντα χρήση ασφαλούς σύνδεσης όταν ο χρήστης είναι συνδεδεμένος",
        "underline-always": "Πάντα",
        "password-change-forbidden": "Δεν μπορείτε να αλλάξετε τους κωδικούς πρόσβασης σε αυτό το βίκι.",
        "externaldberror": "Είτε συνέβη κάποιο σφάλμα εξωτερικής πιστοποίησης της βάσης δεδομένων είτε δεν σας έχει επιτραπεί να ενημερώσετε τον εξωτερικό σας λογαριασμό.",
        "login": "Είσοδος",
+       "login-security": "Επαληθεύστε την ταυτότητά σας",
        "nav-login-createaccount": "Είσοδος / δημιουργία λογαριασμού",
        "userlogin": "Είσοδος / δημιουργία λογαριασμού",
        "userloginnocreate": "Είσοδος",
        "userlogin-resetpassword-link": "Ξεχάσατε τον κωδικό πρόσβασης;",
        "userlogin-helplink2": "Βοήθεια για τη σύνδεση",
        "userlogin-loggedin": "Είστε ήδη {{GENDER:$1|συνδεδεμένος|συνδεδεμένη}} ως $1.\nΧρησιμοποιήστε την παρακάτω φόρμα για να συνδεθείτε ως άλλος χρήστης.",
+       "userlogin-reauth": "Θα πρέπει να συνδεθείτε ξανά για να επιβεβαιώσετε ότι είστε ο/η {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Δημιουργήστε άλλο λογαριασμό",
        "createacct-emailrequired": "Διεύθυνση ηλεκτρονικού ταχυδρομείου",
        "createacct-emailoptional": "Διεύθυνση ηλεκτρονικού ταχυδρομείου (προαιρετικό)",
        "createacct-email-ph": "Εισαγάγετε τη διεύθυνση ηλεκτρονικού σας ταχυδρομείου",
        "createacct-another-email-ph": "Εισαγάγετε τη διεύθυνση ηλεκτρονικού ταχυδρομείου",
        "createaccountmail": "Χρήση τυχαίου προσωρινού κωδικού πρόσβασης και αποστολή του στην καθοριζόμενη διεύθυνση ηλεκτρονικού ταχυδρομείου",
+       "createaccountmail-help": "Μπορεί να χρησιμοποιηθεί για την δημιουργία λογαριασμού τρίτων χωρίς την γνωστοποίηση των κωδικών πρόσβασής τους.",
        "createacct-realname": "Πραγματικό όνομα (προαιρετικό)",
        "createaccountreason": "Αιτία:",
        "createacct-reason": "Λόγος",
        "createacct-reason-ph": "Γιατί δημιουργείτε έναν άλλο λογαριασμό",
+       "createacct-reason-help": "Εμφανιζόμενο μήνυμα στο μητρώο δημιουργίας λογαριασμών",
        "createacct-submit": "Δημιουργία λογαριασμού χρήστη",
        "createacct-another-submit": "Δημιουργία λογαριασμού",
+       "createacct-continue-submit": "Συνεχίστε την δημιουργία λογαριασμού",
+       "createacct-another-continue-submit": "Συνεχίστε την δημιουργία λογαριασμού",
        "createacct-benefit-heading": "Το {{SITENAME}} έχει φτιαχτεί από ανθρώπους σαν κι εσένα.",
        "createacct-benefit-body1": "{{PLURAL:$1|επεξεργασία|επεξεργασίες}}",
        "createacct-benefit-body2": "{{PLURAL:$1|σελίδα|σελίδες}}",
        "nocookiesnew": "Ο λογαριασμός χρήστη έχει δημιουργηθεί, αλλά δεν έχετε ακόμα συνδεθεί. Το {{SITENAME}} χρησιμοποιεί cookies κατά τη σύνδεση των χρηστών. Τα cookies είναι απενεργοποιημένα στον υπολογιστή σας. Παρακαλούμε ενεργοποιήστε τα και στη συνέχεια συνδεθείτε χρησιμοποιώντας το νέο όνομα χρήστη σας και τον κωδικό σας.",
        "nocookieslogin": "Το {{SITENAME}} χρησιμοποιεί cookies κατά τη σύνδεση των χρηστών. Τα cookies είναι απενεργοποιημένα στον υπολογιστή σας. Παρακαλούμε ενεργοποιήστε τα και ξαναδοκιμάστε!",
        "nocookiesfornew": "Ο λογαριασμός χρήστη δεν δημιουργήθηκε, καθώς δεν μπορούσε να επιβεβαιώσει την πηγή του. \n Βεβαιωθείτε ότι έχετε ενεργοποιήσει τα cookies, ξαναφορτώστε αυτή τη σελίδα και προσπαθήστε ξανά.",
+       "createacct-loginerror": "Ο λογαριασμός δημιουργήθηκε με επιτυχία, αλλά δεν μπορέσατε να συνδεθείτε αυτόματα. Παρακαλώ [[Special:UserLogin|συνδεθείτε χειροκίνητα]].",
        "noname": "Το όνομα χρήστη που έχετε καθορίσει δεν είναι έγκυρο.",
        "loginsuccesstitle": "Επιτυχής σύνδεση",
        "loginsuccess": "Είστε συνδεδεμένος(-η) στο {{SITENAME}} ως \"$1\".",
-       "nosuchuser": "Δεν υπάρχει χρήστης με το όνομα \"$1\".\nΤα ονόματα χρηστών είναι ευαίσθητα σε κεφαλαιογράμματη και μικρογράμματη γραφή.\nΕλέγξτε την ορθογραφία ή [[Special:CreateAccount|δημιουργήστε ένα νέο λογαριασμό]].",
+       "nosuchuser": "Δεν υπάρχει χρήστης με το όνομα \"$1\".\nΤα ονόματα χρηστών είναι ευαίσθητα στα κεφαλαία και στα μικρά.\nΕλέγξτε την ορθογραφία ή [[Special:CreateAccount|δημιουργήστε ένα νέο λογαριασμό]].",
        "nosuchusershort": "Δεν υπάρχει χρήστης με το όνομα \"$1\". Παρακαλούμε ελέγξτε την ορθογραφία.",
        "nouserspecified": "Πρέπει να ορίσετε ένα όνομα χρήστη.",
        "login-userblocked": "Αυτός ο χρήστης έχει αποκλειστεί. Δεν επιτρέπεται σύνδεση.",
        "noemail": "Δεν έχει καθοριστεί ηλεκτρονική διεύθυνση για τον χρήστη \"$1\".",
        "noemailcreate": "Είναι απαραίτητο να υποβάλλετε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου",
        "passwordsent": "Σας έχει σταλεί ένας νέος κωδικός στην ηλεκτρονική διέθυνση που δηλώσατε για \"$1\".\nΣας παρακαλούμε να ξανασυνδεθείτε μόλις τον λάβετε.",
-       "blocked-mailpassword": "Î\97 Î´Î¹ÎµÏ\8dθÏ\85νÏ\83η IP Ï\83αÏ\82 ÎµÎ¯Î½Î±Î¹ Î±Ï\80οκλειÏ\83μένη Î±Ï\80Ï\8c ÎµÏ\80εξεÏ\81γαÏ\83ία, ÎºÎ±Î¹ Î­Ï\84Ï\83ι\nδεν ÎµÏ\80ιÏ\84Ï\81έÏ\80εÏ\84αι Î½Î± Ï\87Ï\81ηÏ\83ιμοÏ\80οιήÏ\83ει Ï\84ην Î»ÎµÎ¹Ï\84οÏ\85Ï\81γία Î±Î½Î¬ÎºÏ\84ηÏ\83ηÏ\82 ÎºÏ\89δικοÏ\8d Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82, Î³Î¹Î± Ï\84ην Î±Ï\80οÏ\86Ï\85γή ÎºÎ±Ï\84άÏ\87Ï\81ηÏ\83ηÏ\82.",
+       "blocked-mailpassword": "Î\97 Î´Î¹ÎµÏ\8dθÏ\85νÏ\83η IP Ï\83αÏ\82 Î´ÎµÎ½ Î­Ï\87ει Î´Î¹ÎºÎ±Î¯Ï\89μα ÎµÏ\80εξεÏ\81γαÏ\83ίαÏ\82. Î\93ια Ï\84ην Î±Ï\80οÏ\86Ï\85γή ÎºÎ±Ï\84άÏ\87Ï\81ηÏ\83ηÏ\82, Î´ÎµÎ½ ÎµÏ\80ιÏ\84Ï\81έÏ\80εÏ\84αι Î½Î± Ï\87Ï\81ηÏ\83ιμοÏ\80οιήÏ\83εÏ\84ε Ï\84ην Î»ÎµÎ¹Ï\84οÏ\85Ï\81γία Î±Î½Î¬ÎºÏ\84ηÏ\83ηÏ\82 ÎºÏ\89δικοÏ\8d Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Î±Ï\80Ï\8c Î±Ï\85Ï\84ήν Ï\84ην IP.",
        "eauthentsent": "Ένα μήνυμα επαλήθευσης έχει σταλεί στην ηλεκτρονική διεύθυνση που έχετε δηλώσει.\nΠριν αρχίσει η αποστολή μηνυμάτων στη συγκεκριμένη διεύθυνση, πρέπει να ακολουθήσετε τις οδηγίες που βρίσκονται στο μήνυμα που σας έχει σταλεί, για να επαληθεύσετε ότι η συγκεκριμένη ηλεκτρονική διεύθυνση ανήκει πραγματικά σε εσάς.",
        "throttled-mailpassword": "Ένα email επαναφοράς κωδικού έχει ήδη αποσταλεί, μέσα {{PLURAL:$1|στην τελευταία ώρα|στις τελευταίες $1 ώρες}}.\nΓια την αποφυγή κατάχρησης, μόνο ένα email επαναφοράς κωδικού θα στέλνεται ανά {{PLURAL:$1|ώρα|$1 ώρες}}.",
        "mailerror": "Σφάλμα στην αποστολή του μηνύματος: $1",
        "createaccount-title": "Δημιουργία λογαριασμού για {{SITENAME}}",
        "createaccount-text": "Κάποιος δημιούργησε έναν λογαριασμό για τη διεύθυνση email σας στο {{SITENAME}} ($4) με το όνομα \"$2\", με κωδικό πρόσβασης \"$3\". Θα πρέπει να συνδεθείτε και να αλλάξετε τον κωδικό πρόσβασής σας τώρα.\n\nΜπορείτε να αγνοήσετε αυτό το μήνυμα, αν αυτός ο λογαριασμός δημιουργήθηκε εσφαλμένα.",
        "login-throttled": "Κάνατε πάρα πολλές πρόσφατες απόπειρες σύνδεσης.\nΠαρακαλούμε περιμένετε $1 προτού ξαναδοκιμάσετε.",
-       "login-abort-generic": "Η είσοδος δεν πέτυχε - Ματαιώθηκε",
+       "login-abort-generic": "Η είσοδος σας απέτυχε - Ματαίωση",
        "login-migrated-generic": "Ο λογαριασμός σας έχει μεταναστεύσει, και το όνομα χρήστη σας δεν υπάρχει πλέον σε αυτό το wiki.",
        "loginlanguagelabel": "Γλώσσα: $1",
        "suspicious-userlogout": "Το αίτημα αποσύνδεσής σας απερρίφθη επειδή φαίνεται ότι στάλθηκε από ένα λανθασμένο φυλλομετρητή (browser) ή διακομιστή προσωρινής αποθήκευσης.",
        "createacct-another-realname-tip": "Το πραγματικό όνομα είναι προαιρετικό.\nΑν επιλέξετε να το δώσετε, αυτό θα μπορεί να χρησιμοποιηθεί για να αναγνωριστεί η δουλειά σας.",
        "pt-login": "Σύνδεση",
        "pt-login-button": "Σύνδεση",
+       "pt-login-continue-button": "Συνεχίστε την σύνδεσή σας",
        "pt-createaccount": "Δημιουργία λογαριασμού",
        "pt-userlogout": "Αποσύνδεση",
        "php-mail-error-unknown": "Άγνωστο σφάλμα στη συνάρτηση mail() της PHP.",
        "newpassword": "Νέος κωδικός πρόσβασης",
        "retypenew": "Πληκτρολογήστε ξανά το νέο κωδικό.",
        "resetpass_submit": "Δώστε κωδικό πρόσβασης και συνδεθείτε",
-       "changepassword-success": "Ο κωδικός πρόσβασής σας άλλαξε επιτυχώς!",
+       "changepassword-success": "Ο κωδικός πρόσβασής σας άλλαξε!",
        "changepassword-throttled": "Κάνατε πάρα πολλές πρόσφατες απόπειρες σύνδεσης.\nΠαρακαλούμε περιμένετε $1 προτού ξαναδοκιμάσετε.",
        "botpasswords": "Κωδικοί πρόσβασης για Μποτ",
+       "botpasswords-summary": "<em>Οι κωδικοί των μποτ</em> δίνουν πρόσβαση σε λογαριασμό χρήστη μέσω του API χωρίς να χρησιμοποιούνται τα συνθηματικά της κύριας σύνδεσης του λογαριασμού. Τα δικαιώματα χρήστη όταν με σύνδεση μέσω κωδικού μποτ μπορεί να είναι περιορισμένα.\n\nΑν δεν ξέρετε γιατί θέλετε να το κάνετε αυτό, καλύτερα να μην το κάνετε. Κανένα δεν θα πρέπει να σας ζητήσει να δημιουργήσετε ένα τέτοιο κωδικό και να του τον γνωστοποιήσετε.",
        "botpasswords-disabled": "Οι κωδικοί πρόσβασης των ρομπότ είναι απενεργοποιημένοι.",
        "botpasswords-no-central-id": "Για να χρησιμοποιήσετε τους κωδικούς πρόσβασης των ρομπότ θα πρέπει να συνδεθείτε με έναν κεντρικό λογαριασμό.",
        "botpasswords-existing": "Υπάρχοντες κωδικοί πρόσβασης ρομπότ",
        "minoredit": "Αυτή είναι μια μικροαλλαγή",
        "watchthis": "Παρακολούθηση αυτής της σελίδας",
        "savearticle": "Αποθήκευση σελίδας",
+       "publishpage": "Δημοσίευση σελίδας",
+       "publishchanges": "Δημοσίευση αλλαγών",
        "preview": "Προεπισκόπηση",
        "showpreview": "Εμφάνιση προεπισκόπησης",
        "showdiff": "Εμφάνιση αλλαγών",
        "revdelete-submit": "Εφαρμογή {{PLURAL:$1|στην επιλεγμένη αναθεώρηση|στις επιλεγμένες αναθεωρήσεις}}",
        "revdelete-success": "'''Η ορατότητα έκδοσης ενημερώθηκε επιτυχώς.'''",
        "revdelete-failure": "'''Η ορατότητα της επεξεργασίας δεν ήταν δυνατόν να ενημερωθεί:''' $1",
-       "logdelete-success": "'''Η ορατότητα γεγονότος τέθηκε επιτυχώς.'''",
+       "logdelete-success": "Η ορατότητα γεγονότος τέθηκε επιτυχώς.",
        "logdelete-failure": "'''Η ορατότητα του καταλόγου δεν μπορούσε να ρυθμιστεί:'''\n$1",
        "revdel-restore": "αλλαγή ορατότητας",
        "pagehist": "Ιστορικό σελίδας",
        "tooltip-ca-nstab-category": "Προβολή της σελίδας κατηγορίας",
        "tooltip-minoredit": "Χαρακτηρισμός αυτής της επεξεργασίας ως μικροεπεξεργασία",
        "tooltip-save": "Αποθήκευση των αλλαγών σας",
+       "tooltip-publish": "Δημοσίευση των αλλαγών σας",
        "tooltip-preview": "Προεπισκόπηση των αλλαγών σας. Παρακαλούμε χρησιμοποιήστε την πριν αποθηκεύσετε!",
        "tooltip-diff": "Εμφάνιση των αλλαγών που κάνατε στο κείμενο",
        "tooltip-compareselectedversions": "Προβολή των διαφορών ανάμεσα στις δύο επιλεγμένες αναθεωρήσεις αυτής της σελίδας",
        "mw-widgets-dateinput-placeholder-month": "ΕΕΕΕ-ΜΜ",
        "mw-widgets-titleinput-description-new-page": "η σελίδα που δεν υπάρχει ακόμα",
        "mw-widgets-titleinput-description-redirect": "ανακατεύθυνση στο $1",
-       "api-error-blacklisted": "Παρακαλώ επιλέξτε ένα διαφορετικό, περιγραφικό τίτλο.",
        "sessionprovider-generic": "$1 συνεδρίες",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "συνεδρίες με βάση τα cookies",
        "sessionprovider-nocookies": "Τα Cookies μπορούν να απενεργοποιηθούν. Βεβαιωθείτε ότι έχετε ενεργοποιημένα τα cookies και ξεκινήστε πάλι.",
-       "randomrootpage": "Τυχαία κύρια σελίδα"
+       "randomrootpage": "Τυχαία κύρια σελίδα",
+       "log-action-filter-rights": "Πληκτρολογήστε για αλλαγή δικαιωμάτων:"
 }
index 6e2915b..7c755f7 100644 (file)
        "noindex-category": "Noindexed pages",
        "broken-file-category": "Pages with broken file links",
        "categoryviewer-pagedlinks": "($1) ($2)",
+       "category-header-numerals": "$1–$2",
        "about": "About",
        "article": "Content page",
        "newwindow": "(opens in new window)",
        "databaseerror-query": "Query: $1",
        "databaseerror-function": "Function: $1",
        "databaseerror-error": "Error: $1",
-       "transaction-duration-limit-exceeded": "To avoid creating high replication lag, this transaction was aborted because the write duration ($1) exceeded the $2 {{PLURAL:$2|second|seconds}} limit.\nIf you are changing many items at once, try doing multiple smaller operations instead.",
+       "transaction-duration-limit-exceeded": "To avoid creating high replication lag, this transaction was aborted because the write duration ($1) exceeded the $2 second limit.\nIf you are changing many items at once, try doing multiple smaller operations instead.",
        "laggedslavemode": "<strong>Warning:</strong> Page may not contain recent updates.",
        "readonly": "Database locked",
        "enterlockreason": "Enter a reason for the lock, including an estimate of when the lock will be released",
        "minoredit": "This is a minor edit",
        "watchthis": "Watch this page",
        "savearticle": "Save page",
+       "savechanges": "Save changes",
        "publishpage": "Publish page",
+       "publishchanges": "Publish changes",
        "preview": "Preview",
        "showpreview": "Show preview",
        "showdiff": "Show changes",
        "content-model-json": "JSON",
        "content-json-empty-object": "Empty object",
        "content-json-empty-array": "Empty array",
+       "deprecated-self-close-category": "Pages using invalid self-closed HTML tags",
+       "deprecated-self-close-category-desc": "The page contains invalid self-closed HTML tags, such as <code>&lt;b/></code> or <code>&lt;span/></code>.  The behavior of these will change soon to be consistent with the HTML5 specification, so their use in wikitext is deprecated.",
        "duplicate-args-warning": "<strong>Warning:</strong> [[:$1]] is calling [[:$2]] with more than one value for the \"$3\" parameter. Only the last value provided will be used.",
        "duplicate-args-category": "Pages using duplicate arguments in template calls",
        "duplicate-args-category-desc": "The page contains template calls that use duplicates of arguments, such as <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "rightslogtext": "This is a log of changes to user rights.",
        "action-read": "read this page",
        "action-edit": "edit this page",
-       "action-createpage": "create pages",
-       "action-createtalk": "create discussion pages",
+       "action-createpage": "create this page",
+       "action-createtalk": "create this discussion page",
        "action-createaccount": "create this user account",
        "action-autocreateaccount": "automatically create this external user account",
        "action-history": "view the history of this page",
        "upload-http-error": "An HTTP error occurred: $1",
        "upload-copy-upload-invalid-domain": "Copy uploads are not available from this domain.",
        "upload-foreign-cant-upload": "This wiki is not configured to upload files to the requested foreign file repository.",
-       "upload-foreign-cant-load-config": "Loading file upload configuration for the foreign file repository failed.",
+       "upload-foreign-cant-load-config": "Failed to load the configuration for file uploads to the foreign file repository.",
+       "upload-dialog-disabled": "File uploads using this dialog are disabled on this wiki.",
        "upload-dialog-title": "Upload file",
        "upload-dialog-button-cancel": "Cancel",
        "upload-dialog-button-done": "Done",
        "sp-contributions-username": "IP address or username:",
        "sp-contributions-toponly": "Only show edits that are latest revisions",
        "sp-contributions-newonly": "Only show edits that are page creations",
+       "sp-contributions-hideminor": "Hide minor edits",
        "sp-contributions-submit": "Search",
        "sp-contributions-explain": "",
        "sp-contributions-footer": "-",
        "mw-widgets-dateinput-placeholder-month": "YYYY-MM",
        "mw-widgets-titleinput-description-new-page": "page does not exist yet",
        "mw-widgets-titleinput-description-redirect": "redirect to $1",
-       "api-error-blacklisted": "Please choose a different, descriptive title.",
        "sessionmanager-tie": "Cannot combine multiple request authentication types: $1.",
        "sessionprovider-generic": "$1 sessions",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "cookie-based sessions",
        "log-action-filter-newusers": "Type of account creation:",
        "log-action-filter-patrol": "Type of patrol:",
        "log-action-filter-protect": "Type of protection:",
-       "log-action-filter-rights": "Type of right change",
-       "log-action-filter-suppress": "Type of suppression",
+       "log-action-filter-rights": "Type of right change:",
+       "log-action-filter-suppress": "Type of suppression:",
        "log-action-filter-upload": "Type of upload:",
        "log-action-filter-all": "All",
        "log-action-filter-block-block": "Block",
        "log-action-filter-suppress-event": "Log suppression",
        "log-action-filter-suppress-revision": "Revision suppression",
        "log-action-filter-suppress-delete": "Page suppression",
-       "log-action-filter-suppress-block": "User supppression by block",
+       "log-action-filter-suppress-block": "User suppression by block",
        "log-action-filter-suppress-reblock": "User suppression by reblock",
        "log-action-filter-upload-upload": "New upload",
        "log-action-filter-upload-overwrite": "Reupload",
index 2725fb9..1a60284 100644 (file)
                        "Xð",
                        "Robin van der Vliet",
                        "Zciric",
-                       "Psychoslave"
+                       "Psychoslave",
+                       "Orikrin1998"
                ]
        },
        "tog-underline": "Substreki ligilojn",
        "tog-hideminor": "Kaŝi malgrandajn redaktetojn ĉe <i>Lastaj ŝanĝoj</i>",
        "tog-hidepatrolled": "Kaŝi patrolitajn redaktojn en lastaj ŝanĝoj",
        "tog-newpageshidepatrolled": "Kaŝi patrolitajn paĝojn de listo de novaj paĝoj",
-       "tog-hidecategorization": "Kaŝu enkategoriigon de paĝoj",
+       "tog-hidecategorization": "Kaŝi enkategoriigon de paĝoj",
        "tog-extendwatchlist": "Etendi la atentaron por montri ĉiujn ŝanĝojn, ne nur la plej lastajn",
        "tog-usenewrc": "Grupigi ŝanĝojn laŭ paĝo en \"Lastaj ŝanĝoj\" kaj \"Atentaro\" (bezonas Ĝavaskripton)",
-       "tog-numberheadings": "Aŭtomate numerigi sekciojn",
+       "tog-numberheadings": "Aŭtomate numeri sekciojn",
        "tog-showtoolbar": "Montri redakto-breton (per Ĝavaskripto)",
        "tog-editondblclick": "Redakti paĝojn per duobla alklako",
        "tog-editsectiononrightclick": "Ŝalti sekcian redaktadon per dekstra musklako de sekciaj titoloj (per Ĝavaskripto)",
@@ -64,7 +65,7 @@
        "tog-watchdefault": "Aldoni al mia atentaro paĝojn kaj dosierojn redaktitajn de mi",
        "tog-watchmoves": "Aldoni paĝojn kaj dosierojn, kiujn mi movas, al mia atentaro",
        "tog-watchdeletion": "Aldoni paĝojn kaj dosierojn, kiujn mi forigas, al mia atentaro",
-       "tog-watchuploads": "Aldonu novajn dosierojn ke mi alŝutas al mia atentaro",
+       "tog-watchuploads": "Aldonu novajn dosierojn, kiujn mi alŝutas, al mia atentaro",
        "tog-watchrollback": "Aldoni paĝojn, kie mi amasmalfaris, al mia atentaro.",
        "tog-minordefault": "Marki defaŭlte ĉiujn redaktojn kiel etajn",
        "tog-previewontop": "Montri antaŭrigardon antaŭ redaktilo",
@@ -82,7 +83,7 @@
        "tog-watchlisthidebots": "Kaŝi robotajn redaktojn de la atentaro",
        "tog-watchlisthideminor": "Kaŝi malgrandajn redaktojn de la atentaro",
        "tog-watchlisthideliu": "Kaŝi redaktojn de ensalutitaj uzantoj de la atentaro",
-       "tog-watchlistreloadautomatically": "Reŝarĝi la atentaron aŭtomate ĉiam filtro estas ŝanĝita (Necesi Ĝavoskripton)",
+       "tog-watchlistreloadautomatically": "Reŝargi la atentaron aŭtomate ĉiam, kiam filtrilo estas ŝanĝita (bezonas Ĝavoskripton)",
        "tog-watchlisthideanons": "Kaŝi redaktojn de anonimuloj de la atentaro",
        "tog-watchlisthidepatrolled": "Kaŝi patrolitajn redaktojn de la atentaro",
        "tog-watchlisthidecategorization": "Kaŝu enkategoriigon de paĝoj",
        "pagecategories": "{{PLURAL:$1|Kategorio|Kategorioj}}",
        "category_header": "Artikoloj en kategorio \"$1\"",
        "subcategories": "Subkategorioj",
-       "category-media-header": "Dosieroj en kategorio \"$1\"",
+       "category-media-header": "Dosieroj en kategorio “$1”",
        "category-empty": "<em>Tiu ĉi kategorio nuntempe enhavas neniun artikolon aŭ plurmedian dosieron.</em>",
        "hidden-categories": "{{PLURAL:$1|Kaŝita kategorio|Kaŝitaj kategorioj}}",
        "hidden-category-category": "Kaŝitaj kategorioj",
        "createacct-reason": "Kialo",
        "createacct-reason-ph": "Kial vi kreas plian konton",
        "createacct-reason-help": "Mesaĝo vidigita en la protokolo pri kreado de konto",
-       "createacct-submit": "Krei konton",
+       "createacct-submit": "Kreu vian konton",
        "createacct-another-submit": "Krei konton",
        "createacct-continue-submit": "Daŭri kreadon de konto",
        "createacct-another-continue-submit": "Daŭri kreadon de konto",
        "botpasswords-label-delete": "Forigi",
        "botpasswords-label-resetpassword": "Rekomencigi la pasvorton",
        "botpasswords-label-grants": "Uzeblaj permesdonoj:",
-       "botpasswords-help-grants": "Ĉiu permesdono provizas aliron al listitaj uzantaj permisoj, kiujn uzantkonto jam havas. Vidu la [[Special:ListGrants|tabelon de permisdonoj]] por pli da informo.",
+       "botpasswords-help-grants": "Ĉiu permesdono provizas aliron al listitaj uzantaj permisoj, kiujn uzantkonto jam havas. Vidu la [[Special:ListGrants|tabelon de permesdonoj]] por pli da informo.",
        "botpasswords-label-restrictions": "Limigoj de uzado:",
        "botpasswords-label-grants-column": "Permeso donita",
        "botpasswords-bad-appid": "La robota nomo \"$1\" estas malvalida.",
        "minoredit": "Ĉi tiu ŝanĝo estas redakteto",
        "watchthis": "Atenti ĉi tiun paĝon",
        "savearticle": "Konservi paĝon",
+       "savechanges": "Konservi ŝanĝojn",
        "publishpage": "Publikigi paĝon",
        "preview": "Antaŭrigardo",
        "showpreview": "Antaŭrigardo",
        "accmailtext": "Hazarde generita pasvorto por [[User talk:$1|$1]] estis sendita al $2.\n\nLa pasvorto por ĉi tiu nova konto povas esti ŝanĝita en la paĝo ''[[Special:ChangePassword|ŝanĝi pasvorton]]'' dum ensalutado.",
        "newarticle": "(Nova)",
        "newarticletext": "Vi sekvis ligilon al paĝo ankoraŭ ne ekzistanta. Se vi volas krei ĝin, ektajpu malsupre (vidu la [$1 helpopaĝon] por klarigoj.) Se vi malintence alvenis ĉi tien, simple alklaku la retrobutonon de via retumilo.",
-       "anontalkpagetext": "---- ''Jen diskutopaĝo por anonima kontribuanto kiu ne jam kreis konton aŭ ne uzas ĝin.\nNi tial devas uzi la cifran IP-adreson por identigi lin/ŝin.\nĈi tia IP-adreso povas esti uzata de pluraj uzantoj.\nSe vi estas anonimulo kaj preferus eviti tiajn mistrafajn komentojn al vi, bonvolu [[Special:CreateAccount|krei konton]] aŭ [[Special:UserLogin|ensaluti]] por eviti estontan konfuzon pro aliaj anonimaj uzantoj.''",
+       "anontalkpagetext": "<em>Jen diskutopaĝo por anonima kontribuanto kiu ne jam kreis konton aŭ ne uzas ĝin.</em>\nNi tial devas uzi la cifran IP-adreson por identigi lin/ŝin.\nĈi tia IP-adreso povas esti uzata de pluraj uzantoj.\nSe vi estas anonimulo kaj preferus eviti tiajn mistrafajn komentojn al vi, bonvolu [[Special:CreateAccount|krei konton]] aŭ [[Special:UserLogin|ensaluti]] por eviti estontan konfuzon pro aliaj anonimaj uzantoj.''",
        "noarticletext": "Mankas teksto en ĉi tiu paĝo.\nVi povas [[Special:Search/{{PAGENAME}}|serĉi ĉi tiun paĝtitolon]] en aliaj paĝoj,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} serĉi la rilatajn protokolojn],\naŭ [{{fullurl:{{FULLPAGENAME}}|action=edit}} krei ĉi tiun paĝon]</span>.",
        "noarticletext-nopermission": "Estas neniom da teksto en ĉi tiu paĝo.\nVi povas [[Special:Search/{{PAGENAME}}|serĉi ĉi tiun paĝan titolon]] en aliaj paĝoj,\naŭ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} serĉi la rilatajn protokolojn]</span>, sed vi ne rajtas krei ĉi tiun paĝon.",
        "missing-revision": "La revizio n-ro $1 de la paĝo nomata \"{{FULLPAGENAME}}\" ne ekzistas.\n\nTio kutime estas kaŭzata per sekvado de malaktuala historio-ligilo al paĝo forigita.\nDetaloj troveblos en la [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de forigoj].",
        "userpage-userdoesnotexist": "Uzantokonto \"<nowiki>$1</nowiki>\" ne estas registrita. Bonvolu konfirmi se vi volas krei/redakti ĉi tiun paĝon.",
        "userpage-userdoesnotexist-view": "Uzanto-konto \"$1\" ne estas registrita.",
        "blocked-notice-logextract": "Ĉi tiu uzanto estas ĉi-momente forbarita.\nLa lasta protokolero estas jene montrata por via referenco:",
-       "clearyourcache": "Notu:''' Post konservado, vi forviŝu la kaŝmemoron de via foliumilo por vidi la ŝanĝojn. \n* '''Firefox / Safari:''' Premu majuskligan klavon klakante ''Reŝarĝi'', aŭ premu aŭ ''Stir-F5'' aŭ ''Stir-R'' (''⌘-R'' kun Makintoŝo)\n* '''Google Chrome:''' Premu ''Stir-majuskligklavon-R'' (''⌘-Majuskligklavo-R'' kun Makintoŝo)\n* '''Interreta Esplorilo''': Premu ''Stir'' klakante ''Refreŝu'', aŭ premu ''Stir-F5'' \n* '''Opera:''' Nuligi la kaŝmemoro en ''Iloj → Preferoj''",
+       "clearyourcache": "<strong>Notu:</strong>Post konservado, vi forviŝu la kaŝmemoron de via foliumilo por vidi la ŝanĝojn. \n* <strong>Firefox / Safari:</strong> Premu majuskligan klavon klakante <em>Reŝarĝi</em>, aŭ premu aŭ <em>Stir-F5</em> aŭ <em>Stir-R</em> (<em>⌘-R</em> kun Makintoŝo)\n* <strong>Google Chrome:</strong> Premu <em>Stir-majuskligklavon-R</em> (<em>⌘-Majuskligklavo-R</em> kun Makintoŝo)\n* <strong>Interreta Esplorilo</strong>: Premu <em>Stir</em> klakante <em>Refreŝu</em>, aŭ premu <em>Stir-F5</em> \n* <strong>Opera:</strong> Iru al <em>menuo →  parametroj</em> (<em>Opera →  Agordoj</em> per Makintoŝa) kaj tiam al <em>privateco kaj sekureco →  Nuligi retuman datenon → kaŝmemorataj bildoj kaj dosieroj</em>.",
        "usercssyoucanpreview": "'''Konsileto:''' Uzu la butonon \"Antaŭrigardi\" por provi vian novan CSS-kodon antaŭ konservado.",
        "userjsyoucanpreview": "'''Konsileto:''' Uzu la butonon \"{{int:showpreview}}\" por provi vian novan Ĝavaskriptan kodon antaŭ konservado.",
        "usercsspreview": "'''Notu ke vi nur antaŭvidas vian uzanto-CSS.\nĜi ne jam estis konservita!'''",
        "rev-suppressed-unhide-diff": "Unu el la revizioj de ĉi tiu diferenco estis '''kaŝita'''.\nEble estas detaloj en la [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} protokolo pri kaŝado].\nVi povas ankoraŭ [$1 vidi ĉi tiun diferencon] se vi deziras.",
        "rev-deleted-diff-view": "Unu el la revizioj de ĉi tiu diferenco estis '''forigita'''.\nVi povas rigardi ĉi tiun diferencon, detaloj estas trovebla en la [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokolo pri forigado].",
        "rev-suppressed-diff-view": "Unu el la revizioj de ĉi tiu diferenco estis '''kaŝita'''.\nKiel administranto, vi povas rigardi ĉi tiun diferencon, eble estas detaloj en la [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} protokolo pri kaŝadoj].",
-       "rev-delundel": "montri/kaŝi",
+       "rev-delundel": "ŝanĝi videblecon",
        "rev-showdeleted": "montri",
        "revisiondelete": "Forigi/malforigi versiojn",
        "revdelete-nooldid-title": "Nevalida cela revizio",
        "mergelog": "Protokolo de kunigoj",
        "revertmerge": "Malkunigi",
        "mergelogpagetext": "Jen listo de la plej lastatempaj kunigoj de unu paĝhistorio en alian.",
-       "history-title": "Revizio-historio de \"$1\"",
+       "history-title": "Revizio-historio de “$1”",
        "difference-title": "$1: Malsamoj inter versioj",
        "difference-title-multipage": "Malsamoj inter la paĝoj $1 kaj $2",
        "difference-multipage": "(Diferenco inter paĝoj)",
        "searchprofile-images": "Plurmedio",
        "searchprofile-everything": "Ĉion",
        "searchprofile-advanced": "Progresa",
-       "searchprofile-articles-tooltip": "Serĉo en $1",
+       "searchprofile-articles-tooltip": "Serĉi en $1",
        "searchprofile-images-tooltip": "Serĉi dosierojn",
        "searchprofile-everything-tooltip": "Traserĉi ĉiun enhavon (inkluzivante diskuto-paĝojn)",
        "searchprofile-advanced-tooltip": "Serĉi en specialaj nomspacoj",
        "right-override-export-depth": "Eksporti paĝojn inkluzivante ligitajn paĝojn ĝis profundeco de 5",
        "right-sendemail": "Sendi retpoŝton al aliaj uzantoj",
        "right-passwordreset": "Vidi retpoŝtojn de pasvorta restarado.",
-       "right-managechangetags": "Kreado kaj forigado de [[Special:Tags|etikedoj]] de datumbazo",
+       "right-managechangetags": "Kreado kaj (mal)aktivgo de [[Special:Tags|etikedoj]]",
        "right-applychangetags": "Aldoni [[Special:Tags|etikedojn]] al propraj ŝanĝoj",
        "right-changetags": "Aldoni kaj forigi arbitrajn [[Special:Tags|etikedojn]] ĉe unuopaj revizioj kaj protokoleroj",
        "right-deletechangetags": "Forigi [[Special:Tags|etikedojn]] de la datenbazo",
        "rightslogtext": "Ĉi tio estas protokolo pri la ŝanĝoj de uzantorajtoj.",
        "action-read": "legi ĉi tiun paĝon",
        "action-edit": "redakti ĉi tiun paĝon",
-       "action-createpage": "krei paĝojn",
-       "action-createtalk": "krei diskuto-paĝojn",
+       "action-createpage": "krei ĉi tiun paĝon",
+       "action-createtalk": "krei ĉi tiun diskutpaĝon",
        "action-createaccount": "krei ĉi tiun uzanto-konton",
        "action-autocreateaccount": "Aŭtomate krei tiun eksteruzantan konton",
        "action-history": "vidi historion de tiu ĉi paĝo",
        "upload-http-error": "HTTP-eraro okazis: $1",
        "upload-copy-upload-invalid-domain": "Kopio-alŝutoj ne disponiĝas el ĉi tiu domajno.",
        "upload-foreign-cant-upload": "Tiu vikio ne estas agorita por alŝuti alŝutitan dosieron al la petita fora dosierdeponejo.",
+       "upload-foreign-cant-load-config": "La ŝarĝado de agordo pri dosieran alŝuton malsukcesis por la fora dosiera deponejo.",
+       "upload-dialog-disabled": "Alŝutoj de dosiero per ĉi tiun dialogon estas malfunkciigita sur ĉi tiu vikio.",
        "upload-dialog-title": "Alŝuti dosieron",
        "upload-dialog-button-cancel": "Nuligi",
        "upload-dialog-button-done": "Farite",
        "listgrouprights-namespaceprotection-namespace": "Nomspaco",
        "listgrouprights-namespaceprotection-restrictedto": "Rajtoj, kiuj permesas al uzanto redakti",
        "listgrants": "Rajtoj donitaj",
+       "listgrants-summary": "La sekvo estas listo de permesdonoj kun ilia rilata aliro al uzantaj rajtoj. Uzantoj povas sankcii aplikojn por uzi ilian konton, sed kun limaj permesoj laŭ la gratifikoj ke la uzanto donis al la aplikaĵo. Tamen aplikaĵo kiu agas en la nomo de uzanto ne povas efektive uzi rajtojn ke la uzanto ne havas.\nPovas esti [[{{MediaWiki:Listgrouprights-helppage}}|suplementa informo]] pri individuaj rajtoj.",
        "listgrants-grant": "Aljuĝoj",
        "listgrants-rights": "Rajtoj",
        "trackingcategories": "Kategorioj por kontrolado",
        "sp-contributions-username": "IP-adreso aŭ uzantonomo:",
        "sp-contributions-toponly": "Montru nur ŝanĝojn kiuj estas la plej lastaj revizioj",
        "sp-contributions-newonly": "Montri nur redaktojn, kiuj kreis paĝon",
+       "sp-contributions-hideminor": "Malvidigu redaktetojn",
        "sp-contributions-submit": "Serĉi",
        "whatlinkshere": "Ligiloj ĉi tien",
        "whatlinkshere-title": "Paĝoj ligantaj al \"$1\"",
        "lockedbyandtime": "(de {{GENDER:$1|$1}} je $2, $3)",
        "move-page": "Alinomi $1",
        "move-page-legend": "Alinomi paĝon",
-       "movepagetext": "Per la jena formulo vi povas ŝanĝi la nomon de iu paĝo, kunportante ĝian historion de redaktoj al la nova nomo.\nLa antaŭa titolo fariĝos alidirektilo al la nova titolo.\nVi povas ĝisdatigi alidirektilojn kiu indikas la originalan titolon aŭtomate.\nSe vi elektas ĝisdatigi permane, bonvolu kontroli [[Special:DoubleRedirects|duoblajn]] aŭ [[Special:BrokenRedirects|rompitajn alidirektilojn]].\nVi estas responsa por certigi ke ligilojn direktas fidinde.\n\nNotu, ke la paĝo '''ne''' estos movita se jam ekzistas paĝo ĉe la nova titolo, krom se tiu loko estas malplena aŭ alidirektilo al ĉi tiu paĝo, kaj sen antaŭa redaktohistorio.\nPro tio, vi ja povos removi la paĝon je la antaŭa titolo se vi mistajpus, kaj ne povas forviŝi ekzistantan paĝon per movo.\n\n'''AVERTO!'''\nTio povas esti drasta kaj neatendita ŝanĝo por populara paĝo;\nbonvolu certigi vin, ke vi komprenas ties konsekvencojn antaŭ ol vi antaŭeniru.",
-       "movepagetext-noredirectfixer": "Per jena formularo vi povas alinomigi paĝon, kaj movi tutan ĝian redaktohistorion al la nova nomo. \nLa antaŭa titolo alidirektigos onin al la nova titolo.\nKontrolu pri [[Special:DoubleRedirects|duoblajn]] aŭ [[Special:BrokenRedirects|nefunkciantajn alidirektilojn]].\nVi respondecas pri tio ke ligoj restas montrantaj ĝustadirekten.\n\nKonsciu ke la paĝo '''ne'' estas movota se jam ekzistas paĝo havanta la novan titolon, krom se ĝi maplenas aŭ estas alidirektilo sen antaŭa redaktohistorio.\nTio ĉi signifas ke vi povas alinomigi paĝon reen al antaŭa nomo se vi eraras, kaj vi ke vi ne povas anstataŭigi ekzistantan paĝon.\n\n'''Averto!''\nEblas ke tio ĉi estas drasta kaj neatendita ŝanĝo de populara paĝo;\nAntaŭ daŭrigi, bonvolu certiĝi, ke vi komprenas la konsekvencojn de tiuj ĉi ŝanĝo.",
-       "movepagetalktext": "La movo aŭtomate kunportos la diskuto-paĝon, se tia ekzistas, '''krom se:'''\n*Vi movas la paĝon tra nomspacoj (ekz de ''Nomo'' je ''User:Nomo''),\n*Ne malplena diskuto-paĝo jam ekzistas je la nova nomo, aŭ\n*Vi malelektas la suban ŝaltilon.\n\nTiujokaze, vi nepre permane kunigu la diskuto-paĝojn se vi tion deziras.",
+       "movepagetext": "Per la jena formulo vi povas ŝanĝi la nomon de iu paĝo, kunportante ĝian historion de redaktoj al la nova nomo.\nLa antaŭa titolo fariĝos alidirektilo al la nova titolo.\nVi povas ĝisdatigi alidirektilojn kiu indikas la originalan titolon aŭtomate.\nSe vi elektas ĝisdatigi permane, bonvolu kontroli [[Special:DoubleRedirects|duoblajn]] aŭ [[Special:BrokenRedirects|rompitajn alidirektilojn]].\nVi estas responsa por certigi ke ligilojn direktas fidinde.\n\nNotu, ke la paĝo '''ne''' estos movita se jam ekzistas paĝo ĉe la nova titolo, krom se tiu loko estas malplena aŭ alidirektilo al ĉi tiu paĝo, kaj sen antaŭa redaktohistorio.\nPro tio, vi ja povos removi la paĝon je la antaŭa titolo se vi mistajpus, kaj ne povas forviŝi ekzistantan paĝon per movo.\n\n'''Note:'''\nTio povas esti drasta kaj neatendita ŝanĝo por populara paĝo;\nbonvolu certigi vin, ke vi komprenas ties konsekvencojn antaŭ ol vi antaŭeniru.",
+       "movepagetext-noredirectfixer": "Per jena formularo vi povas alinomigi paĝon, kaj movi tutan ĝian redaktohistorion al la nova nomo. \nLa antaŭa titolo alidirektigos onin al la nova titolo.\nKontrolu pri [[Special:DoubleRedirects|duoblajn]] aŭ [[Special:BrokenRedirects|nefunkciantajn alidirektilojn]].\nVi respondecas pri tio ke ligoj restas montrantaj ĝustadirekten.\n\nKonsciu ke la paĝo '''ne'' estas movota se jam ekzistas paĝo havanta la novan titolon, krom se ĝi estas alidirektilo sen antaŭa redaktohistorio.\nTio ĉi signifas ke vi povas alinomigi paĝon reen al antaŭa nomo se vi eraras, kaj vi ke vi ne povas anstataŭigi ekzistantan paĝon.\n\n'''Rimarko:''\nEblas ke tio ĉi estas drasta kaj neatendita ŝanĝo de populara paĝo;\nAntaŭ daŭrigi, bonvolu certiĝi, ke vi komprenas la konsekvencojn de tiuj ĉi ŝanĝo.",
+       "movepagetalktext": "Se vi validas tiun elektobutono, la asociata diskutpaĝo estos aŭtomate alinomita al nova titolo, krom se malplena diskutpaĝo jam ekzistas.\n\nTiujokaze, vi alinomigendos aŭ kunfandendos malaŭtomate la paĝon se vi tion deziras.",
        "moveuserpage-warning": "<strong>Averto:</strong> Vi preskaŭ alinomas paĝon de uzanto. Bonvolu noti ke nur la paĝo estos alinomita kaj la uzanto mem <em>ne</em> estos alinomita.",
        "movecategorypage-warning": "<strong>Averto:</strong> Vi baldaŭ movos kategorian paĝon. Bonvolu noti ke, nur la paĝo estos movita, kaj la paĝoj en la malnova kategorio <em>ne</em> transiros en la novan kategorion.",
        "movenologintext": "Vi nepre estu registrita uzanto kaj [[Special:UserLogin|ensalutu]] por rajti movi paĝojn.",
        "movenosubpage": "Ĉi tiu paĝo havas neniujn subpaĝojn.",
        "movereason": "Kialo:",
        "revertmove": "restarigi",
-       "delete_and_move_text": "==Forigo nepras==\n\nLa celartikolo \"[[:$1]]\" jam ekzistas. Ĉu vi volas forigi ĝin por krei spacon por la movo?",
+       "delete_and_move_text": "La celpaĝo \"[[:$1]]\" jam ekzistas. Ĉu vi volas forigi ĝin por krei spacon por la alinomado?",
        "delete_and_move_confirm": "Jes, forigu la paĝon",
        "delete_and_move_reason": "Forigita por ebligi movadon de \"[[$1]]\"",
        "selfmove": "Fonto- kaj celo-titoloj samas; ne povas movi paĝon sur ĝin mem.",
        "move-leave-redirect": "Forlasi alidirektilon",
        "protectedpagemovewarning": "'''Averto:''' Ĉi tiu paĝo estis ŝlosita tiel nur uzantoj kun administranto-rajtoj povas movi ĝin.\nJen la lasta protokolero por via referenco:",
        "semiprotectedpagemovewarning": "'''Averto:''' Ĉi tiu paĝo estis ŝlosita tiel ĝi estas nur movebla de registritaj uzantoj.\nJen la lasta protokolero por via referenco:",
-       "move-over-sharedrepo": "== Dosiero ekzistas ==\n[[:$1]] ekzistas en komuna dosierujo. Movante la dosieron al ĉi tiu titolo anstataŭigos la komunan dosieron.",
+       "move-over-sharedrepo": "[[:$1]] ekzistas en komuna dosierujo. Movado de dosiero al ĉi tiu titolo anstataŭigos la komunan dosieron.",
        "file-exists-sharedrepo": "La elektita dosiernomo jam estas uzita en komun dosierujo.\nBonvolu elekti alian nomon.",
        "export": "Eksporti paĝojn",
        "exporttext": "Vi povas eksporti la tekston kaj la redaktohistorion de aparta paĝo aŭ de paĝaro kolektita en ia XML.\nĈi tio povas esti importita en alian programon funkciantan per MediaWiki-softvaro per la [[Special:Import|import-paĝo]].\n\nPor eksporti paĝojn, enigu la titolojn en la jena tekst-skatolo, po unu por linio, kaj elektu ĉu vi volas kaj la nunan version kaj ĉiujn antaŭajn versiojn, kun la paĝaj historiaj linioj, aŭ la nunan version kun la informo pri la lasta redakto.\n\nEn la lasta okazo, vi ankaŭ povas uzi ligilon, ekz-e [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] por la paĝo \"[[{{MediaWiki:Mainpage}}]]\".",
        "import-nonewrevisions": "Neniuj versioj estis antaŭe importitaj. Aŭ ili ĉiuj jam ekzistis aŭ estis ellasitaj pro eraroj.",
        "xml-error-string": "$1 ĉe linio $2, kolumno $3 (bitiko $4): $5",
        "import-upload": "Alŝuti XML-datenojn",
-       "import-token-mismatch": "Seancaj datenoj perdiĝis. Bonvolu reprovi.",
+       "import-token-mismatch": "Seancaj datenoj perdiĝis.\n\nVi eble estis elsalutita. <strong>Bonvolu kontroli ke vi ankaŭ estas ensalutita kaj pravu denove</strong>.\nSe tiu ankoraŭ ne funkcios, pravu [[Special:UserLogout|elsaluti]] \nkaj ensaluti denove, kaj kontrolu ke via retumilo permesas kuketon de tiu paĝaro.",
        "import-invalid-interwiki": "Ne povas importi de la specifita vikio.",
        "import-error-edit": "Paĝo \"$1\" ne estis importita ĉar vi ne rajtas radakti ĝin.",
        "import-error-create": "Paĝo \"$1\" ne estis importita ĉar vi ne rajtas krei ĝin.",
        "tooltip-pt-watchlist": "Listo de paĝoj kies ŝanĝojn vi priatentas.",
        "tooltip-pt-mycontris": "Listo de viaj kontribuoj",
        "tooltip-pt-anoncontribs": "Listo de redaktoj faritaj el ĉi tiu IPa adreso",
-       "tooltip-pt-login": "Vi estas invitita ensaluti, tamen ne estas devige.",
+       "tooltip-pt-login": "Vi kuraĝigas ensaluti, tamen ne estas devige.",
        "tooltip-pt-logout": "Elsaluti",
        "tooltip-pt-createaccount": "Ni rekomendas al vi kreon de uzantokonto kaj ensaluto; tamen, tio ne estas deviga",
        "tooltip-ca-talk": "Diskuto pri la artikolo",
        "tooltip-ca-nstab-project": "Rigardi la paĝon de la projekto",
        "tooltip-ca-nstab-image": "Rigardi la dosierpaĝon",
        "tooltip-ca-nstab-mediawiki": "Rigardi la sisteman mesaĝon",
-       "tooltip-ca-nstab-template": "Rigardi la ŝablonon",
+       "tooltip-ca-nstab-template": "Vidi la ŝablonon",
        "tooltip-ca-nstab-help": "Rigardi la helppaĝon",
        "tooltip-ca-nstab-category": "Vidi la paĝon de la kategorio",
        "tooltip-minoredit": "Marki tiun ŝanĝon kiel etan",
        "tooltip-save": "Konservi viajn ŝanĝojn",
        "tooltip-publish": "Publikigi viajn ŝanĝojn",
-       "tooltip-preview": "Antaŭrigardi viajn ŝanĝojn. Bonvolu uzi tion antaŭ ol konservi ilin!",
+       "tooltip-preview": "Antaŭrigardi viajn ŝanĝojn. Bonvolu uzi tion antaŭ ol konservi.",
        "tooltip-diff": "Montri la ŝanĝojn kiujn vi faris de la teksto.",
        "tooltip-compareselectedversions": "Rigardi la malsamojn inter ambaŭ selektitaj versioj de ĉi tiu paĝo.",
        "tooltip-watch": "Aldoni ĉi paĝon al via atentaro",
        "version-libraries-description": "Priskribo",
        "version-libraries-authors": "Aŭtoroj",
        "redirect": "Alidirektilo laŭ dosiera, uzanta, paĝa, revizia aŭ protokola identigilo.",
-       "redirect-summary": "Tiu ĉi paĝo alidirektas al dosiero (laŭ ĝia nomo), paĝo (laŭ ĝia revizio-numero aŭ paĝo-identigilo) aŭ al uzantopaĝo (laŭ numera uzanto-identigilo). Uzado: [[{{#Special:Redirect}}/file/Ekzemplo.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], aŭ [[{{#Special:Redirect}}/user/101]].",
+       "redirect-summary": "Tiu ĉi paĝo alidirektas al dosiero (laŭ ĝia nomo), paĝo (laŭ ĝia revizio-numero aŭ paĝo-identigilo) aŭ al uzantopaĝo (laŭ numera uzanto-identigilo) aŭ enigo de protokolo (laŭ la protokol-identigilo). Uzado: [[{{#Special:Redirect}}/file/Ekzemplo.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], aŭ [[{{#Special:Redirect}}/user/101]], aŭ [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Ek",
        "redirect-lookup": "Traserĉi:",
        "redirect-value": "Valoro:",
        "logentry-suppress-block": "$1 {{GENDER:$2|forbaris}} la {{GENDER:$4|uzanton|uzantinon}} $3 por daŭro de $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|ŝanĝis}} agordojn de forbaro por la {{GENDER:$4|uzanto|uzantino}} $3 por daŭro de $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|importis}} $3 per dosiera alŝuto",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|importis}} $3 kiel dosiera alŝuto ($4 {{PLURAL:$4|revizio|revizioj}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|importis}} $3 de alia vikio",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|importis}} $3 el $5 ($4 {{PLURAL:$4|revizio|revizioj}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|kunigis}} $3 en $4 (revizioj ĝis $5)",
        "logentry-move-move": "$1 movis paĝon $3 al $4",
        "logentry-move-move-noredirect": "$1 movis paĝon $3 al $4 ne lasante alidirektilon",
        "logentry-newusers-create2": "Konto de uzanto $3 estis kreita de $1",
        "logentry-newusers-byemail": "Konto de uzanto $3 estis kreita de $1 kaj pasvorto estis sendita per retpoŝto",
        "logentry-newusers-autocreate": "Uzantokonto $1 estis {{GENDER:$2|kreita}} aŭtomate",
-       "logentry-rights-rights": "$1 ŝanĝis grupan membrecon por $3 de $4 al $5",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|movis}} protektajn agordojn el $4 al $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|forigis}} protekton el $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|protektis}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protektis}} $3 $4 [rikure]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|ŝanĝis}} la nivelon de protekto de $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|ŝanĝis}} la nivelon de protekto de $3 $4 [rikure]",
+       "logentry-rights-rights": "$1 {{GENDER:$2|ŝanĝis}} grupan membrecon por {{GENDER:$6|$3}} el $4 al $5",
        "logentry-rights-rights-legacy": "$1 ŝanĝis grupan membrecon por $3",
        "logentry-rights-autopromote": "$1 estis aŭtomate {{GENDER:$2|altrangigita}} de $4 al $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|alŝutis}} $3",
        "expand_templates_generate_xml": "Montri XML-sintaksarbon",
        "expand_templates_generate_rawhtml": "Montri krudan HTML-n",
        "expand_templates_preview": "Antaŭrigardo",
-       "expand_templates_preview_fail_html": "<em>Ĉar {{SITENAME}} ebligas enmeton de kruda HTML kaj sesiaj datumoj estis perditaj, antaŭvido estas kaŝita kiel protekto kontraŭ Ĝavoskriptaj atakoj.</em>\n\n<strong>Se tio estis legitima provo antaŭvidi, bonvolu reprovi.</strong>\nSe tio daŭre ne funkcias, provu [[Special:UserLogout|elsaluti]] kaj ree ensaluti.",
+       "expand_templates_preview_fail_html": "<em>Ĉar {{SITENAME}} ebligas enmeton de kruda HTML kaj sesiaj datumoj estis perditaj, antaŭvido estas kaŝita kiel protekto kontraŭ Ĝavoskriptaj atakoj.</em>\n\n<strong>Se tio estis legitima provo antaŭvidi, bonvolu reprovi.</strong>\nSe tio daŭre ne funkcias, provu [[Special:UserLogout|elsaluti]] kaj ree ensaluti, kaj kontrolu ke via retumilo permesas kuketojn el tiu paĝaro.",
        "expand_templates_preview_fail_html_anon": "<em>Ĉar {{SITENAME}} ebligas enmeton de kruda HTML kaj vi ne estas ensalutinta, antaŭvido estas kaŝita kiel protekto kontraŭ Ĝavoskriptaj atakoj.</em>\n\n<strong>Se tio estis legitima provo antaŭvidi, bonvolu [[Special:UserLogin|ensaluti]] kaj reprovi.</strong>",
        "expand_templates_input_missing": "Vi nepras provizi almenaŭ iom da eniga teksto.",
        "pagelanguage": "Ŝanĝi paĝan lingvon",
        "mediastatistics": "Statistikoj pri dosieroj",
        "mediastatistics-summary": "Statistiko pri tipoj de alŝutitaj dosieroj. Tio ĉi inkludas nur aktualajn versiojn de dosiero. Malnovaj aŭ forigitaj versioj de dosieroj estas ekskluditaj.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 bitoko|$1 bitokoj}} ($2; $3%)",
-       "mediastatistics-allbytes": "Totala dosiera grandeco por ĉiuj dosieroj: {{PLURALO:$1|$1 okumo|$1 okumoj}} ($2).",
+       "mediastatistics-bytespertype": "Totala grandeco de dosiero por ĉi tiu sekcio: {{PLURAL:$1|$1 okopo|$1 okopoj}} ($2; $3%).",
+       "mediastatistics-allbytes": "Totala grandeco de dosiero por ĉiuj dosieroj: {{PLURAL:$1|$1 okopo|$1 okopoj}} ($2).",
        "mediastatistics-table-mimetype": "MIME-tipo",
        "mediastatistics-table-extensions": "Eblaj dosier-sufiksoj",
        "mediastatistics-table-count": "Nombro de dosieroj",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
        "mw-widgets-titleinput-description-new-page": "paĝo ankoraŭ ne ekzistas",
        "mw-widgets-titleinput-description-redirect": "alidirekti al $1",
-       "api-error-blacklisted": "Bonvolu elekti alian, priskriban titolon.",
        "sessionmanager-tie": "Kombini diversajn tipojn de ensaluta peto ne estas permisita: $1.",
        "sessionprovider-generic": "$1 seancoj",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "kuketaj seancoj",
        "log-action-filter-managetags-activate": "Etikeda ekebligado",
        "log-action-filter-managetags-deactivate": "Etikeda malekebligado",
        "log-action-filter-move-move": "Alinomi sen anstataŭigi alidirektojn",
+       "log-action-filter-move-move_redir": "Alinomi anstataŭige alidirektojn",
+       "log-action-filter-newusers-create": "Kreo far anonima uzanto",
        "log-action-filter-newusers-create2": "Kreo de registrita uzanton",
        "log-action-filter-newusers-autocreate": "Aŭtomata kreo",
        "log-action-filter-newusers-byemail": "Kreo kun pasvorto sendita per retpoŝto",
        "log-action-filter-protect-protect": "Protekto",
        "log-action-filter-protect-modify": "Modifo de la protekto",
        "log-action-filter-protect-unprotect": "Malprotektado",
+       "log-action-filter-protect-move_prot": "Movis protekton",
        "log-action-filter-rights-rights": "Malaŭtomata ŝanĝo",
        "log-action-filter-rights-autopromote": "Aŭtomata ŝanĝo",
+       "log-action-filter-suppress-event": "Forigo de protokolo",
+       "log-action-filter-suppress-revision": "Forigo de revizio",
+       "log-action-filter-suppress-delete": "Forigo de paĝo",
+       "log-action-filter-suppress-block": "Forigo de uzanto per forbari",
+       "log-action-filter-suppress-reblock": "Forigi uzanton per reforbari",
        "log-action-filter-upload-upload": "Novalŝuta",
        "log-action-filter-upload-overwrite": "Realŝuta",
+       "authmanager-authn-not-in-progress": "Aŭtentikigado ne estas progresanta aŭ seanca dateno estis perdita. Bonvolu pravi denove ekde la komenco.",
+       "authmanager-authn-no-primary": "La provizita legitimaĵo ne povus esti aŭtentikigita.",
+       "authmanager-authn-no-local-user": "La provizitaj legitimaĵoj ne estas asociitaj kun ajna uzanto de ĉi tiu vikio.",
+       "authmanager-authn-no-local-user-link": "La provizitaj legitimaĵoj estas validaj sed ne estas asociita kun ajna uzanto de ĉi tiu vikio. Ensalutu per malsama metodo aŭ kreu novan uzanton kaj vi havos elekton por ligi vian antaŭan legitimaĵon kun tiu konto.",
+       "authmanager-authn-autocreate-failed": "Aŭtokreo de loka konto malsukcesis: $1",
+       "authmanager-change-not-supported": "La provizitaj legitimaĵoj ne povas esti ŝanĝita, kiel nenio uzus ilin.",
+       "authmanager-create-disabled": "kreado de kontoj estas malebligita",
+       "authmanager-create-from-login": "Por krei vian konton, bonvolu plenigi la kampojn sube.",
+       "authmanager-create-not-in-progress": "Konta kreo ne estas progresanta aŭ seanca dateno estis perdita. Bonvolu pravi denove ekde la komenco.",
+       "authmanager-create-no-primary": "La provizitaj legitimaĵoj ne povus esti uzita por konta kreo.",
+       "authmanager-link-no-primary": "La provizitaj legitimaĵoj ne povus esti uzita por konta ligado.",
+       "authmanager-link-not-in-progress": "Ligo de konto ne estas progresanta aŭ dateno de seanco estis perdita. Bonvolu pravi denove ekde la komenco.",
+       "authmanager-authplugin-setpass-failed-title": "Pasvorta ŝanĝo malsukcesis",
+       "authmanager-authplugin-setpass-failed-message": "La aŭtentikigado kromprogramo neis la pasvortan ŝanĝon.",
+       "authmanager-authplugin-create-fail": "La kromprogramo de aŭtentikigado neis la keon de konto.",
+       "authmanager-authplugin-setpass-denied": "La kromprogramaro de aŭtentikigado ne permisas ŝanĝadon de pasvorto.",
        "authmanager-authplugin-setpass-bad-domain": "Malvalida domajno.",
        "authmanager-autocreate-noperm": "Aŭtomata kreo de konto ne estas permesita.",
        "authmanager-autocreate-exception": "Aŭtomata kreo de konto estas provizore malfunkciigita pro antaŭaj eraroj.",
        "authmanager-userdoesnotexist": "Uzanto-konto \"$1\" ne estas registrita.",
+       "authmanager-userlogin-remembermypassword-help": "Ĉu la pasvorto devus esti memorita por pli longa ol la daŭro de la sesio.",
        "authmanager-username-help": "Salutnomo por aŭtentikado.",
+       "authmanager-password-help": "Pasvorto por aŭtentikigo.",
+       "authmanager-domain-help": "Domajno por ekstera aŭtentikigo.",
+       "authmanager-retype-help": "Pasvortu denove konfirmi.",
+       "authmanager-email-label": "Retadreso",
        "authmanager-email-help": "Retpoŝtadreso",
        "authmanager-realname-label": "Vera nomo",
        "authmanager-realname-help": "Vera nomo de la uzanto",
-       "changecredentials-submit": "Ŝanĝi",
-       "removecredentials-submit": "Forigi",
+       "authmanager-provider-password": "Pasvorto-bazita aŭtentikigo",
+       "authmanager-provider-password-domain": "Aŭtentikigo per pasvorto kaj domajno",
+       "authmanager-provider-temporarypassword": "Provizora pasvorto:",
+       "authprovider-confirmlink-message": "Laŭ viaj lastatempaj provoj de ensalutado, la sekvantaj kontoj povas esti ligita al via vikia konto. Ligi ilin ebligas ensalutadon per tiuj kontoj. Bonvolu elekti tiun, kiun ligendus.",
+       "authprovider-confirmlink-request-label": "Kontoj kiuj devus esti ligita",
+       "authprovider-confirmlink-success-line": "$1: Ligita sukcese.",
+       "authprovider-confirmlink-failed": "Ligado de konto ne plene sukcesis: $1",
+       "authprovider-confirmlink-ok-help": "Kontinui post montrado de mesaĝoj pri malsukceso de ligado.",
+       "authprovider-resetpass-skip-label": "Preterpasi",
+       "authprovider-resetpass-skip-help": "Preterpasi  pasvortan reensignadon.",
+       "authform-nosession-login": "La aŭtentikagdo sukcesis, sed via retumilo ne povas \"memori\" ensalutitadon.\n\n$1",
+       "authform-nosession-signup": "La konto estis kreita, sed via retumilo ne povas \"memori\" ensalutitadon.\n\n$1",
+       "authform-newtoken": "Mankanta ĵetono. $1",
+       "authform-notoken": "Mankanta ĵetono",
+       "authform-wrongtoken": "Malvalida ĵetono",
+       "specialpage-securitylevel-not-allowed-title": "Ne permesita",
+       "specialpage-securitylevel-not-allowed": "Pardonu, vi ne permesohavas je uzi ĉi tiun paĝon ĉar via identeco ne povus esti konfirmita.",
+       "authpage-cannot-login": "Ne povas ekensaluti.",
+       "authpage-cannot-login-continue": "Malpovas kontinui ensalutadon. Via sesio probablege tempoelĉerpis.",
+       "authpage-cannot-create": "Malpovas kontan ekkron",
+       "authpage-cannot-create-continue": "Malpovas konitinui kontan kreon. Via sesio probablege tempoelĉerpiĝis.",
+       "authpage-cannot-link": "Malpovas kontan ekligadon.",
+       "authpage-cannot-link-continue": "Malpovas kontinui ensalutan ligadon. Via sesio probablege tempoelĉerpis.",
+       "cannotauth-not-allowed-title": "Permison neis",
+       "cannotauth-not-allowed": "Estas malpermesite al vi uzi ĉi tiun paĝon",
+       "changecredentials": "Ŝanĝi legitimaĵojn",
+       "changecredentials-submit": "Ŝanĝi legitimaĵojn",
+       "changecredentials-invalidsubpage": "\"$1\" ne estas valida legitimaĵa tipo.",
+       "changecredentials-success": "Viaj legitimaĵoj estis ŝanĝitaj.",
+       "removecredentials": "Forigi legitimaĵojn",
+       "removecredentials-submit": "Forigi legitimaĵojn",
+       "removecredentials-invalidsubpage": "\"$1\" ne estas valida legitimaĵa tipo.",
+       "removecredentials-success": "Viaj legitimaĵoj estis forigitaj.",
+       "credentialsform-provider": "Tipo de legitimaĵoj",
+       "credentialsform-account": "Nomo de konto:",
+       "cannotlink-no-provider-title": "Malekzistas linkeblajn kontojn",
+       "cannotlink-no-provider": "Malekzistas ligeblajn kontojn.",
        "linkaccounts": "Ligi kontojn",
-       "linkaccounts-submit": "Ligi kontojn"
+       "linkaccounts-success-text": "La konto estis ligita.",
+       "linkaccounts-submit": "Ligi kontojn",
+       "unlinkaccounts": "Malligi kontojn",
+       "unlinkaccounts-success": "La konto estis malligita.",
+       "authenticationdatachange-ignored": "La ŝanĝo de dateno pri aŭtentikigado ne estis traktita. Eble neniu provizanto estis agorda?"
 }
index a989881..4b76762 100644 (file)
                        "Codynguyen1116",
                        "2axterix2",
                        "Matma Rex",
-                       "Dgstranz"
+                       "Dgstranz",
+                       "Copper12",
+                       "Ivanhercaz",
+                       "AlvaroMolina",
+                       "Tokvo"
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
        "category-file-count-limited": "{{PLURAL:$1|El siguiente archivo pertenece|Los siguientes $1 archivos pertenecen}} a esta categoría.",
        "listingcontinuesabbrev": "cont.",
        "index-category": "Páginas indizadas",
-       "noindex-category": "Páginas no indizadas",
+       "noindex-category": "Páginas no indexadas",
        "broken-file-category": "Páginas con enlaces rotos a archivos",
        "about": "Acerca de",
        "article": "Página de contenido",
        "unprotectthispage": "Cambiar la protección de esta página",
        "newpage": "Página nueva",
        "talkpage": "Discutir esta página",
-       "talkpagelinktext": "Discusión",
+       "talkpagelinktext": "discusión",
        "specialpage": "Página especial",
        "personaltools": "Herramientas personales",
        "articlepage": "Ver artículo",
        "views": "Vistas",
        "toolbox": "Herramientas",
        "userpage": "Ver página de usuario",
-       "projectpage": "Ver página de proyecto",
+       "projectpage": "Ver página del proyecto",
        "imagepage": "Ver página del archivo",
-       "mediawikipage": "Ver página de mensaje",
+       "mediawikipage": "Ver página del mensaje",
        "templatepage": "Ver página de plantilla",
        "viewhelppage": "Ver página de ayuda",
        "categorypage": "Ver página de categoría",
        "protectedpagetext": "Esta página ha sido protegida para evitar su edición u otras acciones.",
        "viewsourcetext": "Puedes ver y copiar el código fuente de esta página.",
        "viewyourtext": "Puedes ver y copiar el código de <strong>tus ediciones</strong> en esta página.",
-       "protectedinterface": "Esta página proporciona el texto de la interfaz del software en este wiki, y está protegida para prevenir el abuso.\nPara agregar o cambiar las traducciones para todos los wikis, por favor, usa [https://translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
+       "protectedinterface": "Esta página proporciona el texto de la interfaz del software en este wiki, y está protegida para prevenir el abuso.\nPara agregar o cambiar las traducciones para todos los wikis, usa [https://translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
        "editinginterface": "<strong>Advertencia:</strong> estás editando una página usada para proporcionar texto de la interfaz al software. \nLos cambios en esta página afectarán la apariencia de la interfaz de los demás usuarios de este wiki.",
        "translateinterface": "Para añadir o cambiar traducciones para todos los wikis, usa [https://translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
        "cascadeprotected": "Esta página ha sido protegida contra edición porque está transcluida en {{PLURAL:$1|la siguiente página protegida|las siguientes páginas protegidas}} con la opción de «cascada» activa:\n$2",
        "passwordreset-emailerror-capture": "Se ha generado un correo electrónico de restablecimiento de contraseña, que se muestra a continuación, pero ha fallado el envío {{GENDER:$2|al usuario|a la usuaria}}: $1",
        "passwordreset-emailsent-capture2": "{{PLURAL:$1|El e-mail de restablecimiento de contraseña ha sido enviado|Los e-mails de restablecimiento de contraseña han sido enviados}}. {{PLURAL:$1|El nombre de usuario y la contraseña se muestra a continuación|La lista de nombres de usuarios y contraseñas se muestra a continuación}}.",
        "passwordreset-emailerror-capture2": "No fue posible mandar un correo electrónico {{Gender:$2|al usuario|a la usuaria}}: $1 {{PLURAL:$3|El nombre de usuario y la contraseña|La lista de nombres de usuarios y contraseñas}} se muestra a continuación.",
+       "passwordreset-nocaller": "Debe de proporcionarse un interlocutor",
+       "passwordreset-nosuchcaller": "La persona que llama no existe: $1",
+       "passwordreset-ignored": "No se logró el reestablecimiento de la contraseña. ¿Tal vez no se configuró un proveedor?",
        "passwordreset-invalideamil": "Dirección de correo electrónico no válida.",
        "passwordreset-nodata": "No se ha proporcionado ni un nombre de usuario ni una dirección de correo electrónico",
        "changeemail": "Cambiar o eliminar la dirección de correo electrónico",
        "minoredit": "Esta es una edición menor",
        "watchthis": "Vigilar esta página",
        "savearticle": "Guardar la página",
+       "savechanges": "Guardar cambios",
        "publishpage": "Publicar la página",
+       "publishchanges": "Publicar cambios",
        "preview": "Previsualizar",
        "showpreview": "Mostrar previsualización",
        "showdiff": "Mostrar los cambios",
        "content-model-css": "CSS",
        "content-json-empty-object": "Objeto vacío",
        "content-json-empty-array": "Matriz vacía",
+       "deprecated-self-close-category": "Páginas que utilizan etiquetas HTML autocerradas no válidas",
+       "deprecated-self-close-category-desc": "Esta página contiene etiquetas HTML de auto-cierre invalidas, tales como <code>&lt;b/></code> o <code>&lt;span/></code>. El comportamiento de estas en  cambiará pronto para ser coherente con la especificación de HTML5, por lo que su utilización en wikitext está en desuso.",
        "duplicate-args-warning": "<strong>Aviso:</strong> [[:$1]] llama a [[:$2]] con más de un valor para el parámetro «$3». Se usará solo el último valor proporcionado.",
        "duplicate-args-category": "Páginas que usan argumentos duplicados en invocaciones de plantillas",
        "duplicate-args-category-desc": "La página contiene invocaciones de plantillas que utilizan argumentos duplicados, como <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "rows": "Filas:",
        "columns": "Columnas:",
        "searchresultshead": "Búsquedas",
-       "stub-threshold": "Límite para cambiar a formato de enlace a esbozo ($1):",
+       "stub-threshold": "Límite para enlazar con el estilo de esbozo ($1):",
        "stub-threshold-sample-link": "muestra",
        "stub-threshold-disabled": "Desactivado",
        "recentchangesdays": "Días que mostrar en los cambios recientes:",
        "rightslogtext": "Este es un registro de cambios en los permisos de usuarios.",
        "action-read": "leer esta página",
        "action-edit": "modificar esta página",
-       "action-createpage": "crear páginas",
-       "action-createtalk": "crear páginas de discusión",
+       "action-createpage": "crear esta página",
+       "action-createtalk": "crear esta página de discusión",
        "action-createaccount": "crear esta cuenta de usuario",
        "action-autocreateaccount": "crear automáticamente esta cuenta de usuario externa",
        "action-history": "ver el historial de esta página",
        "upload-http-error": "Ha ocurrido un error HTTP: $1",
        "upload-copy-upload-invalid-domain": "No se pueden realizar subidas remotas desde este dominio.",
        "upload-foreign-cant-upload": "Este wiki no está configurado para subir archivos al repositorio de archivos externo solicitado.",
+       "upload-foreign-cant-load-config": "Falló la carga de la configuración para subir archivos al depósito de archivos externo.",
+       "upload-dialog-disabled": "En este wiki están desactivadas las subidas de archivos mediante este cuadro de diálogo.",
        "upload-dialog-title": "Subir archivo",
        "upload-dialog-button-cancel": "Cancelar",
        "upload-dialog-button-done": "Hecho",
        "rollbacklinkcount": "revertir $1 {{PLURAL:$1|edición|ediciones}}",
        "rollbacklinkcount-morethan": "revertir más de $1 {{PLURAL:$1|edición|ediciones}}",
        "rollbackfailed": "No se pudo revertir",
+       "rollback-missingparam": "Faltan parámetros requeridos en la solicitud.",
        "cantrollback": "No se puede revertir la edición;\nel último colaborador es el único autor de esta página.",
        "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>.",
        "sp-contributions-username": "Dirección IP o nombre de usuario:",
        "sp-contributions-toponly": "Solo mostrar últimas ediciones de página",
        "sp-contributions-newonly": "Mostrar solo ediciones que son creaciones de páginas",
+       "sp-contributions-hideminor": "Ocultar ediciones menores",
        "sp-contributions-submit": "Buscar",
        "whatlinkshere": "Lo que enlaza aquí",
        "whatlinkshere-title": "Páginas que enlazan con «$1»",
        "blocklist-timestamp": "Fecha y hora",
        "blocklist-target": "Destino",
        "blocklist-expiry": "Caduca",
-       "blocklist-by": "Administrador bloqueante",
+       "blocklist-by": "Administrador que bloqueó",
        "blocklist-params": "Parámetros de bloqueo",
        "blocklist-reason": "Motivo",
        "ipblocklist-submit": "Buscar",
        "allmessagesname": "Nombre",
        "allmessagesdefault": "Texto predeterminado",
        "allmessagescurrent": "Texto actual",
-       "allmessagestext": "Esta es una lista de mensajes del sistema disponibles en el espacio de nombres MediaWiki.\nVisita [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Localización MediaWiki] y [https://translatewiki.net translatewiki.net] si deseas contribuir a la localización genérica de MediaWiki.",
+       "allmessagestext": "Esta es una lista de mensajes del sistema disponibles en el espacio de nombres MediaWiki.\nVisita [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Localización de MediaWiki] y [https://translatewiki.net translatewiki.net] si deseas contribuir a la localización genérica de MediaWiki.",
        "allmessagesnotsupportedDB": "Esta página no está disponible porque <strong>$wgUseDatabaseMessages</strong> está desactivado.",
        "allmessages-filter-legend": "Filtro",
        "allmessages-filter": "Filtrar por estado de personalización:",
        "timezone-local": "Local",
        "duplicate-defaultsort": "<strong>Advertencia:</strong> la clave de ordenamiento predeterminada «$2» anula la clave de ordenamiento anterior «$1».",
        "duplicate-displaytitle": "<strong>Advertencia:</strong> El título visualizado \"$2\" sobreescribe al anterior \"$1\".",
-       "restricted-displaytitle": "<strong>Atención:</strong> El título mostrado \"$1\" se ignoró porque no es equivalente al título real de la página.",
+       "restricted-displaytitle": "<strong>Atención:</strong> el título mostrado \"$1\" se ignoró porque no es equivalente al título real de la página.",
        "invalid-indicator-name": "<strong>Error:</strong> el atributo <code>name</code> de los indicadores de estado de página no debe estar vacío.",
        "version": "Versión",
        "version-extensions": "Extensiones instaladas",
        "api-error-autoblocked": "Tu dirección IP ha sido bloqueada automáticamente porque fue utilizada por un usuario bloqueado.",
        "api-error-badaccess-groups": "No puedes cargar archivos en este wiki.",
        "api-error-badtoken": "Error interno: Símbolo incorrecto.",
+       "api-error-blocked": "Has sido bloqueado de editar.",
        "api-error-copyuploaddisabled": "La subida por URL está desactivada en este servidor.",
        "api-error-duplicate": "Ya {{PLURAL:$1|existe otro archivo|existen otros archivos}} en el sitio con el mismo contenido.",
        "api-error-duplicate-archive": "Ya {{PLURAL:$1|existía otro archivo|existían otros archivos}} en el sitio con el mismo contenido, pero {{PLURAL:$1|fue eliminado|fueron eliminados}}.",
        "api-error-nomodule": "Error interno: No hay un módulo de carga configurado.",
        "api-error-ok-but-empty": "Error interno: No hay respuesta del servidor.",
        "api-error-overwrite": "No se permite sobrescribir un archivo existente.",
+       "api-error-ratelimited": "Estás tratando de subir, en un corto periodo de tiempo, más archivos de los que este wiki permite.\nPor favor, inténtalo de nuevo dentro de algunos minutos.",
        "api-error-stashfailed": "Error interno: El servidor no pudo almacenar el archivo temporal.",
        "api-error-publishfailed": "Error interno: el servidor no pudo publicar el archivo temporal.",
        "api-error-stasherror": "Ha ocurrido un error al subir el archivo al depósito.",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "la página aún no existe",
        "mw-widgets-titleinput-description-redirect": "redirigir a $1",
-       "api-error-blacklisted": "Elige un título diferente, más descriptivo.",
        "sessionmanager-tie": "No se pueden combinar múltiples tipos de autenticación de solicitudes: $1.",
        "sessionprovider-generic": "sesiones $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesiones basadas en cookies",
        "log-action-filter-newusers": "Tipo de creación de la cuenta:",
        "log-action-filter-patrol": "Tipo de verificación:",
        "log-action-filter-protect": "Tipo de protección:",
-       "log-action-filter-rights": "El tipo de cambio correcto",
-       "log-action-filter-suppress": "Tipo de supresión",
+       "log-action-filter-rights": "Tipo de cambio de permisos:",
+       "log-action-filter-suppress": "Tipo de supresión:",
        "log-action-filter-upload": "Tipo de subida:",
        "log-action-filter-all": "Todas",
        "log-action-filter-block-block": "Bloquear",
        "log-action-filter-suppress-event": "Supresión de registros",
        "log-action-filter-suppress-revision": "Supresión de revisiones",
        "log-action-filter-suppress-delete": "Supresión de páginas",
-       "log-action-filter-suppress-block": "Usuario supppression por bloque",
+       "log-action-filter-suppress-block": "Supresión de usuarios por bloque",
        "log-action-filter-suppress-reblock": "Usuario supresión de rebloqueo",
        "log-action-filter-upload-upload": "Subida nueva",
        "log-action-filter-upload-overwrite": "Volver a subir",
+       "authmanager-authn-not-in-progress": "La autenticación no está en curso o los datos de sesión se han perdido. Por favor, vuelve a empezar desde el principio.",
        "authmanager-authn-no-primary": "Las credenciales proporcionadas no se han podido autentificar.",
        "authmanager-authn-no-local-user": "Las credenciales suministradas no están asociadas con ningún usuario en este wiki.",
        "authmanager-authn-no-local-user-link": "Las credenciales suministradas son válidas, pero no están asociadas con ningún usuario de este wiki. Inicia sesión con un usuario diferente, o crea un nuevo usuario, para poder vincular tus credenciales anteriores a esa cuenta.",
        "authmanager-authn-autocreate-failed": "Falló la creación automática de una cuenta local: $1",
+       "authmanager-change-not-supported": "Las credenciales proporcionadas no se pueden cambiar, ya que no hay nada que fuera a hacer uso de ellas.",
        "authmanager-create-disabled": "Está desactivada la creación de cuentas.",
        "authmanager-create-from-login": "Para crear tu cuenta, completa los campos a continuación.",
        "authmanager-create-not-in-progress": "El proceso de creación de la cuenta no está en progreso o se perdieron los datos de la sesión. Empieza de nuevo desde el principio.",
        "authmanager-create-no-primary": "Las credenciales suministradas no pueden usarse para la creación de la cuenta.",
+       "authmanager-link-no-primary": "Las credenciales proporcionadas no se han podido utilizar para enlazar cuentas.",
+       "authmanager-link-not-in-progress": "La vinculación de cuentas no está en curso o los datos de la sesión se han perdido. Por favor, vuelve a empezar desde el principio.",
+       "authmanager-authplugin-setpass-failed-title": "Error de cambio de contraseña",
        "authmanager-authplugin-setpass-failed-message": "El complemento de autenticación denegó el cambio de contraseña.",
        "authmanager-authplugin-create-fail": "El complemento de autenticación denegó la creación de la cuenta.",
        "authmanager-authplugin-setpass-denied": "El complemento de autenticación no permite el cambio de contraseñas.",
        "authmanager-autocreate-noperm": "La creación automática de cuentas no está permitida.",
        "authmanager-autocreate-exception": "La creación automática de cuentas ha sido temporalmente desactivada debido a errores previos.",
        "authmanager-userdoesnotexist": "El usuario «$1» no está registrado.",
+       "authmanager-userlogin-remembermypassword-help": "Si debe recordarse la contraseña por más tiempo que la duración de la sesión.",
+       "authmanager-username-help": "Nombre de usuario para la autenticación.",
        "authmanager-password-help": "Contraseña para autenticación.",
+       "authmanager-domain-help": "Dominio para la autenticación externa.",
        "authmanager-retype-help": "La contraseña de nuevo para confirmar.",
        "authmanager-email-label": "Correo electrónico",
        "authmanager-email-help": "Dirección de correo electrónico",
        "authmanager-provider-password": "Autenticación basada en contraseña",
        "authmanager-provider-password-domain": "Autenticación basada en contraseña y dominio",
        "authmanager-provider-temporarypassword": "Contraseña temporal",
+       "authprovider-confirmlink-message": "Basado en tus últimos intentos para iniciar sesión, las siguientes cuentas pueden vincularse a tu cuenta wiki. Vincularlas permite iniciar sesión a través de esas cuentas. Selecciona cuáles deben vincularse.",
+       "authprovider-confirmlink-request-label": "Cuentas que deberían vincularse",
        "authprovider-confirmlink-success-line": "$1: vinculado exitosamente.",
+       "authprovider-confirmlink-failed": "La vinculación de cuentas no se ha realizado con éxito: $1",
+       "authprovider-confirmlink-ok-help": "Continuar luego de mostrar los mensajes de error en la vinculación.",
        "authprovider-resetpass-skip-label": "Omitir",
+       "authprovider-resetpass-skip-help": "Saltar el reestablecimiento de la contraseña.",
        "authform-nosession-login": "La autenticación fue exitosa, pero tu navegador no puede \"recordar\" haber iniciado sesión.\n\n$1",
        "authform-nosession-signup": "La cuenta ha sido creada, pero tu navegador no \"recuerda\" haber iniciado sesión.\n\n$1",
+       "authform-newtoken": "Falta token. $1",
+       "authform-notoken": "Falta token",
+       "authform-wrongtoken": "Token incorrecto",
        "specialpage-securitylevel-not-allowed-title": "No está permitido",
        "specialpage-securitylevel-not-allowed": "Lo siento, no tienes permitido usar esta página, porque tu identidad no pudo verificarse.",
+       "authpage-cannot-login": "No se puede iniciar la sesión.",
        "authpage-cannot-login-continue": "No se puede continuar con el inicio de sesión. Lo más probable es que tu sesión haya expirado.",
        "authpage-cannot-create": "No se puede iniciar la creación de la cuenta.",
+       "authpage-cannot-create-continue": "No se puede continuar con la creación de la cuenta. Lo más probable es que tu sesión haya expirado.",
+       "authpage-cannot-link": "No se puede iniciar la vinculación de la cuenta.",
        "authpage-cannot-link-continue": "No se puede continuar con la vinculación de la cuenta. Lo más probable es que tu sesión haya expirado.",
        "cannotauth-not-allowed-title": "Permiso denegado",
        "cannotauth-not-allowed": "No tienes permiso para usar esta página.",
        "changecredentials": "Cambiar las credenciales",
        "changecredentials-submit": "Cambiar credenciales",
+       "changecredentials-invalidsubpage": "$1 no es un tipo de credencial válido.",
        "changecredentials-success": "Tus credenciales han sido cambiadas.",
        "removecredentials": "Eliminar credenciales",
        "removecredentials-submit": "Eliminar credenciales",
+       "removecredentials-invalidsubpage": "$1 no es un tipo de credencial válido.",
        "removecredentials-success": "Tus credenciales han sido eliminadas.",
+       "credentialsform-provider": "Tipo de credenciales:",
        "credentialsform-account": "Nombre de la cuenta:",
+       "cannotlink-no-provider-title": "No hay cuentas vinculables",
        "cannotlink-no-provider": "No hay cuentas vinculables.",
        "linkaccounts": "Vincular cuentas",
        "linkaccounts-success-text": "La cuenta fue vinculada.",
        "linkaccounts-submit": "Vincular cuentas",
        "unlinkaccounts": "Desvincular cuentas",
-       "unlinkaccounts-success": "Se ha desvinculado la cuenta."
+       "unlinkaccounts-success": "Se ha desvinculado la cuenta.",
+       "authenticationdatachange-ignored": "El cambio den los datos de autentificacion no fue realizado. ¿Tal vez, no se configuró un proveedor?"
 }
index 97e943e..1b5d5e7 100644 (file)
        "october-date": "$1. oktoober",
        "november-date": "$1. november",
        "december-date": "$1. detsember",
+       "period-am": "e. l.",
+       "period-pm": "p. l.",
        "pagecategories": "{{PLURAL:$1|Kategooria|Kategooriad}}",
        "category_header": "Leheküljed kategoorias \"$1\"",
        "subcategories": "Alamkategooriad",
        "nocookieslogin": "{{SITENAME}} kasutab kasutajate tuvastamisel küpsiseid. Sinu brauseris on küpsised keelatud. Palun sea küpsised lubatuks ja proovi siis uuesti.",
        "nocookiesfornew": "Kasutajakonto jäi loomata, kuna me ei saanud selle allikat kindlaks teha.\nVeendu, et sul on küpsised lubatud, taaslaadi see lehekülg ja proovi uuesti.",
        "noname": "Sa ei sisestanud kasutajanime lubataval kujul.",
-       "loginsuccesstitle": "Sisselogimine õnnestus",
+       "loginsuccesstitle": "Sisse logitud",
        "loginsuccess": "Oled sisse loginud. Sinu kasutajanimi on \"$1\".",
        "nosuchuser": "Kasutajat \"$1\" pole.\nKasutajanimed on tõstutundlikud.\nKontrolli kirjapilti või [[Special:CreateAccount|loo uus konto]].",
        "nosuchusershort": "Kasutajat nimega \"$1\" pole.\nKontrolli kirjapilti.",
        "noemail": "Kasutaja $1 e-posti aadressi meil kahjuks pole.",
        "noemailcreate": "Pead sisestama korrektse e-posti aadressi",
        "passwordsent": "Uus parool on saadetud kasutaja $1 registreeritud e-postiaadressil.\nPärast parooli saamist logige palun sisse.",
-       "blocked-mailpassword": "Sinu IP-aadressi jaoks on toimetamine blokeeritud, seetõttu ei saa sa kasutada ka parooli meeldetuletamise funktsiooni.",
+       "blocked-mailpassword": "Sinu IP-aadressi jaoks on toimetamine blokeeritud. Et väärtarvitust ennetada, ei saa sellelt IP-aadressilt kasutada parooli meeldetuletamise funktsiooni.",
        "eauthentsent": "Määratud e-posti aadressile on saadetud kinnituse e-kiri.\nEnne kui su kontole ükskõik milline muu e-kiri saadetakse, pead e-kirjas olevat juhist järgides kinnitama, et konto on tõepoolest sinu.",
        "throttled-mailpassword": "Parooli lähtestamise e-kiri saadetud viimase {{PLURAL:$1|tunni|$1 tunni}} jooksul.\nVäärtarvitamise vältimiseks saadetakse {{PLURAL:$1|tunni|$1 tunni}} jooksul ainult üks lähtestamise e-kiri.",
        "mailerror": "Viga kirja saatmisel: $1",
        "newpassword": "Uus parool:",
        "retypenew": "Sisesta uus parool uuesti:",
        "resetpass_submit": "Sisesta parool ja logi sisse",
-       "changepassword-success": "Sinu parool on edukalt muudetud!\nSind logitakse nüüd sisse...",
+       "changepassword-success": "Sinu parool on muudetud!",
        "changepassword-throttled": "Oled hiljuti proovinud liiga palju kordi sisse logida.\nPalun oota $1, enne kui uuesti proovid.",
        "resetpass_forbidden": "Paroole ei saa muuta",
        "resetpass-no-info": "Pead olema sisselogitud, et sellele lehele pääseda.",
        "resetpass-submit-loggedin": "Muuda parool",
        "resetpass-submit-cancel": "Loobu",
-       "resetpass-wrong-oldpass": "Vigane ajutine või praegune salasõna.\nVõib-olla oled juba edukalt muudnud oma salasõna või taotlenud uut ajutist salasõna.",
+       "resetpass-wrong-oldpass": "Vigane ajutine või praegune salasõna.\nVõib-olla oled juba muutnud oma salasõna või taotlenud uut ajutist salasõna.",
        "resetpass-recycled": "Palun vali uus salasõna, mis erineb praegusest.",
        "resetpass-temp-emailed": "Logisid sisse e-posti teel saadud ajutise koodiga.\nEt sisselogimine lõpule viia, pead määrama siin uue parooli:",
        "resetpass-temp-password": "Ajutine parool:",
        "userpage-userdoesnotexist": "Kasutajakontot \"<nowiki>$1</nowiki>\" pole olemas.\nPalun mõtle järele, kas soovid seda lehte luua või muuta.",
        "userpage-userdoesnotexist-view": "Kasutajakonto \"$1\" pole registreeritud.",
        "blocked-notice-logextract": "See kasutaja on praegu blokeeritud.\nAllpool on toodud viimane blokeerimislogi sissekanne:",
-       "clearyourcache": "'''Märkus:''' Võimalik, et pärast salvestamist tuleb muudatuste nägemiseks veebilehitseja puhver tühjendada.\n* '''Firefox / Safari:''' Hoia all ''Shift''-klahvi ja klõpsa ''Laadi uuesti'' või vajuta kas ''Ctrl-F5'' või ''Ctrl-R'' (Macis ''⌘-R'').\n* '''Google Chrome:''' Vajuta ''Ctrl-Shift-R'' (Macis ''⌘-Shift-R'').\n* '''Internet Explorer:''' Hoia all ''Ctrl''-klahvi ja klõpsa ''Värskenda'' või vajuta ''Ctrl-F5''.\n* '''Opera:''' Tühjenda puhver asukohas ''Seaded → Eelistused''.",
+       "clearyourcache": "<strong>Märkus:</strong> Võimalik, et pärast salvestamist tuleb muudatuste nägemiseks veebilehitseja puhver tühjendada.\n* <strong>Firefox / Safari:</strong> Hoia all <em>Shift</em>-klahvi ja klõpsa <em>Laadi uuesti</em> või vajuta kas <em>Ctrl-F5</em> või <em>Ctrl-R</em> (Macis <em>⌘-R</em>).\n* <strong>Google Chrome:</strong> Vajuta <em>Ctrl-Shift-R</em> (Macis <em>⌘-Shift-R</em>).\n* <strong>Internet Explorer:</strong> Hoia all <em>Ctrl</em>-klahvi ja klõpsa <em>Värskenda</em> või vajuta <em>Ctrl-F5</em>.\n* <strong>Opera:</strong> Mine asukohta <em>Menüü → Seaded</em> (Macis <em>Opera → Eelistused</em>) ja seejärel <em>Privaatsus ja turvalisus → Tühjenda sirvimisandmed → Puhverdatud pildid ja failid</em>.",
        "usercssyoucanpreview": "'''Vihje:''' Enne salvestamist kasuta oma uue CSSi proovimiseks nuppu \"{{int:showpreview}}\".",
        "userjsyoucanpreview": "'''Vihje:''' Enne salvestamist kasuta oma uue JavaScripti proovimiseks nuppu \"{{int:showpreview}}\".",
        "usercsspreview": "'''Ära unusta, et seda versiooni sinu isiklikust stiililehest pole veel salvestatud!'''",
        "previewnote": "'''Ära unusta, et see on kõigest eelvaade!'''\nSinu muudatused pole veel salvestatud!",
        "continue-editing": "Mine redigeerimiskasti juurde",
        "previewconflict": "See eelvaade näitab, kuidas ülemises toimetuskastis olev tekst hakkab välja nägema, kui otsustate salvestada.",
-       "session_fail_preview": "'''Vabandust! Meil ei õnnestunud seansiandmete kaotuse tõttu sinu muudatust töödelda.'''\nPalun proovi uuesti.\nKui see ikka ei tööta, proovi [[Special:UserLogout|välja]] ja tagasi sisse logida.",
-       "session_fail_preview_html": "'''Vabandust! Meil ei õnnestunud seansiandmete kaotuse tõttu sinu muudatust töödelda.'''\n\n''Kuna {{GRAMMAR:inessive|{{SITENAME}}}} on toor-HTML lubatud, on eelvaade JavaScripti-rünnakute vastase ettevaatusabinõuna peidetud.''\n\n'''Kui see on õigustatud redigeerimiskatse, proovi palun uuesti.'''\nKui see ikka ei tööta, proovi [[Special:UserLogout|välja]] ja tagasi sisse logida.",
+       "session_fail_preview": "Vabandust! Meil ei õnnestunud seansiandmete kaotuse tõttu sinu muudatust töödelda.\n\nVõimalik, et oled välja loginud. <strong>Palun veendu, et oled endiselt sisse logitud ja proovi uuesti</strong>.\nKui see ei toimi, siis proovi [[Special:UserLogout|logida välja]] ja seejärel tagasi sisse ning kontrolli, kas brauser lubab sellest võrgukohast küpsiseid.",
+       "session_fail_preview_html": "Vabandust! Meil ei õnnestunud seansiandmete kaotuse tõttu sinu muudatust töödelda.\n\n<em>Kuna {{GRAMMAR:inessive|{{SITENAME}}}} on toor-HTML lubatud, on eelvaade JavaScripti-rünnakute vastase ettevaatusabinõuna peidetud.</em>\n\n<strong>Kui see on õigustatud redigeerimiskatse, proovi palun uuesti.</strong>\nKui see ikka ei tööta, proovi [[Special:UserLogout|välja]] ja tagasi sisse logida ning kontrolli, kas brauser lubab sellest võrgukohast küpsiseid.",
        "token_suffix_mismatch": "'''Muudatus lükati tagasi, kuna sinu klienttarkvara ei suuda õigesti kirjavahemärke kasutada.'''\nMuudatus lükati tagasi, et vältida lehekülje segiminekut.\nSee juhtub mõnikord siis, kui kasutatakse vigast veebipõhist anonüümsusserverit.",
        "edit_form_incomplete": "'''Redigeerimisvormi mõni osa ei jõudnud serverisse; kontrolli, kas sinu tehtud muudatused on alles, ja proovi uuesti.'''",
        "editing": "Muutmisel on \"$1\"",
        "revdelete-unsuppress": "Eemalda taastatud redaktsioonidelt piirangud",
        "revdelete-log": "Põhjus:",
        "revdelete-submit": "Rakenda valitud {{PLURAL:$1|redaktsiooni|redaktsioonide}} suhtes",
-       "revdelete-success": "Redaktsiooni nähtavus edukalt värskendatud.",
+       "revdelete-success": "Redaktsiooni nähtavus värskendatud.",
        "revdelete-failure": "'''Redaktsiooni nähtavust ei saanud värskendada:'''\n$1",
-       "logdelete-success": "'''Logi nähtavus edukalt muudetud.'''",
+       "logdelete-success": "Logi nähtavus muudetud.",
        "logdelete-failure": "'''Logi nähtavust ei saanud paika:'''\n$1",
        "revdel-restore": "muuda nähtavust",
        "pagehist": "lehekülje ajalugu",
        "userrights": "Kasutajaõiguste haldus",
        "userrights-lookup-user": "Kasutajarühma muutmine",
        "userrights-user-editname": "Sisesta kasutajanimi:",
-       "editusergroup": "Muuda kasutajarühmi",
+       "editusergroup": "Muuda {{GENDER:$1|kasutajarühmi}}",
        "editinguser": "Kasutaja '''[[User:$1|$1]]''' $2 õiguste muutmine",
        "userrights-editusergroup": "Kasutajarühmade muutmine",
-       "saveusergroups": "Salvesta kasutajarühmad",
+       "saveusergroups": "Salvesta {{GENDER:$1|kasutajarühmad}}",
        "userrights-groupsmember": "Kuulub rühmadesse:",
        "userrights-groupsmember-auto": "Kuulub vaikimisi rühmadesse:",
        "userrights-groups-help": "Sa võid muuta selle kasutaja kuuluvust eri kasutajarühmadesse.\n* Märgitud kast tähendab, et kasutaja kuulub sellesse rühma.\n* Märkimata kast tähendab, et kasutaja ei kuulu sellesse rühma.\n* Aga * kasutajarühma juures tähistab õigust, mida sa peale lisamist enam eemaldada ei saa, või siis ka vastupidi.",
        "userrights-changeable-col": "Rühmad, mida sa saad muuta",
        "userrights-unchangeable-col": "Rühmad, mida sa ei saa muuta",
        "userrights-conflict": "Kasutajaõiguste muutmise konflikt! Palun vaata oma muudatused üle ja kinnita need.",
-       "userrights-removed-self": "Võtsid edukalt endalt õigused. Seetõttu sellele leheküljele sa enam ligi ei pääse.",
+       "userrights-removed-self": "Võtsid endalt õigused. Seetõttu sellele leheküljele sa enam ligi ei pääse.",
        "group": "Rühm:",
        "group-user": "Kasutajad",
        "group-autoconfirmed": "Automaatselt kinnitatud kasutajad",
        "right-override-export-depth": "Eksportida lehekülgi, kaasates viidatud leheküljed kuni viienda tasemeni",
        "right-sendemail": "Saata teistele kasutajatele e-kirju",
        "right-passwordreset": "Vaadata parooli lähtestamise e-kirju",
-       "right-managechangetags": "Koostada [[Special:Tags|märgiseid]] ja kustutada neid andmebaasist",
+       "right-managechangetags": "Koostada ja (in)aktiveerida [[Special:Tags|märgiseid]]",
        "right-applychangetags": "Rakendada [[Special:Tags|märgiseid]] enda muudatuste suhtes",
        "right-changetags": "Lisada ja eemaldada käsitsi rakendatavaid [[Special:Tags|märgiseid]] üksikute redaktsioonide ja logisissekannete juures",
        "grant-group-page-interaction": "Interaktsioon lehekülgedega",
        "grant-sendemail": "Kasutajatele e-kirjade saatmine",
        "grant-uploadeditmovefile": "Failide üleslaadimine, asendamine ja teisaldamine",
        "grant-uploadfile": "Uute failide üleslaadimine",
+       "grant-basic": "Põhiõigused",
        "grant-viewdeleted": "Kustutatud failide ja lehekülgede vaatamine",
        "grant-viewmywatchlist": "Oma jälgimisloendi vaatamine",
        "newuserlogpage": "Konto loomise logi",
        "rightslogtext": "See on logi kasutajate õiguste muutuste kohta.",
        "action-read": "seda lehekülge lugeda",
        "action-edit": "seda lehekülge muuta",
-       "action-createpage": "lehekülgi luua",
-       "action-createtalk": "arutelulehekülgi luua",
+       "action-createpage": "seda lehekülge luua",
+       "action-createtalk": "seda arutelulehekülge luua",
        "action-createaccount": "seda kasutajakontot luua",
        "action-history": "vaadata selle lehekülje ajalugu",
        "action-minoredit": "seda muudatust pisimuudatuseks märkida",
        "action-viewmyprivateinfo": "oma eraandmeid vaadata",
        "action-editmyprivateinfo": "oma eraandmeid redigeerida",
        "action-editcontentmodel": "lehekülje sisumudelit muuta",
-       "action-managechangetags": "märgiseid koostada ege neid andmebaasist kustutada",
+       "action-managechangetags": "märgiseid koostada ega (in)aktiveerida",
        "action-applychangetags": "rakendada märgiseid oma muudatuste suhtes",
        "action-changetags": "käsitsi rakendatavaid märgiseid üksikute redaktsioonide ega logisissekannete juures lisada ega eemaldada",
        "nchanges": "$1 {{PLURAL:$1|muudatus|muudatust}}",
        "recentchangeslinked-page": "Lehekülje nimi:",
        "recentchangeslinked-to": "Näita hoopis muudatusi lehekülgedel, mis sellele lehele lingivad",
        "recentchanges-page-added-to-category": "kategooriasse lisatud \"[[:$1]]\"",
-       "recentchanges-page-added-to-category-bundled": "kategooriasse lisatud \"[[:$1]]\" ja veel [[Special:WhatLinksHere/$1|{{PLURAL:$2|üks lehekülg|$2 lehekülge}}]]",
+       "recentchanges-page-added-to-category-bundled": "kategooriasse lisatud \"[[:$1]]\", [[Special:WhatLinksHere/$1|seda lehekülge kasutatakse teisel leheküljel mallina]]",
        "recentchanges-page-removed-from-category": "kategooriast eemaldatud \"[[:$1]]\"",
-       "recentchanges-page-removed-from-category-bundled": "kategooriast eemaldatud \"[[:$1]]\" ja veel {{PLURAL:$2|üks lehekülg|$2 lehekülge}}",
+       "recentchanges-page-removed-from-category-bundled": "kategooriast eemaldatud \"[[:$1]]\", [[Special:WhatLinksHere/$1|seda lehekülge kasutatakse teisel leheküljel mallina]]",
        "autochange-username": "MediaWiki automaatne muudatus",
        "upload": "Faili üleslaadimine",
        "uploadbtn": "Laadi fail üles",
        "uploaded-script-svg": "Üleslaaditud SVG-failist leiti skriptitav element \"$1\".",
        "uploaded-hostile-svg": "Üleslaaditud SVG-faili laadielemendist leiti ebaturvaline CSS.",
        "uploaded-event-handler-on-svg": "Sündmuse halduse atribuutide <code>$1=\"$2\"</code> seadmine pole SVG-failis lubatud.",
-       "uploaded-href-unsafe-target-svg": "Üleslaaditud SVG-failist leiti href, mille sihtkoht <code>&lt;$1 $2=\"$3\"&gt;</code> on ebaturvaline.",
+       "uploaded-href-unsafe-target-svg": "Üleslaaditud SVG-failist leiti href, mis viitab ebaturvalistele andmetele: URI sihtkoht <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-animate-svg": "Üleslaaditud SVG-failist leiti silt \"animate\", mis võib href-i muuta, kasutades from-atribuuti <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-setting-event-handler-svg": "Sündmuse halduse atribuutide seadmine on keelatud, üleslaaditud SVG-failist leiti <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-setting-href-svg": "Sildi \"set\" kasutamine, selleks et lisada emaelemendile href-atribuut, on keelatud.",
        "backend-fail-read": "Faili $1 ei saa lugeda.",
        "backend-fail-create": "Faili $1 ei saa kirjutada.",
        "backend-fail-maxsize": "Faili $1 ei saa kirjutada, sest see on {{PLURAL:$2|ühest baidist|$2 baidist}} suurem.",
-       "backend-fail-readonly": "Tagamälu \"$1\" on praegu kirjutuskaitstud. Põhjus: \"<em>$2</em>\"",
+       "backend-fail-readonly": "Tagamälu \"$1\" on praegu kirjutuskaitstud. Põhjus: <em>$2</em>",
        "backend-fail-synced": "Faili \"$1\" olek sisemälus on ühtimatu.",
        "backend-fail-connect": "Ühendus tagamäluga \"$1\" ebaõnnestus.",
        "backend-fail-internal": "Tagamälus \"$1\" esines tundmatu tõrge.",
        "uploadstash-summary": "See lehekülg pakub juurdepääsu failidele, mis on üles laaditud (või mida parasjagu üles laaditakse), kuid mis pole veel vikis avaldatud. Need failid on nähtavad üksnes kasutajale, kes need üles laadis.",
        "uploadstash-clear": "Kustuta failid algsest hoidlast",
        "uploadstash-nofiles": "Sul pole algses hoidlas faile.",
-       "uploadstash-badtoken": "Toiming ebaõnnestus; võib-olla redigeerimisloa aegumise tõttu. Proovi uuesti.",
+       "uploadstash-badtoken": "Toiming ebaõnnestus, võib-olla redigeerimismandaadi aegumise tõttu. Palun proovi uuesti.",
        "uploadstash-errclear": "Failide kustutamine ebaõnnestus.",
        "uploadstash-refresh": "Värskenda faililoendit",
        "invalid-chunk-offset": "Tüki vigane nihe",
        "pageswithprop-prophidden-long": "pika tekstiatribuudi väärtus peidetud ($1)",
        "pageswithprop-prophidden-binary": "kahendatribuudi väärtus peidetud ($1)",
        "doubleredirects": "Kahekordsed ümbersuunamised",
-       "doubleredirectstext": "See lehekülg loetleb leheküljed, mis on ümber suunatud teistele ümbersuunamislehekülgedel.\nIgal real on toodud esimene ja teine ümbersuunamislehekülg ning samuti lehekülg, kuhu teine ümbersuunamislehekülg on suunatud ja kuhu tavaliselt ka esimene ümbersuunamislehekülg tegelikult peaks suunama.\n<del>Läbikriipsutatud</del> kirjed on kohendatud.",
+       "doubleredirectstext": "See lehekülg loetleb leheküljed, mis on ümber suunatud teistele ümbersuunamislehekülgedele.\nIgal real on toodud esimene ja teine ümbersuunamislehekülg ning samuti lehekülg, kuhu teine ümbersuunamislehekülg on suunatud ja kuhu tavaliselt ka esimene ümbersuunamislehekülg tegelikult peaks suunama.\n<del>Läbikriipsutatud</del> kirjed on kohendatud.",
        "double-redirect-fixed-move": "[[$1]] on teisaldatud.\nLehekülg uuendati automaatselt ja see suunab nüüd leheküljele [[$2]].",
        "double-redirect-fixed-maintenance": "Hooldustöö käigus parandati automaatselt kahekordne suunamine leheküljelt [[$1]] leheküljele [[$2]].",
        "double-redirect-fixer": "Ümbersuunamiste parandaja",
        "apihelp-no-such-module": "Moodulit \"$1\" ei leitud.",
        "apisandbox": "API liivakast",
        "apisandbox-api-disabled": "API on selles võrgukohas keelatud.",
-       "apisandbox-intro": "Kasuta seda lehekülge '''MediaWiki API''' katsetamiseks.\nÜksikasjad API kasutamise kohta leiad [https://www.mediawiki.org/wiki/API:Main_page API dokumentatsioonist]. Näide: [https://www.mediawiki.org/wiki/API#A_simple_example esilehe sisu hankimine]. Vali toiming, et näha veel näiteid.\n\nPane tähele, et kuigi siin on liivakast, võivad siin leheküljel tehtud toimingud vikit muuta.",
+       "apisandbox-intro": "Kasuta seda lehekülge <strong>MediaWiki API</strong> katsetamiseks.\nÜksikasjad API kasutamise kohta leiad [[mw:API:Main page|API dokumentatsioonist]]. Näide: [https://www.mediawiki.org/wiki/API#A_simple_example esilehe sisu hankimine]. Vali toiming, et näha veel näiteid.\n\nPane tähele, et kuigi siin on liivakast, võivad siin leheküljel tehtud toimingud vikit muuta.",
        "apisandbox-submit": "Tee päring",
        "apisandbox-reset": "Puhasta",
-       "apisandbox-examples": "Näide",
-       "apisandbox-results": "Tulemus",
+       "apisandbox-examples": "Näited",
+       "apisandbox-results": "Tulemused",
        "apisandbox-request-url-label": "Päringu URL:",
-       "apisandbox-request-time": "Päringuaeg: $1",
+       "apisandbox-request-time": "Päringuaeg: {{PLURAL:$1|$1 ms}}",
        "booksources": "Raamatuotsimine",
        "booksources-search-legend": "Raamatuotsimine",
        "booksources-search": "Otsi",
        "log-title-wildcard": "Selle tekstiga algavad pealkirjad",
        "showhideselectedlogentries": "Muuda valitud logisissekannete nähtavust",
        "log-edit-tags": "Muuda valitud logisissekannete märgiseid",
+       "checkbox-select": "Vali: $1",
+       "checkbox-all": "kõik",
+       "checkbox-none": "mitte ühtegi",
+       "checkbox-invert": "pööra",
        "allpages": "Kõik leheküljed",
        "nextpage": "Järgmine lehekülg ($1)",
        "prevpage": "Eelmine lehekülg ($1)",
        "listgrouprights-namespaceprotection-header": "Nimeruumipiirangud",
        "listgrouprights-namespaceprotection-namespace": "Nimeruum",
        "listgrouprights-namespaceprotection-restrictedto": "Redigeerimiseks vajalikud õigused",
-       "listgrants-summary": "See on OAuthi-volituste ja neile vastavate kasutajaõiguste loend. Kasutaja saab volitada rakenduse tarvituse enda nimel, aga vaid kasutaja valitud volituste piires. Rakenduse abil ei saa kasutaja nimel siiski kasutada õigusi, mida kasutajal pole.\nÜksikute õiguste kohta võib leiduda [[{{MediaWiki:Listgrouprights-helppage}}|lisateavet]].",
-       "listgrants-rights": "Volitus",
+       "listgrants": "Volitused",
+       "listgrants-summary": "See on volituste ja neile vastavate kasutajaõiguste loend. Kasutaja saab volitada rakenduse tarvituse enda nimel, aga vaid kasutaja valitud volituste piires. Rakenduse abil ei saa kasutaja nimel siiski kasutada õigusi, mida kasutajal pole.\nÜksikute õiguste kohta võib leiduda [[{{MediaWiki:Listgrouprights-helppage}}|lisateavet]].",
+       "listgrants-grant": "Volitus",
+       "listgrants-rights": "Õigused",
        "trackingcategories": "Süsteemikategooriad",
        "trackingcategories-summary": "Siin leheküljel on loetletud süsteemikategooriad, millesse MediaWiki tarkvara ise lehekülgi arvab. Nende kategooriate nimesid saab muuta, kui vahetada {{ns:8}}-nimeruumis vastavaid süsteemisõnumeid.",
        "trackingcategories-msg": "Süsteemikategooria",
        "delete-toobig": "See lehekülg on pika redigeerimisajalooga – üle {{PLURAL:$1|ühe muudatuse|$1 muudatuse}}.\nSelle kustutamine on keelatud, et ära hoida ekslikku {{GRAMMAR:genitive|{{SITENAME}}}} töö häirimist.",
        "delete-warning-toobig": "See lehekülg on pika redigeerimislooga – üle {{PLURAL:$1|ühe muudatuse|$1 muudatuse}}.\nEttevaatust, selle kustutamine võib esile kutsuda häireid {{GRAMMAR:genitive|{{SITENAME}}}} andmebaasi töös.",
        "deleteprotected": "Seda lehekülge ei saa kustutada, sest see on kaitstud.",
-       "deleting-backlinks-warning": "'''Hoiatus:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Teised leheküljed]] viitavad leheküljele, mida oled kustutamas, või see lehekülg on kasutuses mallina.",
+       "deleting-backlinks-warning": "<strong>Hoiatus:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Teised leheküljed]] viitavad leheküljele, mida oled kustutamas, või see lehekülg on kasutuses mallina.",
        "rollback": "Tühista muudatused",
        "rollbacklink": "tühista",
        "rollbacklinkcount": "tühista {{PLURAL:$1|üks muudatus|$1 muudatust}}",
        "protect-summary-cascade": "kaskaad",
        "protect-expiring": "aegumistähtaeg $1 (UTC)",
        "protect-expiring-local": "aegumistähtaeg $1",
-       "protect-expiry-indefinite": "määramatu",
+       "protect-expiry-indefinite": "tähtajatu",
        "protect-cascade": "Kaitse lehekülgi, mis on lülitatud käesoleva lehekülje koosseisu (kaskaadkaitse)",
        "protect-cantedit": "Sa ei saa lehekülje kaitsetaset muuta, sest sul puudub lehekülje redigeerimise õigus.",
        "protect-othertime": "Muu aeg:",
        "unblock": "Kasutaja blokeeringu eemaldamine",
        "blockip": "Blokeeri {{GENDER:$1|kasutaja}}",
        "blockip-legend": "Kasutaja blokeerimine",
-       "blockiptext": "See vorm on kindla IP-aadressi või kasutajanime kirjutamisõiguste blokeerimiseks.\nSeda tohib teha ainult vandalismi vältimiseks ja kooskõlas [[{{MediaWiki:Policy-url}}|{{GRAMMAR:genitive|{{SITENAME}}}} sisekorraga]].\nTäida ka põhjuse väli, näiteks viidates lehekülgedele, mis rikuti.",
+       "blockiptext": "See vorm on kindla IP-aadressi või kasutajanime kirjutamisõiguste blokeerimiseks.\nSeda tohib teha ainult vandalismi vältimiseks ja kooskõlas [[{{MediaWiki:Policy-url}}|{{GRAMMAR:genitive|{{SITENAME}}}} sisekorraga]].\nTäida ka põhjuse väli, näiteks viidates lehekülgedele, mis rikuti.\nIP-aadresside vahemikke saad blokeerida [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]-süntaksi abil; suurim lubatud vahemik on IPv4 jaoks /$1 ja IPv6 jaoks /$2.",
        "ipaddressorusername": "IP-aadress või kasutajanimi:",
        "ipbexpiry": "Kehtivus:",
        "ipbreason": "Põhjus:",
        "lockedbyandtime": "(lukustas $1; $2, kell $3)",
        "move-page": "Lehekülje \"$1\" teisaldamine",
        "move-page-legend": "Lehekülje teisaldamine",
-       "movepagetext": "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.\nPraeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.\nSaad senisele pealkirjale viitavad ümbersuunamised automaatselt parandada.\nKui sa seda ei tee, kontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge '''ei teisaldata''' juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui viimane on redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n'''Hoiatus!'''\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
-       "movepagetext-noredirectfixer": "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.\nPraeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.\nKontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge '''ei teisaldata''' juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui olemasolev lehekülg on tühi või redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n'''Hoiatus!'''\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
+       "movepagetext": "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.\nPraeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.\nSaad senisele pealkirjale viitavad ümbersuunamised automaatselt parandada.\nKui sa seda ei tee, kontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge <strong>ei teisaldata</strong> juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui viimane on redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n<strong>Märkus:</strong>\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
+       "movepagetext-noredirectfixer": "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.\nPraeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.\nKontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge <strong>ei teisaldata</strong> juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui olemasolev lehekülg on tühi või redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n<strong>Note:</strong>\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
        "movepagetalktext": "Kui märgid selle ruudu, teisaldatakse arutelulehekülg automaatselt uue pealkirja alla. Seda välja arvatud juhul, kui uue pealkirja all on juba arutelulehekülg, mis pole tühi.\n\nSel juhul saad lehekülje soovi korral käsitsi teisaldada või liita.",
        "moveuserpage-warning": "'''Hoiatus:''' Oled teisaldamas kasutajalehekülge. Pane tähele, et teisaldatakse ainult lehekülg ja kasutajat '''ei''' nimetata ümber.",
        "movecategorypage-warning": "<strong>Hoiatus:</strong> Oled teisaldamas kategoorialehekülge. Pane palun tähele, et teisaldatakse vaid see lehekülg ja ühtegi vanas kategoorias sisalduvat lehekülge <em>ei</em> kategoriseerita ümber uude kategooriasse.",
        "movenosubpage": "Sellel leheküljel pole alamlehekülgi.",
        "movereason": "Põhjus:",
        "revertmove": "taasta",
-       "delete_and_move_text": "== Vajalik kustutamine ==\nSihtlehekülg \"[[:$1]]\" on juba olemas.\nKas kustutad selle, et luua võimalus teisaldamiseks?",
+       "delete_and_move_text": "Sihtlehekülg \"[[:$1]]\" on juba olemas.\nKas kustutad selle, et luua võimalus teisaldamiseks?",
        "delete_and_move_confirm": "Jah, kustuta lehekülg",
        "delete_and_move_reason": "Kustutatud, et tõsta asemele lehekülg \"[[$1]]\"",
        "selfmove": "Algne nimi ja uus nimi on samad.",
        "move-leave-redirect": "Jäta maha ümbersuunamisleht",
        "protectedpagemovewarning": "'''Hoiatus:''' See lehekülg on nii lukustatud, et ainult administraatori õigustega kasutajad saavad seda teisaldada.\nAllpool on toodud uusim logisissekanne:",
        "semiprotectedpagemovewarning": "'''Pane tähele:''' See lehekülg on lukustatud, nii et ainult registreeritud kasutajad saavad seda teisaldada.\nAllpool on toodud uusim logisissekanne:",
-       "move-over-sharedrepo": "== Fail on olemas ==\n[[:$1]] on olemas jagatud failivaramus. Faili teisaldamisel selle nime alla varjatakse jagatud failivarmus olev samanimeline fail.",
+       "move-over-sharedrepo": "[[:$1]] on olemas jagatud failivaramus. Faili teisaldamisel selle nime alla varjatakse jagatud failivarmus olev samanimeline fail.",
        "file-exists-sharedrepo": "Valitud failinimi on juba kasutusel jagatud failivaramus.\nPalun kasuta mõnda teist nime.",
        "export": "Lehekülgede eksport",
        "exporttext": "Saad eksportida kindla leheküljel või lehekülgede kogumi teksti ja redigeerimisloo XML-kujule viiduna.\nSeda saab teise vikisse importida, kasutades selleks MediaWiki [[Special:Import|impordi lehekülge]].\n\nEt eksportida lehekülgi, sisesta nende pealkirjad allolevasse tekstikasti, iga pealkiri ise reale ja vali, kas soovid viimast redaktsiooni ja kõiki vanemaid redaktsioone ühes redigeerimislooga või viimast redaktsiooni ühes andmetega viimase redigeerimise kohta.\n\nViimasel juhul saab kasutada ka linki, näiteks lehekülje \"[[{{MediaWiki:Mainpage}}]]\" jaoks [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].",
        "import-nonewrevisions": "Ühtegi redaktsiooni ei imporditud (kõik on juba olemas või tõrgete tõttu vahele jäetud).",
        "xml-error-string": "$1 real $2, tulbas $3 (bait $4): $5",
        "import-upload": "Laadi üles XML-andmed",
-       "import-token-mismatch": "Seansiandmed läksid kaduma.\nPalun ürita uuesti.",
+       "import-token-mismatch": "Seansiandmed läksid kaduma.\n\nVõimalik, et oled välja loginud. <strong>Palun veendu, et oled endiselt sisse logitud ja proovi uuesti</strong>.\nKui see ei toimi, siis proovi [[Special:UserLogout|logida välja]] ja tagasi sisse ning kontrolli, kas brauser lubab sellest võrgukohast küpsiseid.",
        "import-invalid-interwiki": "Määratud vikist ei saa importida.",
        "import-error-edit": "Lehekülge \"$1\" ei imporditud, sest sul pole õigust seda muuta.",
        "import-error-create": "Lehekülge \"$1\" ei imporditud, sest sul pole õigust seda luua.",
        "tooltip-t-recentchangeslinked": "Viimased muudatused lehekülgedel, millele on siit viidatud",
        "tooltip-feed-rss": "Selle lehekülje RSS-voog",
        "tooltip-feed-atom": "Selle lehekülje Atom-voog",
-       "tooltip-t-contributions": "Kuva selle kasutaja kaastöö",
-       "tooltip-t-emailuser": "Saada sellele kasutajale e-kiri",
+       "tooltip-t-contributions": "Kuva {{GENDER:$1|selle kasutaja}} kaastöö",
+       "tooltip-t-emailuser": "Saada {{GENDER:$1|sellele kasutajale}} e-kiri",
        "tooltip-t-info": "Lisateave selle lehekülje kohta",
        "tooltip-t-upload": "Laadi faile üles",
        "tooltip-t-specialpages": "Erilehekülgede loend",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|lehekülg|lehekülge}}",
        "file-info": "faili suurus: $1, MIME tüüp: $2",
        "file-info-size": "$1 × $2 pikslit, faili suurus: $3, MIME tüüp: $4",
-       "file-info-size-pages": "$1 × $2 pikslit, faili suurus: $3 , MIME tüüp: $4, $5 {{PLURAL:$5|lehekülg|lehekülge}}",
+       "file-info-size-pages": "$1 × $2 pikslit, faili suurus: $3, MIME tüüp: $4, $5 {{PLURAL:$5|lehekülg|lehekülge}}",
        "file-nohires": "Sellest suuremat pilti pole.",
        "svg-long-desc": "SVG-fail, algsuurus $1 × $2 pikslit, faili suurus: $3",
        "svg-long-desc-animated": "Animeeritud SVG-fail,  algsuurus $1 × $2 pikslit, faili suurus: $3",
        "watchlistedit-raw-done": "Sinu jälgimisloend on uuendatud.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 lehekülg|$1 lehekülge}} lisatud:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 pealkiri|$1 pealkirja}} eemaldati:",
-       "watchlistedit-clear-title": "Tühjendatud jälgimisloend",
+       "watchlistedit-clear-title": "Jälgimisloendi tühjendamine",
        "watchlistedit-clear-legend": "Jälgimisloendi tühjendamine",
        "watchlistedit-clear-explain": "Sinu jälgimisloendist eemaldatakse kõik pealkirjad.",
        "watchlistedit-clear-titles": "Pealkirjad:",
        "version-libraries-license": "Litsents",
        "version-libraries-description": "Kirjeldus",
        "version-libraries-authors": "Autorid",
-       "redirect": "Ümbersuunamine faili, kasutaja, lehekülje või redaktsiooni identifikaatori järgi",
-       "redirect-summary": "See erilehekülg suunab ümber faili (toodud failinimi), lehekülje (toodud redaktsiooni või lehekülje identifikaator) või kasutajalehekülje (toodud numbriline kasutaja identfikaator) juurde. Kasutamine: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] või [[{{#Special:Redirect}}/user/101]].",
+       "redirect": "Ümbersuunamine faili, kasutaja, lehekülje, redaktsiooni või logiidentifikaatori järgi",
+       "redirect-summary": "See erilehekülg suunab ümber faili (toodud failinimi), lehekülje (toodud redaktsiooni või lehekülje identifikaator), kasutajalehekülje (toodud numbriline kasutaja identfikaator) või logisissekande (toodud logiidentifikaator) juurde. Kasutamine: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]] või [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Mine",
        "redirect-lookup": "Leia:",
        "redirect-value": "Väärtus:",
        "tags-delete-not-allowed": "Tarkvaralisas määratletud märgiseid ei saa kustutada, kui märgis on tarkvaralisas eraldi lubatud.",
        "tags-delete-not-found": "Märgist \"$1\" pole.",
        "tags-delete-too-many-uses": "Märgist \"$1\" on rakendatud rohkem kui {{PLURAL:$2|ühe|$2}} redaktsiooni juures, mistõttu ei saa seda kustutada.",
-       "tags-delete-warnings-after-delete": "Märgis \"$1\" on edukalt kustutatud, kuid väljastati {{PLURAL:$2|järgmine hoiatus|järgmised hoiatused}}:",
+       "tags-delete-warnings-after-delete": "Märgis \"$1\" on kustutatud, kuid väljastati {{PLURAL:$2|järgmine hoiatus|järgmised hoiatused}}:",
        "tags-activate-title": "Märgise lubamine",
        "tags-activate-question": "Siinkohal lubad märgise \"$1\".",
        "tags-activate-reason": "Põhjus:",
        "tags-edit-revision-legend": "Märgiste lisamine või eemaldamine {{PLURAL:$1|selle|kõigi $1}} redaktsiooni juures",
        "tags-edit-logentry-legend": "Märgiste lisamine või eemaldamine {{PLURAL:$1|selle|kõigi $1}} logisissekande juures",
        "tags-edit-existing-tags": "Senised märgised:",
-       "tags-edit-existing-tags-none": "''puuduvad''",
+       "tags-edit-existing-tags-none": "<em>puuduvad</em>",
        "tags-edit-new-tags": "Uued märgised:",
        "tags-edit-add": "Lisa need märgised:",
        "tags-edit-remove": "Eemalda need märgised:",
        "tags-edit-reason": "Põhjus:",
        "tags-edit-revision-submit": "Rakenda {{PLURAL:$1|selle|$1}} redaktsiooni suhtes",
        "tags-edit-logentry-submit": "Rakenda {{PLURAL:$1|selle|$1}} logisissekande suhtes",
-       "tags-edit-success": "Muudatused on edukalt rakendatud.",
+       "tags-edit-success": "Muudatused on rakendatud.",
        "tags-edit-failure": "Muudatusi ei õnnestunud rakendada:\n$1",
        "tags-edit-nooldid-title": "Vigane sihtredaktsioon",
        "tags-edit-nooldid-text": "Selle toimingu jaoks pole määratud ühtegi sihtredaktsiooni või määratud redaktsiooni pole olemas.",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|kaitses}} lehekülje $3 $4 [kaskaadkaitse]",
        "logentry-protect-modify": "$1 {{GENDER:$2|muutis}} lehekülje $3 kaitsetaset $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|muutis}} lehekülje $3 kaitsetaset $4 [kaskaadkaitse]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|muutis}} kasutaja $3 rühmaliikmesust; enne oli $4, nüüd on $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|muutis}} kasutaja {{GENDER:$6|$3}} rühmaliikmesust; enne oli $4, nüüd on $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|muutis}} kasutaja $3 rühmaliikmesust",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|viidi}} automaatselt üle teise rühma; enne oli $4, nüüd on $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|laadis üles}} faili $3",
        "expand_templates_generate_xml": "Näita XML-liigenduspuud",
        "expand_templates_generate_rawhtml": "Näita toor-HTMLi",
        "expand_templates_preview": "Eelvaade",
-       "expand_templates_preview_fail_html": "<em>Kuna {{GRAMMAR:inessive|{{SITENAME}}}} on toor-HTML lubatud ja osa seansiandmeid läks kaotsi, siis on JavaScripti põhiste rünnakute vastase abinõuna eelvaade peidetud.</em>\n\n<strong>Kui see eelvaatekatse on õigustatud, proovi palun uuesti.</strong>\nKui see ikka ei tööta, proovi [[Special:UserLogout|logida välja]] ja tagasi sisse.",
+       "expand_templates_preview_fail_html": "<em>Kuna {{GRAMMAR:inessive|{{SITENAME}}}} on toor-HTML lubatud ja osa seansiandmeid läks kaotsi, siis on JavaScripti põhiste rünnakute vastase abinõuna eelvaade peidetud.</em>\n\n<strong>Kui see eelvaatekatse on õigustatud, proovi palun uuesti.</strong>\nKui see ikka ei tööta, proovi [[Special:UserLogout|logida välja]] ja tagasi sisse ning kontrolli, kas brauser lubab sellest võrgukohast küpsiseid.",
        "expand_templates_preview_fail_html_anon": "<em>Kuna {{GRAMMAR:inessive|{{SITENAME}}}} on toor-HTML lubatud ja sa pole sisse logitud, siis on JavaScripti põhiste rünnakute vastase abinõuna eelvaade peidetud.</em>\n\n<strong>Kui see eelvaatekatse on õigustatud, [[Special:UserLogin|logi]] palun sisse ja proovi uuesti.</strong>",
        "pagelanguage": "Lehekülje keele valik",
        "pagelang-name": "Lehekülg",
        "mediastatistics": "Meediafailide arvandmestik",
        "mediastatistics-summary": "Arvandmed üles laaditud failitüüpide kohta. See käib ainult failide viimaste versioonide kohta. Vanu ja kustutatud versioone pole arvesse võetud.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 bait|$1 baiti}} ($2; $3%)",
-       "mediastatistics-bytespertype": "Failide kogusuurus selles alaosas: $1 baiti.",
-       "mediastatistics-allbytes": "Kõigi failide kogusuurus: $1 baiti.",
+       "mediastatistics-bytespertype": "Failide kogusuurus selles alaosas: $1 {{PLURAL:$1|bait|baiti}} ($2; $3%).",
+       "mediastatistics-allbytes": "Kõigi failide kogusuurus: $1 {{PLURAL:$1|bait|baiti}} ($2).",
        "mediastatistics-table-mimetype": "MIME tüüp",
        "mediastatistics-table-extensions": "Võimalikud laiendid",
        "mediastatistics-table-count": "Failide arv",
        "mw-widgets-dateinput-placeholder-month": "AAAA-KK",
        "mw-widgets-titleinput-description-new-page": "lehekülge pole veel",
        "mw-widgets-titleinput-description-redirect": "ümbersuunamine leheküljele \"$1\"",
-       "api-error-blacklisted": "Palun vali muu pealkiri, mis on kirjeldav.",
        "randomrootpage": "Juhuslik juurlehekülg"
 }
index f3ecd93..8517227 100644 (file)
        "minoredit": "Aldaketa hau txikia da",
        "watchthis": "Orrialde hau jarraitu",
        "savearticle": "Gorde orria",
+       "publishpage": "Orrialdea argitaratu",
+       "publishchanges": "Aldaketak argitaratu",
        "preview": "Aurrebista erakutsi",
        "showpreview": "Aurrebista erakutsi",
        "showdiff": "Aldaketak erakutsi",
        "badsig": "Baliogabeko sinadura; egiaztatu HTML etiketak.",
        "badsiglength": "Zure sinadura luzeegia da.\n$1 {{PLURAL:$1|karakteretik|karakteretik}} behera izan behar ditu.",
        "yourgender": "Nola nahiagu duzu deskribatua izatea?",
-       "gender-unknown": "Nahiago dut ez esatea",
+       "gender-unknown": "Aipatzen zaituztenean, softwareak genero neutroa erabiliko du hori posible denean",
        "gender-male": "Wiki orrialdeak editatzen dituen gizona",
        "gender-female": "Wiki orrialdeak editatzen dituen emakumea",
        "prefs-help-gender": "Hobespen hau jartzea aukerazkoa da.\nSoftwareak bere balioak erabiltzen ditu zu aipatzeko eta beste batzuek genero gramatikala erabiltzeko aukera izan dezaten.\nInformazio hau publikoa da.",
        "sp-contributions-search": "Ekarpenentzako bilaketa",
        "sp-contributions-username": "IP helbidea edo erabiltzaile izena:",
        "sp-contributions-toponly": "Azken aldaketak direnak soilik erakutsi",
+       "sp-contributions-newonly": "Orrialde sorkuntza direnak soilik erakutsi",
+       "sp-contributions-hideminor": "Aldaketa txikiak ezkutatu",
        "sp-contributions-submit": "Bilatu",
        "whatlinkshere": "Honanzko lotura duten orriak",
        "whatlinkshere-title": "$1(e)ra lotura duten orriak",
        "mw-widgets-dateinput-no-date": "Ez duzu datarik aukeratu",
        "mw-widgets-titleinput-description-new-page": "orri hori oraindik ez da existitzen",
        "mw-widgets-titleinput-description-redirect": "$1ra birzuzendu",
-       "api-error-blacklisted": "Aukera ezazu, mesedez, izenburu ezberdin eta deskriptiboago bat.",
        "sessionprovider-generic": "$1 sesio"
 }
index 0510719..8c8cee9 100644 (file)
                        "Ms96",
                        "Freshman404",
                        "Hamisun",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "4nn1l2",
+                       "Namo",
+                       "Alifakoor"
                ]
        },
        "tog-underline": "خط کشیدن زیر پیوندها:",
@@ -80,7 +83,7 @@
        "tog-enotifusertalkpages": "هنگامی که در صفحهٔ بحث کاربری‌ام تغییری صورت می‌گیرد به من ایمیلی فرستاده شود",
        "tog-enotifminoredits": "برای تغییرات جزئی در صفحه‌ها و پرونده‌ها هم به من ایمیلی فرستاده شود",
        "tog-enotifrevealaddr": "نشانی پست الکترونیکی من در ایمیل‌های اطلاع‌رسانی هویدا گردد",
-       "tog-shownumberswatching": "شمار کاربران پی‌گیرندهٔ نمایش یابد",
+       "tog-shownumberswatching": "نمایشِ شمار کاربران پی‌گیری کننده",
        "tog-oldsig": "امضای کنونی:",
        "tog-fancysig": "امضا به صورت ویکی‌متن در نظر گرفته شود (بدون درج خودکار پیوند)",
        "tog-uselivepreview": "استفاده از پیش‌نمایش زنده",
        "tog-showhiddencats": "نمایش رده‌های پنهان",
        "tog-norollbackdiff": "بعد از واگردانی، تفاوت نشان داده نشود",
        "tog-useeditwarning": "زمان خروج از صفحهٔ ویرایش در صورت داشتن ویرایش‌های‌ ذخیره‌نشده به من هشدار داده شود",
-       "tog-prefershttps": "در حالت ورود به سامانه همواره از اتصال امن استفاده شود",
+       "tog-prefershttps": "هنگامی که به سامانه وارد شده‌ام، همواره از اتصال امن استفاده شود",
        "underline-always": "همیشه",
        "underline-never": "هرگز",
        "underline-default": "پیش‌فرض پوسته یا مرورگر",
        "password-change-forbidden": "شما نمی‌توانید گذرواژه‌ها را در این ویکی تغییر دهید.",
        "externaldberror": "خطایی در ارتباط با پایگاه داده رخ داده است یا اینکه شما اجازهٔ به‌روزرسانی حساب خارجی خود را ندارید.",
        "login": "ورود به سامانه",
+       "login-security": "هویتتان را تائید کنید",
        "nav-login-createaccount": "ورود به سامانه / ایجاد حساب کاربری",
        "userlogin": "ورود به سامانه / ایجاد حساب کاربری",
        "userloginnocreate": "ورود به سامانه",
        "userlogin-resetpassword-link": "گذرواژه‌تان را فراموش کردید؟",
        "userlogin-helplink2": "کمک با ورود",
        "userlogin-loggedin": "شما در حال حاضر به عنوان {{GENDER:$1|$1}} وارد شده‌اید.\nاز فرم پایین برای ورود به عنوان یک کاربر دیگر استفاده کنید.",
+       "userlogin-reauth": "برای تأييد اینکه شما خود $1 هستيد، نیاز است دوباره وارد شويد.",
        "userlogin-createanother": "ایجاد یک حساب کاربری دیگر",
        "createacct-emailrequired": "نشانی ایمیل",
        "createacct-emailoptional": "نشانی ایمیل (اختیاری)",
        "createacct-email-ph": "نشانی ایمیل خود را وارد کنید",
        "createacct-another-email-ph": "آدرس ایمیل را وارد کنید",
        "createaccountmail": "استفاده از رمز عبور موقت تصادفی و ارسال آن به آدرس ایمیل مشخص شده",
+       "createaccountmail-help": "جهت ايجاد حساب برای شخص ديگری بدون دانستن گذرواژهٔ آن کاربرد دارد.",
        "createacct-realname": "نام واقعی (اختیاری)",
        "createaccountreason": "دلیل:",
        "createacct-reason": "دلیل",
        "createacct-reason-ph": "چرا شما حساب دیگری می‌سازید؟",
+       "createacct-reason-help": "پیامی که در سياههٔ ایجاد حساب نمایش داده می‌شود",
        "createacct-submit": "حسابتان را بسازید",
        "createacct-another-submit": "ایجاد حساب کاربری",
+       "createacct-continue-submit": "ادامهٔ ايجاد حساب",
+       "createacct-another-continue-submit": "ادامهٔ ايجاد حساب",
        "createacct-benefit-heading": "{{SITENAME}} توسط افرادی مانند شما ساخته شده است",
        "createacct-benefit-body1": "{{PLURAL:$1|ویرایش}}",
        "createacct-benefit-body2": "{{PLURAL:$1|صفحه}}",
        "nocookiesnew": "حساب کاربری ایجاد شد، اما شما وارد سامانه نشدید.\n{{SITENAME}} برای ورود کاربران به سامانه از کوکی استفاده می‌کند.\nشما کوکی‌ها را از کار انداخته‌اید.\nلطفاً کوکی‌ها را به کار بیندازید، و سپس با نام کاربری و گذرواژهٔ جدیدتان به سامانه وارد شوید.",
        "nocookieslogin": "{{SITENAME}} برای ورود کاربران به سامانه از کوکی‌ها استفاده می‌کند.\nشما کوکی‌ها را از کار انداخته‌اید.\nلطفاً کوکی‌ها را به کار بیندازید و دوباره امتحان کنید.",
        "nocookiesfornew": "حساب کاربری ساخته نشد، زیرا نتوانستیم منبع آن را تأیید کنیم.\nمطمئن شوید که کوکی‌ها فعال هستند، آن‌گاه صفحه را از نو بارگیری کنید و دوباره امتحان کنید.",
+       "createacct-loginerror": "حساب با موفقيت ايجاد شد، ليکن امکان ورود خودکار شما وجود ندارد. لطفاً با [[Special:UserLogin|manual login]] ادامه دهيد.",
        "noname": "شما نام کاربری معتبری مشخص نکرده‌اید.",
        "loginsuccesstitle": "ورود به سامانه",
        "loginsuccess": "'''شما اکنون با نام «$1» به {{SITENAME}} وارد شده‌اید.'''",
        "createacct-another-realname-tip": "نام واقعی اختیاری است.\nاگر آن را وارد کنید هنگام ارجاع به آثارتان و انتساب آن‌ها به شما از نام واقعی‌تان استفاده خواهد شد.",
        "pt-login": "ورود",
        "pt-login-button": "ورود به سامانه",
+       "pt-login-continue-button": "ادامه دادن ورود به سامانه",
        "pt-createaccount": "ایجاد حساب کاربری",
        "pt-userlogout": "خروج",
        "php-mail-error-unknown": "خطای ناشناخته در تابع  mail()‎ پی‌اچ‌پی",
        "botpasswords-invalid-name": "نام کاربری مشخص شده دارای جداکنندهٔ گذرواژهٔ رباتی نیست (\"$1\").",
        "botpasswords-not-exist": "کاربر «$1» گذرواژهٔ رباتی نام‌دهی شدهٔ «$2» ندارد.",
        "resetpass_forbidden": "نمی‌توان گذرواژه‌ها را تغییر داد",
+       "resetpass_forbidden-reason": "نمی‌توانید گذرواژه‌ها را تغییر داد: $1",
        "resetpass-no-info": "برای دسترسی مستقیم به این صفحه شما باید به سامانه وارد شده باشید.",
        "resetpass-submit-loggedin": "تغییر گذرواژه",
        "resetpass-submit-cancel": "لغو",
        "passwordreset-emailsentusername": "اگر نشانی پست الکترونیکی مرتبطی موجود باشد، یک نامه برای بازنشانی گذرواژه به آن ارسال خواهد شد.",
        "passwordreset-emailsent-capture": "یک ایمیل بازنشانی که در پایین نمایش داده شده، فرستاده شده است.",
        "passwordreset-emailerror-capture": "ایمیل بازنشانی، که در زیر نمایش داده شده، ایجاد شد، ولی ارسال آن به {{GENDER:$2|کاربر}} موفقیت‌آمیز نبود: $1",
+       "passwordreset-emailsent-capture2": "{{PLURAL:$1|نامهٔ|نامهٔ}} بازنشانی گذرواژه ارسال شد. در زير $1 نام کاربری و گذرواژه در حال نمایش است.",
+       "passwordreset-emailerror-capture2": "ارسال ناموفق نامه به $2: $1\nدر زير $3 نام کاربری و گذرواژه در حال نمایش است",
+       "passwordreset-nocaller": "فراخواننده می‌بايست مشخص شده باشد",
+       "passwordreset-nosuchcaller": "اين فراخواننده وجود ندارد:$1",
+       "passwordreset-ignored": "به بازنشانی گذرواژه پرداخته نشد. آیا ممکن است که هيچ مهياکننده‌ای برای این کار تنظيم نشده باشد؟",
+       "passwordreset-invalideamil": "آدرس ایمیل نامعتبر",
+       "passwordreset-nodata": "یک نام کاربری و یا یک آدرس ايميل، هيچکدام ارائه نشده",
        "changeemail": "تغییر یا حذف نشانی ایمیل",
        "changeemail-header": "برای تغییر ایمیلتان این فرم را کامل کنید. برای حذف ایملیتان کافی است بخش ایمیل را خالی رها کنید و فرم را ارسال کنید.",
        "changeemail-passwordrequired": "برای تائید این تغییر باید گذرواژه‌تان را وارد کنید.",
        "minoredit": "این ویرایش، جزئی است",
        "watchthis": "پی‌گیری این صفحه",
        "savearticle": "صفحه ذخیره شود",
+       "savechanges": "ذخیرهٔ تغییرات",
        "publishpage": "انتشار صفحه",
+       "publishchanges": "انتشار تغییرات",
        "preview": "پیش‌نمایش",
        "showpreview": "پیش‌نمایش",
        "showdiff": "نمایش تغییرات",
        "accmailtext": "یک گذرواژهٔ تصادفی برای [[User talk:$1|$1]] به $2 فرستاده شد. می‌توان آن را از صفحهٔ ''[[Special:ChangePassword|تغییر گذرواژه]]'' که هنگام ثبت ورود نمایش می‌یابد تغییر داد.",
        "newarticle": "(تازه)",
        "newarticletext": "شما پیوندی را دنبال کرده‌اید و به صفحه‌ای رسیده‌اید که هنوز وجود ندارد.\nبرای ایجاد صفحه، در مستطیل زیر شروع به نوشتن کنید (برای اطلاعات بیشتر به [$1 صفحهٔ راهنما] مراجعه کنید).\nاگر به اشتباه اینجا آمده‌اید، دکمهٔ «بازگشت» مرورگرتان را بزنید.",
-       "anontalkpagetext": "----''این صفحهٔ بحث برای کاربر گمنامی است که هنوز حسابی درست نکرده است یا از آن استفاده نمی‌کند.\nبنا بر این برای شناسایی‌اش مجبوریم از نشانی آی‌پی عددی استفاده کنیم.\nچنین نشانی‌های آی‌پی ممکن است توسط چندین کاربر به شکل مشترک استفاده شود.\nاگر شما کاربر گمنامی هستید و تصور می‌کنید اظهار نظرات نامربوط به شما صورت گرفته است، لطفاً برای پیشگیری از اشتباه گرفته شدن با کاربران گمنام دیگر در آینده [[Special:CreateAccount|حسابی ایجاد کنید]] یا [[Special:UserLogin|به سامانه وارد شوید]].''",
+       "anontalkpagetext": "----<em>این صفحهٔ بحث برای کاربر گمنامی است که هنوز حسابی درست نکرده است یا از آن استفاده نمی‌کند.\nبنا بر این برای شناسایی‌اش مجبوریم از نشانی آی‌پی عددی استفاده کنیم.</em>\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-nopermission": "این صفحه هم‌اکنون متنی ندارد.\nشما می‌توانید در دیگر صفحات [[Special:Search/{{PAGENAME}}|این عنوان را جستجو کنید]]،\nیا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} سیاهه‌های مرتبط را بگردید]</span> ولی شما اجازه ایجاد این صفحه را ندارید.",
        "missing-revision": "ویرایش #$1 از صفحهٔ «{{FULLPAGENAME}}» موجود نیست.\n\nمعمولاً در اثر پیوند به تاریخچهٔ به‌روز نشدهٔ صفحهٔ حذف شده است.\nمی‌توانید جزئیات بیشتر را در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] بیابید.",
        "userpage-userdoesnotexist": "حساب کاربر «<nowiki>$1</nowiki>» ثبت نشده‌است.\nلطفاً مطمئن شوید که می‌خواهید این صفحه را ایجاد یا ویرایش کنید.",
        "userpage-userdoesnotexist-view": "حساب کاربری «$1» ثبت نشده‌است.",
        "blocked-notice-logextract": "دسترسی این کاربر در حال حاضر بسته است.\nآخرین مورد سیاهه قطع دسترسی در زیر آمده‌است:",
-       "clearyourcache": "<strong>Ù\86کتÙ\87:</strong> Ù¾Ø³ Ø§Ø² Ø°Ø®Û\8cرÙ\87 Ú©Ø±Ø¯Ù\86 Ù\85Ù\85Ú©Ù\86 Ø§Ø³Øª Ø¨Ø±Ø§Û\8c Ø¯Û\8cدÙ\86 ØªØºÛ\8cÛ\8cرات Ù\86Û\8cاز Ø¨Ø§Ø´Ø¯ Ú©Ù\87 Ø­Ø§Ù\81ظÙ\87Ù\94 Ù\86Ù\87اÙ\86Û\8c Ù\85رÙ\88رگر Ø®Ù\88د Ø±Ø§ Ù¾Ø§Ú© Ú©Ù\86Û\8cد.\n*<strong>Ù\81اÛ\8cرÙ\81اکس / Ø³Ø§Ù\81ارÛ\8c:</strong> Ú©Ù\84Û\8cد <em>Shift</em> Ø±Ø§ Ù\86Ú¯Ù\87 Ø¯Ø§Ø±Û\8cد Ù\88 Ø±Ù\88Û\8c Ø¯Ú©Ù\85Ù\87Ù\94 <em>Reload</em> Ú©Ù\84Û\8cÚ© Ú©Ù\86Û\8cدØ\8c Û\8cا Ú©Ù\84Û\8cدâ\80\8cÙ\87اÛ\8c <em>Ctrl-F5</em> Û\8cا <em>Ctrl-R</em> Ø±Ø§ Ø¨Ø§ Ù\87Ù\85 Ù\81شار Ø¯Ù\87Û\8cد (در Ø±Ø§Û\8cاÙ\86Ù\87â\80\8cÙ\87اÛ\8c Ø§Ù¾Ù\84 Ù\85Ú©Û\8cÙ\86تاش Ú©Ù\84Û\8cدâ\80\8cÙ\87اÛ\8c <em>â\8c\98-R</em>)\n*<strong>Ú¯Ù\88Ú¯Ù\84 Ú©Ø±Ù\88Ù\85:</strong> Ú©Ù\84Û\8cدÙ\87اÛ\8c <em>Ctrl+Shift+R</em> Ø±Ø§ Ø¨Ø§ Ù\87Ù\85 Ù\81شار Ø¯Ù\87Û\8cد (در Ø±Ø§Û\8cاÙ\86Ù\87â\80\8cÙ\87اÛ\8c Ø§Ù¾Ù\84 Ù\85Ú©Û\8cÙ\86تاش Ú©Ù\84Û\8cدâ\80\8cÙ\87اÛ\8c <em>â\8c\98-Shift-R</em>)\n*<strong>اÛ\8cÙ\86ترÙ\86ت Ø§Ú©Ø³Ù¾Ù\84Ù\88رر:</strong> Ú©Ù\84Û\8cد <em>Ctrl</em> Ø±Ø§ Ù\86Ú¯Ù\87â\80\8cدارÛ\8cد Ù\88 Ø±Ù\88Û\8c Ø¯Ú©Ù\85Ù\87Ù\94 <em>Refresh</em> Ú©Ù\84Û\8cÚ© Ú©Ù\86Û\8cدØ\8c Û\8cا Ú©Ù\84Û\8cدâ\80\8cÙ\87اÛ\8c <em>Ctrl-F5</em> Ø±Ø§ Ø¨Ø§ Ù\87Ù\85 Ù\81شار Ø¯Ù\87Û\8cد\n*<strong>اپرا:</strong> Ø­Ø§Ù\81ظÙ\87Ù\94 Ù\86Ù\87اÙ\86Û\8c Ù\85رÙ\88رگر Ø±Ø§ Ø§Ø² Ø·Ø±Û\8cÙ\82 Ù\85Ù\86Ù\88Û\8c <em>Tools &rarr; Preferences</em> Ù¾Ø§Ú© Ú©Ù\86Û\8cد",
+       "clearyourcache": "<strong>Ù\86کتÙ\87:</strong> Ù¾Ø³ Ø§Ø² Ø°Ø®Û\8cرÙ\87 Ú©Ø±Ø¯Ù\86 Ù\85Ù\85Ú©Ù\86 Ø§Ø³Øª Ø¨Ø±Ø§Û\8c Ø¯Û\8cدÙ\86 ØªØºÛ\8cÛ\8cرات Ù\86Û\8cاز Ø¨Ø§Ø´Ø¯ Ú©Ù\87 Ø­Ø§Ù\81ظÙ\87Ù\94 Ù\86Ù\87اÙ\86Û\8c Ù\85رÙ\88رگر Ø®Ù\88د Ø±Ø§ Ù¾Ø§Ú© Ú©Ù\86Û\8cد.\n*<strong>Ù\81اÛ\8cرÙ\81اکس / Ø³Ø§Ù\81ارÛ\8c:</strong> Ú©Ù\84Û\8cد <em>Shift</em> Ø±Ø§ Ù\86Ú¯Ù\87 Ø¯Ø§Ø±Û\8cد Ù\88 Ø±Ù\88Û\8c Ø¯Ú©Ù\85Ù\87Ù\94 <em>Reload</em> Ú©Ù\84Û\8cÚ© Ú©Ù\86Û\8cدØ\8c Û\8cا Ú©Ù\84Û\8cدâ\80\8cÙ\87اÛ\8c <em>Ctrl-F5</em> Û\8cا <em>Ctrl-R</em> Ø±Ø§ Ø¨Ø§ Ù\87Ù\85 Ù\81شار Ø¯Ù\87Û\8cد (در Ø±Ø§Û\8cاÙ\86Ù\87â\80\8cÙ\87اÛ\8c Ø§Ù¾Ù\84 Ù\85Ú©Û\8cÙ\86تاش Ú©Ù\84Û\8cدâ\80\8cÙ\87اÛ\8c <em>â\8c\98-R</em>)\n*<strong>Ú¯Ù\88Ú¯Ù\84 Ú©Ø±Ù\88Ù\85:</strong> Ú©Ù\84Û\8cدÙ\87اÛ\8c <em>Ctrl+Shift+R</em> Ø±Ø§ Ø¨Ø§ Ù\87Ù\85 Ù\81شار Ø¯Ù\87Û\8cد (در Ø±Ø§Û\8cاÙ\86Ù\87â\80\8cÙ\87اÛ\8c Ø§Ù¾Ù\84 Ù\85Ú©Û\8cÙ\86تاش Ú©Ù\84Û\8cدâ\80\8cÙ\87اÛ\8c <em>â\8c\98-Shift-R</em>)\n*<strong>اÛ\8cÙ\86ترÙ\86ت Ø§Ú©Ø³Ù¾Ù\84Ù\88رر:</strong> Ú©Ù\84Û\8cد <em>Ctrl</em> Ø±Ø§ Ù\86Ú¯Ù\87â\80\8cدارÛ\8cد Ù\88 Ø±Ù\88Û\8c Ø¯Ú©Ù\85Ù\87Ù\94 <em>Refresh</em> Ú©Ù\84Û\8cÚ© Ú©Ù\86Û\8cدØ\8c Û\8cا Ú©Ù\84Û\8cدâ\80\8cÙ\87اÛ\8c <em>Ctrl-F5</em> Ø±Ø§ Ø¨Ø§ Ù\87Ù\85 Ù\81شار Ø¯Ù\87Û\8cد\n*<strong>اپرا:</strong> Ø¨Ø±Ù\88Û\8cد Ø¨Ù\87 <em>Menu â\86\92 Settings</em> (<em>Opera â\86\92 Preferences</em> on a Mac) and then to <em>Privacy & security â\86\92 Clear browsing data â\86\92 Cached images and files</em>.",
        "usercssyoucanpreview": "'''نکته:''' پیش از ذخیره کردن پرونده سی‌اس‌اس خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
        "userjsyoucanpreview": "'''نکته:''' پیش از ذخیره کردن پروندهٔ جاوااسکریپت خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
        "usercsspreview": "'''فراموش مکنید که شما فقط دارید پیش‌نمایش سی‌اس‌اس کاربری‌تان را می‌بینید.'''\n'''این سی‌اس‌اس هنوز ذخیره نشده‌است!'''",
        "content-model-css": "سی‌اس‌اس",
        "content-json-empty-object": "ابجکت خالی",
        "content-json-empty-array": "آرایهٔ خالی",
+       "deprecated-self-close-category": "صفحه از برچسب اچ‌تی‌ام‌ال self-closed غیرمجاز استفاده می‌کند",
+       "deprecated-self-close-category-desc": "صفحه دارای برچسب اچ‌تی‌ام‌ال self-closed است مانند <code>&lt;b/></code> یا <code>&lt;span/></code>. عملکرد این برچسب‌ها در اچ‌تی‌ام‌ال۵ تغییر می‌کند در نتیجه استفاده از آنها در ویکی‌متن منسوخ و بی‌اثر است.",
        "duplicate-args-warning": "<strong>هشدار:</strong> [[:$1]] [[:$2]] را با بیش از یک مقدار برای پارامتر «$3» صدا می‌زند. فقط آخرین مقدار داده شده استفاده خواهد شد.",
        "duplicate-args-category": "صفحه‌های دارای آرگومان تکراری در فراخوانی الگو",
        "duplicate-args-category-desc": "صفحاتی که دارای آرگومان تکراری هستند مانند، <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> یا <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "right-override-export-depth": "برون‌بری صفحه‌ها شامل صفحه‌های پیوند شده تا عمق ۵",
        "right-sendemail": "ارسال ایمیل به دیگر کاربران",
        "right-passwordreset": "مشاهدهٔ نامه‌های تنظیم مجدد گذرواژه",
-       "right-managechangetags": "اÛ\8cجاد Ù\88 Ø­Ø°Ù\81 [[Special:Tags|برÚ\86سبâ\80\8cÙ\87ا]] Ø§Ø² Ù¾Ø§Û\8cگاÙ\87 Ø¯Ø§Ø¯Ù\87",
+       "right-managechangetags": "اÛ\8cجاد Ù\88 ØºÛ\8cرÙ\81عاÙ\84 Ú©Ø±Ø¯Ù\86 [[Special:Tags|برÚ\86سبâ\80\8cÙ\87ا]]",
        "right-applychangetags": "تائید [[Special:Tags|برچسب]] بر روی تغییرات یک نفر",
        "right-changetags": "افزودن یا حذف [[Special:Tags|برچسب]] قراردادی بر روی نسخه یا سیاهه ورودی‌ها",
        "right-deletechangetags": "حذف [[Special:Tags|برچسب‌ها]] از پایگاه داده",
        "rightslogtext": "این سیاههٔ تغییرات اختیارات کاربر است.",
        "action-read": "خواندن این صفحه",
        "action-edit": "ویرایش این صفحه",
-       "action-createpage": "ایجاد صفحه",
-       "action-createtalk": "اÛ\8cجاد ØµÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8c بحث",
+       "action-createpage": "اÛ\8cجاد Ø§Û\8cÙ\86 ØµÙ\81Ø­Ù\87",
+       "action-createtalk": "اÛ\8cجاد Ø§Û\8cÙ\86 ØµÙ\81Ø­Ù\87 بحث",
        "action-createaccount": "ایجاد این حساب کاربری",
        "action-autocreateaccount": "حساب کاربری خارجی به صورت خودکار ساخته شد",
        "action-history": "مشاهده تاریخچه این صفحه",
        "recentchanges-page-added-to-category": "[[:$1]] به رده اضافه شد",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] به رده افزوده شد، [[Special:WhatLinksHere/$1|این صفحه در صفحه‌های دیگر قرار گرفته است.]]",
        "recentchanges-page-removed-from-category": "[[:$1]] از رده حذف شد",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] و [[Special:WhatLinksHere/$1|{{PLURAL:$2|یک صفحه|$2 صفحه}}]] دیگر از رده حذف شدند",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] از رده حذف شد، [[Special:WhatLinksHere/$1|این صفحه در صفحه‌های دیگر قرار گرفته است.]]",
        "autochange-username": "تغییرات خودکار مدیاویکی",
        "upload": "بارگذاری پرونده",
        "uploadbtn": "بارگذاری پرونده",
        "upload-http-error": "یک خطای اچ‌تی‌تی‌پی رخ داد: $1",
        "upload-copy-upload-invalid-domain": "بارگذاری کپی پرونده‌ها از این دامنه امکان‌پذیر نیست.",
        "upload-foreign-cant-upload": "این ویکی برای بارگذاری پرونده ها در مخزن پرونده های خارجی درخواست شده پیکربندی نشده است.",
+       "upload-foreign-cant-load-config": "خواندن تنظيمات مربوط به بارگذاری پرونده در مخزن خارجی با شکست مواجه شد",
+       "upload-dialog-disabled": "در اين ويکی، بارگذاری پرونده‌هااز طريق اين رابط کاربری غير فعال است",
        "upload-dialog-title": "بارگذاری پرونده",
        "upload-dialog-button-cancel": "لغو",
        "upload-dialog-button-done": "انجام شد",
        "trackingcategories-msg": "ردهٔ ردیابی",
        "trackingcategories-name": "نام پیام",
        "trackingcategories-desc": "معیارهای گنجایش رده",
+       "restricted-displaytitle-ignored": "صفحه‌ها باعنوان نمایشی نادیده‌گرفته‌شده",
+       "restricted-displaytitle-ignored-desc": "دراين صفحه <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> بی‌اهميت تلقی گرديده‌است، چراکه با عنوان اصلی صفحه یکي نيست.",
        "noindex-category-desc": "این صفحه توسط ربات‌ها فهرست‌نشده‌است به این دلیل که واژه جادویی <code><nowiki>__NOINDEX__</nowiki></code> در آن یا در فضای که پرچم مجاز است دارد.",
        "index-category-desc": "این صفحه <code><nowiki>__INDEX__</nowiki></code> درونش دارد (و در فضای نامی است که پرچم مجاز است)، و به این دلیل توسط ربات مجاز است که به‌صورت عادی نباید می‌شد.",
        "post-expand-template-inclusion-category-desc": "پس از گسترش همهٔ الگوها، حجم صفحه بزرگتر از <code>$wgMaxArticleSize</code> است بنابراین بعضی از الگو گسترش نیافته‌اند.",
        "rollbacklinkcount": "واگردانی $1 ویرایش",
        "rollbacklinkcount-morethan": "واگردانی بیش از $1 ویرایش",
        "rollbackfailed": "واگردانی نشد",
+       "rollback-missingparam": "فقدان پارامترهای ضروری در درخواست",
        "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>.",
        "changecontentmodel-success-text": "نوع محتوی [[:$1]]  تغییر یافت",
        "changecontentmodel-cannot-convert": "محتوی در [[:$1]] نمی‌تواند به گونه‌ای از $2 تبدیل شود.",
        "changecontentmodel-nodirectediting": "نمونه محتوی $1 امکان ویرایش مستقیم را پشتیبانی نمی‌کند",
+       "changecontentmodel-emptymodels-title": "هيچ مدل محتوایی در دسترس نيست",
+       "changecontentmodel-emptymodels-text": "محتوای موجود در [[:$1]] به هيچ نوعی نمی‌تواند تبديل شود.",
        "log-name-contentmodel": "سیاهه تغییر نمونه محتوی",
        "log-description-contentmodel": "رویدادهای مرتبط با نمونه محتوی‌های یک صفحه",
        "logentry-contentmodel-new": "صفحهٔ $3 با استفاده از مدل‌های محتوایی غیر پیش‌فرض «$5» توسط $1 {{GENDER:$2|ساخته شد}}",
        "sp-contributions-username": "نشانی آی‌پی یا نام کاربری:",
        "sp-contributions-toponly": "فقط ویرایش‌هایی که آخرین نسخه‌اند نمایش داده شود",
        "sp-contributions-newonly": "فقط نمایش ویرایش‌هایی که ایجاد صفحه هستند",
+       "sp-contributions-hideminor": "پنهان کردن ویرایش‌های جزئی",
        "sp-contributions-submit": "جستجو",
        "whatlinkshere": "پیوندها به این صفحه",
        "whatlinkshere-title": "صفحه‌هایی که به «$1» پیوند دارند",
        "whatlinkshere-prev": "{{PLURAL:$1|قبلی|$1 مورد قبلی}}",
        "whatlinkshere-next": "{{PLURAL:$1|بعدی|$1 مورد بعدی}}",
        "whatlinkshere-links": "→ پیوندها",
-       "whatlinkshere-hideredirs": "$1 تغییرمسیر",
-       "whatlinkshere-hidetrans": "$1 تراگنجانش‌ها",
+       "whatlinkshere-hideredirs": "$1 تغییر مسیر",
+       "whatlinkshere-hidetrans": "$1 تراگنجانش",
        "whatlinkshere-hidelinks": "$1 پیوند",
-       "whatlinkshere-hideimages": "$1 پیوندهای پرونده",
+       "whatlinkshere-hideimages": "$1 پیوند پرونده",
        "whatlinkshere-filters": "پالایه‌ها",
        "whatlinkshere-submit": "برو",
        "autoblockid": "شناسه قطع دسترسی خودکار #$1",
        "invalidateemail": "لغو تأیید نشانی ایمیل",
        "notificationemail_subject_changed": "نشانی ایمیل ثبت شدهٔ {{SITENAME}} تغییر یافته است",
        "notificationemail_subject_removed": "نشانی ایمیل ثبت شدهٔ {{SITENAME}} حذف شده است",
+       "notificationemail_body_changed": "کسی، شايد خود شما، از آدرس اينترنتی $1، آدرس ايميل حساب $2 در {{SITENAME}} را به $3 تغيير داده است.\n\nاگر آن شخص شما نبوده‌ايد، فوراً با یک مدير سایت تماس بگيريد.",
+       "notificationemail_body_removed": "کسی، شايد خود شما، از آدرس اينترنتی $1، آدرس ايميل حساب $2 در {{SITENAME}} را حذف کرده است.\n\nاگر آن شخص شما نبوده‌ايد، فوراً با یک مدير سایت تماس بگيريد.",
        "scarytranscludedisabled": "[تراگنجانش بین‌ویکیانه فعال نیست]",
        "scarytranscludefailed": "[فراخوانی الگو برای $1 میسر نشد]",
        "scarytranscludefailed-httpstatus": "[فراخوانی الگو برای $1 میسر نشد: خطای اچ‌تی‌تی‌پی $2]",
        "timezone-local": "محلی",
        "duplicate-defaultsort": "هشدار: ترتیب پیش‌فرض «$2» ترتیب پیش‌فرض قبلی «$1» را باطل می‌کند.",
        "duplicate-displaytitle": "<strong>هشدار:</strong> نمایش عنوان \" $2 \"باعث ابطال پیش نمایش عنوان\" $1 \" می‌شود.",
+       "restricted-displaytitle": "<strong>هشدار:</strong> از آنجايي که عنوان نمایشی «$1» با عنوان اصلی صفحه یکی نبود، مورد اغماز قرار گرفت.",
        "invalid-indicator-name": "<strong>خطا:</strong>ویژگی های شاخص‌های وضعیت صفحهٔ <code>name</code> نباید خالی باشند.",
        "version": "نسخه",
        "version-extensions": "افزونه‌های نصب‌شده",
        "api-error-nomodule": "خطای داخلی: پودمان بارگذاری تنظیم نشده‌است.",
        "api-error-ok-but-empty": "خطای داخلی : پاسخی از سرور دریافت نشد.",
        "api-error-overwrite": "جای نوشتن یک پرونده موجود مجاز نیست.",
+       "api-error-ratelimited": "شما سعی داريد، در بازه زمانی کوتاهی، بيشتر از تعدادی که اين ويکی اجازه داده‌است پرونده بارگذاری کنيد.\nلطفاً چند دقيقه بعد مجدداً تلاش نماييد.",
        "api-error-stashfailed": "خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.",
        "api-error-publishfailed": "خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.",
        "api-error-stasherror": "هنگام انتقال پوشه برای ذخیره خطایی بود.",
        "api-error-unknownerror": "خطای ناشناخته: «$1».",
        "api-error-uploaddisabled": "بارگذاری در این ویکی غیرفعال است.",
        "api-error-verification-error": "ممکن است پرونده آسیب دیده باشد، یا دارای پسوند نادرست باشد.",
+       "api-error-was-deleted": "پرونده‌ای با همين نام قبلاً بارگذاری و متعاقباً حذف شده است.",
        "duration-seconds": "$1 ثانیه",
        "duration-minutes": "$1 دقیقه",
        "duration-hours": "$1 ساعت",
        "mw-widgets-dateinput-no-date": "هیچ داده‌ای انتخاب نشده",
        "mw-widgets-titleinput-description-new-page": "این صفحه هنوز وجود ندارد",
        "mw-widgets-titleinput-description-redirect": "تغییر مسیر به $1",
-       "api-error-blacklisted": "لطفاً یک عنوان توصیفی متفاوت انتخاب کنید.",
        "sessionmanager-tie": "نمی‌توان چندین نوع درخواست هویت‌سنجی را ترکیب کرد: $1.",
        "sessionprovider-generic": "$1 فصل",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "فصل‌های کوکی‌محور",
        "log-action-filter-newusers": "نوع ایجاد حساب",
        "log-action-filter-patrol": "نوع گشت:",
        "log-action-filter-protect": "نوع محافظت",
-       "log-action-filter-rights": "روش تغییر صحیح",
-       "log-action-filter-suppress": "روش سرکوب",
+       "log-action-filter-rights": "روش تغییر صحیح:",
+       "log-action-filter-suppress": "روش سرکوب:",
        "log-action-filter-upload": "نوع بارگذاری",
        "log-action-filter-all": "همه",
        "log-action-filter-block-block": "بستن",
        "log-action-filter-delete-event": "حذف سیاهه",
        "log-action-filter-delete-revision": "حذف ویرایش",
        "log-action-filter-import-interwiki": "ورودی ترانسویکی",
+       "log-action-filter-import-upload": "درون‌ریزی به کمک بارگذاری XML",
        "log-action-filter-managetags-create": "ایجاد تگ",
        "log-action-filter-managetags-delete": "حذف کردن تگ",
        "log-action-filter-managetags-activate": "فعالسازی تگ",
        "log-action-filter-suppress-block": "مخفی‌سازی کاربر با بستن",
        "log-action-filter-suppress-reblock": "مخفی‌سازی کاربر با بستن مجدد",
        "log-action-filter-upload-upload": "بارگذاری جدید",
-       "log-action-filter-upload-overwrite": "بارگذاری دوباره"
+       "log-action-filter-upload-overwrite": "بارگذاری دوباره",
+       "authmanager-authn-not-in-progress": "ارزیابی ورود در جريان نيست یا اطلاعات جلسه کاری از بين رفته است. لطفاً دوباره از ابتدا شروع کنيد.",
+       "authmanager-authn-no-primary": "اعتبارسنجی اطلاعات ارائه شده جهت ورود ميسر نيست",
+       "authmanager-authn-no-local-user": "اطلاعات ورود ارائه شده با هيچ کاربری در اين ويکی مرتبط نيست",
+       "authmanager-authn-no-local-user-link": "اطلاعات اعتبارسنجی ارائه شده معتبرند، ليکن با هيچ کاربری در اين ويکی مرتبط نشده‌اند. از طريق ديگری وارد شويد و یا یک حساب جديد بسازيد. شما امکان اتصال اطلاعات اعتبار‌سنجی قبلی را با آن حساب خواهيد داشت.",
+       "authmanager-authn-autocreate-failed": "ايجاد خودکار یک حساب بومی با شکست مواجه شد:$1",
+       "authmanager-change-not-supported": "تغییر پشتیبانی از اعتبارنامه امکان‌پذیر نیست، در صورتی که هیچ چیز از آنها استفاده نمی‌کند.",
+       "authmanager-create-disabled": "قابلیت ایجاد حساب غیرفعال است",
+       "authmanager-create-from-login": "برای ايجاد حساب، قسمت‌های زير را تکميل کنيد.",
+       "authmanager-create-not-in-progress": "ايجاد حساب در جريان نيست یا اطلاعات جلسه کاری از بين رفته است. لطفاً دوباره از ابتدا شروع کنيد.",
+       "authmanager-create-no-primary": "اطلاعات اعتبارسنجی ارائه شده نمی‌تواند جهت ايجاد حساب بکار رود.",
+       "authmanager-link-no-primary": "اطلاعات اعتبارسنجی ارائه شده نمی‌تواند جهت مرتبط کردن حساب بکار رود.",
+       "authmanager-link-not-in-progress": "مرتبط کردن حساب در جريان نيست یا اطلاعات جلسه کاری از بين رفته است. لطفاً دوباره از ابتدا شروع کنيد.",
+       "authmanager-authplugin-setpass-failed-title": "تغییر گذرواژه ناموفق بود",
+       "authmanager-authplugin-setpass-failed-message": "افزونهٔ اعتبارسنجی، تغيير گذزواژه را مردود دانست",
+       "authmanager-authplugin-create-fail": "افزونهٔ اعتبارسنجی، ايجاد حساب را مردود دانست",
+       "authmanager-authplugin-setpass-denied": "افزونهٔ اعتبارسنجی اجازهٔ تغيير گذرواژه را نمی‌دهد",
+       "authmanager-authplugin-setpass-bad-domain": "دامنه نامعتبر است.",
+       "authmanager-autocreate-noperm": "ایجاد حساب خودکار مجاز نیست.",
+       "authmanager-autocreate-exception": "ایجاد حساب کاربری به خاطر خطاهای قبلی به طور موقت غیرفعال است.",
+       "authmanager-userdoesnotexist": "حساب کاربری «$1» ثبت نشده‌است.",
+       "authmanager-userlogin-remembermypassword-help": "اينکه گذرواژه می‌بایست به مدتی بيش از طول جلسه به خاطر سپرده شود",
+       "authmanager-username-help": "نام کاربری جهت ورود",
+       "authmanager-password-help": "گذرواژه جهت ورود",
+       "authmanager-domain-help": "دامنه برای احراز هویت خارجی.",
+       "authmanager-retype-help": "تکراد مجدد گذرواژه جهت تأييد",
+       "authmanager-email-label": "ایمیل",
+       "authmanager-email-help": "آدرس ایمیل",
+       "authmanager-realname-label": "نام واقعی",
+       "authmanager-realname-help": "نام واقعی کاربر",
+       "authmanager-provider-password": "احراز هويت بر پايهٔ گذرواژه",
+       "authmanager-provider-password-domain": "احراز هويت بر پايهٔ دامنه و گذرواژه",
+       "authmanager-provider-temporarypassword": "گذرواژهٔ موقت",
+       "authprovider-confirmlink-message": "طبق تلاش‌های اخير شما جهت ورود، حسابهای زير می‌توتنند با حساب ويکی شما پيوند بخورند. پيوند آنها شما را قادر می‌سازد تا از طریق آنها به سامانه وارد شويد. لطفاً انتخاب کنيد که کداميک از آنها می‌بايست پيوند داده شوند.",
+       "authprovider-confirmlink-request-label": "حساب‌هایي که می‌بایست پيوند داده شوند",
+       "authprovider-confirmlink-success-line": "$1 با موفقيت پيوند خورد.",
+       "authprovider-confirmlink-failed": "پيوند حسابها به طور کامل انجام نشد:$1",
+       "authprovider-confirmlink-ok-help": "پس از نمايش پيامهای عدم موفقيت پيوند زدن همچنان ادامه بده.",
+       "authprovider-resetpass-skip-label": "رها کردن",
+       "authprovider-resetpass-skip-help": "از خير تغيير گذرواژه بگذر",
+       "authform-nosession-login": "احراز هويت موفقيت‌آميز بود، ليکن مرورگرشما نمی‌تواند وارد شدن شما را «به خاطر بسپارد».\n\n$1",
+       "authform-nosession-signup": "حساب کاربری ساخته شد، ليکن مرورگرشما نمی‌تواند وارد شدن شما را «به خاطر بسپارد».\n\n$1",
+       "authform-newtoken": "فقدان توکن.$1",
+       "authform-notoken": "فقدان توکن.",
+       "authform-wrongtoken": "توکن اشتباه",
+       "specialpage-securitylevel-not-allowed-title": "مجاز نیست",
+       "specialpage-securitylevel-not-allowed": "با عرض پوزش، شما مجاز به استفاده از اين صفحه نمی‌باشيد، چراکه هويت شما را نمی‌توان تأييد کرد.",
+       "authpage-cannot-login": "نمی‌توان ورود را آغاز نمود",
+       "authpage-cannot-login-continue": "نمی‌توان به ورود ادامه داد. زمان جلسه کاری شما احتمالاً به سر آمده است.",
+       "authpage-cannot-create": "نمی‌توان ايجاد حساب را آغاز نمود.",
+       "authpage-cannot-create-continue": "نمی‌توان به ايجاد حساب ادامه داد. زمان جلسه کاری شما احتمالاً به سر آمده است.",
+       "authpage-cannot-link": "نمی‌توان پيوند دادن حساب را آغاز نمود.",
+       "authpage-cannot-link-continue": "نمی‌توان به پيوند دادن حساب ادامه داد. زمان جلسه کاری شما احتمالاً به سر آمده‌است.",
+       "cannotauth-not-allowed-title": "اجازه داده نشد",
+       "cannotauth-not-allowed": "شما برای دسترسی به این صفحه مجاز نیستید",
+       "changecredentials": "تغییر اعتبارنامه‌ها",
+       "changecredentials-submit": "تغییر اعتبارنامه‌ها",
+       "changecredentials-invalidsubpage": "$1 به دلیل نوع اعتبارنامه نادرست قابل پذیرش نیست.",
+       "changecredentials-success": "اعتبارنامه شما تغییر یافت.",
+       "removecredentials": "حذف اعتبارنامه‌ها",
+       "removecredentials-submit": "حذف اعتبارنامه‌ها",
+       "removecredentials-invalidsubpage": "$1 به دلیل نوع اعتبارنامه نادرست قابل پذیرش نیست.",
+       "removecredentials-success": "اعتبارنامهٔ شما حذف شد.",
+       "credentialsform-provider": "نوع اعتبارنامه:",
+       "credentialsform-account": "نام حساب کاربری:",
+       "cannotlink-no-provider-title": "حساب کاربری قابل پیوند وجود ندارد",
+       "cannotlink-no-provider": "حساب کاربری قابل پیوند وجود ندارد.",
+       "linkaccounts": "پیوند حساب کاربری",
+       "linkaccounts-success-text": "حساب کاربری پیوند شده‌است.",
+       "linkaccounts-submit": "پیوند حساب کاربری",
+       "unlinkaccounts": "حذف پیوند حساب کاربری",
+       "unlinkaccounts-success": "پیوند کاربری بدون پیوند شد.",
+       "authenticationdatachange-ignored": "به تغيير اطلاعات احراز هويت پرداخته نشد. آیا ممکن است که هيچ مهيا کننده‌ای برای اين کار تنظيم نشده باشد؟"
 }
index 5663cd2..07869da 100644 (file)
        "password-change-forbidden": "Et voi muuttaa salasanoja tässä wikissä.",
        "externaldberror": "Tapahtui virhe ulkoisen autentikointitietokannan käytössä tai sinulla ei ole lupaa päivittää tunnustasi.",
        "login": "Kirjaudu sisään",
+       "login-security": "Varmista henkilöllisyytesi",
        "nav-login-createaccount": "Kirjaudu sisään tai luo tunnus",
        "userlogin": "Kirjaudu sisään tai luo tunnus",
        "userloginnocreate": "Kirjaudu sisään",
        "userlogin-resetpassword-link": "Unohditko salasanasi?",
        "userlogin-helplink2": "Apua sisäänkirjautumiseen",
        "userlogin-loggedin": "Olet jo kirjautunut sisään tunnuksella {{GENDER:$1|$1}}.\nKäytä alla olevaa lomaketta kirjautuaksesi sisään toisena käyttäjänä.",
+       "userlogin-reauth": "Sinun on kirjauduttava sisään uudelleen varmistaaksesi olevasi {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Luo toinen käyttäjätunnus",
        "createacct-emailrequired": "Sähköpostiosoite",
        "createacct-emailoptional": "Sähköpostiosoite (vapaaehtoinen)",
        "createacct-email-ph": "Anna sähköpostiosoitteesi",
        "createacct-another-email-ph": "Lisää sähköpostiosoite",
        "createaccountmail": "Käytä satunnaista väliaikaissalasanaa ja lähetä se alla olevaan sähköpostiosoitteeseen",
+       "createaccountmail-help": "Voidaan käyttää luomaan tunnus toiselle käyttäjälle ilman salasanan tietämistä.",
        "createacct-realname": "Oikea nimi (vapaaehtoinen tieto)",
        "createaccountreason": "Syy:",
        "createacct-reason": "Syy",
        "createacct-reason-ph": "Miksi olet luomassa toista käyttäjätunnusta",
+       "createacct-reason-help": "Tunnustenluontilokissa näytetty viesti",
        "createacct-submit": "Luo tunnus",
        "createacct-another-submit": "Luo käyttäjätunnus",
+       "createacct-continue-submit": "Jatka tunnuksen luomista",
+       "createacct-another-continue-submit": "Jatka tunnuksen luomista",
        "createacct-benefit-heading": "{{SITENAME}} on sinun kaltaistesi ihmisten tekemä.",
        "createacct-benefit-body1": "{{PLURAL:$1|muokkaus|muokkausta}}",
        "createacct-benefit-body2": "{{PLURAL:$1|sivu|sivua}}",
        "nocookiesnew": "Käyttäjätunnus on luotu, mutta et ole kirjautunut sisään. \n{{SITENAME}} käyttää evästeitä sisäänkirjautumisen yhteydessä. \nSelaimesi ei salli evästeitä. \nSalli evästeiden käyttö, ja sen jälkeen kirjaudu sisään juuri luomallasi käyttäjätunnuksella ja salasanalla.",
        "nocookieslogin": "{{SITENAME}} käyttää evästeitä sisäänkirjautumisen yhteydessä. Selaimesi ei salli evästeitä. Ota ne käyttöön, ja yritä uudelleen.",
        "nocookiesfornew": "Käyttäjätunnusta ei luotu, koska sen lähdettä ei kyetty varmistamaan. Varmista, että selaimessasi on käytössä evästeet, päivitä tämä sivu ja yritä uudelleen.",
+       "createacct-loginerror": "Tunnus luotiin onnistuneesti, mutta automaattista sisäänkirjautumista ei voitu tehdä. Siirry [[Special:UserLogin|manuaaliseen kirjautumiseen]].",
        "noname": "Et ole määritellyt kelvollista käyttäjänimeä.",
        "loginsuccesstitle": "Olet kirjautunut sisään",
        "loginsuccess": "'''Olet kirjautunut sivustolle {{SITENAME}} käyttäjänä $1.'''",
        "botpasswords-invalid-name": "Annetussa käyttäjätunnuksessa ei ole bottisalasanan erotinta (\"$1\").",
        "botpasswords-not-exist": "Käyttäjällä \"$1\" ei ole bottisalasanaa nimellä \"$2\".",
        "resetpass_forbidden": "Salasanoja ei voi vaihtaa.",
+       "resetpass_forbidden-reason": "Salasanoja ei voi muuttaa: $1",
        "resetpass-no-info": "Et voi nähdä tätä sivua kirjautumatta sisään.",
        "resetpass-submit-loggedin": "Muuta salasana",
        "resetpass-submit-cancel": "Peruuta",
        "passwordreset-emailsentusername": "Jos on olemassa vastaava rekisteröity sähköpostiosoite, salasanan uudistamisesta kertova viesti lähetetään.",
        "passwordreset-emailsent-capture": "Salasanan uudistamisesta kertova sähköpostiviesti on lähetetty, ja se näkyy myös alla.",
        "passwordreset-emailerror-capture": "Allaoleva sähköpostiviesti luotiin, mutta sen lähettäminen {{GENDER:$2|käyttäjälle}} epäonnistui: $1",
+       "passwordreset-emailsent-capture2": "Salasananpalautus{{PLURAL:$1|sähköposti|sähköpostit}} on lähetetty. {{PLURAL:$1|Käyttäjä ja salasana|Luettelo käyttäjistä ja salasanoista}} näytetään alapuolella.",
+       "passwordreset-emailerror-capture2": "Sähköpostin lähettäminen {{GENDER:$2|käyttäjälle}} epäonnistui: $1 {{PLURAL:$3|Käyttäjänimi ja salasana|Luettelo käyttäjänimistä ja salasanoista}} näytetään alla.",
+       "passwordreset-invalideamil": "Virheellinen sähköpostiosoite",
+       "passwordreset-nodata": "Käyttäjätunnusta ja salasanaa ei annettu",
        "changeemail": "Muuta tai poista sähköpostiosoite",
        "changeemail-header": "Täydennä tämä lomake, jolla voit muuttaa sähköpostiosoitettasi. Jos haluat poistaa sähköpostiosoitteesi kokonaan tunnuksesi yhteydestä, älä kirjoita uudeksi osoitteeksi mitään vaan jätä se tyhjäksi.",
        "changeemail-passwordrequired": "Sinun on syötettävä salasanasi vahvistaaksesi tämän muutoksen.",
        "minoredit": "Tämä on pieni muutos",
        "watchthis": "Tarkkaile tätä sivua",
        "savearticle": "Tallenna sivu",
+       "savechanges": "Tallenna muutokset",
        "publishpage": "Julkaise sivu",
+       "publishchanges": "Julkaise muutokset",
        "preview": "Esikatselu",
        "showpreview": "Esikatsele",
        "showdiff": "Näytä muutokset",
        "userpage-userdoesnotexist": "Käyttäjätunnusta \"$1\" ei ole rekisteröity. \nVarmista, haluatko luoda tämän sivun tai muokata sitä.",
        "userpage-userdoesnotexist-view": "Käyttäjätunnusta ”$1” ei ole rekisteröity.",
        "blocked-notice-logextract": "Tämä käyttäjä on tällä hetkellä estetty.\nAlla on viimeisin estolokin tapahtuma:",
-       "clearyourcache": "'''Huomautus:''' Selaimen välimuisti pitää tyhjentää asetusten tallentamisen jälkeen, jotta muutokset tulisivat voimaan.\n* '''Firefox ja Safari:''' Napsauta ''Shift''-näppäin pohjassa ''Päivitä'' tai paina ''Ctrl-F5'' tai ''Ctrl-R'' (''⌘-R'' Macilla)\n* '''Google Chrome:''' Paina ''Ctrl-Shift-R'' (''⌘-Shift-R'' Macilla)\n* '''Internet Explorer:''' Napsauta ''Ctrl''-näppäin pohjassa ''Päivitä'' tai paina ''Ctrl-F5''\n* '''Opera:''' Tyhjennä välimuisti: ''Tools→Preferences''",
+       "clearyourcache": "<strong>Huomautus:</strong> Selaimen välimuisti pitää tyhjentää asetusten tallentamisen jälkeen, jotta muutokset tulisivat voimaan.\n* <strong>Firefox ja Safari:</strong> Napsauta <em>Shift</em>-näppäin pohjassa <em>Päivitä</em>, tai paina <em>Ctrl-F5</em> tai <em>Ctrl-R</em> (<em>⌘-R</em> Macilla)\n* <strong>Google Chrome:</strong> Paina <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> Macilla)\n* <strong>Internet Explorer:</strong> Napsauta <em>Ctrl</em>-näppäin pohjassa <em>Päivitä</em> tai paina <em>Ctrl-F5</em>\n* <strong>Opera:</strong> <em>Menu → Settings</em> (<em>Opera → Preferences</em> Macilla) ja sitten <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "usercssyoucanpreview": "Voit testata uutta CSS:ää ennen tallennusta käyttämällä painiketta ”{{int:showpreview}}”.",
        "userjsyoucanpreview": "Voit testata uutta JavaScriptiä ennen tallennusta käyttämällä painiketta ”{{int:showpreview}}”.",
        "usercsspreview": "'''Tämä on CSS:n esikatselu. Muutoksia ei ole vielä tallennettu.'''",
        "continue-editing": "Siirry muokkauskenttään",
        "previewconflict": "Tämä esikatselu näyttää miltä muokkausalueella oleva teksti näyttää tallennettuna.",
        "session_fail_preview": "Muokkaustasi ei voitu tallentaa, koska istuntosi tiedot ovat kadonneet.\n\nSaatat olla kirjautunut ulos. '''Varmista, että olet edelleen kirjautunut sisään ja yritä uudelleen'''. Jos ongelma ei katoa, yritä [[Special:UserLogout|kirjautua ulos]] ja takaisin sisään, ja varmista, että selaimesi sallii evästeet tältä sivustolta.",
-       "session_fail_preview_html": "'''Muokkaustasi ei voitu tallentaa, koska istuntosi tiedot ovat kadonneet.'''\n\nEsikatselu on piilotettu varokeinona JavaScript-hyökkäyksiä vastaan – tässä wikissä on HTML-tila päällä.\n\nYritä uudelleen. Jos ongelma ei katoa, yritä [[Special:UserLogout|kirjautua ulos]] ja takaisin sisään.",
+       "session_fail_preview_html": "Valitettavasti muokkaustasi ei voitu käsitellä istunnon tietojen katoamisen vuoksi.\n\n<em>Koska sivustolla {{SITENAME}} on käytössä suodattamaton HTML-koodi, esikatselu on piilotettu JavaScript-hyökkäyksien torjumiseksi</em>\n\n<strong>Jos tämä on oikea muokkausyritys, yritä uudelleen.</strong> Jos ongelma ei katoa, yritä [[Special:UserLogout|kirjautua ulos]] ja takaisin sisään. Tarkista myös, että selaimesi sallii evästeet tältä sivustolta.",
        "token_suffix_mismatch": "'''Muokkauksesi on hylätty, koska asiakasohjelmasi ei osaa käsitellä välimerkkejä muokkaustarkisteessa. Syynä voi olla viallinen välityspalvelin.'''",
        "edit_form_incomplete": "'''Osa muokkauslomakkeesta ei saavuttanut palvelinta. Tarkista, että muokkauksesi ovat vahingoittumattomia ja yritä uudelleen.'''",
        "editing": "Muokataan sivua $1",
        "prefs-tabs-navigation-hint": "Vihje: Voit käyttää vasenta ja oikeata nuolinäppäintä liikkumiseen välilehtien välillä.",
        "userrights": "Käyttöoikeuksien hallinta",
        "userrights-lookup-user": "Hallinnoi käyttäjän ryhmiä",
-       "userrights-user-editname": "Käyttäjätunnus",
+       "userrights-user-editname": "Käyttäjätunnus:",
        "editusergroup": "Muokkaa {{GENDER:$1|käyttäjän}} ryhmiä",
        "editinguser": "Muutetaan {{GENDER:$1|käyttäjän}} <strong>[[User:$1|$1]]</strong> $2 oikeuksia",
        "userrights-editusergroup": "Muuta käyttäjän ryhmiä",
        "rightslogtext": "Tämä on loki käyttäjien käyttöoikeuksien muutoksista.",
        "action-read": "lukea tätä sivua",
        "action-edit": "muokata tätä sivua",
-       "action-createpage": "luoda sivuja",
-       "action-createtalk": "luoda keskustelusivuja",
+       "action-createpage": "luoda tätä sivua",
+       "action-createtalk": "luoda tätä keskustelusivua",
        "action-createaccount": "luoda tätä käyttäjätunnusta",
        "action-autocreateaccount": "luoda automaattisesti tätä ulkopuolista käyttäjätunnusta",
        "action-history": "tarkastella tämän sivun historiaa",
        "trackingcategories-msg": "Tarkkailuluokka",
        "trackingcategories-name": "Viestin nimi",
        "trackingcategories-desc": "Kriteerit luokkaan joutumiselle",
+       "restricted-displaytitle-ignored": "Sivut, joiden näytettäviä otsikoita ei huomioida",
+       "restricted-displaytitle-ignored-desc": "Sivulla on <code><nowiki>{{DISPLAYTITLE}}</nowiki></code>, jota ei oteta huomioon, koska se ei vastaa sivun oikeaa nimeä.",
        "noindex-category-desc": "Tätä sivua eivät hakurobotit indeksoi, koska sivulla on taikasana <code><nowiki>__NOINDEX__</nowiki></code> ja koska sivu on sellaisessa nimiavaruudessa, jossa taikasanan käyttö on sallittua.",
        "index-category-desc": "Tällä sivulla on koodi <code><nowiki>__INDEX__</nowiki></code> ja sivu on sellaisessa nimiavaruudessa, jossa koodin käyttö on sallittua. Tämän vuoksi hakurobotit indeksoivat tämän sivun, vaikka ilman koodia sivua ei indeksoitaisi normaalisti.",
        "post-expand-template-inclusion-category-desc": "Sivun koko on suurempi kuin <code>$wgMaxArticleSize</code>, kun kaikki mallineet on laajennettu. Tämän vuoksi joitakin mallineita ei laajennettu.",
        "rollbacklinkcount": "palauta $1 {{PLURAL:$1|muutos|muutosta}}",
        "rollbacklinkcount-morethan": "palauta yli $1 {{PLURAL:$1|muutos|muutosta}}",
        "rollbackfailed": "Palautus epäonnistui",
+       "rollback-missingparam": "Tarvittavat parametrit puuttuvat pyynnöstä.",
        "cantrollback": "Aiempaan versioon ei voi palauttaa, koska viimeisin kirjoittaja on sivun ainoa tekijä.",
        "alreadyrolled": "Käyttäjän [[User:$2|$2]] ([[User talk:$2|keskustelu]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) tekemiä muutoksia sivuun [[:$1]] ei voida kumota, koska joku toinen käyttäjä on joko muuttanut sivua tai palauttanut muokkauksen.\n\nViimeisimmän muokkauksen on tehnyt käyttäjä [[User:$3|$3]] ([[User talk:$3|keskustelu]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Muokkauksen yhteenveto oli: <em>$1</em>.",
        "revertpage": "Käyttäjän [[Special:Contributions/$2|$2]] ([[User talk:$2|keskustelu]]) muokkaukset kumottiin ja sivu palautettiin viimeisimpään käyttäjän [[User:$1|$1]] tekemään versioon.",
        "revertpage-nouser": "Käyttäjän (käyttäjänimi poistettu) muokkaukset kumottiin ja sivu palautettiin viimeisimpään käyttäjän {{GENDER:$1|[[User:$1|$1]]}} tekemään versioon",
        "rollback-success": "Käyttäjän $1 tekemät muokkaukset kumottiin ja sivu palautettiin käyttäjän $2 versioon.",
+       "rollback-success-notify": "Kumottiin käyttäjän $1 muokkaukset; palautettiin viimeiseen käyttäjän $2 versioon. [$3 Näytä muutokset]",
        "sessionfailure-title": "Istuntovirhe",
        "sessionfailure": "Istuntosi kanssa on ongelma. Muutosta ei toteutettu varotoimena istuntokaappauksien takia. Käytä selaimen paluutoimintoa ja päivitä sivu, jolta tulit, ja yritä uudelleen.",
        "changecontentmodel": "Muuta sivun sisältömallia",
        "sp-contributions-username": "IP-osoite tai käyttäjätunnus:",
        "sp-contributions-toponly": "Näytä vain muokkaukset, jotka ovat viimeisimpiä versioita",
        "sp-contributions-newonly": "Näytä vain muokkaukset, joilla on luotu sivu",
+       "sp-contributions-hideminor": "Piilota pienet muutokset",
        "sp-contributions-submit": "Hae",
        "whatlinkshere": "Tänne viittaavat sivut",
        "whatlinkshere-title": "Sivut, jotka viittaavat sivulle $1",
        "confirm-watch-top": "Lisätäänkö tämä sivu tarkkailulistallesi?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Poistetaanko tämä sivu tarkkailulistaltasi?",
+       "confirm-rollback-button": "OK",
+       "confirm-rollback-top": "Palauta tämän sivun muokkaukset?",
        "percent": "$1&#160;%",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← edellinen sivu",
        "timezone-local": "Paikallinen",
        "duplicate-defaultsort": "'''Varoitus:''' Oletuslajitteluavain ”$2” korvaa aiemman oletuslajitteluavaimen ”$1”.",
        "duplicate-displaytitle": "<strong>Varoitus:</strong> Näytettävä otsikko \"$2\" päällekirjoittaa edellisen otsikon \"$1\".",
+       "restricted-displaytitle": "<strong>Varoitus:</strong> Näytettävää otsikkoa \"$1\" ei huomioitu, koska se ei vastaa sivun oikeaa nimeä.",
        "invalid-indicator-name": "<strong>Virhe:</strong> Sivun tilan osoittimien attribuutti <code>name</code> ei saa olla tyhjä.",
        "version": "Versio",
        "version-extensions": "Asennetut laajennukset",
        "api-error-nomodule": "Sisäinen virhe: tallennusmoduulia ei ole asetettu.",
        "api-error-ok-but-empty": "Sisäinen virhe: palvelimelta ei saatu vastausta.",
        "api-error-overwrite": "Olemassa olevan tiedoston korvaaminen toisella ei ole sallittua.",
+       "api-error-ratelimited": "Yrität tallentaa lyhyessä ajassa enemmän tiedostoja kuin tämä wiki sallii.\nYritä uudelleen muutaman minuutin kuluttua.",
        "api-error-stashfailed": "Sisäinen virhe: Väliaikaisen tiedoston tallentaminen epäonnistui.",
        "api-error-publishfailed": "Sisäinen virhe: Väliaikaisen tiedoston julkaiseminen epäonnistui.",
        "api-error-stasherror": "Tiedostoa ladattaessa tapahtui virhe.",
        "mw-widgets-dateinput-placeholder-month": "VVVV-KK",
        "mw-widgets-titleinput-description-new-page": "sivua ei ole olemassa vielä",
        "mw-widgets-titleinput-description-redirect": "ohjaus kohteeseen $1",
-       "api-error-blacklisted": "Valitse toinen, kuvaava nimi.",
        "sessionmanager-tie": "!!FYZZ!!Cannot combine multiple request authentication types: $1.",
        "sessionprovider-generic": "$1 istuntoa",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "istuntoja, joissa on evästeet käytössä",
        "log-action-filter-suppress-reblock": "Käyttäjätunnuksen häivyttäminen uudella estolla",
        "log-action-filter-upload-upload": "Uusi tallennus",
        "log-action-filter-upload-overwrite": "Päälletallennus",
+       "authmanager-authn-not-in-progress": "Varmennus ei ole käynnissä tai istunnon tiedot ovat hävinneet. Ole hyvä ja aloita uudelleen alusta.",
+       "authmanager-authn-no-primary": "Annettua kirjautumistietoja ei pystytty varmentamaan.",
+       "authmanager-authn-no-local-user": "Annetut kirjautumistiedot eivät kuulu millekään tämän wikin käyttäjistä.",
+       "authmanager-authn-no-local-user-link": "Annetut kirjautumisiedot ovat kelvolliset, mutta eivät liity mihinkään tämän wikin käyttäjään. Kirjaudu sisään toisella tavalla, tai luo uusi käyttäjä ja sinulla on mahdollisuus linkittää aiemmat kirjautumistietosi tälle käyttäjälle.",
+       "authmanager-authn-autocreate-failed": "Paikallisen tunnuksen automaattinen luonti epäonnistui: $1",
+       "authmanager-change-not-supported": "Annettuja kirjautumistietoja ei voida muuttaa, koska mikään ei käyttäisi niitä.",
+       "authmanager-create-disabled": "Tunnusten luonti ei ole käytössä.",
+       "authmanager-create-from-login": "Luodaksesi tunnuksen täytä alla olevat kentät.",
+       "authmanager-create-not-in-progress": "Tunnuksen luonti ei ole käynnissä tai istunnon tiedot ovat hävinneet. Ole hyvä ja aloita uudelleen alusta.",
+       "authmanager-create-no-primary": "Annettuja kirjautumistietoja ei voitu käyttää tunnuksen luontiin.",
+       "authmanager-link-no-primary": "Annettuja kirjautumistietoja ei voitu käyttää tunnuksen linkittämiseen.",
+       "authmanager-link-not-in-progress": "Tunnuksen linkitys ei ole käynnissä tai istunnon tiedot ovat hävinneet. Ole hyvä ja aloita uudelleen alusta.",
+       "authmanager-authplugin-setpass-failed-title": "Salasanan muuttaminen epäonnistui",
+       "authmanager-authplugin-setpass-failed-message": "Varmennuslisäosa esti salasanan muuttamisen.",
+       "authmanager-authplugin-create-fail": "Varmennuslisäosa esti tunnuksen luonnin.",
+       "authmanager-authplugin-setpass-denied": "Varmennuslisäosa ei salli salasanojen muuttamista.",
+       "authmanager-authplugin-setpass-bad-domain": "Virheellinen domain.",
+       "authmanager-autocreate-noperm": "Automaattinen tunnustenluonti ei ole sallittu.",
+       "authmanager-autocreate-exception": "Automaattinen tunnuksenluonti on tilapäisesti poistettu käytöstä aikaisempien virheiden vuoksi.",
+       "authmanager-userdoesnotexist": "Käyttäjätunnusta ”$1” ei ole rekisteröity.",
+       "authmanager-userlogin-remembermypassword-help": "Tulisiko salasana muistaa istunnon kestoa pidempään.",
+       "authmanager-username-help": "Käyttäjänimi varmentamiseen.",
+       "authmanager-password-help": "Salasana varmentamiseen.",
+       "authmanager-retype-help": "Salasana uudelleen vahvistaaksesi.",
+       "authmanager-email-label": "Sähköposti",
+       "authmanager-email-help": "Sähköpostiosoite",
+       "authmanager-realname-label": "Oikea nimi",
+       "authmanager-realname-help": "Käyttäjän oikea nimi",
+       "authmanager-provider-password": "Salasanapohjainen varmennus",
        "authmanager-provider-temporarypassword": "Väliaikainen salasana",
-       "authprovider-resetpass-skip-label": "Ohita"
+       "authprovider-confirmlink-message": "Viimeisimpien kirjautumisyritystesi perusteella seuraavat tunnukset voidaan linkittää wikitunnuksellesi. Tunnusten linkittäminen mahdollistaa sisäänkirjautumisen niitä käyttämällä. Valitse tunnukset, jotka tulisi linkittää.",
+       "authprovider-confirmlink-request-label": "Tunnukset, jotka tulisi yhdistää",
+       "authprovider-confirmlink-success-line": "$1: Linkitetty onnistuneesti.",
+       "authprovider-confirmlink-failed": "Tunnuksen linkitys ei onnistunut täysin: $1",
+       "authprovider-resetpass-skip-label": "Ohita",
+       "authprovider-resetpass-skip-help": "Ohita salasanan palautus.",
+       "authform-nosession-login": "Varmennus onnistui, mutta selaimesi ei pysty \"muistamaan\" sisäänkirjautumista.\n\n$1",
+       "authform-nosession-signup": "Tunnus luotiin, mutta selaimesi ei pysty \"muistamaan\" sisäänkirjautumista.\n\n$1",
+       "specialpage-securitylevel-not-allowed-title": "Ei sallittu",
+       "specialpage-securitylevel-not-allowed": "Valitettavasti sinulla ei ole oikeutta muokata tätä sivua, koska henkilöllisyyttäsi ei voitu varmentaa.",
+       "authpage-cannot-login": "Kirjautumista ei voitu aloittaa.",
+       "authpage-cannot-login-continue": "Kirjautumista ei voitu jatkaa. Istuntosi todennäköisesti aikakatkaistiin.",
+       "authpage-cannot-create": "Tunnuksen luontia ei voitu aloittaa.",
+       "authpage-cannot-create-continue": "Tunnuksen luontia ei voitu jatkaa. Istuntosi todennäköisesti aikakatkaistiin.",
+       "authpage-cannot-link": "Tunnuksen linkittämistä ei voitu aloittaa.",
+       "authpage-cannot-link-continue": "Tunnuksen linkittämistä ei voitu jatkaa. Istuntosi todennäköisesti aikakatkaistiin.",
+       "cannotauth-not-allowed-title": "Pääsy estetty",
+       "cannotauth-not-allowed": "Sinulla ei ole oikeutta käyttää tätä sivua",
+       "changecredentials": "Muuta kirjautumistietoja",
+       "changecredentials-submit": "Muuta kirjautumistietoja",
+       "changecredentials-invalidsubpage": "$1 ei ole kelvollinen kirjautumistietojen tyyppi",
+       "changecredentials-success": "Kirjautumistietosi on muutettu.",
+       "removecredentials": "Poista kirjautumistiedot",
+       "removecredentials-submit": "Poista kirjautumistiedot",
+       "removecredentials-invalidsubpage": "$1 ei ole kelvollinen kirjautumistietojen tyyppi.",
+       "removecredentials-success": "Kirjautumistietosi on poistettu.",
+       "credentialsform-provider": "Kirjautumistietojen tyyppi:",
+       "credentialsform-account": "Tunnuksen nimi:",
+       "cannotlink-no-provider-title": "Linkitettäviä tunnuksia ei ole",
+       "cannotlink-no-provider": "Linkitettäviä tunnuksia ei ole.",
+       "linkaccounts": "Linkitä tunnuksia",
+       "linkaccounts-success-text": "Tunnus linkitettiin.",
+       "linkaccounts-submit": "Linkitä tunnuksia",
+       "unlinkaccounts": "Poista tunnusten linkityksiä",
+       "unlinkaccounts-success": "Tunnuksen linkitys poistettiin.",
+       "authenticationdatachange-ignored": "Varmennustietojen muutosta ei käsitelty. Ehkä palveluntarjoajaa ei määritelty?"
 }
index 0fb313d..3cb4d6f 100644 (file)
        "tog-diffonly": "Ne pas afficher le contenu des pages sous les diffs",
        "tog-showhiddencats": "Afficher les catégories cachées",
        "tog-norollbackdiff": "Ne pas afficher le diff après avoir révoqué",
-       "tog-useeditwarning": "M’avertir quand je quitte une page de modification sans publier les changements",
-       "tog-prefershttps": "Conserver une connexion sécurisée une fois connecté(e)",
+       "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 pour se connecter",
        "underline-always": "Toujours",
        "underline-never": "Jamais",
        "underline-default": "Valeur par défaut du thème ou du navigateur",
        "viewhelppage": "Voir la page d'aide",
        "categorypage": "Voir la page de catégorie",
        "viewtalkpage": "Voir la page de discussion",
-       "otherlanguages": "Dans d'autres langues",
+       "otherlanguages": "Dans dautres langues",
        "redirectedfrom": "(Redirigé depuis $1)",
        "redirectpagesub": "Page de redirection",
        "redirectto": "Rediriger vers :",
        "jumpto": "Aller à :",
        "jumptonavigation": "navigation",
        "jumptosearch": "rechercher",
-       "view-pool-error": "Désolé, les serveurs sont surchargés en ce moment.\nTrop d’utilisateurs cherchent à consulter cette page.\nVeuillez attendre un peu avant de réessayer d’accéder à celle-ci.\n\n$1",
+       "view-pool-error": "Désolé, les serveurs sont surchargés en ce moment.\nTrop d’utilisateurs cherchent à consulter cette page.\nVeuillez attendre un peu avant d’essayer à nouveau d’accéder à celle-ci.\n\n$1",
        "generic-pool-error": "Désolé, les serveurs sont surchargés en ce moment.\nTrop d’utilisateurs cherchent à consulter cette ressource.\nVeuillez attendre un peu avant de tenter à nouveau l’accès à celle-ci.",
        "pool-timeout": "Délai d’attente du verrou dépassé",
        "pool-queuefull": "La file des processus est pleine",
        "currentevents-url": "Project:Actualités",
        "disclaimers": "Avertissements",
        "disclaimerpage": "Project:Avertissements généraux",
-       "edithelp": "Aide",
+       "edithelp": "Aide pour l'édition",
        "helppage-top-gethelp": "Aide",
        "mainpage": "Accueil",
        "mainpage-description": "Accueil",
        "viewdeleted": "Voir $1 ?",
        "restorelink": "{{PLURAL:$1|une modification effacée|$1 modifications effacées}}",
        "feedlinks": "Flux :",
-       "feed-invalid": "Type de flux invalide pour abonnement.",
+       "feed-invalid": "Type de flux d’abonnement non valide.",
        "feed-unavailable": "Les flux de syndication ne sont pas disponibles",
        "site-rss-feed": "Flux RSS de $1",
        "site-atom-feed": "Flux Atom de $1",
        "databaseerror-query": "Requête : $1",
        "databaseerror-function": "Fonction : $1",
        "databaseerror-error": "Erreur : $1",
-       "transaction-duration-limit-exceeded": "Pour éviter une trop forte augmentation du délai de réplication, cette transaction a été annulée car la durée d’écriture ($1) a dépassé la limite de $2 seconde{{PLURAL:$2||s}}. Si vous cherchez à modifier un grand nombre d’éléments simultanément, essayez plutôt d’effectuer l’opération en plusieurs étapes.",
+       "transaction-duration-limit-exceeded": "Pour éviter une trop forte augmentation du délai de réplication, cette transaction a été annulée car la durée d’écriture ($1) a dépassé la limite de $2 seconde{{PLURAL:$2||s}}. Si vous cherchez à modifier un grand nombre d’éléments simultanément, essayez plutôt d’effectuer l’opération en plusieurs étapes plus petites.",
        "laggedslavemode": "Attention, cette page peut ne pas contenir les toutes dernières modifications effectuées",
        "readonly": "Base de données verrouillée",
        "enterlockreason": "Indiquez la raison du verrouillage ainsi qu’une estimation de sa durée",
        "viewyourtext": "Vous pouvez voir et copier le contenu de <strong>vos modifications</strong> à cette page.",
        "protectedinterface": "Cette page fournit du texte d’interface pour le logiciel sur ce wiki et est protégée pour éviter les abus.\nPour ajouter ou modifier des traductions sur tous les wikis, veuillez utiliser [https://translatewiki.net/ translatewiki.net], le projet de localisation de MediaWiki.",
        "editinginterface": "<strong>Attention :</strong> vous êtes en train de modifier une page utilisée pour créer le texte de l’interface du logiciel.\nLes changements sur cette page se répercuteront sur l’apparence de l’interface utilisateur pour les autres utilisateurs de ce wiki.",
-       "translateinterface": "Pour ajouter ou modifier des traductions pour tous les wikis, veuillez utiliser [https://translatewiki.net/ translatewiki.net], le projet de localisation de MediaWiki.",
+       "translateinterface": "Pour ajouter ou modifier des traductions pour tous les wikis, veuillez utiliser [https://translatewiki.net/ translatewiki.net], le projet de localisation linguistique de MediaWiki.",
        "cascadeprotected": "Cette page est protégée contre les modifications car elle est transcluse par {{PLURAL:$1|la page suivante, qui a été protégée|les pages suivantes, qui ont été protégées}} avec l’option « protection en cascade » activée :\n$2",
        "namespaceprotected": "Vous n’avez pas la permission de modifier les pages de l’espace de noms « <strong>$1</strong> ».",
        "customcssprotected": "Vous n’avez pas la permission de modifier cette page de CSS, car elle contient les paramètres personnels d’un autre utilisateur.",
        "mycustomjsprotected": "Vous n’avez pas le droit de modifier cette page JavaScript.",
        "myprivateinfoprotected": "Vous n’avez pas le droit de modifier vos informations personnelles.",
        "mypreferencesprotected": "Vous n’avez pas le droit de modifier vos préférences.",
-       "ns-specialprotected": "Les pages dans l’espace de noms « {{ns:special}} » ne peuvent pas être modifiées.",
+       "ns-specialprotected": "Les pages spéciales ne peuvent pas être modifiés.",
        "titleprotected": "Ce titre a été protégé contre toute création par [[User:$1|$1]].\nLe motif fourni est <em>$2</em>.",
        "filereadonlyerror": "Impossible de modifier le fichier « $1 » parce que le répertoire de fichiers « $2 » est en lecture seule.\n\nL’administrateur système qui l’a verrouillé a fourni ce motif : « $3 ».",
        "invalidtitle-knownnamespace": "Titre non valide avec l’espace de noms « $2 » et l’intitulé « $3 »",
        "nocookiesnew": "Le compte utilisateur a été créé, mais vous n’êtes pas connecté{{GENDER:||e|(e)}}.\n{{SITENAME}} utilise des cookies pour conserver la connexion mais vous les avez désactivés.\nVeuillez les activer et vous reconnecter avec le même nom et le même mot de passe.",
        "nocookieslogin": "{{SITENAME}} utilise des cookies pour conserver la connexion mais vous les avez désactivés.\nVeuillez les activer et vous reconnecter.",
        "nocookiesfornew": "Le compte utilisateur n’a pas été créé, car nous n’avons pas pu identifier son origine.\nVérifiez que vous avez activé les cookies, rechargez la page et essayez à nouveau.",
-       "createacct-loginerror": "Le compte a bien été créé mais vous ne pouvez pas vous connecter automatiquement? Veuillez vous [[Special:UserLogin|connecter manuellement]].",
+       "createacct-loginerror": "Le compte a bien été créé mais vous ne pouvez pas vous connecter automatiquement. Veuillez vous [[Special:UserLogin|connecter manuellement]].",
        "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’utilisateurs 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": "Cet utilisateur est bloqué. Connexion non autorisée.",
        "pt-createaccount": "Créer un compte",
        "pt-userlogout": "Se déconnecter",
        "php-mail-error-unknown": "Erreur inconnue dans la fonction <code>mail()</code> de PHP.",
-       "user-mail-no-addy": "Tenté d'envoyer un courriel sans adresse de courriel",
-       "user-mail-no-body": "Essai d'envoi d'un courriel avec un corps vide ou déraisonnablement court.",
+       "user-mail-no-addy": "Impossible d’envoyer un courriel sans adresse de courriel.",
+       "user-mail-no-body": "Essai d’envoi d’un courriel avec un corps vide ou anormalement court.",
        "changepassword": "Changer de mot de passe",
-       "resetpass_announce": "Pour terminer l'enregistrement, vous devez fournir un nouveau mot de passe.",
+       "resetpass_announce": "Pour terminer votre inscription, vous devez fournir un nouveau mot de passe.",
        "resetpass_text": "<!-- Ajoutez le texte ici -->",
        "resetpass_header": "Changer le mot de passe du compte",
        "oldpassword": "Ancien mot de passe :",
        "changepassword-success": "Votre mot de passe a été modifié !",
        "changepassword-throttled": "Vous avez fait trop de tentatives de connexion récemment.\nVeuillez attendre $1 avant de réessayer.",
        "botpasswords": "Mots de passe de robots",
-       "botpasswords-summary": "<em>Mots de passe de robots</em> permet d’accéder à un compte utilisateur via l’API sans utiliser les identifiants de connexion principaux. Les droits utilisateur disponibles en étant connecté avec un mot de passe robot peuvent être réduits.\n\nSi vous ne voyez pas pourquoi vous voudriez faire cela, c’est que vous n’en avez pas besoin. Personne ne devrait jamais vous demander d’en générer un et de le lui donner.",
+       "botpasswords-summary": "Les <em>mots de passe de robots</em> permettent d’accéder à un compte utilisateur via l’API sans utiliser les identifiants de connexion principaux. Les droits utilisateur disponibles en étant connecté avec un mot de passe robot peuvent être réduits.\n\nSi vous ne voyez pas pourquoi vous voudriez faire cela, c’est que vous n’en avez pas besoin. Personne ne devrait jamais vous demander d’en générer un et de le lui donner.",
        "botpasswords-disabled": "Les mots de passe robots sont désactivés.",
        "botpasswords-no-central-id": "Pour utiliser les mots de passe de robots, vous devez être connecté à un compte centralisé.",
        "botpasswords-existing": "Mots de passe de robots existants",
        "botpasswords-label-delete": "Supprimer",
        "botpasswords-label-resetpassword": "Réinitialiser le mot de passe",
        "botpasswords-label-grants": "Droits applicables :",
-       "botpasswords-help-grants": "Chaque droit donne accès aux droits utilisateurs listés qu’a déjà un compte. Voyez le [[Special:ListGrants|tableau des droits]] pour plus d’information.",
+       "botpasswords-help-grants": "Chaque droit accordé donne accès à la liste des droits utilisateurs dont l’utilisateur dispose déjà. Voyez le [[Special:ListGrants|tableau des droits]] pour plus d’informations.",
        "botpasswords-label-restrictions": "Restrictions d’utilisation :",
        "botpasswords-label-grants-column": "Accordé",
        "botpasswords-bad-appid": "Le nom de robot « $1 » n’est pas valide.",
        "botpasswords-no-provider": "BotPasswordsSessionProvider n’est pas disponible.",
        "botpasswords-restriction-failed": "Les restrictions de mot de passe de robots empêchent cette connexion.",
        "botpasswords-invalid-name": "Le nom d’utilisateur spécifié ne contient pas de séparateur de mot de passe de robots (« $1 »).",
-       "botpasswords-not-exist": "L’utilisateur « $1 » n’a pas de nom de mot de passe de robots appelé « $2 ».",
+       "botpasswords-not-exist": "L’utilisateur « $1 » n’a pas le mot de passe de robots intitulé « $2 ».",
        "resetpass_forbidden": "Les mots de passe ne peuvent pas être changés",
        "resetpass_forbidden-reason": "Les mots de passe ne peuvent pas être modifiés : $1",
-       "resetpass-no-info": "Vous devez être connecté pour avoir accès à cette page.",
+       "resetpass-no-info": "Vous devez être connecté pour avoir accès directement à cette page.",
        "resetpass-submit-loggedin": "Changer de mot de passe",
        "resetpass-submit-cancel": "Annuler",
        "resetpass-wrong-oldpass": "Mot de passe actuel ou temporaire invalide.\nVous avez peut-être déjà changé votre mot de passe ou demandé un nouveau mot de passe temporaire.",
        "passwordreset-text-one": "Remplissez ce formulaire pour réinitialiser votre mot de passe.",
        "passwordreset-text-many": "{{PLURAL:$1|Remplissez un des champs pour recevoir un mot de passe temporaire par courriel.}}",
        "passwordreset-disabled": "La réinitialisation des mots de passe a été désactivée sur ce wiki.",
-       "passwordreset-emaildisabled": "Les fonctionnalités e-mail ont été désactivées sur ce wiki.",
+       "passwordreset-emaildisabled": "Les fonctionnalités de courriel ont été désactivées sur ce wiki.",
        "passwordreset-username": "Nom d'utilisateur :",
        "passwordreset-domain": "Domaine :",
        "passwordreset-capture": "Voir le courriel résultant ?",
-       "passwordreset-capture-help": "Si vous cochez cette case, le courriel (avec le mot de passe temporaire) vous sera affiché en même temps qu'il sera envoyé à l'utilisateur.",
+       "passwordreset-capture-help": "Si vous cochez cette case, le courriel (avec le mot de passe temporaire) vous sera affiché en même temps qu’il sera envoyé à l’utilisateur.",
        "passwordreset-email": "Adresse de courriel :",
        "passwordreset-emailtitle": "Détails du compte sur {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Quelqu'un (probablement vous, depuis l'adresse IP $1) a demandé un réinitialisation de votre mot de passe pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :\n\n$2\n\n{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. Vous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou que vous avez retrouvé votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.",
-       "passwordreset-emailtext-user": "L'utilisateur $1 sur {{SITENAME}} a demandé un réinitialisation de votre mot de passe pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :\n\n$2\n\n{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. Vous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou que vous avez retrouvé votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.",
-       "passwordreset-emailelement": "Nom d'utilisateur : \n$1\n\nMot de passe temporaire : \n$2",
+       "passwordreset-emailtext-ip": "Quelqu’un (probablement vous, depuis l’adresse IP $1) a demandé un réinitialisation de votre mot de passe pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :\n\n$2\n\n{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. Vous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou que vous avez retrouvé votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.",
+       "passwordreset-emailtext-user": "Lutilisateur $1 sur {{SITENAME}} a demandé un réinitialisation de votre mot de passe pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :\n\n$2\n\n{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. Vous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou que vous avez retrouvé votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.",
+       "passwordreset-emailelement": "Nom dutilisateur : \n$1\n\nMot de passe temporaire : \n$2",
        "passwordreset-emailsentemail": "Si cette adresse de courriel est associée à votre compte, alors un courriel de réinitialisation de mot de passe sera envoyé.",
        "passwordreset-emailsentusername": "S’il y a une adresse de courriel associée à ce nom d’utilisateur, alors un courriel de réinitialisation de mot de passe sera envoyé.",
        "passwordreset-emailsent-capture": "Un courriel de réinitialisation de mot de passe a été envoyé, qui est affiché ci-dessous.",
-       "passwordreset-emailerror-capture": "Un courriel de réinitialisation de mot de passe a été généré, qui est affiché ci-dessous, mais l'envoi à l'{{GENDER:$2|utilisateur|utilisatrice}} a échoué : $1",
-       "passwordreset-emailsent-capture2": "The password reset {{PLURAL:$1|Le courriel de réinitialisation du mot de passe a été envoyé|Les courriels de réinitialisation du mot de passe ont été envoyés}}. {{PLURAL:$1|Le nom d’utilisateur et le mot de passe sont affichés|La liste des noms d’utilisateur et mots de passe est affichée}} ci-dessous.",
+       "passwordreset-emailerror-capture": "Un courriel de réinitialisation de mot de passe a été généré, qui est affiché ci-dessous, mais l’envoi à l’{{GENDER:$2|utilisateur|utilisatrice}} a échoué : $1",
+       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Le courriel de réinitialisation du mot de passe a été envoyé|Les courriels de réinitialisation du mot de passe ont été envoyés}}. {{PLURAL:$1|Le nom d’utilisateur et le mot de passe sont affichés|La liste des noms d’utilisateur et mots de passe est affichée}} ci-dessous.",
        "passwordreset-emailerror-capture2": "L’envoi de courriel à {{GENDER:$2|l’utilisateur|l’utilisatrice}} a échoué : $1 {{PLURAL:$3|Le nom d’utilisateur et le mot de passe sont affichés|La liste des noms d’utilisateur et des mots de passe est affichée}} ci-dessous.",
        "passwordreset-nocaller": "Un appelant doit être fourni",
        "passwordreset-nosuchcaller": "L’appelant n’existe pas : $1",
-       "passwordreset-ignored": "La réinitialisation du mot de passe n’a pas été gérée. Peut-être qu'aucun fournisseur n’a été configuré ?",
+       "passwordreset-ignored": "La réinitialisation du mot de passe n’a pas été gérée. Peut-être quaucun fournisseur n’a été configuré ?",
        "passwordreset-invalideamil": "Adresse de messagerie non valide",
-       "passwordreset-nodata": "Ni nom d’utilisateur ni adresse de messagerie n’ont été fournis",
+       "passwordreset-nodata": "Ni un nom d’utilisateur ni une adresse de messagerie n’a  été fourni",
        "changeemail": "Changer ou supprimer l’adresse de courriel",
        "changeemail-header": "Complétez ce formulaire pour modifier votre adresse de courriel. Si vous voulez supprimer l’association d’une adresse de courriel avec votre compte, laissez la nouvelle adresse de courriel vide lors de la soumission du formulaire.",
        "changeemail-passwordrequired": "Vous devrez saisir votre mot de passe pour confirmer cette modification.",
        "italic_tip": "Texte italique",
        "link_sample": "Titre du lien",
        "link_tip": "Lien interne",
-       "extlink_sample": "http://www.example.com titre du lien",
+       "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",
        "minoredit": "Modification mineure",
        "watchthis": "Suivre cette page",
        "savearticle": "Enregistrer",
+       "savechanges": "Enregistrer les modifications",
        "publishpage": "Publier la page",
+       "publishchanges": "Publier les modifications",
        "preview": "Prévisualisation",
        "showpreview": "Prévisualiser",
        "showdiff": "Voir les modifications",
-       "blankarticle": "<strong>Attention :</strong> La page que vous créez est vide.\nSi vous cliquez de nouveau sur « {{int:savearticle}} », la page sera créée sans aucun contenu.",
-       "anoneditwarning": "<strong>Attention :</strong> Vous n’êtes pas connecté. Votre adresse IP sera visible de tout le monde si vous faites des modifications. Si vous <strong>[$1 vous connectez]</strong> ou <strong>[$2 créez un compte]</strong>, vos modifications seront attribuées à votre nom d’utilisateur, entre autres avantages.",
-       "anonpreviewwarning": "''Vous n’êtes pas identifié{{GENDER:||e}}. Sauvegarder enregistrera votre adresse IP dans l’historique des modifications de la page.''",
-       "missingsummary": "'''Rappel :''' vous n'avez pas encore fourni le résumé de votre modification.\nSi vous cliquez de nouveau sur le bouton « {{int:savearticle}} », la publication sera faite sans nouvel avertissement.",
-       "selfredirect": "<strong>Attention :</strong> Vous êtes en train de rediriger la page vers elle-même.\nVous pouvez avoir spécifié la mauvaise cible pour la redirection, ou vous modifiez peut-être la mauvaise page.\nSi vous cliquez de nouveau sur « {{int:savearticle}} », la redirection sera créée tout de même.",
+       "blankarticle": "<strong>Attention :</strong> la page que vous créez est vide.\nSi vous cliquez de nouveau sur « {{int:savearticle}} », la page sera créée sans aucun contenu.",
+       "anoneditwarning": "<strong>Attention :</strong> vous n’êtes pas connecté. Votre adresse IP sera visible de tout le monde si vous faites des modifications. Si vous <strong>[$1 vous connectez]</strong> ou <strong>[$2 créez un compte]</strong>, vos modifications seront attribuées à votre nom d’utilisateur, avec d'autres avantages.",
+       "anonpreviewwarning": "<em>Vous n’êtes pas connecté{{GENDER:||e}}. Sauvegarder enregistrera votre adresse IP dans l’historique des modifications de la page.</em>",
+       "missingsummary": "<strong>Rappel :</strong> vous n’avez pas encore fourni le résumé de votre modification.\nSi vous cliquez de nouveau sur le bouton « {{int:savearticle}} », vos modifications seront sauvegardées sans résumé.",
+       "selfredirect": "<strong>Attention :</strong> vous êtes en train de rediriger la page vers elle-même.\nVous pouvez avoir spécifié la mauvaise cible pour la redirection, ou vous modifiez peut-être la mauvaise page.\nSi vous cliquez de nouveau sur « {{int:savearticle}} », la redirection sera tout de même créée.",
        "missingcommenttext": "Veuillez entrer un commentaire ci-dessous.",
-       "missingcommentheader": "<strong>Rappel :</strong> Vous n’avez pas fourni de sujet pour ce commentaire.\nSi vous cliquez de nouveau sur « {{int:Savearticle}} », votre modification sera enregistrée sans sujet.",
+       "missingcommentheader": "<strong>Rappel :</strong> vous n’avez pas fourni de sujet pour ce commentaire.\nSi vous cliquez de nouveau sur « {{int:Savearticle}} », votre modification sera enregistrée sans sujet.",
        "summary-preview": "Aperçu du résumé :",
        "subject-preview": "Aperçu du sujet :",
        "previewerrortext": "Une erreur s’est produite lors de la tentative de prévisualisation de vos modifications.",
        "whitelistedittext": "Vous devez vous $1 pour avoir la permission de modifier le contenu.",
        "confirmedittext": "Vous devez confirmer votre adresse de courriel avant de modifier les pages.\nVeuillez entrer et valider votre adresse de courriel dans vos [[Special:Preferences|préférences]].",
        "nosuchsectiontitle": "Impossible de trouver la section",
-       "nosuchsectiontext": "Vous avez essayé de modifier une section qui n'existe pas.\nElle a peut-être été déplacée ou supprimée depuis que vous avez lu cette page.",
+       "nosuchsectiontext": "Vous avez essayé de modifier une section qui n’existe pas.\nElle a peut-être été déplacée ou supprimée pendant que vous la consultiez.",
        "loginreqtitle": "Connexion nécessaire",
        "loginreqlink": "connecter",
        "loginreqpagetext": "Vous devez vous $1 pour voir les autres pages.",
        "accmailtitle": "Mot de passe envoyé.",
        "accmailtext": "Un mot de passe généré aléatoirement pour [[User talk:$1|$1]] a été envoyé à $2.\nIl peut être modifié sur la page ''[[Special:ChangePassword|Changement de mot de passe]]'' après connexion.",
        "newarticle": "(Nouveau)",
-       "newarticletext": "Vous avez suivi un lien vers une page qui n’existe pas encore. \nAfin de créer cette page, entrez votre texte dans la boîte ci-après (vous pouvez consulter [$1 la page d’aide] pour plus d’informations). \nSi vous êtes arrivé{{GENDER:||e}} ici par erreur, cliquez sur le bouton '''retour''' de votre navigateur.",
+       "newarticletext": "Vous avez suivi un lien vers une page qui n’existe pas encore. \nAfin de créer cette page, entrez votre texte dans la boîte ci-après (vous pouvez consulter [$1 la page d’aide] pour plus d’informations). \nSi vous êtes arrivé{{GENDER:||e}} ici par erreur, cliquez sur le bouton <strong>Retour</strong> de votre navigateur.",
        "anontalkpagetext": "----\n<em>Vous êtes sur la page de discussion d’un utilisateur anonyme qui n’a pas encore créé de compte ou qui n’en utilise pas</em>.\nPour cette raison, nous devons utiliser son adresse IP pour l’identifier.\nUne adresse IP peut être partagée par plusieurs utilisateurs.\nSi vous êtes un{{GENDER:||e|}} utilisat{{GENDER:|eur|rice|eur}} anonyme et si vous constatez que des commentaires qui ne vous concernent pas vous ont été adressés, vous pouvez [[Special:CreateAccount|créer un compte]] ou [[Special:UserLogin|vous connecter]] afin d’éviter toute confusion future avec d’autres contributeurs anonymes.",
        "noarticletext": "Il n’y a pour l’instant aucun texte sur cette page.\nVous pouvez [[Special:Search/{{PAGENAME}}|lancer une recherche sur ce titre]] dans les autres pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rechercher dans les opérations liées]\nou [{{fullurl:{{FULLPAGENAME}}|action=edit}} créer cette page]</span>.",
-       "noarticletext-nopermission": "Il n'y a pour l'instant aucun texte sur cette page.\nVous pouvez [[Special:Search/{{PAGENAME}}|faire une recherche sur ce titre]] dans les autres pages,\nou <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rechercher dans les journaux associés]</span>.",
-       "missing-revision": "La révision n° $1 de la page intitulée Â« {{FULLPAGENAME}} Â» n'existe pas.\n\nCela survient en général en suivant un lien historique obsolète vers une page qui a été supprimée.\nVous pouvez trouver plus de détails dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].",
-       "userpage-userdoesnotexist": "Le compte utilisateur « <nowiki>$1</nowiki> » n'est pas enregistré. Veuillez vérifier que vous voulez créer cette page.",
+       "noarticletext-nopermission": "Il n'y a pour l'instant aucun texte sur cette page.\nVous pouvez [[Special:Search/{{PAGENAME}}|faire une recherche sur ce titre]] dans les autres pages,\nou <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rechercher dans les journaux associés]</span>, mais vous n'avez pas la permission de créer cette page.",
+       "missing-revision": "La révision nº $1 de la page intitulée Â« {{FULLPAGENAME}} Â» nâ\80\99existe pas.\n\nCela survient en général en suivant un lien historique obsolète vers une page qui a été supprimée.\nVous pouvez trouver plus de détails dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].",
+       "userpage-userdoesnotexist": "Le compte utilisateur « <nowiki>$1</nowiki> » nest 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 indiquée ci-dessous à titre d’information :",
-       "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>.",
-       "usercssyoucanpreview": "'''Astuce :''' utilisez le bouton « {{int:showpreview}} » pour tester votre nouvelle feuille CSS avant de l'enregistrer.",
-       "userjsyoucanpreview": "'''Astuce :''' utilisez le bouton « {{int:showpreview}} » pour tester votre nouvelle feuille JavaScript avant de l'enregistrer.",
-       "usercsspreview": "'''Rappelez-vous que vous n'êtes qu'en train de prévisualiser votre propre feuille CSS.'''\n'''Elle n'a pas encore été enregistrée !'''",
-       "userjspreview": "'''Rappelez-vous que vous êtes en train de visualiser ou de tester votre code JavaScript et qu'il n'a pas encore été enregistré !'''",
-       "sitecsspreview": "'''Souvenez-vous que vous êtes seulement en train de prévisualiser cette feuille de style.'''\n'''Elle n'a pas encore été enregistrée !'''",
-       "sitejspreview": "'''Souvenez-vous que vous êtes seulement en train de prévisualiser ce code JavaScript.'''\n'''Il n'a pas encore été enregistré !'''",
-       "userinvalidcssjstitle": "'''Attention :''' il n'existe pas d'habillage « $1 ». Rappelez-vous que les pages personnelles avec extensions .css et .js utilisent des titres en minuscules, par exemple {{ns:user}}:Foo/vector.css et non {{ns:user}}:Foo/Vector.css.",
+       "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>.",
+       "usercssyoucanpreview": "<strong>Astuce :</strong> utilisez le bouton « {{int:showpreview}} » pour tester votre nouvelle feuille CSS avant de l’enregistrer.",
+       "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>",
+       "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>",
+       "sitejspreview": "<strong>Rappelez-vous que vous ne faites que prévisualiser ce code JavaScript. \nIl n’a pas encore été enregistré !</strong>",
+       "userinvalidcssjstitle": "<strong>Attention :</strong> il n’existe pas d’habillage « $1 ». \nLes pages personnelles avec extensions .css et .js utilisent des titres en minuscules, par exemple {{ns:user}}:Foo/vector.css et non {{ns:user}}:Foo/Vector.css.",
        "updated": "(Mis à jour)",
-       "note": "'''Note :'''",
-       "previewnote": "'''Rappelez-vous que ce n'est qu'une prévisualisation.'''\nVos modifications n'ont pas encore été enregistrées !",
+       "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.",
+       "previewconflict": "Cette prévisualisation montre le texte de la boîte supérieure de modification tel quil 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 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 cookies de ce site.",
-       "token_suffix_mismatch": "'''Votre modification n'a pas été acceptée car votre navigateur a mal codé les caractères de ponctuation dans l'identifiant de modification.'''\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": "'''Certaines parties du formulaire de modification n'ont pas atteint le serveur, vérifiez que vos modifications sont intactes et essayez à nouveau.'''",
+       "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>",
        "editing": "Modification de $1",
        "creating": "Création de $1",
        "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 ayez 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'''Seul''' le texte de la zone supérieure sera sauvegardé si vous cliquez sur « {{int:savearticle}} ».",
+       "explainconflict": "Cette page a été changée après que vous ayez 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 « {{int:savearticle}} ».",
        "yourtext": "Votre texte",
        "storedversion": "La version enregistrée",
-       "nonunicodebrowser": "'''Attention : Votre navigateur ne supporte pas l'Unicode.'''\nUne solution de rechange a été trouvée pour vous permettre de modifier en toute sûreté une page : les caractères non-ASCII apparaîtront dans votre boîte de modification en tant que codes hexadécimaux. Vous devriez utiliser un navigateur plus récent.",
-       "editingold": "'''Attention : vous êtes en train de modifier une ancienne version de cette page.\nSi vous la publiez, toutes les modifications effectuées depuis cette version seront perdues.'''",
+       "nonunicodebrowser": "<strong>Attention : votre navigateur ne supporte pas l’Unicode.</strong>\nUn palliatif est en place vous permettant de modifier les pages en toute sécurité, faisant apparaître les caractères non-ASCII  sous forme hexadécimale dans la boîte de modification.",
+       "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.",
        "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). Si 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. '''N’UTILISEZ PAS DE TRAVAUX SOUS DROIT D’AUTEUR SANS AUTORISATION EXPRESSE !'''",
-       "copyrightwarning2": "Toutes les contributions à {{SITENAME}} peuvent être modifiées ou supprimées par d’autres utilisateurs. Si vous ne désirez pas que vos écrits soient modifiés et distribués à volonté, merci de ne pas les soumettre ici.<br \n/>Vous 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'''N’UTILISEZ PAS DE TRAVAUX SOUS DROIT D’AUTEUR SANS AUTORISATION EXPRESSE !'''",
+       "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": "'''AVERTISSEMENT : cette page est protégée. Seuls les utilisateurs ayant le statut d'administrateur peuvent la modifier.'''<br />\nLa dernière entrée du journal est affichée ci-dessous pour référence :",
-       "semiprotectedpagewarning": "'''Note :''' Cette page a été protégée de telle façon que seuls les contributeurs enregistrés puissent la modifier. La dernière entrée du journal est affichée ci-dessous pour référence :",
+       "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 de telle façon que seuls les contributeurs enregistrés puissent la modifier. \nLa dernière entrée du journal est affichée ci-dessous pour référence :",
        "cascadeprotectedwarning": "'''ATTENTION :''' Cette page a été protégée de manière à ce que seuls les administrateurs puissent la modifier car elle est transcluse dans {{PLURAL:$1|la page protégée suivante, qui a|les pages protégées suivantes, qui ont}} la « protection en cascade » activée :",
-       "titleprotectedwarning": "'''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.''' La dernière entrée du journal est affichée ci-dessous pour référence :",
+       "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 :",
        "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.",
        "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.",
+       "sectioneditnotsupported-text": "La modification d’une section n’est pas prise en charge pour cette page.",
        "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}} :",
        "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": "'''Attention : vous êtes en train de recréer une page qui a été précédemment supprimée.'''\n\nAssurez-vous qu'il est pertinent de poursuivre les modifications sur cette page. Le journal des suppressions et des déplacements est affiché ci-dessous :",
-       "moveddeleted-notice": "Cette page a été supprimée. Le journal des suppressions et des déplacements est affiché 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 et des renommages pour la page sont fournis ci-dessous à titre d’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. \nLe journal des suppressions et des déplacements pour cette page est affiché ci-dessous à titre d'information :",
+       "moveddeleted-notice": "Cette page a été supprimée. \nLe journal des suppressions et des déplacements de la page est affiché 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 et des renommages pour la page sont fournis ci-dessous pour référence.",
        "log-fulllog": "Voir le journal complet",
-       "edit-hook-aborted": "Échec de la modification par une extension.\nCause inconnue",
-       "edit-gone-missing": "N'a pas pu mettre à jour la page.\nIl semble qu'elle ait été supprimée.",
+       "edit-hook-aborted": "Échec de la modification par une extension.\nAucune explication n’a été retournée.",
+       "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é fait au texte.",
+       "edit-no-change": "Votre modification a été ignorée car aucun changement na été fait au texte.",
        "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.",
-       "edit-already-exists": "La nouvelle page n'a pas pu être créée.\nElle existe déjà.",
+       "edit-already-exists": "La nouvelle page na pas pu être créée.\nElle existe déjà.",
        "defaultmessagetext": "Message par défaut",
        "content-failed-to-parse": "Échec de l’analyse syntaxique du contenu de $2 pour le modèle $1 : $3",
        "invalid-content-data": "Données du contenu non valides",
        "content-model-css": "CSS",
        "content-json-empty-object": "Objet vide",
        "content-json-empty-array": "Tableau vide",
+       "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 obsolè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": "Attention : 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-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 de fonctions de l'analyseur syntaxique",
-       "post-expand-template-inclusion-warning": "Attention : Cette page contient trop d'inclusions de modèles. Certaines inclusions ne seront pas effectuées.",
+       "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": "Attention : Cette page contient au moins un paramètre de modèle dont l'inclusion est rendue impossible. Après extension, celui-ci aurait produit un résultat trop long, il n'a 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]]",
        "parser-template-recursion-depth-warning": "Limite de profondeur des appels 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 où nombre de nœuds est dépassé",
-       "node-count-exceeded-category-desc": "Cette page dépasse le nombre maximal de nœuds.",
-       "node-count-exceeded-warning": "Page dépassant le nombre de nœuds",
-       "expansion-depth-exceeded-category": "Pages où la profondeur d'expansion est dépassée",
+       "node-count-exceeded-category": "Pages dépassant le nombre de nœuds maximal",
+       "node-count-exceeded-category-desc": "Ces pages dépassent le nombre maximal de nœuds.",
+       "node-count-exceeded-warning": "La page dépasse 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",
+       "expansion-depth-exceeded-warning": "Page dépassant la profondeur d’expansion maximale",
        "parser-unstrip-loop-warning": "Boucle non démontable détectée",
        "parser-unstrip-recursion-limit": "Limite de récursion non démontable dépassée ($1)",
        "converter-manual-rule-error": "Erreur détectée dans la règle manuelle de conversion de langue",
        "cantcreateaccount-text": "La création de compte depuis cette adresse IP (<b>$1</b>) a été bloquée par [[User:$3|$3]].\n\nLa raison donnée était ''$2''.",
        "cantcreateaccount-range-text": "La création de compte depuis les adresses IP dans la plage <strong>$1</strong>, qui comprend votre adresse IP (<strong>$4</strong>), ont été bloquées 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 pour cette page.",
+       "nohistory": "Il n’existe pas d’historique des modifications pour cette page.",
        "currentrev": "Version actuelle",
-       "currentrev-asof": "Version actuelle en date du $1",
+       "currentrev-asof": "Version actuelle datée du $1",
        "revisionasof": "Version du $1",
-       "revision-info": "Révision de $1 par {{GENDER:$6|$2}}$7",
+       "revision-info": "Révision datée du $1 par {{GENDER:$6|$2}}$7",
        "previousrevision": "← Version précédente",
        "nextrevision": "Version suivante →",
        "currentrevisionlink": "Voir la version actuelle",
        "cur": "actu",
        "next": "suivant",
-       "last": "diff",
+       "last": "précédent",
        "page_first": "première",
        "page_last": "dernière",
-       "histlegend": "Légende : ({{int:cur}}) = différence avec la version actuelle, ({{int:last}}) = différence avec la version précédente, <b>{{int:minoreditletter}}</b> = modification mineure",
+       "histlegend": "Diff de sélection: cochez les boîtes radio des révisions à 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 révision, <strong>({{int:last}})</strong> = différence avec la précédente révision, <strong>{{int:minoreditletter}}</strong> = modification mineure.",
        "history-fieldset-title": "Naviguer dans l’historique",
-       "history-show-deleted": "Masqués seulement",
+       "history-show-deleted": "Supprimés seulement",
        "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 pour cette page sur le wiki",
+       "history-feed-description": "Historique des versions 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 des pages en rapport.",
+       "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-edit-tags": "Modifier les balises des révisions sélectionnées",
        "rev-deleted-comment": "(résumé de modification retiré)",
        "rev-deleted-user": "(nom d'utilisateur retiré)",
-       "rev-deleted-event": "(détails de l’entrée retirée)",
-       "rev-deleted-user-contribs": "[nom d'utilisateur ou adresse IP retiré - modification masquée sur les contributions]",
-       "rev-deleted-text-permission": "Cette version de la page a été '''effacée'''.\nDes détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].",
+       "rev-deleted-event": "(détails de l’historique retirés)",
+       "rev-deleted-user-contribs": "[nom d’utilisateur ou adresse IP retiré – modification masquée dans les contributions]",
+       "rev-deleted-text-permission": "Cette version de la page a été <strong>effacée</strong>.\nDes détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].",
        "rev-suppressed-text-permission": "Cette version de la page a été <strong>masquée</strong>.\nLes détails se trouvent dans le [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} journal des masquages].",
        "rev-deleted-text-unhide": "Cette version de la page a été <strong>supprimée</strong>.\nDes détails sont disponibles dans [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} le journal des suppressions].\nVous pouvez toujours [$1 voir cette version] si vous le voulez.",
        "rev-suppressed-text-unhide": "Cette version de la page a été <strong>masquée</strong>.\nDes détails sont disponibles dans [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} le journal des masquages].\nVous pouvez toujours [$1 voir cette version] si vous le voulez.",
        "logdelete-text": "Les évènements du journal supprimés 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 '''que''' dans les cas suivants :\n* Informations potentiellement diffamatoires\n* Informations personnelles inappropriées\n*: ''adresse, numéro de téléphone, numéro de sécurité sociale, …''",
-       "revdelete-legend": "Mettre en place des restrictions de visibilité :",
+       "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",
        "rightslogtext": "Voici l’historique des modifications des droits des utilisateurs.",
        "action-read": "lire cette page",
        "action-edit": "modifier cette page",
-       "action-createpage": "créer des pages",
-       "action-createtalk": "créer des pages de discussion",
+       "action-createpage": "créer cette page",
+       "action-createtalk": "créer cette page de discussion",
        "action-createaccount": "créer ce compte utilisateur",
        "action-autocreateaccount": "créer automatiquement ce compte utilisateur externe",
        "action-history": "afficher l’historique de cette page",
        "enhancedrc-history": "historique",
        "recentchanges": "Modifications récentes",
        "recentchanges-legend": "Options des modifications récentes",
-       "recentchanges-summary": "Piste les changements les plus récents du wiki sur cette page.",
+       "recentchanges-summary": "Suivez les changements les plus récents du wiki sur cette page.",
        "recentchanges-noresult": "Aucune modification correspondant à ces critères sur la période indiquée.",
-       "recentchanges-feed-description": "Suivre les dernières modifications de ce wiki dans un flux.",
+       "recentchanges-feed-description": "Suivez les dernières modifications du wiki dans ce flux.",
        "recentchanges-label-newpage": "Cette modification a créé une nouvelle page",
        "recentchanges-label-minor": "Cette modification est mineure.",
        "recentchanges-label-bot": "Cette modification a été effectuée par un robot.",
        "upload-http-error": "Une erreur HTTP est survenue : $1",
        "upload-copy-upload-invalid-domain": "La copie des téléversements n’est pas disponible depuis ce domaine.",
        "upload-foreign-cant-upload": "Ce wiki n’est pas configuré pour télécharger des fichiers vers le dépôt de fichiers externe demandé.",
+       "upload-foreign-cant-load-config": "Échec au chargement de la configuration du téléversement des fichiers vers le référentiel de fichiers étrangers.",
+       "upload-dialog-disabled": "Les téléversements de fichier utilisant cette boîte de dialogue sont désactivés sur ce wiki.",
        "upload-dialog-title": "Téléverser un fichier",
        "upload-dialog-button-cancel": "Annuler",
        "upload-dialog-button-done": "Terminé",
        "sp-contributions-username": "Adresse IP ou nom d'utilisateur :",
        "sp-contributions-toponly": "Ne montrer que les contributions qui sont les dernières des articles",
        "sp-contributions-newonly": "Afficher uniquement les modifications qui sont des créations de page",
+       "sp-contributions-hideminor": "Masquer les modifications mineures",
        "sp-contributions-submit": "Rechercher",
        "whatlinkshere": "Pages liées",
        "whatlinkshere-title": "Pages qui pointent vers « $1 »",
        "lockedbyandtime": "(par $1 le $2 à $3)",
        "move-page": "Renommer $1",
        "move-page-legend": "Renommer une page",
-       "movepagetext": "Utilisez le formulaire ci-dessous pour renommer une page, en déplaçant tout son historique vers le nouveau nom. L’ancien titre deviendra une page de redirection vers le nouveau titre. Vous pouvez mettre à jour automatiquement les redirections actuelles qui pointent vers le titre original. Si vous choisissez de ne pas le faire, assurez-vous de vérifier toute [[Special:DoubleRedirects|double redirection]] ou [[Special:BrokenRedirects|redirection cassée]]. Vous avez la responsabilité de vous assurer que les liens continuent de pointer vers leur destination supposée.\n\nNotez que la page ne sera <string>pas</strong> renommée s’il existe déjà une page avec le nouveau titre, sauf si cette dernière est une simple redirection avec un historique de modifications vierge. Ceci permet de renommer une page vers sa position d’origine si le déplacement s’avère erroné.\n\n<strong>Attention !</strong>\nCeci peut provoquer un changement radical et imprévu pour une page souvent consultée ; assurez-vous d’en avoir compris les conséquences avant de continuer.",
+       "movepagetext": "Utilisez le formulaire ci-dessous pour renommer une page, en déplaçant tout son historique vers le nouveau nom. L’ancien titre deviendra une page de redirection vers le nouveau titre. \nVous pouvez mettre à jour automatiquement les redirections qui pointent vers le titre original. \nSi vous choisissez de ne pas le faire, assurez-vous de vérifier toute [[Special:DoubleRedirects|double redirection]] ou [[Special:BrokenRedirects|redirection cassée]]. Vous avez la responsabilité de vous assurer que les liens continuent de pointer vers leur destination supposée.\n\nNotez que la page ne sera <strong>pas</strong> renommée s’il existe déjà une page portant le nouveau titre, sauf si cette dernière est une simple redirection avec un historique de modifications vierge. \nCela signifie que vous pouvez de nouveau renommer une page vers sa position d’origine si vous avez fait une erreur et que vous ne pouvez pas écraser une page existante.\n\n<strong>Attention !</strong>\nCeci peut provoquer un changement radical et imprévu pour une page souvent consultée ; assurez-vous d’avoir compris les conséquences de votre démarche avant de continuer.",
        "movepagetext-noredirectfixer": "Utilisez le formulaire ci-dessous pour renommer une page, en déplaçant tout son historique vers le nouveau nom.\nL’ancien titre deviendra une page de redirection vers le nouveau titre.\nVérifiez bien les [[Special:DoubleRedirects|doubles redirections]] ou les [[Special:BrokenRedirects|redirections cassées]].\nVous avez la responsabilité de vous assurer que les liens continuent de pointer vers leur destination supposée.\n\nNotez que la page ne sera <strong>pas</strong> déplacée s’il existe déjà une page avec le nouveau titre, sauf si cette dernière a un historique de modifications vierge et est soit vide, soit une simple redirection. Ceci permet de renommer une page vers sa position d’origine si le déplacement s’avère erroné, et il est impossible d’écraser une page existante.\n\n<strong>Attention !</strong>\nCeci peut provoquer un changement radical et imprévu pour une page souvent consultée ; assurez-vous d’en avoir compris les conséquences avant de continuer.",
        "movepagetalktext": "Si vous cochez cette case, la page de discussion associée sera automatiquement renommée, à moins qu’une page de discussion non vide existe déjà sous ce nouveau nom.\n\nDans ce cas, vous devrez renommer ou fusionner cette page de discussion manuellement si vous le désirez.",
        "moveuserpage-warning": "'''Attention :''' Vous êtes sur le point de renommer une page d’utilisateur. Veuillez noter que seule la page sera renommée et que l’utilisateur '''ne''' sera '''pas''' renommé.",
        "allmessagesname": "Nom du message",
        "allmessagesdefault": "Message par défaut",
        "allmessagescurrent": "Message actuel",
-       "allmessagestext": "Ceci est la liste des messages disponibles dans l’espace MediaWiki.\nVeuillez visiter la [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Localisation de MediaWiki] et [https://translatewiki.net/ translatewiki.net] si vous désirez contribuer à la localisation générique de MediaWiki.",
+       "allmessagestext": "Ceci est la liste des messages système disponibles dans l’espace de noms MediaWiki.\nVeuillez visiter la [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Régionalisation de MediaWiki] et [https://translatewiki.net/ translatewiki.net] si vous désirez contribuer à la régionalisation générique de MediaWiki.",
        "allmessagesnotsupportedDB": "Cette page '''{{ns:special}}:Allmessages''' n'est pas utilisable car '''$wgUseDatabaseMessages''' a été désactivé.",
        "allmessages-filter-legend": "Filtrer",
        "allmessages-filter": "Filtrer par état de modification :",
        "invalidateemail": "Annuler la confirmation de l'adresse de courriel",
        "notificationemail_subject_changed": "L’adresse courriel enregistrée sur {{SITENAME}} a été changée",
        "notificationemail_subject_removed": "L’adresse courriel enregistrée sur {{SITENAME}} a été supprimée",
-       "notificationemail_body_changed": "Quelqu’un, probablement vous, connecté depuis l’adresse IP $1, a changé l’adresse courriel\nassociée au compte « $2 » sur {{SITENAME}} en « $3 ».\n\nSi ce n’était pas vous, contactez un administrateur du site immédiatement.",
-       "notificationemail_body_removed": "Quelqu’un, probablement vous, connecté depuis l’adresse IP $1,\na suprrimé l’adresse courriel associée au compte « $2 » sur {{SITENAME}}.\n\nSi ce n’était pas vous, contactez un administrateur du site immédiatement.",
+       "notificationemail_body_changed": "Quelqu’un, probablement vous, connecté depuis l’adresse IP $1, a changé l’adresse\ncourriel associée au compte « $2 » sur {{SITENAME}} en « $3 ».\n\nSi ce n’était pas vous, contactez un administrateur du site immédiatement.",
+       "notificationemail_body_removed": "Quelqu’un, probablement vous, connecté depuis l’adresse IP $1,\na supprimé l’adresse courriel associée au compte « $2 » sur {{SITENAME}}.\n\nSi ce n’était pas vous, contactez un administrateur du site immédiatement.",
        "scarytranscludedisabled": "[La transclusion interwiki est désactivée]",
        "scarytranscludefailed": "[La récupération de modèle a échoué pour $1]",
        "scarytranscludefailed-httpstatus": "[Échec de la récupération du modèle pour  $1 : HTTP  $2 ]",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "la page n’existe pas encore",
        "mw-widgets-titleinput-description-redirect": "redirection vers $1",
-       "api-error-blacklisted": "Merci de choisir un autre titre descriptif.",
        "sessionmanager-tie": "Impossible de combiner les demandes multiples de types d’authentification : $1.",
        "sessionprovider-generic": "sessions $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sessions basées sur les cookies",
        "log-action-filter-newusers": "Type de création de compte :",
        "log-action-filter-patrol": "Type de patrouille :",
        "log-action-filter-protect": "Type de protection :",
-       "log-action-filter-rights": "Type de changement de droit",
-       "log-action-filter-suppress": "Type de suppression",
+       "log-action-filter-rights": "Type de changement de droit :",
+       "log-action-filter-suppress": "Type de suppression :",
        "log-action-filter-upload": "Type de téléversement :",
        "log-action-filter-all": "Tout",
        "log-action-filter-block-block": "Blocage",
        "linkaccounts-success-text": "Le compte a été lié.",
        "linkaccounts-submit": "Lier les comptes",
        "unlinkaccounts": "Dissocier les comptes",
-       "unlinkaccounts-success": "Le compte a été dissocié."
+       "unlinkaccounts-success": "Le compte a été dissocié.",
+       "authenticationdatachange-ignored": "Les modifications de données d’authentification n’ont pas été gérées. Peut-être aucun fournisseur n’a-t-il été configuré ?"
 }
index a7feed5..d3828ca 100644 (file)
        "removewatch": "Enlevar de la lista de gouârda",
        "removedwatchtext": "« [[:$1]] » et sa pâge de discussion sont étâyes enlevâyes de voutra [[Special:Watchlist|lista de gouârda]].",
        "removedwatchtext-short": "La pâge « $1 » est étâye enlevâye de voutra lista de gouârda.",
-       "watch": "Siuvre",
+       "watch": "Gouardar",
        "watchthispage": "Siuvre cela pâge",
        "unwatch": "Pas més siuvre",
        "unwatchthispage": "Pas més siuvre",
        "htmlform-selectorother-other": "Ôtro",
        "sqlite-has-fts": "$1 avouéc rechèrche en tèxto complèt recognua",
        "sqlite-no-fts": "$1 sen rechèrche en tèxto complèt recognua",
-       "logentry-delete-delete": "$1 at suprimâ la pâge $3",
+       "logentry-delete-delete": "$1 {{GENDER:$2|at suprimâ}} la pâge $3",
        "logentry-delete-restore": "$1 at refêt la pâge $3",
        "logentry-delete-event": "$1 at changiê la visibilitât {{PLURAL:$5|d’un èvènement|de $5 èvènements}} du jornal dessus $3 : $4",
        "logentry-delete-revision": "$1 at changiê la visibilitât {{PLURAL:$5|d’una vèrsion|de $5 vèrsions}} sur la pâge $3 : $4",
        "revdelete-uname-unhid": "nom d’usanciér pas més cachiê",
        "revdelete-restricted": "at aplicâ les rèstriccions ux administrators",
        "revdelete-unrestricted": "rèstriccions enlevâs por los administrators",
-       "logentry-move-move": "$1 at dèplaciê la pâge $3 vers $4",
+       "logentry-move-move": "$1 {{GENDER:$2|at dèplaciê}} la pâge $3 vers $4",
        "logentry-move-move-noredirect": "$1 at dèplaciê la pâge $3 vers $4 sen lèssiér una redirèccion",
        "logentry-move-move_redir": "$1 at dèplaciê la pâge $3 vers $4 en ècrasent sa redirèccion",
        "logentry-move-move_redir-noredirect": "$1 at dèplaciê la pâge $3 vers $4 en ècrasent sa redirèccion sen lèssiér una redirèccion",
        "logentry-rights-rights": "$1 at changiê l’apartegnence a la tropa por « $3 » de $4 a $5",
        "logentry-rights-rights-legacy": "$1 at changiê l’apartegnence a la tropa por « $3 »",
        "logentry-rights-autopromote": "$1 est étâ nomâ ôtomaticament de $4 a $5",
+       "logentry-upload-upload": "$1 {{GENDER:$2|at tèlèchargiê}} $3",
        "rightsnone": "(nion)",
        "revdelete-summary": "rèsumâ du changement",
        "feedback-adding": "Aponsa de voutros avis a la pâge...",
        "special-characters-title-minus": "segno muens",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-JJ",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
-       "api-error-blacklisted": "Volyéd chouèsir un ôtro titro dèscriptif.",
        "randomrootpage": "Pâge racena a l’hasârd"
 }
index 87835e9..e6cbbcb 100644 (file)
        "move-page-legend": "Ad diişmäklii",
        "movepagetext": "Aşaadaki formayı kullanılarak var nicä sayfanın adın diiştirin, onnan bilä hepsi diiştirmää jurnalı eni ada aktarılacêk.\nEski ad eni ada yönnendirmäk olacêk.\nEski başlaa baalantılar  [[Special:DoubleRedirects|diişmeycek]] çift yaki yannış  [[Special:BrokenRedirects|yönnendirmäkleri]].\nLäazım inanmaa ani baalantılar genä dä gösterer orayı nerä läazım göstersin.\n\nHerliim ilerdän eni adda sayfa vardı, ad diişmää '''yapılmaycêk'''.\nBu o maana verer ani eer yannış olarak adını diiştirdiniz siz var nicä döndürün sayfayı eski adına.\n\n'''BAK!'''\nBu ad diişmää var nicä duursun masştablı hem beklenmeyän rezultatlar ''populyar'' sayfalar için ;\nonuştan devam etmedän ileri läazım inanmaa ani annêêrsiniz hepsi olacêk rezultatları.",
        "movepagetalktext": "Birleştirilmiş konuşmaa sayfasın, herliim varsa,\navtomatik adı diiştirilecek, '''o haller dışında, ne zaman:'''\n\n*Eni adda konuşmaa sayfası taa varsa,\n*Alttaki kutucuu seçmedinizsä .\n\nBu hallerdä läazım kendiniz ellän sayfaları aktarmaa yaki birleştirmää.",
-       "movearticle": "Eski ad",
        "newtitle": "Eni ad",
        "move-watch": "Bak bu sayfaya",
        "movepagebtn": "Adı diiştir",
index b9645d1..ddc6770 100644 (file)
        "mailerror": "Mearachd a' cur post: $1",
        "acct_creation_throttle_hit": "Chruthaich na h-aoighean air an uicidh seo {{PLURAL:$1|$1 chunntas|$1 chunntas|$1 cunntasan|$1 cunntas}} fon IP agad an-dè agus sin an àireamh as motha a tha ceadaichte. Chan urrainn do dh'aoighean eile on IP seo barrachd chunntasan a chruthachadh air sgàth sin.",
        "emailauthenticated": "Chaidh an seòladh puist-d agad a dhearbhadh $2 aig $3.",
-       "emailnotauthenticated": "Cha deach am post-d agad a dhearbhadh fhathast.\nCha dèid post-d a chur airson gin dhe na feartan a leanas.",
-       "noemailprefs": "Sònraich post-d sna roghainnean agad gus na feartan seo a chur an comas.",
+       "emailnotauthenticated": "Cha deach am post-d agad a dhearbhadh fhathast.\nCha dèid post-d a chur airson gin dhe na gleusan a leanas.",
+       "noemailprefs": "Sònraich post-d sna roghainnean agad gus na gleusan seo a chur an comas.",
        "emailconfirmlink": "Dearbhaich an seòladh puist-dhealain agad",
        "invalidemailaddress": "Chan urrainn dhuinn gabhail ris an t-seòladh seo a chionn 's gu bheil coltas cearr air.\nCuir a-steach seòladh san fhòrmat cheart no falamhaich an raon sin.",
        "cannotchangeemail": "Cha ghabh na puist-d a tha co-cheangailte ri cunntas atharrachadh air an uicipeid seo.",
        "pt-login-button": "Log a-steach",
        "pt-createaccount": "Cruthaich cunntas",
        "pt-userlogout": "Log a-mach",
-       "php-mail-error-unknown": "Mearachd neo-aithichte san fheart mail() aig PHP.",
+       "php-mail-error-unknown": "Mearachd nach aithne dhuinn sa ghleus mail() aig PHP.",
        "user-mail-no-addy": "Cha do ghabh am post-d a chur leis nach robh seòladh puist-d ann.",
        "user-mail-no-body": "Bha bodhaig na teachdaireachd bàn no air leth goirid.",
        "changepassword": "Atharraich facal-faire",
        "summary-preview": "Ro-shealladh a' ghearr-chunntais:",
        "subject-preview": "Ro-shealladh a’ chuspair:",
        "blockedtitle": "Tha an cleachdair air a bhacadh",
-       "blockedtext": "<strong>Chaidh an t-ainm-cleachdaiche no an seòladh IP agad a bhacadh.</strong>\n\n'S e $1 a chur am bacadh seo ort.\n{{GENDER:$1|Thug e|Thug i|Thugadh}} an cèill gun do {{GENDER:$1|rinn e|rinn i|rinneadh}} sin air sgàth an adhbhair seo: <em>$2</em>.\n\n* Toiseach a' bhacaidh: $8\n* Deireadh a' bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n'S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.\nChan urrainn dhut am feart \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n'S e $3 an seòladh IP làithreach agus agus 's e #$5 ID a' bhacaidh.\nThoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
-       "autoblockedtext": "Chaidh an seòladh IP agad a bhacadh gu fèin-obrachail a chionn 's gun deach a chleachdadh le cuideigin eile a chaidh a bhacadh le $1.\n{{GENDER:$1|Thug e|Thug i|Thugadh}} an cèill gun do {{GENDER:$1|rinn e|rinn i|rinneadh}} sin air sgàth an adhbhair seo: \n\n:<em>$2</em>.\n\n* Toiseach a' bhacaidh: $8\n* Deireadh a' bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n'S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.\n\nDh'fhaoidte nach urrainn dhut am feart \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n\n'S e $3 an seòladh IP làithreach agus agus 's e #$5 ID a' bhacaidh.\nThoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
+       "blockedtext": "<strong>Chaidh an t-ainm-cleachdaiche no an seòladh IP agad a bhacadh.</strong>\n\n'S e $1 a chur am bacadh seo ort.\n{{GENDER:$1|Thug e|Thug i|Thugadh}} an cèill gun do {{GENDER:$1|rinn e|rinn i|rinneadh}} sin air sgàth an adhbhair seo: <em>$2</em>.\n\n* Toiseach a' bhacaidh: $8\n* Deireadh a' bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n'S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.\nChan urrainn dhut an gleus \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n'S e $3 an seòladh IP làithreach agus agus 's e #$5 ID a' bhacaidh.\nThoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
+       "autoblockedtext": "Chaidh an seòladh IP agad a bhacadh gu fèin-obrachail a chionn 's gun deach a chleachdadh le cuideigin eile a chaidh a bhacadh le $1.\n{{GENDER:$1|Thug e|Thug i|Thugadh}} an cèill gun do {{GENDER:$1|rinn e|rinn i|rinneadh}} sin air sgàth an adhbhair seo: \n\n:<em>$2</em>.\n\n* Toiseach a' bhacaidh: $8\n* Deireadh a' bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n'S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.\n\nDh'fhaoidte nach urrainn dhut an gleus \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n\n'S e $3 an seòladh IP làithreach agus agus 's e #$5 ID a' bhacaidh.\nThoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
        "blockednoreason": "cha deach adhbhar a shònrachadh",
        "whitelistedittext": "Feumaidh tu $1 mus urrainn dhut duilleagan a dheasachadh.",
        "confirmedittext": "Feumaidh tu am post-d agad a dhearbhadh mus urrainn dhut duilleagan a dheasachadh.\nSuidhich is dearbhaich am post-d agad ann an [[Special:Preferences|roghainnean a' chleachdaiche]]",
        "prefs-skin": "Bian",
        "skin-preview": "Ro-shealladh",
        "datedefault": "Gun roghainnean",
-       "prefs-labs": "Feartan nan deuchainn-lannan",
+       "prefs-labs": "Gleusan nan deuchainn-lannan",
        "prefs-user-pages": "Duilleagan a' chleachdaiche",
        "prefs-personal": "Pròifil",
        "prefs-rc": "Mùthaidhean ùra",
        "zip-file-open-error": "Thachair mearachd le fosgladh an fhaidhle airson dearbhadh ZIP.",
        "zip-wrong-format": "Chan eil am faidhle sònraichte 'na fhaidhle ZIP.",
        "zip-bad": "Tha am faidhle ZIP coirbte no cha ghabh a leughadh air adhbhar eile air choireigin.\nChan urrainn dhuinn dearbhadh mar bu chòir a bheil e tèarainte gus nach eil.",
-       "zip-unsupported": "Tha am faidhle ZIP seo a' chleachdadh feartan ZIP ris nach cuir MediaWiki taic.\nChan urrainn dhuinn dearbhadh mar bu chòir a bheil e tèarainte gus nach eil.",
+       "zip-unsupported": "Tha am faidhle ZIP seo a' chleachdadh gleusan ZIP ris nach cuir MediaWiki taic.\nChan urrainn dhuinn dearbhadh mar bu chòir a bheil e tèarainte gus nach eil.",
        "uploadstash": "Tasgadan an luchdaidh suas",
        "uploadstash-summary": "Bheir an duilleag seo inntrigeadh dhut a dh'fhaidhlichean a chaidh a luchdadh suas no a tha 'gan luchdadh suas ach nach deach fhoillseachadh air an uicidh fhathast. Chan fhaic duine na faidhlichean seo ach an cleachdaiche a rinn an luchdadh suas.",
        "uploadstash-clear": "Glan na faidhlichean ann an tasgadan an luchdaidh suas",
        "emailccsubject": "Lethbhreac dhen teachdaireachd agad gu $1: $2",
        "emailsent": "Post-d air a chur",
        "emailsenttext": "Chaidh an teachdaireachd puist-d agad a chur.",
-       "emailuserfooter": "Chaidh am post-d seo a chur o $1 gu $2 leis an fheart \"{{int:emailuser}}\" air {{SITENAME}}.",
+       "emailuserfooter": "Chaidh am post-d seo a chur o $1 gu $2 leis a' ghleus \"{{int:emailuser}}\" air {{SITENAME}}.",
        "usermessage-summary": "A' fàgail teachdaireachd an t-siostaim.",
        "usermessage-editor": "Teachdaire an t-siostaim",
        "usermessage-template": "MediaWiki:UserMessage",
        "dellogpage": "Loga an sguabaidh às",
        "dellogpagetext": "Seo liosta dhe na chaidh a sguabadh às o chionn goirid.",
        "deletionlog": "loga an sguabaidh às",
-       "reverted": "Air aiseag gu mùthadh nas sine",
+       "reverted": "Air tilleadh gu mùthadh roimhe",
        "deletecomment": "Adhbhar:",
        "deleteotherreason": "Adhbhar eile/a bharrachd:",
        "deletereasonotherlist": "Adhbhar eile",
        "revertpage": "Deasachaidhean a chaidh a thilleadh leis [[Special:Contributions/$2|$2]] ([[User talk:$2|an deasbaireachd]]) dhan mhùthadh mu dheireadh le [[User:$1|$1]]",
        "revertpage-nouser": "Deasachaidhean a chaidh a thilleadh le cleachdaiche falaichte dhan mhùthadh mu dheireadh le [[User:$1|$1]]",
        "rollback-success": "Na deasachaidhean a chaidh a thilleadh le $1;\nchaidh an tilleadh gun mhùthadh mu dheireadh le $2.",
+       "rollback-success-notify": "Na deasachaidhean a chaidh a thilleadh le $1;\nchaidh an tilleadh gun mhùthadh mu dheireadh le $2. [$3 Seall na h-atharraichean]",
        "sessionfailure-title": "Trioblaid leis an t-seisean",
        "sessionfailure": "Tha duilgheadas ann leis an seisean logaidh a-steach agad a-rèir coltais;\nchaidh sgur dhen ghnìomh seo a chum dìon o session hijacking.\nTill dhan duilleag roimhpe, ath-luchdaich an duilleag ud 's feuch ris a-rithist an uairsin.",
+       "logentry-contentmodel-change-revertlink": "till",
+       "logentry-contentmodel-change-revert": "till",
        "protectlogpage": "Loga an dìon",
        "protectlogtext": "Tha liosta na chaidh a dhìon gu h-ìosal.\nCuir sùil air [[Special:ProtectedPages|liosta nan duilleagan fo dhìon]] airson liosta na fheadhainn a tha fo dhìon an-dràsta fhèin.",
        "protectedarticle": "\"[[$1]]\" air a dhìon",
        "markaspatrolledtext": "Cuir comharra freiceadain ris an duilleag seo",
        "markedaspatrolled": "Comharra freiceadain ris",
        "markedaspatrolledtext": "Chaidh comharra freiceadain a chur ris a' mhùthadh de [[:$1]] a thagh thu.",
-       "rcpatroldisabled": "Chaidh feart nam freiceadan airson atharraichean o chionn goirid a chur à comas",
-       "rcpatroldisabledtext": "Tha feart nam freiceadan airson atharraichean o chionn goirid à comas an-dràsta.",
+       "rcpatroldisabled": "Chaidh gleus nam freiceadan airson atharraichean o chionn goirid a chur à comas",
+       "rcpatroldisabledtext": "Tha gleus nam freiceadan airson atharraichean o chionn goirid à comas an-dràsta.",
        "markedaspatrollederror": "Cha ghabh comharra freiceadain a chur ris",
        "markedaspatrollederrortext": "Feumaidh tu mùthadh a shònrachadh gus comharra freiceadain a chur ris.",
        "markedaspatrollederror-noautopatrol": "Chan fhaod thu comharra freiceadain a chur ris na h-atharraichean agad fhèin.",
        "monthsall": "na h-uile",
        "confirmemail": "Dearbhaich an seòladh puist-dhealain",
        "confirmemail_noemail": "Cha dug thu seachad seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chleachdaiche]] agad.",
-       "confirmemail_text": "Iarraidh {{SITENAME}} ort gun dearbhaich thu an seòladh puist-d agad mus cleachd thu feartan puist-d.\nCleachd am putan gu h-ìosal gus post-d dearbhaidh a chur dhan t-seòladh agad.\nBidh ceangal le còd sa phost-d ud;\nluchdaich an ceangal sa bhrabhsair agad airson dearbhadh gu bheil an seòladh puist-d agad dligheach.",
+       "confirmemail_text": "Iarraidh {{SITENAME}} ort gun dearbhaich thu an seòladh puist-d agad mus cleachd thu gleusan puist-d.\nCleachd am putan gu h-ìosal gus post-d dearbhaidh a chur dhan t-seòladh agad.\nBidh ceangal le còd sa phost-d ud;\nluchdaich an ceangal sa bhrabhsair agad airson dearbhadh gu bheil an seòladh puist-d agad dligheach.",
        "confirmemail_pending": "Chaidh còd dearbhaidh a chur thugad air a' phost-d mar-thà;\nma tha thu air a' chunntas agad a chruthachadh o chionn goirid, 's math dh'fhaoidte gum b' feairrde thu feitheamh mionaid no dhà ach an ruig e thu mus iarr thu còd ùr.",
        "confirmemail_send": "Cuir còd dearbhaidh thugam",
        "confirmemail_sent": "Chaidh post-d dearbhaidh a chur.",
-       "confirmemail_oncreate": "Chaidh còd dearbhaidh a chur dhan t-seòladh puist-d agad.\nChan eil thu feumach air a' chòd seo airson logadh a-steach, ach feumaidh tu a thoirt seachad mus cleachd thu feart sam bith san uicidh a chleachdas post-d.",
+       "confirmemail_oncreate": "Chaidh còd dearbhaidh a chur dhan t-seòladh puist-d agad.\nChan eil thu feumach air a' chòd seo airson logadh a-steach, ach feumaidh tu a thoirt seachad mus cleachd thu gleus sam bith san uicidh a chleachdas post-d.",
        "confirmemail_sendfailed": "Cha deach le {{SITENAME}} post-d dearbhaidh a chur thugad.\nDearbhaich nach eil caractar mì-dhligheach san t-seòladh puist-d agad.\n\nSeo na thill an t-inneal puist-d: $1",
        "confirmemail_invalid": "Tha an còd dearbhaidh mì-dhligheach.\n'S dòcha gun do dh'fhalbh an ùine air.",
        "confirmemail_needlogin": "$1 gus an seòladh puist-d agad a dhearbhadh.",
        "confirmemail_success": "Chaidh an seòladh puist-d agad a dhearbhadh.\nFaodaidh tu [[Special:UserLogin|logadh a-steach]] a-nis 's tlachd a ghabhail às an uicidh.",
        "confirmemail_loggedin": "Tha an seòladh puist-d agad air a dhearbhadh a-nis.",
        "confirmemail_subject": "Dearbhadh an t-seòlaidh puist-d air {{SITENAME}}",
-       "confirmemail_body": "Chlàraich chuideigin - 's sinne an dùil gur e tusa a bh' ann - cunntas \"$2\"\nair {{SITENAME}} leis an t-seòladh puist-d seo on t-seòladh IP $1.\n\nGus dearbhadh gur an agad fhèin a tha an cunntas seo agus gus na feartan puist-d\na ghnìomhachadh air {{SITENAME}}, fosgail an ceangal seo sa bhrabhsair agad:\n\n$3\n\nMur e *tusa* a bh' ann a chlàraich an cunntas seo, lean air a' cheangal seo\ngus sgur dhen dearbhadh leis a' phost-d:\n\n$5\n\nFalbhaidh an ùine air a' chòd dearbhaidh seo $4.",
-       "confirmemail_body_changed": "Dh'atharraich chuideigin - 's sinne an dùil gur e tusa a bh' ann - an seòladh puist-d\naig a' chunntas \"$2\" air {{SITENAME}} dhan t-seòladh puist-d seo on t-seòladh IP $1.\n\nGus dearbhadh gur an agad fhèin a tha an cunntas seo agus gus na feartan puist-d\na ghnìomhachadh às ùr air {{SITENAME}}, fosgail an ceangal seo sa bhrabhsair agad:\n\n$3\n\nMur e *tusa* a bh' ann a chlàraich an cunntas seo, lean air a' cheangal seo\ngus sgur dhen dearbhadh leis a' phost-d:\n\n$5\n\nFalbhaidh an ùine air a' chòd dearbhaidh seo $4.",
-       "confirmemail_body_set": "Shuidhich chuideigin - 's sinne an dùil gur e tusa a bh' ann - an seòladh puist-d\naig a' chunntas \"$2\" air {{SITENAME}} dhan t-seòladh puist-d seo on t-seòladh IP $1.\n\nGus dearbhadh gur an agad fhèin a tha an cunntas seo agus gus na feartan puist-d\na ghnìomhachadh air {{SITENAME}}, fosgail an ceangal seo sa bhrabhsair agad:\n\n$3\n\nMur e *tusa* a bh' ann a chlàraich an cunntas seo, lean air a' cheangal seo\ngus sgur dhen dearbhadh leis a' phost-d:\n\n$5\n\nFalbhaidh an ùine air a' chòd dearbhaidh seo $4.",
+       "confirmemail_body": "Chlàraich chuideigin - 's sinne an dùil gur e tusa a bh' ann - cunntas \"$2\"\nair {{SITENAME}} leis an t-seòladh puist-d seo on t-seòladh IP $1.\n\nGus dearbhadh gur an agad fhèin a tha an cunntas seo agus gus na gleusan puist-d\na ghnìomhachadh air {{SITENAME}}, fosgail an ceangal seo sa bhrabhsair agad:\n\n$3\n\nMur e *tusa* a bh' ann a chlàraich an cunntas seo, lean air a' cheangal seo\ngus sgur dhen dearbhadh leis a' phost-d:\n\n$5\n\nFalbhaidh an ùine air a' chòd dearbhaidh seo $4.",
+       "confirmemail_body_changed": "Dh'atharraich chuideigin - 's sinne an dùil gur e tusa a bh' ann - an seòladh puist-d\naig a' chunntas \"$2\" air {{SITENAME}} dhan t-seòladh puist-d seo on t-seòladh IP $1.\n\nGus dearbhadh gur an agad fhèin a tha an cunntas seo agus gus na gleusan puist-d\na ghnìomhachadh às ùr air {{SITENAME}}, fosgail an ceangal seo sa bhrabhsair agad:\n\n$3\n\nMur e *tusa* a bh' ann a chlàraich an cunntas seo, lean air a' cheangal seo\ngus sgur dhen dearbhadh leis a' phost-d:\n\n$5\n\nFalbhaidh an ùine air a' chòd dearbhaidh seo $4.",
+       "confirmemail_body_set": "Shuidhich chuideigin - 's sinne an dùil gur e tusa a bh' ann - an seòladh puist-d\naig a' chunntas \"$2\" air {{SITENAME}} dhan t-seòladh puist-d seo on t-seòladh IP $1.\n\nGus dearbhadh gur an agad fhèin a tha an cunntas seo agus gus na gleusan puist-d\na ghnìomhachadh air {{SITENAME}}, fosgail an ceangal seo sa bhrabhsair agad:\n\n$3\n\nMur e *tusa* a bh' ann a chlàraich an cunntas seo, lean air a' cheangal seo\ngus sgur dhen dearbhadh leis a' phost-d:\n\n$5\n\nFalbhaidh an ùine air a' chòd dearbhaidh seo $4.",
        "confirmemail_invalidated": "Chaidh sgur de dhearbhadh an t-seòlaidh puist-d",
        "invalidateemail": "Sguir de dhearbhadh an t-seòlaidh puist-d",
        "scarytranscludedisabled": "[Tha gabhail a-steach 'na iomradh eadar-uicidh à comas]",
        "confirm-watch-top": "A bheil thu airson an duilleag seo a chur ris a' chlàr-fhaire agad?",
        "confirm-unwatch-button": "Ceart ma-thà",
        "confirm-unwatch-top": "A bheil thu airson an duilleag seo a thoirt air falbh on chlàr-fhaire agad?",
+       "confirm-rollback-top": "A bheil thu airson na mùthaidhean air an duilleag seo a thilleadh?",
        "semicolon-separator": ";&#32;",
        "comma-separator": ",&#32;",
        "colon-separator": ":&#32;",
index 0734266..24b6f55 100644 (file)
        "minoredit": "Esta é unha edición pequena",
        "watchthis": "Vixiar esta páxina",
        "savearticle": "Gardar a páxina",
+       "savechanges": "Gardar os cambios",
        "publishpage": "Publicar a páxina",
+       "publishchanges": "Publicar cambios",
        "preview": "Vista previa",
        "showpreview": "Mostrar a vista previa",
        "showdiff": "Mostrar os cambios",
        "content-model-css": "CSS",
        "content-json-empty-object": "Obxecto baleiro",
        "content-json-empty-array": "Matriz baleira",
+       "deprecated-self-close-category": "Páxinas que usan etiquetas HTML de auto-pechado non válidas",
+       "deprecated-self-close-category-desc": "Páxinas que conteñen unha etiqueta HTML de auto-pechado non válida, como <code>&lt;b/></code> ou <code>&lt;span/></code>. O comportamento destas etiquetas vai cambiar para gardar a consistencia coa especificación HTML5, polo que o seu uso no texto wiki está desbotado.",
        "duplicate-args-warning": "<strong>Advertencia:</strong> [[:$1]] está chamando a [[:$2]] con máis dun valor para o parámetro \"$3\". Só se usará o último valor proporcionado.",
        "duplicate-args-category": "Páxinas con argumentos duplicados nas chamadas aos modelos",
        "duplicate-args-category-desc": "Esta páxina contén as chamadas aos modelos que utilizan argumentos duplicados, como <code><nowiki>{{exemplo|bar=1|bar=2}}</nowiki></code> ou <code><nowiki>{{exemplo|bar|1=baz}}</nowiki></code>.",
        "rows": "Filas:",
        "columns": "Columnas:",
        "searchresultshead": "Procurar",
-       "stub-threshold": "Límite superior para o formato de ligazóns de bosquexo($1):",
+       "stub-threshold": "Límite superior de tamaño para o formato das ligazóns cara bosquexos ($1):",
        "stub-threshold-sample-link": "exemplo",
        "stub-threshold-disabled": "Desactivado",
        "recentchangesdays": "Número de días a mostrar nos cambios recentes:",
        "rightslogtext": "Este é un rexistro dos cambios nos permisos de usuario.",
        "action-read": "ler esta páxina",
        "action-edit": "editar esta páxina",
-       "action-createpage": "crear páxinas",
-       "action-createtalk": "crear páxinas de conversa",
+       "action-createpage": "crear esta páxina",
+       "action-createtalk": "crear esta páxina de conversa",
        "action-createaccount": "crear esta conta de usuario",
        "action-autocreateaccount": "crear automaticamente esta conta de usuario externa",
        "action-history": "ver o historial desta páxina",
        "upload-http-error": "Produciuse un erro HTTP: $1",
        "upload-copy-upload-invalid-domain": "A copia de cargas non está dispoñible neste dominio.",
        "upload-foreign-cant-upload": "Este wiki non está configurado para subir ficheiros ao repositorio de ficheiros externo solicitado.",
+       "upload-foreign-cant-load-config": "Erro ó cargar a configuración das subas de ficheiros para o repositorio de ficheiros externo.",
+       "upload-dialog-disabled": "As cargas de ficheiros usando esta pantalla están desactivadas neste wiki.",
        "upload-dialog-title": "Subir un ficheiro",
        "upload-dialog-button-cancel": "Cancelar",
        "upload-dialog-button-done": "Feito",
        "sp-contributions-username": "Enderezo IP ou nome de usuario:",
        "sp-contributions-toponly": "Mostrar só as últimas revisións",
        "sp-contributions-newonly": "Mostrar só as edicións que crearon páxinas",
+       "sp-contributions-hideminor": "Ocultar edicións menores",
        "sp-contributions-submit": "Procurar",
        "whatlinkshere": "Páxinas que ligan con esta",
        "whatlinkshere-title": "Páxinas que ligan con \"$1\"",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "a páxina aínda non existe",
        "mw-widgets-titleinput-description-redirect": "redirección cara a $1",
-       "api-error-blacklisted": "Escolla un título diferente e descritivo.",
        "sessionmanager-tie": "Non pode combinar peticións múltiples de tipos de autenticación: $1.",
        "sessionprovider-generic": "sesións $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesións baseadas nas cookies",
        "log-action-filter-newusers": "Tipo de creación de conta:",
        "log-action-filter-patrol": "Tipo de vixilancia:",
        "log-action-filter-protect": "Tipo de protección:",
-       "log-action-filter-rights": "Tipo de cambio de dereito",
-       "log-action-filter-suppress": "Tipo de borrado",
+       "log-action-filter-rights": "Tipo de cambio de dereito:",
+       "log-action-filter-suppress": "Tipo de borrado:",
        "log-action-filter-upload": "Tipo de subida:",
        "log-action-filter-all": "Todas",
        "log-action-filter-block-block": "Bloquear",
        "linkaccounts-success-text": "A conta foi vinculada.",
        "linkaccounts-submit": "Vincular contas",
        "unlinkaccounts": "Desvincular contas",
-       "unlinkaccounts-success": "A conta foi desvinculada."
+       "unlinkaccounts-success": "A conta foi desvinculada.",
+       "authenticationdatachange-ignored": "Os cambios de datos de autenticación non foron xerados. Está configurado o provedor?"
 }
index 4ba2bcc..2dc66a3 100644 (file)
                "authors": [
                        "AminSanaei",
                        "Varg",
-                       "محک"
+                       "محک",
+                       "Macofe",
+                       "V6rg",
+                       "شیخ"
                ]
        },
+       "tog-underline": "خالؤنˇ جيره خط کشئن:",
+       "tog-hideminor": "کۊجˇ تغىيرؤنه دۊخۊسانئن تغىيرؤنˇ ليستˇ جي",
+       "tog-hidepatrolled": "گشت بۊخؤردهˇ تغىيرؤنه دۊخۊسانئن تغىيرؤنˇ ليستˇ جي",
+       "tog-hidecategorization": "ولگؤنˇجرگه-بندئنه جخۊسانئن",
+       "tog-editondblclick": "دۊته کيليک أجي ولگؤنه دچينواچين گۊدن",
+       "tog-editsectiononrightclick": "وابينؤنˇ تيترˇ سر راس-کيليک بکۊنين تا وابينؤنˇ دچينواچين کار دککئه",
+       "tog-watchcreations": "اۊ ولگؤنه کي چاکؤنم ؤ فاىلؤنه کي جؤراکشنمه علاوه بکۊن مي پىگيري ليسته",
+       "tog-watchdefault": "اۊ ولگؤن ؤ فاىلؤنه کي دچينواچين کؤنم علاوه بکۊن مي پىگيري ليسته",
+       "tog-watchmoves": "اۊ ولگؤن ؤ فاىلؤنه کي جابجا کؤنم علاوه بکۊنمي پىگيري ليسته",
+       "tog-watchdeletion": "اۊ ولگؤن ؤ فاىلؤنه کي پاکأکؤنم علاوه بکۊنمي پىگيري ليسته",
+       "tog-watchrollback": "هر ولگه که پساوگردؤنئم، علاوه بۊکۊن مي پىگيري ليسته",
+       "tog-previewontop": "دچينواچينˇ کادرˇ جؤرˇ پيشادئنه نۊشؤن بدي",
+       "tog-previewonfirst": "أولي دچينواچينˇ هينگؤم پيشادئنه نۊشؤن بدي",
+       "tog-enotifwatchlistpages": "أگه ىکته ولگ ىا فاىل مي پىگيري ليست أجي دچينواچين بۊبؤ مئبه ايمىل بخسأن",
+       "tog-enotifusertalkpages": "وختي مي کارگيري گبˇ ولگˇ مئن ىکچي عوضأبنه، مئبه ايمىل اۊسئه بۊبۊن",
+       "tog-enotifminoredits": "ولگؤن ؤ فاىلؤنˇ مئنˇ ريزˇ تغىيرؤنˇ واسيم مئبه ايمىل اۊسئه بۊبۊن",
+       "tog-enotifrevealaddr": "فأندرˇ ايمىلؤنˇ مئن مي ايمىلˇ آدرس معلۊم بۊبۊن",
+       "tog-shownumberswatching": "پىگير کارگيرؤنˇ تعداده نۊشؤن بدي",
+       "tog-watchlisthideliu": "ديرين بمأ کارگيرؤنˇ دچينواچينؤنه، پىگيتنؤنˇ ليستˇ مئن دۊخۊسان",
+       "tog-ccmeonemails": "اۊ ايمىلˇ جي که ديگرؤن ئبه اۊسئه کؤنم ىک نؤسخه کؤپي مئبه روانه بۊبۊن",
+       "tog-norollbackdiff": "پساوگردانئنˇ پسي، تؤفير نۊشؤن بدأ نۊبۊن",
+       "sunday": "ىکشمبه",
+       "monday": "دۊشمبه",
+       "tuesday": "سۊشمبه",
+       "wednesday": "چارشمبه",
+       "thursday": "پنجشمبه",
+       "friday": "جۊمه",
+       "saturday": "شمبه",
+       "sun": "ىکشمبه",
+       "mon": "دۊشمبه",
+       "tue": "سۊشمبه",
+       "wed": "چارشمبه",
+       "thu": "پنجشمبه",
+       "fri": "جۊمه",
+       "sat": "شمبه",
+       "january": "ژانویه",
+       "february": "فئوریه",
+       "march": "مارس",
+       "april": "آوريل",
+       "may_long": "مئی",
+       "june": "جۊن",
+       "july": "جۊلاى",
+       "august": "آگؤست",
+       "september": "سپتامبر",
+       "october": "اؤکتؤبر",
+       "november": "نؤوامبر",
+       "december": "دسامبر",
+       "january-gen": "ژانویه",
+       "february-gen": "فئوريه",
+       "march-gen": "مارس",
+       "april-gen": "آوريل",
+       "may-gen": "مئى",
+       "june-gen": "جۊن",
+       "july-gen": "جۊلاى",
+       "august-gen": "آگؤست",
+       "september-gen": "سپتامبر",
+       "october-gen": "اؤکتؤبر",
+       "november-gen": "نؤوامبر",
+       "december-gen": "دسامبر",
+       "jan": "ژانویه",
+       "feb": "فئوریه",
+       "mar": "مارس",
+       "apr": "آوریل",
+       "may": "مئی",
+       "jun": "جۊن",
+       "jul": "جۊلای",
+       "aug": "آگؤست",
+       "sep": "سپتامبر",
+       "oct": "اؤکتؤبر",
+       "nov": "نؤوامبر",
+       "dec": "دسامبر",
+       "pagecategories": "{{PLURAL:$1|جرگه|جرگهٰ‌ن}}",
+       "category_header": "\"$1\" جرگه مئنˇ ولگؤن",
+       "category-media-header": "\"$1\" جرگه مئنˇ رسانهٰ‌ن",
+       "hidden-categories": "{{PLURAL:$1|جخۊته جرگه|جخۊته جرگهٰ‌ن}}",
+       "category-subcat-count": "{{PLURAL:$2|اي جرگه ميئن خالي اي جيرجرگه دره.|{{PLURAL:$1|اي جيرجرگه|اي $1 جيرجرگه}} اي جرگه ميئن {{PLURAL:$1|دره|درن}}؛ اي جرگه سرجمع $2ته جيرجرگه دأنه.}}",
+       "category-article-count": "{{PLURAL:$2|اي جرگه ميئن خالي هي ولگ دره.|{{PLURAL:$1|اي جرگه|اي $1 ولگ}} اي جرگه ميئن {{PLURAL:$1|دره|درن}}؛ اي جرگه سرجمع $2ته ولگ دأنه.}}",
+       "category-article-count-limited": "جيرˇ{{PLURAL:$1|ولگ|$1 ولگ}} هي جرگه مئن دره.",
+       "category-file-count": "{{PLURAL:$2|اي جرگه مئن خالي اي فاىل دره.|{{PLURAL:$1|اي فاىل|اي $1ته فاىل}} اي جرگه مئن {{PLURAL:$1|دره|درن}}؛ اي جرگه مئن در کؤل $2ته فاىل دره.}}",
+       "listingcontinuesabbrev": "(ايدامه)",
+       "cancel": "لغو",
        "moredotdotdot": "ویشتر...",
-       "mypage": "می هنه‌شر",
-       "mytalk": "می گب",
-       "anontalk": "اَ آی.پیˇ گب",
-       "qbfind": "یاتن",
-       "qbedit": "دچین واچین",
-       "returnto": "واگرد به $1.",
-       "search": "واموج",
-       "searchbutton": "واموج",
-       "go": "بوشو",
-       "searcharticle": "بوشو",
-       "history_short": "تارئخ",
-       "printableversion": "پرینتی نوسخه",
-       "permalink": "مؤنسنی پیوند",
-       "edit": "دچین واچین",
-       "editthispage": "اَ هنه‌شره (صفحه‌یه) دچین‌واچین بکون.",
-       "create-this-page": "اَ هنه‌شره (صفحه‌یه) چاکون.",
-       "deletethispage": "اَ هنه‌شره پاکأ کون.",
-       "newpage": "تازه هنه‌شر (تازه صفحه)",
+       "mypage": "ولگ",
+       "mytalk": "گب",
+       "anontalk": "گب",
+       "navigation": "گرأخؤردن",
+       "and": "&#32;ؤ",
+       "qbfind": "ىاتن",
+       "qbedit": "دچینواچین",
+       "qbpageoptions": "اي ولگ",
+       "namespaces": "نؤمفضاؤن",
+       "variants": "گۊىشؤن",
+       "navigation-heading": "گرأخؤر منؤ",
+       "returnto": "$1 وگرد.",
+       "tagline": "{{SITENAME}} جي",
+       "help": "رانما",
+       "search": "وامج",
+       "searchbutton": "وامج",
+       "go": "بۊشۊ",
+       "searcharticle": "بۊشۊ",
+       "history": "ولگˇ تاريخ",
+       "history_short": "تاريخ",
+       "printableversion": "وؤته چاپ گۊدن",
+       "permalink": "داىمي خال",
+       "view": "دئن",
+       "edit": "دچينواچين",
+       "editthispage": "اي ولگه دچينواچين بکۊن",
+       "create-this-page": "اي ولگه چاکۊن",
+       "delete": "حذف",
+       "deletethispage": "اي ولگه پاکأ کۊن.",
+       "protect": "پأسن",
+       "protectthispage": "اي ولگه بپا",
+       "unprotect": "پأسنه عوضأؤدن",
+       "unprotectthispage": "اي ولگˇ پأسنه عوضأکۊن",
+       "newpage": "تازه ولگ",
        "talkpagelinktext": "گب",
+       "specialpage": "خاصˇ ولگ",
+       "personaltools": "شخصي بزارؤن",
        "talk": "گب",
-       "toolbox": "ابزار جیگا",
-       "jumpto": "واز بکون به:",
+       "views": "بدئرؤن",
+       "toolbox": "أبزارؤن",
+       "userpage": "کارگيرˇ ولگه دئن",
+       "categorypage": "جرگه ولگه دئن",
+       "otherlanguages": "باخي زوانؤنˇ جي",
+       "redirectedfrom": "(مسير عوضاؤدن $1 أجي)",
+       "protectedpage": "بپأسه ولگ",
+       "jumpto": "بوؤز:",
        "jumptonavigation": "گردسن",
-       "jumptosearch": "واموج",
-       "currentevents": "تازه چیؤن",
-       "mainpage": "گت صفحه",
-       "mainpage-description": "گت صفحه",
-       "portal": "امه جیگا",
-       "privacy": "رازبداری",
-       "editsection": "دچین‌واچین",
-       "editold": "دچین‌واچین",
-       "nstab-main": "وانیویس (مقاله)",
-       "nstab-user": "کاربری هنه‌شر",
-       "nstab-category": "رج",
-       "searchresults": "واموج‌دموجˇ نتایج",
-       "searchresults-title": "واموج‌دموجˇ نتایج، «$1»ˇ واسی",
-       "allpagessubmit": "بشو",
-       "categories": "رجؤن",
+       "jumptosearch": "وامج",
+       "view-pool-error": "سرورؤنˇ سر پۊر بار هننأ. پۊر پۊرˇ کارگيرؤن حقسأى کأدرن که اي ولگه فأندرن. \nلؤطف بۊکۊنين ىيسکالى صبر بدأرين.\n\n$1",
+       "aboutsite": "راجه به {{SITENAME}}",
+       "aboutpage": "Project:راجه به",
+       "copyrightpage": "{{ns:project}}:چاکۊدنحق",
+       "currentevents": "هسأىي تفاقؤن",
+       "currentevents-url": "Project:هساىي تفاقؤن",
+       "disclaimers": "ردنامهٰ‌ن",
+       "disclaimerpage": "Project:عۊمۊمي ردنامه",
+       "edithelp": "دچينواچينˇ رانما",
+       "mainpage": "گتˇ ولگ",
+       "mainpage-description": "گتˇ ولگ",
+       "portal": "أمي جیگا",
+       "portal-url": "Project:کارگيرؤنˇ ديرينگه",
+       "privacy": "خۊصۊصي حریمˇ سیاست",
+       "privacypage": "Project:حريمˇ سیاست",
+       "badaccess-groups": "کاري که شمه خأنين، فقط {{PLURAL:$2|اي پأره|اي پأره'ن}} کارگيرؤنˇ شئه: $1.",
+       "retrievedfrom": "«$1» جي وأىته",
+       "youhavenewmessagesfromusers": "شمه {{PLURAL:$4|ىکته دئه کارگير|$3 کارگير}} جي $1 دأنين ($2).",
+       "editsection": "دچينواچين",
+       "editold": "دچينواچين",
+       "editlink": "دچينواچين",
+       "viewsourcelink": "سربسه دئن",
+       "editsectionhint": "وابينˇ دچينواچين: $1",
+       "toc": "دله",
+       "site-atom-feed": "أتؤمˇ خۊراک $1 ئبه",
+       "page-atom-feed": "أتؤمˇ خۊراک $1 ئبه",
+       "red-link-title": "$1 (ولگ دننه)",
+       "nstab-main": "ولگ",
+       "nstab-user": "کارگيري ولگ",
+       "nstab-special": "خاصˇ ولگ",
+       "nstab-project": "پؤرؤژه ولگ",
+       "nstab-image": "فاىل",
+       "nstab-template": "قالب",
+       "nstab-category": "جرگه",
+       "mainpage-nstab": "گتˇ ولگ",
+       "error": "سأب",
+       "databaseerror": "دىتابىسˇ سأب",
+       "databaseerror-error": "سأب: $1",
+       "readonly": "دىتابىس قؤفلأبؤ",
+       "internalerror": "دۊيريني سأب",
+       "internalerror_info": "دۊيريني سأب: $1",
+       "filedeleteerror": "نۊبؤ کي \"$1\" فاىله حذفأگۊدن.",
+       "directorycreateerror": "نشأنه \"$1\" مسيره چاگۊدن.",
+       "directoryreadonlyerror": "\"$1\" مسير خالي خؤندني ايسه.",
+       "directorynotreadableerror": "\"$1\" مسير خؤندني نئه.",
+       "filenotfound": "نشأنه \"$1\" فاىله ىاتن.",
+       "cannotdelete-title": "نشأنه \"$1\" ولگه حذفأگۊدن",
+       "badtitle": "بدˇ تيتر",
+       "viewsource": "سربسه دئن",
+       "viewsource-title": "$1 سربسه دئن",
+       "actionthrottled": "شمئه کارˇ جۊلؤ بىته بۊبؤ",
+       "protectedpagetext": "اي ولگ پأسه بؤدره تا دچينواچين نبۊن.",
+       "customcssprotected": "شمه اجازه ندأنين اي CSS ولگه دچينواچين بکۊنين چۊن اينˇ مئن ىکته دئه کارگيرˇ شخصي تنظيمات دره.",
+       "customjsprotected": "شمه اجازه ندأنين اي جاوا ولگه دچينواچين بکۊنين چۊن اينˇ مئن ىکته دئه کارگيرˇ شخصي تنظيمات دره.",
+       "mycustomcssprotected": "شمه اجازه ندأنين اي CSS ولگه دچينواچين بکۊنين.",
+       "titleprotected": "اي تيتر [[User:$1|$1]]ˇ جي، چاگۊدن ئبه بپأسسه ايسه.\nاينˇ دليل اينه: <em>$2</em>.",
+       "exception-nologin": "دۊيرين نمأىن",
+       "exception-nologin-text": "خأهشن دۊيرين بأىن تا اي ولگ شيمئه دسفأرس بۊبۊن.",
+       "cannotlogoutnow-title": "هسا بيرين شؤ منين",
+       "cannotlogoutnow-text": "وختي $1 کاردره، نشأنه بيرۊن شؤن.",
+       "welcomeuser": "خۊش بمأى $1!",
+       "welcomecreation-msg": "تي کارگيري حساب چاگۊده بۊبؤ.\nشمره ىاد دبۊن کي تي [[Special:Preferences|تنظيماته {{SITENAME}}]] عوضأکۊني.",
+       "yourname": "کارگيري نؤم",
+       "userlogin-yourname": "کارگيري نؤم",
+       "userlogin-yourname-ph": "تي کارگيري نؤمه بنويس",
+       "createacct-another-username-ph": "تي کارگيري نؤمه بنويس",
+       "yourpassword": "رمز:",
+       "userlogin-yourpassword": "رمز",
+       "userlogin-yourpassword-ph": "تي رمزه بنويس",
+       "createacct-yourpassword-ph": "ىکته رمز بنويس",
+       "yourpasswordagain": "رمزه دۊمارته بنويس",
+       "createacct-yourpasswordagain": "رمزه تأىيد بکۊن",
+       "createacct-yourpasswordagain-ph": "هندئه رمزه بنويس",
+       "remembermypassword": "رمزه (تا حدأکثر $1 {{PLURAL:$1|رۊز|رۊزؤن}}) اي وبمجˇ مئن ىاد بدأر.",
+       "userlogin-remembermypassword": "مره دۊيرين بمأ بدأر",
+       "cannotloginnow-title": "هسأ دۊيرين أمأ منين",
+       "cannotloginnow-text": "وختي $1 کاردره، نشأنه دۊيرين أمأن.",
+       "yourdomainname": "تي پره",
+       "login": "ديرين بأىن",
+       "userloginnocreate": "ديرين",
+       "logout": "بيرين شؤن",
+       "userlogout": "بيرين شؤن",
+       "userlogin-noaccount": "کارگيري حيساب ندأني؟",
+       "userlogin-joinproject": "{{SITENAME}}ˇ مئن ثبتˇ نام بکۊن.",
+       "nologin": "کارگيري حيساب ندأني؟ $1.",
+       "nologinlink": "ىکته حيساب چاکۊن",
+       "createaccount": "حيساب چاکۊدن",
+       "gotaccount": "ىکته کارگيري حيساب دأني؟ $1.",
+       "gotaccountlink": "دۊيرين",
+       "userlogin-resetlink": "دۊيرين أمأنˇ اطلاعاته ىادأگۊدي؟",
+       "userlogin-resetpassword-link": "تي رمزه ىادأگۊدي؟",
+       "userlogin-loggedin": "شمه هسأ {{GENDER:$1|$1}}ˇ تأهأت ديرين بمأىن.\nأگه خأ ىکته دئه کارگيرˇ تأهأت ديرن بأىن، جيري فؤرمه کاراگيرين.",
+       "userlogin-createanother": "ىکته دئه کارگيري حيساب چاکۊن",
+       "createacct-emailrequired": "ايمىلˇ آدرس",
+       "createacct-emailoptional": "ايمىلˇ آدرس (ديلبخا)",
+       "createacct-email-ph": "تي ايمىلˇ آدرسه بنويس",
+       "createacct-another-email-ph": "ايمىلˇ آدرسه بنويس",
+       "createacct-realname": "واقعي نؤم (ديلبخا)",
+       "createaccountreason": "دليل:",
+       "createacct-reason": "دليل",
+       "createacct-reason-ph": "چره ىکته دئه کارگيري حساب چاکأدري؟",
+       "createacct-submit": "تي کارگيري حيسابه چاکۊن",
+       "createacct-another-submit": "حيساب چاگۊدن",
+       "createacct-benefit-heading": "{{SITENAME}} شيمي مۊسؤنچي آدم اۊنه چاگۊدن!",
+       "createacct-benefit-body1": "{{PLURAL:$1|دچينواچين}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|ولگ}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|مؤشارکت گۊدنکس}} أخير",
+       "usernameinprogress": "اي کارگيري نؤم ئبه ىکته حساب چاگۊده بؤدره؛ صبر بۊکۊنين.",
+       "loginerror": "ديرين أمأنˇ مئن سأب بۊبؤ",
+       "createacct-error": "سأب، کارگيري حساب چاگۊدنˇ مئن",
+       "createaccounterror": "نشأنه اي حيسابه چاگۊدن: $1",
+       "nocookiesnew": "تي کارگيري حساب چاگۊده بۊبؤ ولي هنۊز وبجيگه' ديرين نمأى.\n{{SITENAME}} کارگيرؤنˇ ديرين أمأنˇ وأسي کۊکي کأرأىته بنه.\nتۊ کۊکيئنه دبستي.\nلؤطف بکۊن کۊکيئنه هنده کار تؤدي ؤ بازين تي تازه کارگيري نؤم ؤ رمزأجي وبجيگه' ديرين بئه.",
+       "nocookieslogin": "{{SITENAME}} کارگيرؤنˇ ديرين أمأنˇ واسي کۊکي کأرأگينه.\nشمه کۊکيئنه دبۊستين.\nلؤطف بکۊنين کۊکيئنه هندئه کار تؤدين ؤ هندئه حقسأى بکۊنين.",
+       "noname": "شمه ىکته کارگيري نؤم که دبۊن ننويشتين.",
+       "loginsuccesstitle": "دۊيرين بمأى",
+       "nosuchuser": "$1 نؤمي کارگير دننه.\nکارگيري نؤم، حرفؤنˇ کۊشتأکي ؤ پيلئگي سر حساسه. نؤمˇ ايملا' نيأ بکۊنين ىا [[Special:CreateAccount|ىکته تازه حيساب چاکۊنين]].",
+       "nouserspecified": "وا ىکته کارگيري نؤم مألۊم بکۊنين.",
+       "password-name-match": "شيمئه رمز وا شيمئه کارگيري نؤمˇ أمرأ تؤفير بدأره.",
+       "mailmypassword": "هندئه رمز چاگۊدن",
+       "passwordremindertext": "ىک نفر (شاىد خۊدˇ شمه، $1 آى.پي نۊشؤني جي) {{SITENAME}} مئن شيمئه کارگيري حساب ئبه تازه رمز بخأسته ($4).\nىکته مؤوقتي رمز چاگۊده بۊبؤ \"$2\" کارگير ئبه ؤ ائره نأ: \"$3\". \nأگه هينه خأستين، هسأ وأ وبجيگه' ديرين بشين ؤ تازه رمز چاکۊنين.\nشيمئه مؤوقتي رمز {{PLURAL:$5|ىک رۊز|$5 رۊز}} مئن باطل بۊنه.\n\nأگه ىک نفر ديگه همچين چيزي بخأسته ىا أگه شمه شيمئه قديمي رمزه ىاد بأردين ؤ دئه نخأنين اۊنه عوضأکۊنين، اي پىغامه ندئه بگيرين ؤ هۊ قديمي رمزه کاراگيرين.",
+       "accountcreated": "حيساب چاگۊده-بۊبؤ!",
+       "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|گب]]) واسي کارگيري حيساب چاگۊده بۊبؤ.",
+       "login-migrated-generic": "شيمئه کارگيري حيساب جابجا بۊبؤ ؤ شيمئه کارگيري نؤم ديگه اي ويکي ميئن دننه.",
+       "loginlanguagelabel": "زوان: $1",
+       "createacct-another-realname-tip": "واقعي نؤم ديلبخا ايسه.\nأگه اۊنه بنويسين، وختي شيمئه کارؤنˇ گبه ؤ اۊشؤنه نسبت دأدرن شمره، شيمئه واقعي نؤمه کاراگينن.",
+       "pt-login": "ديرين",
+       "pt-login-button": "ديرين",
+       "pt-createaccount": "حساب چاگۊدن",
+       "pt-userlogout": "بيرين شؤن",
+       "changepassword": "رمز عوضأگۊدن",
+       "resetpass_header": "کارگيري حسابˇ رمزه عوضأگۊدن",
+       "oldpassword": "قديمي رمز",
+       "newpassword": "تازه رمز",
+       "retypenew": "رمزه دۊمارته بنويس",
+       "resetpass_submit": "رمزه عوضأکۊن ؤ دۊيرين بشۊ",
+       "changepassword-success": "تي رمز عوضأبؤ!",
+       "botpasswords-label-create": "چاگۊدن",
+       "botpasswords-label-update": "برۊزأگۊدن",
+       "botpasswords-label-cancel": "لغو",
+       "botpasswords-label-delete": "حذف",
+       "botpasswords-label-resetpassword": "هندئه رمز چاگۊدن",
+       "resetpass-submit-loggedin": "رمز عوضأگۊدن",
+       "resetpass-submit-cancel": "لغو",
+       "passwordreset": "هندئه رمز چاگۊدن",
+       "passwordreset-username": "کارگيري نؤم:",
+       "passwordreset-capture-help": "أگه اي گۊزينه' تيک بزنين، ايمىل (که اينˇ مئن مؤوقتي رمز دره) شيمئبه نۊشؤن بدأ بنه ؤ کارگيرئبه ني اۊسئه بنه.",
+       "passwordreset-emailelement": "کارگيري نؤم: \n$1\n\nمؤوقتي رمز: \n$2",
+       "bold_sample": "پۊررنگˇ وؤت",
+       "bold_tip": "پۊررنگˇ وؤت",
+       "italic_sample": "کجˇ وؤت",
+       "italic_tip": "کجˇ وؤت",
+       "link_sample": "خالˇ تيتر",
+       "link_tip": "دۊيريني خال",
+       "extlink_sample": "http://www.example.com خالˇ تيتر",
+       "extlink_tip": "بيريني خال (http://‎ پيشونده ىادانکۊنين)",
+       "headline_sample": "تيترˇ وؤت",
+       "image_tip": "وؤتˇ مئنˇ تصوير",
+       "media_tip": "فاىلˇ خال",
+       "hr_tip": "اؤفؤقي خط (اۊن أجي کم کارأگيرين)",
+       "summary": "فيچالسه:",
+       "minoredit": "اي نيميزگره دچينواچينه",
+       "watchthis": "اي ولگه پى بگير",
+       "savearticle": "ولگه ذخيره گۊدن",
+       "preview": "پيشادئن",
+       "showpreview": "پيشادئن",
+       "showdiff": "تغىيرؤنه نۊشؤن دأن",
+       "summary-preview": "پيشادئنˇفيچالسه:",
+       "blockedtitle": "کارگير دبۊسته بۊبؤ",
+       "loginreqtitle": "خأ أول ديرين بأى",
+       "loginreqlink": "ديرين بئه",
+       "noarticletext": "اي ولگˇ مئن ألؤنى هيچ وؤتي دننئه. شۊمۊ تؤنين باخيˇ ولگؤنˇ مئن [[Special:Search/{{PAGENAME}}|اي ولگˇ تيتره وامجين]]،\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} مۊرتبط سياه'نه وامجين]،\nىا [{{fullurl:{{FULLPAGENAME}}|action=edit}} اي ولگه دچينواچين بکۊنين]</span>.",
+       "editing": "$1 دچينواچين گۊدن",
+       "editingsection": "دچيواچينˇ مئن $1 (وابين)",
+       "templatesused": "اي ولگˇ مينˇ {{PLURAL:$1|قالب|قالبؤن}}",
+       "template-protected": "(بپأسه)",
+       "hiddencategories": "اي ولگ {{PLURAL:$1|ىکته جخۊته جرگه|$1 جخۊته جرگه}} مئن دره:",
+       "currentrev-asof": "هسأىي نۊسخه تا $1",
+       "revisionasof": "نۊسخه $1",
+       "previousrevision": "→ قديميترˇ نۊسخه",
+       "currentrevisionlink": "هسأىى نۊسخهٰ نۊشؤن دأن",
+       "cur": "ألؤن",
+       "last": "دأميشکي",
+       "rev-deleted-user": "(کارگيري نؤم حذفأبؤ)",
+       "rev-delundel": "نۊشؤن دأن/جۊخۊسانئن",
+       "revdelete-hide-user": "کارگيري نؤم/آى.پي",
+       "revdelete-reason-dropdown": "*حذفˇ هرماله دليلؤن\n** چاکۊدنحقه نقض گۊدن\n** نظر ىا اطلاعاتي که مؤناسب نيه\n** کارگيري نؤمي که مؤناسب نيه\n** اطلاعاتي که اۊنˇ مئن تؤهمت دره",
+       "difference-title": "$1: نۊسخه'نˇ تؤفير",
+       "lineno": "رچ $1:",
+       "editundo": "وگردانئن",
+       "diff-multi-otherusers": "{{PLURAL:$2|۱ کارگير|$2 کارگير}} دچينواچين بۊبؤ ({{PLURAL:$1|۱ مئني نؤسخه|$1 مئني نؤسخه}} نۊشؤن بدأ نۊبؤ)",
+       "searchresults": "وامتنˇ نتيجه'ن",
+       "searchresults-title": "وامتنˇ نتيجه'ن، \"$1\"ˇ واسی",
+       "prevn": "داميشکˇ {{PLURAL:$1|$1}}",
+       "nextn": "بعدي {{PLURAL:$1|$1}}",
+       "shown-title": "$1هر ىکته ولگˇ مئن {{PLURAL:$1|نتيجه'|نتيجه'ن}} نۊشؤن بدي.",
+       "searchprofile-articles": "دله ولگؤن",
+       "searchprofile-images": "چنرسانه",
+       "searchprofile-everything": "همه چي",
+       "searchprofile-advanced": "دؤجئه",
+       "searchprofile-articles-tooltip": "$1 مئن وامج",
+       "searchprofile-images-tooltip": "فاىلؤنˇ مئنه وامج",
+       "searchprofile-everything-tooltip": "تمؤمˇ دله' وامتن (حتی گبˇ ولگؤنه)",
+       "searchprofile-advanced-tooltip": "دؤجئه نؤمفضا'نˇ مئن وامتن",
+       "search-result-size": "$1 ({{PLURAL:$2|ىک کلمه|$2 کلمه'ن}})",
+       "search-category": "($1 جرگه)",
+       "search-suggest": "شيمي منظۊر بۊ: $1",
+       "searchall": "همه",
+       "mypreferences": "ترجيحات",
+       "skin-preview": "پيشادئن",
+       "prefs-user-pages": "کارگيري ولگؤن",
+       "allowemail": "باخي کارگيرؤنˇ جي شأسته بۊن ايمىل هأىتن",
+       "username": "{{GENDER:$1|کارگيري نؤم}}:",
+       "prefs-help-email-others": "شيمئه اينم تينين دؤجين بکۊنين که کارگيرؤن بۊتؤنن ىکته خالˇ جي که شيمئه کارگيري ولگ ىا شيمئه گبˇ ولگˇ مئن دره، شيمئبه ايمىل بخسأنن.\nوختي ديگرؤن شيمئه أمرأ تماس گينن شيمئه ايمىلˇ نۊشؤني مألۊم نبۊنه.",
+       "prefs-preview": "پيشادئن",
+       "userrights": "کارگيرˇ دسفارسˇ کياگري",
+       "userrights-lookup-user": "کارگيري پأره'نˇ کياگري",
+       "editusergroup": "{{جنس:$1|کارگيري}}پأره'نˇ دچينواچين",
+       "editinguser": "{{GENDER:$1|کارگير}} <strong>[[User:$1|$1]]</strong> $2 کارگيري دسفأرسؤنه عوضأؤدن",
+       "saveusergroups": "{{جنس:$1|کارگيري}} پأره'نه ذخيره گۊدن",
+       "group": "پأره:",
+       "group-user": "کارگيرؤن",
+       "group-autoconfirmed": "تأىيد بۊبؤ کارگيرؤن",
+       "group-sysop": "کيا'ن",
+       "group-bureaucrat": "شأردويرؤن",
+       "group-suppress": "دۊخۊسانگرۊن",
+       "group-user-member": "{{GENDER:$1|کارگير}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|تأييد بۊبؤ کارگير}}",
+       "group-sysop-member": "{{GENDER:$1|کيا}}",
+       "group-bureaucrat-member": "{{GENDER:$1|شأردوير}}",
+       "group-suppress-member": "{{جنس:$1|دۊخۊسانگر}}",
+       "grouppage-user": "{{ns:project}}:کارگيرؤن",
+       "grouppage-autoconfirmed": "{{ns:project}}:تأييد بۊبؤ کارگيرؤن",
+       "grouppage-sysop": "{{ns:project}}:کيا'ن",
+       "grouppage-bureaucrat": "{{ns:project}}:شأردويرؤن",
+       "grouppage-suppress": "{{ns:project}}:دۊخۊسانگر",
+       "right-createaccount": "تازه کارگيري حيساب چاگۊدن",
+       "right-move-categorypages": "جرگه ولگؤنه جابجا گۊدن",
+       "right-writeapi": "نيويشتنˇ API أجي کاراىتن",
+       "right-block": "باخي کارگيرؤنˇ دچينواچينˇ دسفأرسه دبۊستن",
+       "right-hideuser": "ىکته کارگيره دبۊستن ؤ اينه ديگرؤنˇ جي دۊخۊسانئن",
+       "right-rollback": "آخري کارگيري که ىکته ولگه دچينواچين بؤده، اينˇ دچينواچينؤن تۊنداتۊند پساوگردانه بۊبۊن",
+       "right-userrights": "کارگيرؤنˇهمته دسفأرسؤنˇ دچينواچين",
+       "right-userrights-interwiki": "باخي ويکئنˇ کارگيرؤنˇ دسفأرسˇ دچينواچين",
+       "right-sendemail": "باخي کارگيرؤنه ايمىل بخسأن",
+       "newuserlogpage": "کارگير چاگۊدنˇ سياهه",
+       "newuserlogpagetext": "اي ىکته سياهه' کارگير چاگۊدنؤنˇ جي",
+       "action-createaccount": "اي کارگيري حيسابه چاکۊن",
+       "action-move-categorypages": "جرگه ولگؤنه جابجا گۊدن",
+       "action-block": "اي کارگيرˇ دچينواچينˇ دسفأرسه دبۊد",
+       "action-rollback": "آخري کارگيري که ىکته ولگه دچينواچين بؤده، اينˇ دچينواچينؤن تۊنداتۊند پساوگردانه بۊبۊن",
+       "enhancedrc-history": "تاريخ",
+       "recentchanges": "آخري تغىيرؤن",
+       "recentchanges-legend": "آخري تغىيرؤنˇ تنظيمات",
+       "recentchanges-label-newpage": "اي دچينواچين ىکته تازه ولگ چاگۊده",
+       "recentchanges-label-minor": "اي نيميزگره دچينواچينه",
+       "recentchanges-label-bot": "اي دچينواچينه ىکته رۊبات بؤده",
+       "rcshowhideminor-show": "نۊشؤن دأن",
+       "rcshowhideminor-hide": "دۊخۊسان",
+       "rcshowhidebots": "$1 رۊباتؤن",
+       "rcshowhidebots-show": "نۊشؤن دأن",
+       "rcshowhidebots-hide": "دۊخۊسان",
+       "rcshowhideliu": "$1 ثبتˇ نام بؤده کارگيرؤن",
+       "rcshowhideliu-hide": "دۊخۊسان",
+       "rcshowhideanons": "$1 ناشناس کارگيرؤن",
+       "rcshowhideanons-show": "نۊشؤن دأن",
+       "rcshowhideanons-hide": "دۊخۊسان",
+       "rcshowhidemine": "$1 مي دچينواچينؤن",
+       "rcshowhidemine-show": "نۊشؤن دأن",
+       "rcshowhidemine-hide": "دۊخۊسان",
+       "diff": "تؤفير",
+       "hist": "تاريخ",
+       "hide": "دۊخۊسان",
+       "show": "نۊشؤن دأن",
+       "minoreditletter": "جؤز",
+       "newpageletter": "نؤ",
+       "boteditletter": "ر",
+       "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|کارگير}} پىگير]",
+       "rc-change-size-new": "$1 {{PLURAL:$1|باىت}} تغىيرˇ پسي",
+       "recentchangeslinked": "مۊرتبطˇ تغىيرؤن",
+       "recentchangeslinked-toolbox": "مۊرتبطˇ تغىيرؤن",
+       "recentchangeslinked-summary": "اي جير، ىکته ليسته تينين بىنين آخري تغييرؤن أجي اۊ ولگؤنˇ مئن کي اي ولگˇ جي خال ببؤن (ىا جرگهٔ مؤردˇ نظرˇ جي). اۊ ولگؤني که [[Special:Watchlist|شيمئه پىگيري ليست]]۱ميئن دبۊن پۊررنگ نۊشؤن بدأبۊنن.",
+       "recentchangeslinked-page": "ولگˇ نؤم:",
+       "upload": "فاىله جؤراکشئن",
+       "filedesc": "فيچالسه",
+       "upload-file-error-text": "وختي حقسأى بؤدبۊ که سرورˇ مئن ىکته مؤوقتي فاىل چاگۊده بۊبۊن، سأب بۊبؤ.\n\nىکته [[Special:ListUsers/sysop|کيا]] أمرأ تماس بگيرين.",
+       "upload-misc-error-text": "جيرأکشئنˇ زمت، ىکته سأب بۊبؤ که مألۊم نيه چيسه.\nلؤطف بکۊنين بىنين اينترنتي نۊشؤني مؤعتبر ؤ دسفأرس ايسه ؤ هندئه حقسأى بکۊنين.\n\nأگه هندئه دۊرۊسأنۊبؤ، ىکته [[Special:ListUsers/sysop|کيا'ن]] أمرأ تماس بگيرين.",
+       "img-auth-accessdenied": "شيمئه دسفأرس نيه",
+       "license-header": "جواز",
+       "license-nopreview": "(پيشادئن ئبه هيچي ننأ)",
+       "listfiles-userdoesnotexist": "\"$1\" کارگيري حيساب ثبت نۊبؤ.",
+       "imgfile": "فاىل",
+       "listfiles_user": "کارگير",
+       "file-anchor-link": "فاىل",
+       "filehist": "فاىلˇ تاريخ",
+       "filehist-help": "تاريخ/زمتؤنˇ سر کيليک بکۊنين تا اۊ تاريخ/زمتˇ نۊسخه' بىنين.",
+       "filehist-current": "ألؤنˇ نۊسخه",
+       "filehist-datetime": "تاريخ/زمت",
+       "filehist-thumb": "کلˇ أنگۊشتي",
+       "filehist-thumbtext": "کلˇ أنگۊشتي عکس، $1 تاريخˇ نۊسخه' جي",
+       "filehist-user": "کارگير",
+       "filehist-dimensions": "أبعاد",
+       "filehist-comment": "نظر",
+       "imagelinks": "فاىله کارأىتن",
+       "linkstoimage": "اي {{PLURAL:$1|ولگ|ولگؤن}} اي تاتاىئه خال بدأ {{PLURAL:$1|دأنه|دأنن}}:",
+       "sharedupload-desc-here": "اي فاىل $1 مئن دره ؤ شاىد باخيˇ پؤرؤژه'نˇ مئنأني کاراىته بۊبۊن.\n[$2 فاىلˇ تؤضيحاتˇ ولگ، اؤره]ˇ مئنˇ تؤضيحات اي جير نۊشؤن بدأره.",
+       "randompage": "کترئي ولگ",
+       "randomincategory": "جرگه مئنˇ کترئي ولگ",
+       "randomincategory-nopages": "[[:Category:$1|$1]] جرگه مئن هيچ ولگي دننه.",
+       "randomincategory-legend": "جرگه مئنˇ کترئي ولگ",
+       "statistics-header-users": "کارگيرˇ آمار",
+       "statistics-users": "[[Special:ListUsers|کارگيرؤن]] ثبتˇ نام بؤده",
+       "nbytes": "$1 {{PLURAL:$1|باىت|باىتؤن}}",
+       "ncategories": "{{PLURAL:$1|جرگه|جرگهٰ‌ن}}",
+       "protectedpages": "بپأسه ولگؤن",
+       "protectedpages-performer": "پأسن کارگير",
+       "protectedpages-unknown-performer": "ناشيناس کارگير",
+       "protectedtitles": "بپأسه تيترؤن",
+       "listusers": "کارگيرؤنˇ ليست",
+       "newpages": "تازه ولگؤن",
+       "newpages-username": "کارگيري نؤم:",
+       "unusedcategoriestext": "اي جرگهٰ‌ن درن ولي هيته وانيويسؤن ىا باخيˇ جرگهٰ‌ن اۊشؤنه کارأنگينن.",
+       "suppress": "دۊخۊسانگري",
+       "booksources": "کيتابˇ سربسؤن",
+       "booksources-search": "وامج",
+       "log": "سياههٰ‌ن",
+       "allarticles": "همته ولگؤن",
+       "allpagessubmit": "بۊشۊ",
+       "categories": "جرگه'ن",
+       "listusers-noresult": "هيچ کارگيري پىدا نۊبؤ.",
+       "activeusers": "فعال کارگيرؤنˇ ليست",
+       "activeusers-hidesysops": "کيا'نه جيگا دأن",
+       "activeusers-noresult": "هيچ کارگيري پىدا نۊبؤ.",
+       "listgrouprights": "کارگيري پأره دسفأرسؤن",
+       "listgrouprights-group": "پأره",
+       "listgrouprights-helppage": "Help:پأره'نˇ دسفأرس",
+       "listgrouprights-removegroup-all": "تؤنه همته پأره'نه حذف بکؤني",
+       "trackingcategories-msg": "ردگيري جرگه",
+       "trackingcategories-desc": "جرگه گۊنجاىشˇ ملاک",
+       "hidden-category-category-desc": "جرگه خؤ ولگˇ مئن <code><nowiki>__HIDDENCAT__</nowiki></code> شامل بنه، کي نۊگذارنه کي جرگه خالؤنˇ جعبه پيشفرض ولگؤنˇ مئن نۊشؤن بدأببۊن.",
+       "trackingcategories-disabled": "جرگه دئه کار نۊکؤنه",
+       "emailuser-title-target": "اي {{GENDER:$1|کارگيره}} ايمىل بخسأن.",
+       "usermaildisabled": "نشأنه کارگير ئبه ايمىل خسأنئن.",
+       "usermaildisabledtext": "شمه اي ويکي مئن مننين باخي کارگيرؤنه ايمىل بخسأنين",
+       "mywatchlist": "پىگيتنؤنˇ ليست",
+       "watch": "پىگيتن",
+       "wlheader-enotif": "فأندرˇ ايمىل کار کؤنه.",
+       "dellogpage": "حذفˇ سياهه",
+       "rollbacklink": "پساوگردان",
+       "rollbacklinkcount-morethan": "$1ˇ جي ويشتر پساوگردان {{PLURAL:$1|دچينواچين|دچينواچينؤن}}",
+       "alreadyrolled": "نشأنه [[:$1]]ˇ آخري دچينواچينه که [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); بؤده، پساوگردانئن؛ اينˇ پيشي، ىک نفر وانيويسه دچينواچين ىا پساوگردان بؤده.\n\nولگˇ آخري دچينواچينه [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) بؤده.",
+       "protectlogpage": "پأسنˇ سياهه",
+       "protect-level-sysop": "فقط کيا'ن",
+       "restriction-level-sysop": "قاىم بپأسه",
+       "undeletehistorynoadmin": "اي ولگ حذفأبؤ.\nاي ولگˇ حذفأبؤنˇ دليل باني اۊ کارگيرؤنˇ نۊشؤني که حذفˇ پيشي اي ولگه دچينواچين بؤده بؤن، جيري فيچالˇ مئن بمأ.\nاي حذفأبؤ دچينواچينؤنˇ أصلˇ وؤت خالي کيا'نˇ دسفأرسه.",
+       "namespace": "نؤمفضا:",
+       "invert": "دؤجين وراکينه بۊبۊن",
+       "tooltip-invert": "ائره تيک بزنين تا دؤجئه نؤمفضا مئنˇ ولگؤنˇ تغىيرؤن (ؤ باخي تيک بزئه نؤمفضا'ن) دخۊته بۊمؤن.",
+       "namespace_association": "مؤرتبطˇ نؤمفضا",
+       "tooltip-namespace_association": "ائره' تيک بزنين تا گبˇ نؤمفضا ىا مؤرتبط مؤضۊع ىا دؤجين بۊبؤ نؤمفضا ني شامل بۊبۊن.",
+       "blanknamespace": "گت",
+       "month": "اي ماه مئن (ؤ دأميشک):",
+       "year": "اي سالˇ مئن (ؤ دأميشک):",
        "sp-contributions-talk": "گب",
-       "blocklink": "دَوَسته ببه",
-       "tooltip-ca-edit": "شمه تانید اَ هنه‌شره (صفحه) دچین‌واچین بکونید. بی‌زحمت قبل از ان‌کی ذخیره بکونید، پیش‌نمایشˇ دوکمه جا استفاده بکونید.",
-       "tooltip-ca-history": "اَ هنه‌شر (صفحه)ˇ قدیمی نسخه‌یان"
+       "whatlinkshere": "هرچي خال ببؤ ائره",
+       "whatlinkshere-page": "ولگ:",
+       "isimage": "فاىلˇ خال",
+       "whatlinkshere-links": "→ خالؤن",
+       "whatlinkshere-hidelinks": "$1 خالؤن",
+       "whatlinkshere-filters": "فيلترؤن",
+       "blocklist-by": "دبۊدگر کيا",
+       "blocklist-nousertalk": "مننه خۊ گبˇ ولگه دچينواچين بکۊنه",
+       "blocklink": "دبۊستن",
+       "contribslink": "ىاوري‌ئن",
+       "block-log-flags-nousertalk": "مننه خۊ گبˇ ولگه دچينواچين بکۊنه",
+       "block-log-flags-hiddenname": "دۊخۊسانئه کارگيري نؤم",
+       "movecategorypage-warning": "<strong>اخظار:</strong> شمه جرگه ولگه جابجا کأدرين. شيمه حواس بمؤنه کي فقط ولگ جابجا بنه ؤ ولگؤن قديمي جرگه مئن مؤنن ؤ تازه جرگه مئن <em>نشنن</em>.",
+       "cant-move-category-page": "شمه اجازه ندأنين جرگهٰ‌نˇ ولگه جابجا بکۊنين.",
+       "cant-move-to-category-page": "شمه ايجازه ندأنين ىکته ولگه ببرين ىکته جرگه ولگˇ مئن.",
+       "movelogpage": "جابجا گۊدنˇ سياهه",
+       "protectedpagemovewarning": "'''فأندرين:''' اي ولگ قؤفلأبؤره ؤ خالي اۊ کارگيرؤني که کياگري دسفأرسه دأن تينن اينه جابجا بۊکۊنن. آخري مؤردؤن اي ليستˇ مئن دره:",
+       "export-addcattext": "جرگه جي ولگ اضافه گۊدن:",
+       "thumbnail-more": "پيلله گۊدن",
+       "tooltip-pt-userpage": "{{جنس:|شيمي کارگير}} ولگ",
+       "tooltip-pt-mytalk": "{{جنس:|شيمي}} گبˇ ولگ",
+       "tooltip-pt-preferences": "{{جنس:|شيمي}} ترجيحات",
+       "tooltip-pt-login": "بئتره ديرين بشين؛ بسچی گه ايجباری نیه.",
+       "tooltip-pt-logout": "بيرين شؤن",
+       "tooltip-pt-createaccount": "بئتره کارگیري حساب چاکۊنين ؤ ديرين بشين؛ بسچي که حساب چاؤدن ايجباری نیه.",
+       "tooltip-ca-talk": "گب راجه به ولگˇ مؤحتوا",
+       "tooltip-ca-edit": "اي ولگه دچينواچين بۊکۊنين",
+       "tooltip-ca-addsection": "ىکته تازه وابين چاکۊن",
+       "tooltip-ca-history": "اي ولگˇ قديمي نۊسخه'ن",
+       "tooltip-ca-protect": "أ ولگه بپا",
+       "tooltip-ca-move": "اي ولگه جابجا گۊدن",
+       "tooltip-ca-watch": "اي ولگه علاوه بکۊن تي پىگيري ليسته",
+       "tooltip-search": "{{SITENAME}} مئن وامج",
+       "tooltip-search-go": "بشۊ ىکته ولگˇ مئن کي هي نؤمه بدأره",
+       "tooltip-search-fulltext": "اي وؤتˇ ولگؤنˇ مئن وامج",
+       "tooltip-p-logo": "گتˇ ولگه بىن",
+       "tooltip-n-mainpage": "گتˇ ولگه بىن",
+       "tooltip-n-mainpage-description": "گتˇ ولگه بىن",
+       "tooltip-n-portal": "راجه به پؤرؤژه، اۊنچی تينين بکۊنين، اؤره کي چیزؤنه ىاجنين",
+       "tooltip-n-recentchanges": "ىکته ليست، ويکي آخري تغىيرؤنˇ جي",
+       "tooltip-n-randompage": "ىکته کترئي ولگه أردن",
+       "tooltip-n-help": "فأمسن ؤ آؤجا هأىتنˇ جيگه",
+       "tooltip-t-whatlinkshere": "ىکته ليست همته ولگؤنˇ جي کي ائره خال ببؤن",
+       "tooltip-feed-atom": "أتۊمˇ خبرنامه اي ولگˇ شي",
+       "tooltip-t-upload": "فاىلؤنه جؤراکشئن",
+       "tooltip-t-specialpages": "ىکته ليست، همه ته خاصˇ ولگؤن جي",
+       "tooltip-t-print": "اي ولگˇ چاپي وؤت",
+       "tooltip-ca-nstab-main": "مۊحتوياتˇ ولگه دئن",
+       "tooltip-ca-nstab-user": "کارگيرˇ ولگه دئن",
+       "tooltip-ca-nstab-special": "اي ىکته خاصˇ ولگه ؤ نشأنه دچينواچين گۊدن.",
+       "tooltip-ca-nstab-image": "فاىلˇ ولگه دئن",
+       "tooltip-ca-nstab-template": "قالبه دئن",
+       "tooltip-ca-nstab-category": "جرگه ولگه دئن",
+       "tooltip-save": "شيمه تغىيرؤنه ذخيره بکۊنين",
+       "tooltip-preview": "شيمئه تغىيرؤنˇ پيشادئن. هلئه ثبت نۊده، اي کيليده کاراگيرين.",
+       "tooltip-rollback": "\"پساوگردان\" اي ولگˇ آخري دچينواچينگرˇ دچينواچينؤنه ىکته تنگۊلى أجي خؤنثا کؤنه.",
+       "pageinfo-header-restrictions": "ولگه پأسن",
+       "pageinfo-hidden-categories": "جخۊته {{PLURAL:$1| جرگه|جرگه}} ( $1 )",
+       "pageinfo-toolboxlink": "ولگˇ اطلاعات",
+       "pageinfo-category-info": "جرگه اطلاعات",
+       "file-info-size": "<span dir=\"ltr\">$1 × $2</span> پیکسل، فاىلˇ واويراز: $3، نوع MIME فاىل: $4",
+       "show-big-image": "أصلˇ فاىل",
+       "show-big-image-size": "<span dir=\"ltr\">$1 × $2</span> پيکسل",
+       "metadata": "گتˇ دىتا",
+       "metadata-fields": "اي پىغؤمˇ مئنˇ نۊشؤن بدأ تاتاىي گتˇ دىتا'ن، وختي کي تاتاىي گتˇ دىتا'نˇ جدول جمأبؤبي، هندئه نۊشؤن بدأ بنه. باخيˇ مؤردؤن خالي اۊ زمت نۊشؤن بدأ بنه کي اۊ جدول وابۊبۊن.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-model": "دۊربينˇ مؤدل",
+       "exif-software": "کارىته-بۊبؤ نرمبزار",
+       "exif-colorspace": "رنگي فضا",
+       "exif-iimcategory": "جرگه",
+       "exif-orientation-1": "عادي",
+       "namespacesall": "همه",
+       "monthsall": "همه",
+       "specialpages": "خاصˇ ولگؤن",
+       "specialpages-group-login": "ديرين/ثبتˇ نؤم",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|تگ|تگؤن}}]]: $2)",
+       "logentry-newusers-create": "کارگيري حساب $1 {{GENDER:$2|چاگۊده-بۊبؤ}}",
+       "searchsuggest-search": "وامج",
+       "expand_templates_preview": "پيشادئن",
+       "default-skin-not-found": "اؤخ! پيشفرضˇ قالبي که شيمه ويکي ئبه <code dir=\"ltr\"<$wgDefaultSkin</code> مئن تعريف ببؤ به عنوانˇ <code>$1</code>، دسفرس نيه.\n\nبه نظر می‌آید نصب شما شامل پوسته‌های زیر می‌شود. [https://www.mediawiki.org/wiki/Manual:Skin_configuration راهنما: تنظیمات پوسته] را برای کسب اطلاعات در باره چگونگی فعال‌ساختن آن‌ها و انتخاب پیش‌فرض ببینید.\n\n$2\n\n; اگر اخیراً مدیاویکی را نصب کرده‌اید:\n: احتمالاً از گیت، یا به طور مستقیم از کد مبدأ که از چند متد دیگر استفاده می‌کند نصب کردید. انتظار می‌رود. چند {{PLURAL:$4|پوسته|پوسته}} از [https://www.mediawiki.org/wiki/Category:All_skins فهرست پوسته mediawiki.org] نصب کنید، که همراه چندین پوسته و افزونه هستند. شما می‌توانید شاخه <code>skins/</code> را از آن نسخه‌برداری کرده و بچسبانید.\n\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins استفاده از گیت برای دریافت پوسته‌ها].\n: انجام این کار با مخزن گیت‌تان تداخل نمی‌کند اگر توسعه‌دهنده مدیاویکی هستید.\n\n; اگر اخیراً مدیاویکی را ارتقاء دادید:\n: مدیاویکی ۱٫۲۴ و تازه‌تر دیگر به طور خودکار پوسته‌های نصب‌شده را فعال نمی‌کند ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery راهنما: کشف خودکار پوسته] را ببینید). شما می‌توانید خطوط زیر را به داخل <code>LocalSettings.php</code> بچسبانید تا {{PLURAL:$5|همه|همه}} پوسته‌های نصب‌شده را فعال کنید:\n\n<pre dir=\"ltr\">$3</pre>\n\n; اگر اخیراً <code>LocalSettings.php</code> را تغییر دادید:\n: نام پوسته‌ها را برای غلط املایی دوباره بررسی کنید."
 }
index 44c0b66..d4040cb 100644 (file)
        "logentry-newusers-create": "उपयोगकत्याचें $1 {{GENDER:$2|तयार केलें}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|अपलोड केला}} $3",
        "searchsuggest-search": "सोद",
+       "special-characters-group-latin": "रोमी",
+       "special-characters-group-latinextended": "रोमी (आनिंक-उइ)",
+       "special-characters-group-ipa": "IPA",
+       "special-characters-group-greek": "ग्रीक",
+       "special-characters-group-greekextended": "ग्रीक (आनिंक-उइ)",
+       "special-characters-group-cyrillic": "रश्यन",
+       "special-characters-group-arabic": "अरबी",
+       "special-characters-group-arabicextended": "अरबी (आनिंक-उइ)",
+       "special-characters-group-persian": "पार्सी",
+       "special-characters-group-hebrew": "हेब्रेव",
+       "special-characters-group-bangla": "बंगाली",
+       "special-characters-group-tamil": "तमिळ",
+       "special-characters-group-telugu": "तेलुगु",
+       "special-characters-group-sinhala": "सिंगालेज़",
+       "special-characters-group-gujarati": "गुजराती",
+       "special-characters-group-devanagari": "नगरी",
+       "special-characters-group-thai": "थाई",
+       "special-characters-group-lao": "लाओ",
+       "special-characters-group-khmer": "ख्मेर",
        "mw-widgets-dateinput-no-date": "तारीख निवडूंक ना",
        "mw-widgets-dateinput-placeholder-day": "वर्स-म्हयनो-दीस",
        "mw-widgets-dateinput-placeholder-month": "वर्स-म्हयनो"
index 65dfc1a..975cb88 100644 (file)
        "logentry-newusers-create": "Vapurpeacho kont $1 {{GENDER:$2|rochlam}}",
        "logentry-upload-upload": "$1-an $3 {{GENDER:$2|upload kela}}",
        "searchsuggest-search": "Sod",
+       "special-characters-group-latin": "Romi",
+       "special-characters-group-latinextended": "Romi (anink-ui)",
+       "special-characters-group-ipa": "IPA",
+       "special-characters-group-greek": "Grik",
+       "special-characters-group-greekextended": "Grik (anink-ui)",
+       "special-characters-group-cyrillic": "Russian",
+       "special-characters-group-arabic": "Arbi",
+       "special-characters-group-arabicextended": "Arbi (anink-ui)",
+       "special-characters-group-persian": "Parsi",
+       "special-characters-group-hebrew": "Hebrev",
+       "special-characters-group-bangla": "Bongali",
+       "special-characters-group-tamil": "Tamil",
+       "special-characters-group-telugu": "Telugu",
+       "special-characters-group-sinhala": "Singales",
+       "special-characters-group-gujarati": "Gujrati",
+       "special-characters-group-devanagari": "Nagari",
+       "special-characters-group-thai": "Thai",
+       "special-characters-group-lao": "Lao",
+       "special-characters-group-khmer": "Khmer",
        "mw-widgets-dateinput-no-date": "Tarikh nivddunk na",
        "mw-widgets-dateinput-placeholder-day": "VVVV-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "VVVV-MM"
index cc62704..0b88513 100644 (file)
                        "Michawiki",
                        "Node ue",
                        "Sajasazi (on got.wikipedia.org)",
-                       "Zylbath"
+                       "Zylbath",
+                       "Espreon",
+                       "Gothicspeaker"
                ]
        },
+       "tog-previewonfirst": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽 𐌰𐍄 𐍆𐍂𐌿𐌼𐌹𐍃𐍄𐌰 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽",
        "underline-always": "Sinteino",
-       "underline-never": "Niu",
-       "sunday": "Sunnonsdags",
-       "monday": "Meninsdags",
-       "tuesday": "Tiwisdags",
-       "wednesday": "Midiwiko",
-       "thursday": "Þeiƕonsdags",
-       "friday": "Fraujonsdags",
-       "saturday": "ð\90\8c¸ð\90\8d\85ð\90\8c°ð\90\8c·ð\90\8c»ð\90\8c¹ð\90\8d\83ð\90\8c³ð\90\8c°ð\90\8c²ð\90\8d\83",
+       "underline-never": "𐌽𐌹 𐌰𐌹𐍅",
+       "sunday": "𐌰𐍆𐌰𐍂𐍃𐌰𐌱𐌱𐌰𐍄𐍉",
+       "monday": "𐌼𐌴𐌽𐌹𐌽𐍃 𐌳𐌰𐌲𐍃",
+       "tuesday": "𐍄𐌴𐌹𐍅𐌹𐍃 𐌳𐌰𐌲𐍃",
+       "wednesday": "𐍅𐍉𐌳𐌰𐌽𐌹𐍃 𐌳𐌰𐌲𐍃",
+       "thursday": "𐌸𐌿𐌽𐌰𐍂𐌹𐍃 𐌳𐌰𐌲𐍃",
+       "friday": "𐍆𐍂𐌰𐌿𐌾𐍉𐌽𐍃 𐌳𐌰𐌲𐍃",
+       "saturday": "ð\90\8d\83ð\90\8c°ð\90\8c±ð\90\8c±ð\90\8c°ð\90\8d\84ð\90\8d\89",
        "sun": "𐍃𐌿𐌽",
        "mon": "𐌼𐌴𐌽",
-       "tue": "ð\90\8c°ð\90\8d\82ð\90\8c´",
+       "tue": "ð\90\8d\84ð\90\8c´ð\90\8c¹ð\90\8d\85",
        "wed": "𐍅𐍉𐌳",
-       "thu": "ð\90\8d\80ð\90\8c°ð\90\8c¹",
-       "fri": "ð\90\8d\86ð\90\8d\82ð\90\8c¹",
+       "thu": "ð\90\8c¸ð\90\8c¿ð\90\8c½",
+       "fri": "ð\90\8d\86ð\90\8d\82ð\90\8c°ð\90\8c¿",
        "sat": "𐍃𐌰𐌼",
-       "january": "ð\90\8c°ð\90\8d\86ð\90\8d\84ð\90\8c¿ð\90\8c¼ð\90\8c° ð\90\8c¾ð\90\8c¹ð\90\8c¿ð\90\8c»𐌴𐌹𐍃",
-       "february": "ð\90\8d\86ð\90\8c°ð\90\8c½ð\90\8c¹ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸𐍃",
-       "march": "ð\90\8cºð\90\8c°ð\90\8c»ð\90\8c³ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸𐍃",
-       "april": "ð\90\8c²ð\90\8d\82ð\90\8c°ð\90\8d\83ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸𐍃",
-       "may_long": "ð\90\8c±ð\90\8c»ð\90\8d\89ð\90\8c¼ð\90\8c°ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸𐍃",
-       "june": "ð\90\8d\85ð\90\8c°ð\90\8d\82ð\90\8c¼ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸𐍃",
-       "july": "ð\90\8c·ð\90\8c°ð\90\8d\85ð\90\8c¹ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸𐍃",
-       "august": "ð\90\8c°ð\90\8d\83ð\90\8c°ð\90\8c½ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸𐍃",
-       "september": "ð\90\8c°ð\90\8cºð\90\8d\82ð\90\8c°ð\90\8c½ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸ð\90\8d\83",
-       "october": "ð\90\8d\85ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸ð\90\8d\83",
-       "november": "ð\90\8d\86ð\90\8d\82ð\90\8c¿ð\90\8c¼ð\90\8c° ð\90\8c¾ð\90\8c¹ð\90\8c¿ð\90\8c»ð\90\8c´ð\90\8c¹ð\90\8d\83",
+       "january": "ð\90\8c¾ð\90\8c°ð\90\8c½ð\90\8c¿ð\90\8c°ð\90\8d\82𐌴𐌹𐍃",
+       "february": "ð\90\8d\86ð\90\8c°ð\90\8c¹ð\90\8c±ð\90\8d\82ð\90\8c¿ð\90\8c°ð\90\8d\82ð\90\8c´ð\90\8c¹𐍃",
+       "march": "ð\90\8c¼ð\90\8c°ð\90\8d\82ð\90\8d\84ð\90\8c¹ð\90\8c¿𐍃",
+       "april": "ð\90\8c°ð\90\8d\80ð\90\8d\82ð\90\8c´ð\90\8c¹ð\90\8c»ð\90\8c¹𐍃",
+       "may_long": "ð\90\8c¼ð\90\8c°ð\90\8c¾ð\90\8c¿𐍃",
+       "june": "ð\90\8c¾ð\90\8c¿ð\90\8c½ð\90\8c¹ð\90\8c¿𐍃",
+       "july": "ð\90\8c¾ð\90\8c¿ð\90\8c»ð\90\8c¹ð\90\8c¿𐍃",
+       "august": "ð\90\8c°ð\90\8c²ð\90\8c¿ð\90\8d\83ð\90\8d\84ð\90\8c¿𐍃",
+       "september": "ð\90\8d\83ð\90\8c°ð\90\8c¹ð\90\8d\80ð\90\8d\84ð\90\8c°ð\90\8c¹ð\90\8c¼ð\90\8c±ð\90\8c°ð\90\8c¹ð\90\8d\82",
+       "october": "ð\90\8c°ð\90\8c¿ð\90\8cºð\90\8d\84ð\90\8d\89ð\90\8c±ð\90\8c°ð\90\8c¹ð\90\8d\82",
+       "november": "ð\90\8c½ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c°ð\90\8c¹ð\90\8c¼ð\90\8c±ð\90\8c°ð\90\8c¹ð\90\8d\82",
        "december": "𐌾𐌹𐌿𐌻𐌴𐌹𐍃",
-       "january-gen": "ð\90\8c°ð\90\8d\86ð\90\8d\84ð\90\8c¿ð\90\8c¼ð\90\8c¹ð\90\8c½ð\90\8d\83 ð\90\8c¾ð\90\8c¹ð\90\8c¿ð\90\8c»ð\90\8c´ð\90\8c¹𐍃",
-       "february-gen": "ð\90\8d\86ð\90\8c°ð\90\8c½ð\90\8c¹ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸ð\90\8c¹𐍃",
-       "march-gen": "ð\90\8cºð\90\8c°ð\90\8c»ð\90\8c³ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸ð\90\8c¹𐍃",
-       "april-gen": "ð\90\8c²ð\90\8d\82ð\90\8c°ð\90\8d\83ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸𐌹𐍃",
-       "may-gen": "ð\90\8c±ð\90\8c»ð\90\8d\89ð\90\8c¼ð\90\8c°ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸ð\90\8c¹𐍃",
-       "june-gen": "ð\90\8d\85ð\90\8c°ð\90\8d\82ð\90\8c¼ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸ð\90\8c¹𐍃",
-       "july-gen": "ð\90\8c·ð\90\8c°ð\90\8d\85ð\90\8c¹ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸ð\90\8c¹𐍃",
-       "august-gen": "ð\90\8c°ð\90\8d\83ð\90\8c°ð\90\8c½ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸ð\90\8c¹𐍃",
-       "september-gen": "ð\90\8c°ð\90\8cºð\90\8d\82ð\90\8c°ð\90\8c½ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸ð\90\8c¹ð\90\8d\83",
-       "october-gen": "ð\90\8d\85ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸ð\90\8c¹ð\90\8d\83",
-       "november-gen": "ð\90\8d\86ð\90\8d\82ð\90\8c¿ð\90\8c¼ð\90\8c¹ð\90\8c½ð\90\8d\83 ð\90\8c¾ð\90\8c¹ð\90\8c¿ð\90\8c»ð\90\8c´ð\90\8c¹ð\90\8d\83",
-       "december-gen": "ð\90\8c¾ð\90\8c¹ð\90\8c¿ð\90\8c»ð\90\8c´ð\90\8c¹𐍃",
-       "jan": "ð\90\8c°ð\90\8d\86ð\90\8d\84",
+       "january-gen": "ð\90\8c¾ð\90\8c°ð\90\8c½ð\90\8c¿ð\90\8c°ð\90\8d\82ð\90\8c¾ð\90\8d\89𐍃",
+       "february-gen": "ð\90\8d\86ð\90\8c°ð\90\8c¹ð\90\8c±ð\90\8d\82ð\90\8c¿ð\90\8c°ð\90\8d\82ð\90\8c¾ð\90\8d\89𐍃",
+       "march-gen": "ð\90\8c¼ð\90\8c°ð\90\8d\82ð\90\8d\84ð\90\8c¹ð\90\8c°ð\90\8c¿𐍃",
+       "april-gen": "ð\90\8c°ð\90\8d\80ð\90\8d\82ð\90\8c´ð\90\8c¹ð\90\8c»𐌹𐍃",
+       "may-gen": "ð\90\8c¼ð\90\8c°ð\90\8c¾ð\90\8c°ð\90\8c¿𐍃",
+       "june-gen": "ð\90\8c¾ð\90\8c¿ð\90\8c½ð\90\8c¹ð\90\8c°ð\90\8c¿𐍃",
+       "july-gen": "ð\90\8c¾ð\90\8c¿ð\90\8c»ð\90\8c¹ð\90\8c°ð\90\8c¿𐍃",
+       "august-gen": "ð\90\8c°ð\90\8c²ð\90\8c¿ð\90\8d\83ð\90\8d\84ð\90\8c°ð\90\8c¿𐍃",
+       "september-gen": "ð\90\8d\83ð\90\8c°ð\90\8c¹ð\90\8d\80ð\90\8d\84ð\90\8c°ð\90\8c¹ð\90\8c¼ð\90\8c±ð\90\8c°ð\90\8c¹ð\90\8d\82",
+       "october-gen": "ð\90\8c°ð\90\8c¿ð\90\8cºð\90\8d\84ð\90\8d\89ð\90\8c±ð\90\8c°ð\90\8c¹ð\90\8d\82",
+       "november-gen": "ð\90\8c½ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c°ð\90\8c¹ð\90\8c¼ð\90\8c±ð\90\8c°ð\90\8c¹ð\90\8d\82",
+       "december-gen": "ð\90\8c¾ð\90\8c¹ð\90\8c¿ð\90\8c»ð\90\8c¾ð\90\8d\89𐍃",
+       "jan": "ð\90\8c¾ð\90\8c°ð\90\8c½",
        "feb": "𐍆𐌰𐌽",
-       "mar": "𐌺𐌰𐌻",
-       "apr": "𐌲𐍂𐌰",
-       "may": "𐌱𐌻𐍉",
-       "jun": "𐍅𐌰𐍂",
-       "jul": "𐌷𐌰𐍅",
-       "aug": "𐌰𐍃𐌰",
-       "sep": "𐌰𐌺𐍂",
-       "oct": "𐍅𐌴𐌹",
-       "nov": "𐍆𐍂𐌿",
-       "dec": "𐌾𐌹𐌿",
-       "pagecategories": "{{PLURAL:$1|𐌷𐌰𐌽𐍃𐌰|𐌷𐌰𐌽𐍃𐍉𐍃}}",
-       "category_header": "𐍃𐌴𐌹𐌳𐍉𐍃 𐌹𐌽𐌽 𐌺𐌿𐌽𐌾𐌰 \"$1\"",
-       "subcategories": "Dalaþkunjos",
+       "mar": "𐌼𐌰𐍂",
+       "apr": "𐌰𐍀𐍂",
+       "may": "𐌼𐌰𐌾",
+       "jun": "𐌾𐌿𐌽",
+       "jul": "𐌾𐌿𐌻",
+       "aug": "𐌰𐍀𐍂",
+       "sep": "𐍃𐌰𐌹𐍀",
+       "oct": "𐌰𐌿𐌺",
+       "nov": "𐌽𐌰𐌿𐌱",
+       "dec": "𐌳𐌰𐌹𐌺",
+       "january-date": "𐌾𐌰𐌽𐌿𐌰𐍂𐌴𐌹𐍃 $1",
+       "february-date": "𐍆𐌰𐌹𐌱𐍂𐌿𐌰𐍂𐌴𐌹𐍃 $1",
+       "march-date": "𐌼𐌰𐍂𐍄𐌹𐌿𐍃 $1",
+       "april-date": "𐌰𐍀𐍂𐌹𐌻𐌹𐍃 $1",
+       "september-date": "𐍃𐌰𐌹𐍀𐍄𐌰𐌹𐌼𐌱𐌰𐌹𐍂 $1",
+       "november-date": "𐌽𐌰𐌿𐌱𐌰𐌹𐌼𐌱𐌰𐌹𐍂 $1",
+       "pagecategories": "{{PLURAL:$1|𐌺𐌿𐌽𐌹|𐌺𐌿𐌽𐌾𐌰}}",
+       "category_header": "𐌻𐌰𐌿𐌱𐍉𐍃 𐌹𐌽 𐌺𐌿𐌽𐌾𐌰 \"$1\"",
+       "subcategories": "𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽𐌰 𐌺𐌿𐌽𐌾𐌰",
        "category-media-header": "𐌼𐌴𐌳𐌾𐌰 𐌹𐌽𐌽 𐌺𐌿𐌽𐌾𐌰 \"$1\"",
-       "hidden-categories": "{{PLURAL:$1|𐍆𐌿𐌻𐌲𐌹𐌽𐍃 𐌺𐌰𐍄𐌴𐌲𐍉𐍂𐌹|𐍆𐌿𐌻𐌲𐌹𐌽𐌰𐌹 𐌺𐌰𐍄𐌴𐌲𐍉𐍂𐌾𐍉𐍃}}",
-       "about": "𐌿𐍆𐌰𐍂",
-       "article": "𐍃𐌰𐌸𐍃𐍃𐌴𐌹𐌳𐍉",
-       "newwindow": "(𐌰𐌽𐌳𐌷𐌿𐌻𐌾𐌹𐌸 𐌹𐌽𐌽 𐌽𐌹𐌿𐌾𐌰 𐌰𐌿𐌲𐌰𐌳𐌰𐌿𐍂𐍉)",
-       "cancel": "𐌷𐌰𐌻𐍄𐍃",
+       "hidden-categories": "{{PLURAL:$1|𐌰𐍆𐍆𐌹𐌻𐌷𐌰𐌽 𐌺𐌿𐌽𐌹|𐌰𐍆𐍆𐌹𐌻𐌷𐌰𐌽𐌰 𐌺𐌿𐌽𐌾𐌰}}",
+       "hidden-category-category": "𐌰𐍆𐍆𐌹𐌻𐌷𐌰𐌽𐌰 𐌺𐌿𐌽𐌾𐌰",
+       "category-subcat-count": "{{PLURAL:$2|𐌸𐌰𐍄𐌰 𐌺𐌿𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐌸 𐌸𐌰𐍄𐌴𐌹𐌽𐌴𐌹 𐌹𐍆𐍄𐌿𐌼 𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽 𐌺𐌿𐌽𐌹|𐌸𐌰𐍄𐌰 𐌺𐌿𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐌸 {{PLURAL:$1|𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽 𐌺𐌿𐌽𐌹|𐌹𐍆𐍄𐌿𐌼𐌰 $1 𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽𐌰 𐌺𐌿𐌽𐌾𐌰}}, 𐌰𐌻𐌻𐌰𐌹𐌶𐌴 $2 𐌺𐌿𐌽𐌾𐌴.}}",
+       "category-subcat-count-limited": "𐌸𐌰𐍄𐌰 𐌺𐌿𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐌸 𐌹𐍆𐍄𐌿𐌼𐍉𐌽/𐌹𐍆𐍄𐌿𐌼𐍉𐌽𐌰\n{{PLURAL:$1|𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽 𐌺𐌿𐌽𐌹|$1 𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽𐌰 𐌺𐌿𐌽𐌾𐌰}}.",
+       "category-article-count": "{{PLURAL:$2|𐌸𐌰𐍄𐌰 𐌺𐌿𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐌸 𐌸𐌰𐍄𐌰𐌹𐌽𐌴𐌹 𐌹𐍆𐍄𐌿𐌼𐌰𐌽 𐌻𐌰𐌿𐍆.|𐌹𐍆𐍄𐌿𐌼𐌰(𐌽𐍃) {{PLURAL:$1|𐌻𐌰𐌿𐍆𐍃 𐌹𐍃𐍄|$1 𐌻𐌰𐌿𐌱𐍉𐍃 𐍃𐌹𐌽𐌳}} 𐌹𐌽 𐌸𐌰𐌼𐌼𐌰 𐌺𐌿𐌽𐌾𐌰, 𐌰𐌻𐌻𐌰𐌹𐌶𐌴 $2 𐌻𐌰𐌿𐌱𐌴.}}",
+       "about": "𐌱𐌹",
+       "article": "𐌷𐌰𐌱𐌰𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃",
+       "newwindow": "(𐌿𐍃𐌻𐌿𐌺𐌹𐌸 𐌹𐌽 𐌽𐌹𐌿𐌾𐌰𐌼𐌼𐌰 𐌰𐌿𐌲𐌰𐌳𐌰𐌿𐍂𐌹𐌽)",
+       "cancel": "𐍃𐍅𐌴𐌹𐌱",
        "moredotdotdot": "𐌼𐌰𐌹𐍃...",
-       "mypage": "ð\90\8c¼ð\90\8c´ð\90\8c¹ð\90\8c½ ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89",
-       "mytalk": "ð\90\8c¼ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c° ð\90\8c¼ð\90\8c°ð\90\8c¸ð\90\8c»ð\90\8c´ð\90\8c¹",
-       "navigation": "ð\90\8d\85ð\90\8c¹ð\90\8c²ð\90\8c°ð\90\8d\84ð\90\8c°ð\90\8c¿ð\90\8c·ð\90\8d\84𐍃",
+       "mypage": "ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8d\86ð\90\8d\83",
+       "mytalk": "ð\90\8c²ð\90\8c°ð\90\8d\85ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c³ð\90\8c¾ð\90\8c°",
+       "navigation": "ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c°ð\90\8c²ð\90\8c°ð\90\8d\85ð\90\8c¹ð\90\8d\83ð\90\8d\83ð\90\8c´ð\90\8c¹𐍃",
        "and": "𐌾𐌰𐌷",
-       "qbfind": "𐍃𐍉𐌺𐌴𐌹𐌸",
-       "qbedit": "𐌼𐌰𐌹𐌳𐌾𐌰𐌽",
-       "qbmyoptions": "𐌼𐌴𐌹𐌽𐌰 𐍃𐌴𐌹𐌳𐍉𐍃",
-       "actions": "𐍅𐌰𐌿𐍂𐍃𐍄𐍅𐌴𐌹𐌽𐍃",
-       "namespaces": "𐍃𐌴𐌹𐌳𐍉𐍃𐍄𐌰𐌸𐌴𐌹𐍃",
-       "variants": "𐌼𐌹𐍃𐍃𐌰𐌻𐌴𐌹𐌽𐍃",
-       "errorpagetitle": "𐍆𐌰𐌹𐍂𐌹𐌽𐌰 𐌳𐍅𐌰𐌻𐌹𐍃",
-       "returnto": "𐌲𐌰𐍅𐌰𐌽𐌳𐌾𐌰𐌽 𐌰𐍄 $1.",
+       "qbfind": "𐌱𐌹𐌲𐌹𐍄",
+       "qbedit": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹",
+       "qbpageoptions": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃",
+       "qbmyoptions": "𐌼𐌴𐌹𐌽𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃",
+       "actions": "𐍄𐍉𐌾𐌰",
+       "namespaces": "𐌽𐌰𐌼𐌰𐍂𐌿𐌼𐌰",
+       "variants": "𐌼𐌹𐍃𐍃𐌰𐌻𐌴𐌹𐌺",
+       "errorpagetitle": "𐌰𐌹𐍂𐌶𐌴𐌹",
+       "returnto": "𐌲𐌰𐍅𐌰𐌽𐌳𐌴𐌹 𐌳𐌿 $1.",
        "tagline": "𐍆𐍂𐌰𐌼 {{SITENAME}}",
        "help": "𐌷𐌹𐌻𐍀𐌰",
-       "search": "𐍃𐍉𐌺𐌾𐌰𐌽",
-       "searchbutton": "𐍃𐍉𐌺𐌾𐌰𐌽",
-       "go": "𐌲𐌰𐌲𐌲𐌰",
-       "searcharticle": "𐌰𐍆𐌲𐌰𐌲𐌲𐌰𐌽",
-       "history": "𐌰𐌹𐍂𐌹𐍃 𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 𐌰𐌽𐌰 𐍃𐌴𐌹𐌳𐍉",
-       "history_short": "𐌰𐌹𐍂𐌹𐍃 𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
-       "printableversion": "𐍅𐍂𐌴𐌹𐍄𐌼𐌰𐌷𐍄𐌴𐌹𐌲 𐍃𐌴𐌹𐌳𐍉",
-       "permalink": "𐍃𐌹𐌽𐍄𐌴𐌹𐌽𐍉 𐍃𐍄𐌰𐌽𐌳𐌰𐌽𐍃 𐌻𐌴𐌹𐌽𐌺𐌰",
-       "view": "Saíhvan",
-       "edit": "𐌼𐌰𐌹𐌳𐌾𐌰𐌽",
-       "create": "𐍃𐌺𐌰𐍀𐌾𐌰𐌽",
-       "editthispage": "𐌼𐌰𐌹𐌳𐌾𐌰 𐌸𐍉 𐍃𐌴𐌹𐌳𐍉",
-       "create-this-page": "Skapja þo seido",
-       "delete": "𐍄𐌰𐌹𐍂𐌰𐌽",
-       "deletethispage": "𐍄𐌰𐌹𐍂𐌰 𐌸𐍉 𐍃𐌴𐌹𐌳𐍉",
-       "protect": "𐌱𐌰𐌹𐍂𐌲𐌰𐌽",
-       "protect_change": "𐌼𐌰𐌹𐌳𐌾𐌰𐌽",
-       "protectthispage": "Baírga þo siedo",
-       "unprotect": "𐌽𐌹𐌱𐌰𐌹𐍂𐌲𐌰",
-       "unprotectthispage": "Nibaírga þo siedo",
-       "newpage": "𐌽𐌹𐌿𐌾𐌰 𐍃𐌴𐌹𐌳𐍉",
-       "talkpage": "𐌼𐌰𐌸𐌻𐌴𐌹𐍃𐌴𐌹𐌳𐍉",
+       "search": "𐍃𐍉𐌺𐌴𐌹",
+       "searchbutton": "𐍃𐍉𐌺𐌴𐌹",
+       "go": "𐌲𐌰𐌲𐌲",
+       "searcharticle": "𐌲𐌰𐌲𐌲",
+       "history": "𐌻𐌰𐌿𐌱𐌰𐍃𐍀𐌹𐌻𐌻",
+       "history_short": "𐍃𐍀𐌹𐌻𐌻",
+       "printableversion": "𐌿𐍃𐌼𐌴𐍂𐌴𐌹𐌽𐍃 𐌳𐌿 𐌿𐍃𐌼𐌴𐌻𐌾𐌰𐌽",
+       "permalink": "𐌰𐌹𐍅𐌴𐌹𐌽𐌰 𐌲𐌰𐍅𐌹𐍃𐍃",
+       "print": "𐌿𐍃𐌼𐌴𐌻𐌴𐌹",
+       "view": "𐍃𐌰𐌹𐍈",
+       "view-foreign": "𐍃𐌰𐌹𐍈 𐌰𐌽𐌰 $1",
+       "edit": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹",
+       "create": "𐍃𐌺𐌰𐍀𐌴𐌹",
+       "editthispage": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
+       "create-this-page": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
+       "delete": "𐍆𐍂𐌰𐌵𐌹𐍃𐍄𐌴𐌹",
+       "deletethispage": "𐍆𐍂𐌰𐌵𐌹𐍃𐍄𐌴𐌹 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰",
+       "undeletethispage": "𐌽𐌰𐍃𐌴𐌹 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
+       "protect": "𐍆𐍂𐌹𐌸",
+       "protect_change": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹",
+       "protectthispage": "𐍆𐍂𐌹𐌸 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
+       "unprotect": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹 𐌼𐌿𐌽𐌳",
+       "unprotectthispage": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹 𐌼𐌿𐌽𐌳 𐌸𐌹𐍃 𐌻𐌰𐌿𐌱𐌹𐍃",
+       "newpage": "𐌽𐌹𐌿𐌾𐌹𐍃 𐌻𐌰𐌿𐍆𐍃",
+       "talkpage": "𐍂𐍉𐌳𐌴𐌹 𐌱𐌹 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
        "talkpagelinktext": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰",
-       "specialpage": "𐌿𐍃𐍃𐌹𐌽𐌳𐍃𐌴𐌹𐌳𐍉𐍃",
-       "personaltools": "ð\90\8d\85ð\90\8c°ð\90\8c¹ð\90\8d\82ð\90\8c»ð\90\8c´ð\90\8c¹ð\90\8cºð\90\8d\83 ð\90\8c±ð\90\8d\82ð\90\8c¿ð\90\8cºð\90\8d\85ð\90\8c°ð\90\8c¹ð\90\8c·ð\90\8d\84𐍃",
+       "specialpage": "𐌿𐍃𐍃𐌹𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃",
+       "personaltools": "ð\90\8d\83ð\90\8d\85ð\90\8c´ð\90\8d\83ð\90\8c°ð\90\8c¹ ð\90\8d\83ð\90\8c°ð\90\8d\82ð\90\8d\85ð\90\8c°ð\90\8c½𐍃",
        "talk": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰",
-       "views": "𐌷𐌹𐍅𐌾𐍉𐍃",
-       "toolbox": "𐍄𐌰𐌿𐌹 𐌰𐍂𐌺𐌰",
-       "otherlanguages": "𐌰𐌽𐌸𐌰𐍂 𐍂𐌰𐌶𐌳𐍉𐍃",
-       "redirectedfrom": "(𐌽𐌰𐌿𐌸𐌾𐌰𐌽 𐍆𐍂𐌰𐌼𐌹𐍃 $1)",
-       "redirectpagesub": "𐍄𐌰𐌹𐌺𐌾𐌰𐍃𐌴𐌹𐌳𐍉",
-       "lastmodifiedat": "𐌸𐌰𐍄𐌰 𐍃𐌴𐌹𐌳𐍉 𐍃𐌹𐌽𐌳 𐌼𐌰𐌽𐌰𐌲𐌹𐍃𐍄𐍃 𐌽𐌹𐌿𐌾𐌰 𐌼𐌰𐌹𐌳𐌾𐌹𐌸𐍃 ($2) ($1)",
-       "jumpto": "𐌲𐌰𐌲𐌲𐌰𐌽 𐌰𐍄:",
-       "jumptonavigation": "𐍃𐌴𐌹𐌳𐍉𐌲𐌰𐍅𐌹𐍃𐍃",
-       "jumptosearch": "𐍃𐍉𐌺𐌴𐌹𐌸",
-       "aboutsite": "𐍆𐍂𐌰𐌼 {{SITENAME}}",
-       "aboutpage": "Project:𐌿𐍆𐌰𐍂",
+       "views": "𐍃𐌹𐌿𐌽𐌴𐌹𐍃",
+       "toolbox": "𐍃𐌰𐍂𐍅𐌰𐌽𐍃",
+       "projectpage": "𐌰𐌽𐌳𐌷𐌿𐌻𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍅𐌰𐌿𐍂𐍀𐌰𐌻𐌰𐌿𐍆",
+       "viewhelppage": "𐌰𐌽𐌳𐌷𐌿𐌻𐌴𐌹 𐌷𐌹𐌻𐍀𐌰𐌻𐌰𐌿𐍆",
+       "otherlanguages": "𐌰𐌽𐌸𐌰𐍂𐌰𐌹𐌼 𐍂𐌰𐌶𐌳𐍉𐌼",
+       "redirectedfrom": "(𐌹𐍃 𐍄𐌹𐌿𐌷𐌰𐌽𐍃/𐍄𐌹𐌿𐌷𐌰𐌽𐌰 𐌷𐌹𐌳𐍂𐌴 𐍆𐍂𐌰𐌼 $1)",
+       "redirectpagesub": "𐌰𐌻𐌾𐌰𐍂 𐌱𐍂𐌹𐌲𐌲𐌰𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃",
+       "lastmodifiedat": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃 𐌸𐌰𐍄𐌰 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌸𐍃 𐍅𐌰𐍃 ($1) ($2).",
+       "protectedpage": "𐍆𐍂𐌹𐌸𐍉𐌽𐍃 𐌻𐌰𐌿𐍆𐍃",
+       "jumpto": "𐌲𐌰𐌲𐌲 𐌳𐌿:",
+       "jumptonavigation": "𐌻𐌰𐌿𐌱𐌰𐌲𐌰𐍅𐌹𐍃𐍃𐌴𐌹𐍃",
+       "jumptosearch": "𐍃𐍉𐌺𐌴𐌹",
+       "pool-errorunknown": "𐌽𐌰𐍃𐌴𐌹 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
+       "aboutsite": "𐌱𐌹 {{SITENAME}}",
+       "aboutpage": "Project:𐌱𐌹",
        "copyrightpage": "{{ns:project}}:𐌼𐌰𐌽𐌻𐌴𐌹𐌺𐌰𐍅𐌹𐍄𐍉𐌸𐌰",
        "currentevents": "𐌽𐌹𐌿𐌾𐌰 𐍅𐌰𐌹𐌷𐍄𐍃",
        "currentevents-url": "Project:𐌽𐌹𐌿𐌾𐌰 𐍅𐌰𐌹𐌷𐍄𐍃",
-       "disclaimers": "ð\90\8d\85ð\90\8c°ð\90\8c³ð\90\8c¾ð\90\8d\89ð\90\8c±ð\90\8c¹ð\90\8c»ð\90\8c°ð\90\8c²ð\90\8c´ð\90\8c¹ð\90\8c½𐍃",
-       "disclaimerpage": "Project:ð\90\8d\85ð\90\8c°ð\90\8c³ð\90\8c¾ð\90\8c¹ð\90\8d\83 ð\90\8c±ð\90\8c¹ð\90\8c»ð\90\8c°ð\90\8c²ð\90\8c´ð\90\8c¹ð\90\8c½𐍃",
+       "disclaimers": "ð\90\8c²ð\90\8c°ð\90\8d\82ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\89ð\90\8d\83 ð\90\8d\82ð\90\8c°ð\90\8c¹ð\90\8c·ð\90\8d\84ð\90\8c°ð\90\8c¹𐍃",
+       "disclaimerpage": "Project:ð\90\8c²ð\90\8c°ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c½ð\90\8c° ð\90\8c²ð\90\8c°ð\90\8d\82ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\83 ð\90\8d\82ð\90\8c°ð\90\8c¹ð\90\8c·ð\90\8d\84ð\90\8c°ð\90\8c¹𐍃",
        "edithelp": "𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐌷𐌹𐌻𐍀𐌰",
-       "mainpage": "ð\90\8c·ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c¹ð\90\8c³ð\90\8c°ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89",
-       "mainpage-description": "ð\90\8c·ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c¹ð\90\8c³ð\90\8c°ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89",
-       "portal": "ð\90\8c±ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c²ð\90\8c¹ð\90\8d\83 ð\90\8c²ð\90\8c°ð\90\8d\85ð\90\8c¹",
-       "portal-url": "Project:ð\90\8c±ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c²ð\90\8c¹ð\90\8d\83 ð\90\8c²ð\90\8c°ð\90\8d\85ð\90\8c¹",
-       "privacy": "ð\90\8d\83ð\90\8c¿ð\90\8c½ð\90\8c³ð\90\8d\82ð\90\8c°ð\90\8d\85ð\90\8c¿ð\90\8d\83 ð\90\8c±ð\90\8c¹ð\90\8c»ð\90\8c°ð\90\8c²ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\83",
-       "privacypage": "Project:ð\90\8d\83ð\90\8c¿ð\90\8c½ð\90\8c³ð\90\8d\82ð\90\8c°ð\90\8d\85ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\83 ð\90\8c±ð\90\8c¹ð\90\8c»ð\90\8c°ð\90\8c²ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\83",
-       "retrievedfrom": "ð\90\8c²ð\90\8c°ð\90\8c½ð\90\8c°ð\90\8c¼ 𐍆𐍂𐌰𐌼 \"$1\"",
-       "youhavenewmessages": "𐌸𐌿 𐌷𐌰𐌱𐌹𐍃 $1 ($2).",
-       "editsection": "ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c¾ð\90\8c°ð\90\8c½",
-       "editold": "ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c¾ð\90\8c°ð\90\8c½",
-       "editlink": "ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c¾ð\90\8c°ð\90\8c½",
-       "viewsourcelink": "𐍃𐌰𐌹𐍈𐌹𐍃 𐌱𐍂𐌿𐌽𐌽𐌰𐌽",
-       "editsectionhint": "ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c¾ð\90\8c°ð\90\8c½ 𐌳𐌰𐌹𐌻: $1",
+       "mainpage": "ð\90\8c°ð\90\8c½ð\90\8c°ð\90\8d\83ð\90\8d\84ð\90\8d\89ð\90\8c³ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c¹ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8d\86ð\90\8d\83",
+       "mainpage-description": "ð\90\8c°ð\90\8c½ð\90\8c°ð\90\8d\83ð\90\8d\84ð\90\8d\89ð\90\8c³ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c¹ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8d\86ð\90\8d\83",
+       "portal": "𐌱𐌰𐌿𐍂𐌲𐍃 𐌲𐌰𐍅𐌹",
+       "portal-url": "Project:𐌱𐌰𐌿𐍂𐌲𐍃 𐌲𐌰𐍅𐌹",
+       "privacy": "ð\90\8c²ð\90\8c°ð\90\8d\82ð\90\8c´ð\90\8c³ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\89ð\90\8d\83 ð\90\8d\83ð\90\8c¿ð\90\8c½ð\90\8c³ð\90\8d\82ð\90\8d\89ð\90\8d\85ð\90\8c¹ð\90\8d\83ð\90\8c°ð\90\8c½ð\90\8c°",
+       "privacypage": "Project:ð\90\8c²ð\90\8c°ð\90\8d\82ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\89ð\90\8d\83 ð\90\8d\83ð\90\8c¿ð\90\8c½ð\90\8c³ð\90\8d\82ð\90\8d\89ð\90\8d\85ð\90\8c¹ð\90\8d\83ð\90\8c°ð\90\8c½ð\90\8c°",
+       "retrievedfrom": "ð\90\8c²ð\90\8c°ð\90\8c½ð\90\8c¿ð\90\8c¼ð\90\8c°ð\90\8c½ 𐍆𐍂𐌰𐌼 \"$1\"",
+       "youhavenewmessages": "{{PLURAL:$3|𐌷𐌰𐌱𐌰𐌹𐍃}} $1 ($2).",
+       "editsection": "ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c´ð\90\8c¹",
+       "editold": "ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c´ð\90\8c¹",
+       "editlink": "ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c´ð\90\8c¹",
+       "viewsourcelink": "𐍃𐌰𐌹𐍈 𐌱𐍂𐌿𐌽𐌽𐌰𐌽",
+       "editsectionhint": "ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c´ð\90\8c¹ 𐌳𐌰𐌹𐌻: $1",
        "toc": "𐌹𐌽𐌽𐌰𐌽𐌰",
-       "showtoc": "𐌰𐌿𐌲𐌾𐌰",
-       "hidetoc": "𐍆𐌹𐌻𐌷𐌰𐌽",
+       "showtoc": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹",
+       "hidetoc": "𐌰𐍆𐍆𐌹𐌻𐌷",
+       "confirmable-yes": "𐌾𐌰",
+       "confirmable-no": "𐌽𐌴",
        "site-rss-feed": "$1 RSS Miþnatifodjan",
-       "site-atom-feed": "$1 ð\90\8c°ð\90\8d\84ð\90\8d\89ð\90\8c¼ ð\90\8c¼ð\90\8c¹ð\90\8c¸ð\90\8c½ð\90\8c°ð\90\8d\84ð\90\8c¹ð\90\8d\86ð\90\8d\89ð\90\8c³ð\90\8c¾ð\90\8c°ð\90\8c½",
+       "site-atom-feed": "$1 ð\90\8c°ð\90\8d\84ð\90\8d\89ð\90\8c¼ ð\90\8d\86ð\90\8d\89ð\90\8c³ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\83",
        "page-atom-feed": "\"$1\" 𐌰𐍄𐍉𐌼 𐍂𐌹𐌽𐌽𐍉",
-       "red-link-title": "$1 (ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89 ð\90\8d\83ð\90\8c¹ð\90\8c½ð\90\8c³ 𐌽𐌹𐍃𐍄)",
-       "nstab-main": "ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89",
-       "nstab-user": "ð\90\8c½ð\90\8c¹ð\90\8c¿ð\90\8d\84ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8c¹ð\90\8d\83ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89",
-       "nstab-special": "𐌿𐍃𐍃𐌹𐌽𐌳𐍃𐌴𐌹𐌳𐍉",
-       "nstab-project": "ð\90\8d\82ð\90\8c´ð\90\8c¹ð\90\8cºð\90\8c¹ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89",
+       "red-link-title": "$1 (ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8d\86ð\90\8d\83 𐌽𐌹𐍃𐍄)",
+       "nstab-main": "ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8d\86ð\90\8d\83",
+       "nstab-user": "ð\90\8c±ð\90\8d\82ð\90\8c¿ð\90\8cºð\90\8c¾ð\90\8c°ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8d\86ð\90\8d\83",
+       "nstab-special": "𐌿𐍃𐍃𐌹𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃",
+       "nstab-project": "ð\90\8d\86ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c°ð\90\8d\85ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8d\80ð\90\8c°ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8d\86ð\90\8d\83",
        "nstab-image": "𐍆𐌴𐌹𐌻𐌰",
        "nstab-template": "𐍆𐌰𐌿𐍂𐌰𐌼𐌴𐌻𐌴𐌹𐌽𐍃",
-       "nstab-help": "𐌷𐌹𐌻𐍀𐌰",
-       "nstab-category": "𐌷𐌰𐌽𐍃𐌰",
+       "nstab-help": "𐌷𐌹𐌻𐍀𐌰𐌻𐌰𐌿𐍆𐍃",
+       "nstab-category": "𐌺𐌿𐌽𐌹",
+       "mainpage-nstab": "𐌰𐌽𐌰𐍃𐍄𐍉𐌳𐌴𐌹𐌽𐌹𐌻𐌰𐌿𐍆𐍃",
+       "error": "𐌰𐌹𐍂𐌶𐌴𐌹",
+       "databaseerror-error": "𐌰𐌹𐍂𐌶𐌴𐌹: $1",
        "missing-article": "𐍃𐌰 𐌳𐌰𐍄𐌰𐌱𐌿𐍃 𐌽𐌹 𐌲𐌰𐌽𐌰𐌼 𐌸𐌰𐌽𐌰 𐌱𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳𐌰𐌽 𐌴𐌹 𐌹𐍄𐌰 𐍃𐌺𐌰𐌻 𐌱𐌹𐌲𐌹𐍄𐌰𐌽: \"$1\" $2\n\n(The data base did not find the text of a page that it should have found, named \"$1\" $2.\n\nThis is usually caused by following an outdated diff or history link to a page that has been deleted.\n\nIf this is not the case, you may have found a bug in the software.\nPlease report this to an [[Special:ListUsers/sysop|administrator]], making note of the URL.)",
-       "viewsource": "𐍃𐌰𐌹𐍈𐌹𐍃 𐌱𐍂𐌿𐌽𐌽𐌰𐌽",
-       "yourname": "𐌽𐌹𐌿𐍄𐌰𐌽𐌳𐌹𐍃𐌽𐌰𐌼𐍉:",
-       "yourpassword": "𐌰𐌽𐌰𐌻𐌰𐌿𐌲𐌽𐍃 𐍅𐌰𐌿𐍂𐌳𐌰:",
-       "login": "Atgaggan",
+       "badtitle": "𐌿𐌽𐍂𐌰𐌹𐌷𐍄𐌰𐍄𐌰 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹",
+       "badtitletext": "𐍆𐍂𐌰𐌹𐌷𐌰𐌽𐍃 𐌻𐌰𐌿𐍆𐍃 𐍅𐌰𐍃 𐌿𐌽𐌲𐌰𐌼𐌰𐌲𐌰𐌽𐌳𐍃, 𐌻𐌰𐌿𐍃, 𐌰𐌹𐌸𐌸𐌰𐌿 𐌿𐌽𐍂𐌰𐌹𐌷𐍄𐌰𐌱𐌰 𐌲𐌰𐍅𐌹𐌳𐌰𐌽𐍃 𐌼𐌹𐌸𐍂𐌰𐌶𐌳𐌰 𐌸𐌰𐌿 𐌼𐌹𐌸-𐍅𐌹𐌺𐌹 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹. 𐌼𐌰𐌲𐌹 𐌷𐌰𐌱𐌰𐌽 𐌰𐌹𐌽𐌰 𐌸𐌰𐌿 𐌼𐌰𐌽𐌰𐌲𐌹𐌶𐍉𐍃 𐌱𐍉𐌺𐍉𐍃 𐌱𐍂𐌿𐌺𐌹𐌳𐍉𐍃 𐌹𐌽 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌾𐌰𐌼.",
+       "viewsource": "𐍃𐌰𐌹𐍈 𐌱𐍂𐌿𐌽𐌽𐌰𐌽",
+       "yourname": "𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌼𐍉:",
+       "userlogin-yourname": "𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌼𐍉",
+       "userlogin-yourname-ph": "𐌼𐌴𐌻𐌴𐌹 𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌼𐍉 𐌸𐌴𐌹𐌽",
+       "createacct-another-username-ph": "𐌼𐌴𐌻𐌴𐌹 𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌼𐍉",
+       "yourpassword": "𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳:",
+       "userlogin-yourpassword": "𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳",
+       "userlogin-yourpassword-ph": "𐌼𐌴𐌻𐌴𐌹 𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳 𐌸𐌴𐌹𐌽",
+       "createacct-yourpassword-ph": "𐌼𐌴𐌻𐌴𐌹 𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳",
+       "createacct-yourpasswordagain": "𐌲𐌰𐍃𐌹𐌲𐌻𐌴𐌹 𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳",
+       "createacct-yourpasswordagain-ph": "𐌼𐌴𐌻𐌴𐌹 𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳 𐌰𐍆𐍄𐍂𐌰",
+       "userlogin-remembermypassword": "𐌲𐌰𐍆𐌰𐍃𐍄 𐌼𐌹𐌺 𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌽𐌰/𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰",
+       "login": "𐌰𐍄𐌲𐌰𐌲𐌲",
        "nav-login-createaccount": "𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽 / 𐌲𐌰𐌻𐌰𐌽𐌲𐌾𐌰𐌽 𐌽𐌹𐌿𐍄𐌰𐌽𐌳𐌹𐍃",
        "userlogin": "Atgaggan / gaskapjan niutandis",
-       "logout": "𐌻𐌴𐌹𐌸𐌰𐌽",
-       "userlogout": "𐌻𐌴𐌹𐌸𐌰𐌽",
-       "nologinlink": "Gaskapjan þein niutandis",
-       "createaccount": "𐌲𐌰𐌻𐌰𐌲𐌾𐌰𐌽 𐌽𐌹𐌿𐍄𐌰𐌽𐌳𐌹𐍃",
-       "gotaccount": "Habiþ þu niutandis? '''$1'''",
-       "gotaccountlink": "Atgaggan",
+       "userloginnocreate": "𐌰𐍄𐌲𐌰𐌲𐌲",
+       "logout": "𐌰𐍆𐌻𐌴𐌹𐌸",
+       "userlogout": "𐌰𐍆𐌻𐌴𐌹𐌸",
+       "userlogin-noaccount": "𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐍃 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽?",
+       "userlogin-joinproject": "𐌲𐌰𐌼𐌰𐌹𐌽𐌴𐌹 {{SITENAME}}",
+       "nologinlink": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
+       "createaccount": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
+       "gotaccount": "𐌾𐌿 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽 𐌷𐌰𐌱𐌰𐌹𐍃? $1.",
+       "gotaccountlink": "𐌰𐍄𐌲𐌰𐌲𐌲",
+       "userlogin-resetpassword-link": "𐌿𐍆𐌰𐍂𐌼𐌿𐌽𐌽𐍉𐌳𐌴𐍃 𐌸𐌴𐌹𐌽𐌰𐌼𐌼𐌰 𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳𐌰?",
+       "userlogin-helplink2": "𐌷𐌹𐌻𐍀𐌰 𐌼𐌹𐌸 𐌰𐍄𐌲𐌰𐌲𐌲𐌰",
+       "createacct-emailoptional": "𐌴-𐌱𐍉𐌺𐍉𐍃 (𐌼𐌰𐌷𐍄𐌴𐌹𐌲𐍉𐍃)",
+       "createacct-email-ph": "𐌼𐌴𐌻𐌴𐌹 𐌸𐌴𐌹𐌽𐍉𐍃 𐌴-𐌱𐍉𐌺𐍉𐍃",
+       "createaccountreason": "𐌲𐍂𐌿𐌽𐌳𐌿𐍃:",
+       "createacct-reason": "𐌲𐍂𐌿𐌽𐌳𐌿𐍃",
+       "createacct-submit": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌸𐌴𐌹𐌽𐌰 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
+       "createacct-benefit-heading": "{{SITENAME}} 𐍄𐌰𐍅𐌹𐌸 𐌹𐍃𐍄 𐍆𐍂𐌰𐌼 𐌼𐌰𐌽𐌽𐌰𐌼 𐍃𐍅𐌴 𐌸𐌿𐌺.",
+       "createacct-benefit-body1": "{{PLURAL:$1|𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃|𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|𐌻𐌰𐌿𐍆𐍃|𐌻𐌰𐌿𐌱𐍉𐍃}}",
        "loginlanguagelabel": "Razda: $1",
-       "bold_sample": "𐌰𐌱𐍂𐍃 𐌱𐍉𐌺𐌰",
-       "bold_tip": "𐌰𐌱𐍂 𐍅𐌰𐌿𐍂𐌳𐌰",
-       "italic_sample": "𐍅𐍂𐌰𐌹𐌵𐍃 𐍅𐌰𐌿𐍂𐌳𐌰",
-       "italic_tip": "𐌳𐍂𐌹𐌿𐍃𐍉 𐌱𐍉𐌺𐌰",
-       "link_sample": "𐍄𐌰𐌹𐌺𐌾𐌰𐌽𐌱𐌰𐌽𐌳𐌹 𐌽𐌰𐌼𐍉",
-       "link_tip": "𐍄𐌰𐌹𐌺𐌾𐌰𐌽𐌱𐌰𐌽𐌳𐌹 𐌹𐌽𐌽𐌰𐌽𐌰",
-       "extlink_sample": "http://www.example.com 𐍄𐌰𐌹𐌺𐌾𐌰𐌽𐌳𐌰𐌽𐌳𐌹 𐌽𐌰𐌼𐍉",
-       "extlink_tip": "Uta táikjabandi (maúdjan http://)",
-       "headline_sample": "𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐍅𐌰𐌿𐍂𐌳𐌰",
-       "headline_tip": "𐌷𐌰𐌿𐌷𐍃 𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐌱𐍉𐌺𐌰 •𐌱•",
+       "pt-login": "𐌰𐍄𐌲𐌰𐌲𐌲",
+       "pt-login-button": "𐌰𐍄𐌲𐌰𐌲𐌲",
+       "pt-createaccount": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
+       "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": "ð\90\8c¿ð\90\8c½ð\90\8c³ð\90\8c°ð\90\8d\82ð\90\8c¼ð\90\8c´ð\90\8c» ð\90\8c¸ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c° ð\90\8c¼ð\90\8c¹ð\90\8c¸ ð\90\8d\83ð\90\8d\84ð\90\8c¿ð\90\8c½ð\90\8c³ð\90\8c°𐌼𐌴𐌻𐌰",
+       "sig_tip": "ð\90\8c¸ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c° ð\90\8c¿ð\90\8d\86ð\90\8c¼ð\90\8c´ð\90\8c»ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\83 ð\90\8c¼ð\90\8c¹ð\90\8c¸ ð\90\8c²ð\90\8c»ð\90\8c°ð\90\8c²ð\90\8c²ð\90\8d\85ð\90\8c°ð\90\8c¼ð\90\8c¼ð\90\8c° 𐌼𐌴𐌻𐌰",
        "hr_tip": "𐍂𐌰𐌹𐌷𐍄𐍃𐌱𐌰𐌿𐍂𐌳 (𐌱𐍂𐌿𐌺𐌾𐌰𐌽 𐌼𐌹𐌸 𐌽𐌹𐌿𐍆𐌰𐍂𐌿𐍃𐍃𐌿𐍃)",
-       "summary": "𐌼𐌰𐌹𐌳𐌾𐌰𐌽𐍃𐍀𐌹𐌻𐌻𐍉𐌽:",
-       "subject": "𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐌱𐍉𐌺𐌰:",
-       "minoredit": "𐍃𐌰 𐌹𐍃𐍄 𐌻𐌴𐌹𐍄𐌹𐌻𐌰 𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
-       "watchthis": "𐍅𐌰𐍂𐌰𐌽 𐍃𐌴𐌹𐌳𐍉",
-       "savearticle": "𐌼𐌴𐌻𐌾𐌰 𐍃𐌴𐌹𐌳𐍉",
-       "preview": "𐍆𐌰𐌿𐍂𐍃𐌰𐌹𐍈𐌰 𐍃𐌴𐌹𐌳𐍉",
-       "showpreview": "𐍅𐌹𐍄𐌰𐌽 𐍆𐌰𐌿𐍂𐍃𐌰𐌹𐍈𐌰",
-       "showdiff": "𐍅𐌹𐍄𐌰𐌽 𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
-       "newarticle": "(Niu)",
-       "updated": "(Nuwisan)",
-       "previewnote": "'''𐍃𐌰𐌷 𐌹𐍃𐍄 𐍆𐌰𐌿𐍂𐍃𐌰𐌹𐍈𐌰. 𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 𐌲𐌰𐌼𐌴𐌻𐌾𐌹𐌸 𐌽𐌹 𐌰𐍆 𐌸𐌹𐌶𐍉𐍃 𐍃𐌴𐌹𐌳𐍉𐍃!'''",
-       "editing": "𐌼𐌰𐌹𐌳𐌾𐌰𐌽 𐌰𐍆 $1",
-       "editingsection": "𐌼𐌰𐌹𐌳𐌾𐌰𐌽 𐌰𐍆 $1 (𐍆𐌴𐍂𐌰)",
-       "editingcomment": "𐌼𐌰𐌹𐌳𐌾𐌰𐌽 𐌰𐍆 $1 (𐍂𐍉𐌳𐌾𐌰𐍆𐌴𐍂𐌰)",
-       "yourdiff": "Missalieks",
-       "template-protected": "(𐌲𐌰𐌱𐌰𐌹𐍂𐌲𐌾𐌰𐌽)",
+       "summary": "𐌼𐌰𐌿𐍂𐌲𐌿𐍃 𐍃𐌺𐌴𐌹𐍂𐌴𐌹𐌽𐍃:",
+       "subject": "𐌿𐍆𐍅𐌰𐌿𐍂𐍀𐌰:",
+       "minoredit": "𐌸𐌰𐍄𐌰 𐌹𐍃𐍄 𐌼𐌹𐌽𐌽𐌹𐌶𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
+       "watchthis": "𐌰𐍄𐍅𐌹𐍄 𐌻𐌰𐌿𐌱𐌰",
+       "savearticle": "𐌲𐌰𐍆𐌰𐍃𐍄 𐌻𐌰𐌿𐍆",
+       "preview": "𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽𐍃",
+       "showpreview": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽",
+       "showdiff": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌽𐌹𐌽𐍃",
+       "loginreqlink": "𐌰𐍄𐌲𐌰𐌲𐌲",
+       "newarticle": "(𐌽𐌹𐌿𐌾𐌰𐍄𐌰)",
+       "newarticletext": "𐌻𐌰𐌹𐍃𐍄𐌹𐌳𐌴𐍃 𐌲𐌰𐍅𐌹𐍃 𐌳𐌿 𐌻𐌰𐌿𐌱𐌰 𐍃𐌰𐌴𐌹 𐌽𐌹𐍃𐍄. 𐌳𐌿 𐍃𐌺𐌰𐍀𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆, 𐌰𐌽 𐌰𐍃𐍄𐍉𐌳𐌴𐌹 𐌼𐌴𐌻𐌾𐌰𐌽 𐌹𐌽 𐌰𐍂𐌺𐌰𐌹 𐌿𐍆 (𐍃𐌰𐌹𐍈 [$1 𐌷𐌹𐌻𐍀𐌰𐌻𐌰𐌿𐍆] 𐌼𐌰𐌽𐌰𐌲𐌹𐌶𐌹𐌽 𐌺𐌿𐌽𐌸𐌾𐌰). 𐌾𐌰𐌱𐌰𐌹 𐌹𐍃 𐌷𐌴𐍂 𐌹𐌽 𐌰𐌹𐍂𐌶𐌴𐌹𐌽𐍃, 𐌲𐌰𐌲𐌲 𐌳𐌿 <𐍃𐍄𐍂𐍉𐌽𐌲>𐌹𐌱𐌿𐌺𐌰𐌷𐌰𐌿𐌱𐌹𐌳𐌹𐌻𐍉𐌽.",
+       "noarticletext": "𐌽𐌿 𐌽𐌹 𐍃𐌹𐌽𐌳 𐌱𐍉𐌺𐍉𐍃 𐌹𐌽 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰.\n𐌼𐌰𐌲𐍄 [[Special:Search/{{PAGENAME}}|𐍃𐍉𐌺𐌾𐌰𐌽 𐌸𐌰𐍄𐌰 𐌻𐌰𐌿𐌱𐌰-𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹]] 𐌹𐌽 𐌰𐌽𐌸𐌰𐍂𐌰𐌹𐌼 𐌻𐌰𐌿𐌱𐌰𐌼,  <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 𐍃𐍉𐌺𐌾𐌰𐌽 𐌲𐌰𐌷𐌰𐌷𐌾𐍉 𐌲𐌰𐍆𐌰𐍃𐍄𐍉𐍃], 𐌰𐌹𐌸𐌸𐌰𐌿 [{{fullurl:{{FULLPAGENAME}}|action=edit}} 𐍃𐌺𐌰𐍀𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆.]</ span>",
+       "noarticletext-nopermission": "𐌽𐌿 𐌽𐌹 𐍃𐌹𐌽𐌳 𐌱𐍉𐌺𐍉𐍃 𐌹𐌽 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰.\n𐌼𐌰𐌲𐍄 [[Special:Search/{{PAGENAME}}|𐍃𐍉𐌺𐌾𐌰𐌽 𐌸𐌰𐍄𐌰 𐌻𐌰𐌿𐌱𐌰-𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹]] 𐌹𐌽 𐌰𐌽𐌸𐌰𐍂𐌰𐌹𐌼 𐌻𐌰𐌿𐌱𐌰𐌼, 𐌸𐌰𐌿 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 𐍃𐍉𐌺𐌾𐌰𐌽 𐌲𐌰𐌷𐌰𐌷𐌾𐍉 𐌲𐌰𐍆𐌰𐍃𐍄𐍉𐍃]</span>, 𐌹𐌸 𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐍃 𐌰𐌽𐌳𐌻𐌴𐍄 𐍃𐌺𐌰𐍀𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆.",
+       "updated": "(𐌰𐌽𐌰𐌽𐌹𐍅𐌹𐌸)",
+       "previewnote": "<strong>𐌲𐌰𐌼𐌹𐌽𐌸𐌴𐌹 𐌸𐌰𐍄𐌴𐌹 𐌸𐌰𐍄𐌰 𐌹𐍃𐍄 𐌸𐌰𐍄𐌰𐌹𐌽𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽𐍃.</strong>\n𐌸𐌴𐌹𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌽𐌰𐌿𐌷 𐌽𐌹 𐌲𐌰𐍆𐌰𐍃𐍄𐌰𐌽𐍉𐍃 𐍃𐌹𐌽𐌳!",
+       "editing": "{{GENDER:𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽𐌳𐍃|𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽𐌳𐌴𐌹}} $1",
+       "creating": "𐍃𐌺𐌰𐍀𐌾𐌰𐌽𐌳𐍃/𐍃𐌺𐌰𐍀𐌾𐌰𐌽𐌳𐌴𐌹 $1",
+       "editingsection": "{{GENDER:𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽𐌳𐍃|𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽𐌳𐌴𐌹}} $1 (𐌳𐌰𐌹𐌻)",
+       "editingcomment": "𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽𐌳𐍃/𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽𐌳𐌴𐌹 $1 (𐌽𐌹𐌿𐌾𐌰 𐌳𐌰𐌹𐌻)",
+       "yourdiff": "𐌼𐌹𐍃𐍃𐌰𐌻𐌴𐌹𐌺𐍉𐍃",
+       "template-protected": "(𐌷𐌰𐌱𐌰𐌹𐌸 𐌼𐌿𐌽𐌳)",
        "template-semiprotected": "(halb-gabaírgjan)",
+       "hiddencategories": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃 𐌹𐍃𐍄 𐌲𐌰𐌳𐌰𐌹𐌻𐌰 {{PLURAL:$1|1 𐌰𐌽𐌰𐌻𐌰𐌿𐌲𐌽𐌹𐍃 𐌺𐌿𐌽𐌾𐌹𐍃|$1 𐌰𐌽𐌰𐌻𐌰𐌿𐌲𐌽𐌰𐌹𐌶𐌴 𐌺𐌿𐌽𐌾𐌴}}:‎",
+       "permissionserrorstext-withaction": "𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐍃 𐌰𐌽𐌳𐌻𐌴𐍄 𐌳𐌿 $2, 𐌹𐌽 {{PLURAL:$1|𐌹𐍆𐍄𐌿𐌼𐌰𐌹𐌶𐍉𐍃 𐍅𐌰𐌹𐌷𐍄𐌰𐌹𐍃|𐌹𐍆𐍄𐌿𐌼𐌰𐌹𐌶𐍉 𐍅𐌰𐌹𐌷𐍄𐌴}}:",
+       "moveddeleted-notice": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃 𐌿𐍃𐌽𐌿𐌼𐌰𐌽𐍃 𐌹𐍃𐍄. 𐌿𐍃𐌽𐌿𐌼𐍄𐍃 𐌾𐌰𐌷 𐌲𐌰𐍆𐌰𐍃𐍄𐌰𐌹𐌽𐍃 𐌼𐌹𐌸𐍃𐌰𐍄𐌴𐌹𐌽𐌰𐌹𐍃 𐌿𐍆 𐍃𐌹𐌽𐌳 𐌿𐍃𐍄𐌰𐌹𐌺𐌽𐌴𐌹𐌽𐌰𐌹.",
        "post-expand-template-inclusion-warning": "'''𐌷𐍅𐍉𐍄𐌾𐌰𐌽𐌳𐍃:''' 𐍆𐌰𐌿𐍂𐌰𐌼𐌴𐌻𐌴𐌹𐌽𐍃 𐍃𐌹𐌽𐌳 𐌿𐍆𐌰𐍂𐌼𐌹𐌺𐌹𐌻𐍃. 𐍃𐌿𐌼𐍃 𐍆𐌰𐌿𐍂𐌴𐌼𐌴𐌻𐌴𐌹𐌽𐍉𐍃 𐌽𐌹 𐌼𐌰𐌲 𐍅𐌹𐍃𐌰𐌽 𐌸𐌰𐍂",
        "post-expand-template-inclusion-category": "𐍃𐌴𐌹𐌳𐍉𐌽𐍃 𐌸𐌰𐍂 𐍆𐌰𐌿𐍂𐌰𐌼𐌴𐌻𐌴𐌹𐌽𐍃 𐍃𐌹𐌽𐌳 𐌿𐍆𐌰𐍂𐌼𐌹𐌺𐌹𐌻𐍃",
+       "viewpagelogs": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐌲𐌰𐍆𐌰𐍃𐍄𐌰𐌹𐌽𐌹𐌽𐍃 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰",
        "currentrev": "𐌽𐌿 𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
-       "currentrev-asof": "ð\90\8c°ð\90\8d\86ð\90\8d\84ð\90\8c¿ð\90\8c¼ð\90\8d\83ð\90\8d\84ð\90\8d\83 ð\90\8c²ð\90\8c°ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c¾𐌴𐌹𐌽𐍃 𐍆𐍂𐌰𐌼 $1",
-       "revisionasof": "ð\90\8c²ð\90\8c°ð\90\8c¼ð\90\8c°ð\90\8c³ð\90\8c¾ð\90\8c´ð\90\8c¹ 𐍆𐍂𐌰𐌼 $1",
-       "revision-info": "Máideins fram $1 bi $2",
+       "currentrev-asof": "ð\90\8c°ð\90\8d\86ð\90\8d\84ð\90\8c¿ð\90\8c¼ð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8c° ð\90\8c²ð\90\8c°ð\90\8c±ð\90\8d\89ð\90\8d\84𐌴𐌹𐌽𐍃 𐍆𐍂𐌰𐌼 $1",
+       "revisionasof": "ð\90\8c²ð\90\8c°ð\90\8c±ð\90\8d\89ð\90\8d\84ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\83 𐍆𐍂𐌰𐌼 $1",
+       "revision-info": "𐌲𐌰𐌱𐍉𐍄𐌴𐌹𐌽𐍃 𐌹𐌽 $1 𐍆𐍂𐌰𐌼 {{GENDER:$6|$2}}$7",
        "previousrevision": "←𐌰𐌹𐍂𐌹𐍃 𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
        "nextrevision": "Iftuma máideins→",
        "currentrevisionlink": "𐌽𐌿𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
        "last": "𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍃",
        "page_first": "frumists",
        "page_last": "𐍃𐍀𐌴𐌳𐌿𐌼𐌹𐍃𐍄𐍃",
-       "histfirst": "ð\90\8d\86ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c¸ð\90\8c¹ð\90\8d\83",
-       "histlast": "ð\90\8d\83ð\90\8d\80ð\90\8c´ð\90\8c³ð\90\8c¿ð\90\8c¼ð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8d\83",
+       "histfirst": "ð\90\8c°ð\90\8c»ð\90\8c¸ð\90\8c¹ð\90\8c¶ð\90\8d\89",
+       "histlast": "ð\90\8c½ð\90\8c¹ð\90\8c¿ð\90\8c¾ð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8d\89",
        "history-feed-item-nocomment": "$1 at $2",
-       "revdel-restore": "𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌹𐍃 𐌰𐌽𐌰𐍃𐌹𐌿𐌽𐌼𐌰𐌷𐍄𐌴𐌹𐌲𐍃",
+       "rev-delundel": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹 𐌰𐌽𐌰𐍃𐌹𐌿𐌽",
+       "revdel-restore": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹 𐌰𐌽𐌰𐍃𐌹𐌿𐌽",
        "revertmerge": "𐌿𐌽𐌲𐌰𐍄𐌹𐌻𐍉𐍃",
-       "history-title": "𐌰𐍂𐌹𐍃𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 𐌰𐍆 \"$1\"",
-       "lineno": "𐌱𐍉𐌺𐌰𐍂𐌹𐌲𐌹𐌻𐍉 $1:",
-       "editundo": "𐌽𐌹𐌿𐍃𐌺𐌰𐍀𐌾𐌰𐌽",
-       "searchresults": "𐍃𐍉𐌺𐌽𐌹𐍃 𐍄𐌰𐌿𐌾𐍉𐍃",
-       "searchresults-title": "𐍃𐍉𐌺𐌽𐌹𐍃 𐍄𐌰𐌿𐌾𐍉𐍃 𐍆𐌰𐌿𐍂 \"$1\"",
+       "history-title": "𐌰𐍆𐍄𐍂𐌰𐍃𐌹𐌿𐌽𐌹𐍃𐍀𐌹𐌻𐌻 𐌻𐌰𐌿𐌱𐌹𐍃 \"$1\"",
+       "difference-title": "𐌲𐌰𐍃𐌺𐌰𐌹𐌳𐌴𐌹𐌽𐍃 𐌼𐌹𐌸 𐌰𐍆𐍄𐍂𐌰𐍃𐌹𐌿𐌽𐍉𐌼 𐌻𐌰𐌿𐌱𐌹𐍃 \"$1\"",
+       "lineno": "𐍃𐍄𐍂𐌹𐌺𐍃 $1:",
+       "editundo": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌰𐍆𐍄𐍂𐌰",
+       "diff-multi-sameuser": "({{PLURAL:$1|𐌰𐌹𐌽𐌰 𐌼𐌹𐌳𐌿𐌼𐌰𐌲𐌰𐌱𐍉𐍄𐌴𐌹𐌽𐍃|$1 𐌼𐌹𐌳𐌿𐌼𐌰 𐌲𐌰𐌱𐍉𐍄𐌴𐌹𐌽𐍉𐍃}} 𐍆𐍂𐌰𐌼 𐍃𐌰𐌼𐌹𐌽 𐌱𐍂𐌿𐌺𐌾𐌹𐌽 𐌽𐌹 𐌰𐍄𐌰𐌿𐌲𐌹𐌳𐌰/𐌰𐍄𐌰𐌿𐌲𐌹𐌳𐍉𐍃)",
+       "searchresults": "𐍃𐍉𐌺𐌴𐌹𐌽𐌰𐌹𐍃 𐍄𐍉𐌾𐌰",
+       "searchresults-title": "𐍃𐍉𐌺𐌴𐌹𐌽𐌰𐌹𐍃 𐍄𐍉𐌾𐌰 𐍆𐌰𐌿𐍂 \"$1\"",
        "prevn": "𐌰𐍆𐍄𐌿𐌼𐌰 {{PLURAL:$1|$1}}",
        "nextn": "𐌹𐍆𐍄𐌿𐌼𐌰 {{PLURAL:$1|$1}}",
        "prevn-title": "𐍆𐌰𐌹𐍂𐌽𐌰 $1 {{PLURAL:$1|𐍄𐌰𐌿𐌹|𐍄𐌰𐌿𐌾𐍉𐍃}}",
        "nextn-title": "𐌰𐍆𐍄𐌿𐌼𐌰 $1 {{PLURAL:$1|𐍄𐌰𐌿𐌹|𐍄𐌰𐌿𐌾𐍉𐍃}}",
-       "shown-title": "ð\90\8c°ð\90\8c¿ð\90\8c¾ð\90\8c°ð\90\8c½ð\90\8c³ $1 {{PLURAL:$1|ð\90\8d\84ð\90\8c°ð\90\8c¿ð\90\8c¹|ð\90\8d\84ð\90\8c°ð\90\8c¿ð\90\8c¾ð\90\8d\89ð\90\8d\83}} ð\90\8c¸ð\90\8c°ð\90\8c¹ð\90\8d\82ð\90\8c· ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89",
+       "shown-title": "ð\90\8c°ð\90\8d\84ð\90\8c°ð\90\8c¿ð\90\8c²ð\90\8c´ð\90\8c¹ $1 {{PLURAL:$1|ð\90\8d\84ð\90\8c°ð\90\8c¿ð\90\8c¹|ð\90\8d\84ð\90\8d\89ð\90\8c¾ð\90\8c°}} ð\90\8d\88ð\90\8c°ð\90\8d\82ð\90\8c¾ð\90\8c°ð\90\8c¼ð\90\8c¼ð\90\8c´ð\90\8c· ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c°.",
        "viewprevnext": "𐍃𐌹𐌿𐌽𐌴𐌹𐍃 ($1 {{int:pipe-separator}} $2) ($3)",
-       "searchmenu-new": "'''𐍃𐌺𐌰𐍀𐌾𐌹𐍃 𐌸𐍉 𐍃𐌴𐌹𐌳𐍉𐌽 \"[[:$1]]\" 𐌸𐌹𐌶𐍉𐍃 𐍅𐌹𐌺𐌾𐍉𐍃!'''",
-       "searchprofile-articles": "ð\90\8c²ð\90\8c°ð\90\8c·ð\90\8c°ð\90\8c±ð\90\8c¾ð\90\8d\89ð\90\8d\83 ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89ð\90\8c½𐍃",
-       "searchprofile-images": "ð\90\8c¼ð\90\8c°ð\90\8c½ð\90\8c°ð\90\8c²ð\90\8d\83ð\90\8c¼ð\90\8c´ð\90\8c³ð\90\8c¹𐌰",
+       "searchmenu-new": "<strong>𐍃𐌺𐌰𐍀𐌴𐌹 𐌻𐌰𐌿𐍆 \"[[:$1]]\" 𐌰𐌽𐌰 𐌸𐌹𐌶𐌰𐌹 𐍅𐌹𐌺𐌹!</strong> {{{{PLURAL:$2|0=|𐍃𐌰𐌹 𐌾𐌰𐌷 𐌻𐌰𐌿𐍆 𐌱𐌹𐌲𐌹𐍄𐌰𐌽𐌰 𐌸𐌴𐌹𐌽𐌰𐌹 𐍃𐍉𐌺𐌴𐌹𐌽𐌰𐌹.|𐍃𐌰𐌹 𐌾𐌰𐌷 𐍄𐍉𐌾𐌰 𐍃𐍉𐌺𐌴𐌹𐌽𐌰𐌹𐍃 𐌱𐌹𐌲𐌹𐍄𐌰𐌽𐌰.}}",
+       "searchprofile-articles": "ð\90\8c·ð\90\8c°ð\90\8c±ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8c°ð\90\8c½ð\90\8d\83 ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8d\89𐍃",
+       "searchprofile-images": "ð\90\8c¼ð\90\8c°ð\90\8c½ð\90\8c°ð\90\8c²ð\90\8c¼ð\90\8c´ð\90\8c³ð\90\8c¾𐌰",
        "searchprofile-everything": "𐌰𐌻𐌻",
        "searchprofile-advanced": "𐍆𐌰𐌹𐍂𐍂𐌰𐍆𐍂𐌰𐌼𐌰",
-       "searchprofile-articles-tooltip": "𐍃𐍉𐌺 𐌹𐌽𐌽𐌰 $1",
+       "searchprofile-articles-tooltip": "𐍃𐍉𐌺𐌴𐌹 𐌹𐌽 $1",
        "searchprofile-images-tooltip": "𐍃𐍉𐌺𐌾𐌹𐍃 𐍆𐌴𐌹𐌻𐌰𐌽𐍃",
-       "searchprofile-everything-tooltip": "ð\90\8d\83ð\90\8d\89ð\90\8cºð\90\8c¾ð\90\8c¹ð\90\8d\83 ð\90\8c°ð\90\8c»ð\90\8c» ð\90\8c²ð\90\8c°ð\90\8c·ð\90\8c°ð\90\8c±ð\90\8c¾ð\90\8d\89ð\90\8d\83 (ð\90\8c¸ð\90\8c¹ð\90\8c¶ð\90\8c´ð\90\8c´ð\90\8c¹ ð\90\8c¹ð\90\8d\83ð\90\8d\84 ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89ð\90\8c½ð\90\8d\83 ð\90\8c²ð\90\8c°ð\90\8d\85ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c³ð\90\8c¾ð\90\8c¹𐍃)",
-       "searchprofile-advanced-tooltip": "ð\90\8d\83ð\90\8cºð\90\8d\89ð\90\8c¾ð\90\8c¹ð\90\8d\83 ð\90\8c¹ð\90\8c½ð\90\8c½ð\90\8c° ð\90\8d\83ð\90\8c¹ð\90\8c»ð\90\8c±ð\90\8c°ð\90\8d\83ð\90\8cºð\90\8c°ð\90\8d\80ð\90\8c¹ð\90\8c¸ð\90\8d\83 ð\90\8c½ð\90\8c°ð\90\8c¼ð\90\8c°ð\90\8c½ð\90\8d\83ð\90\8d\84ð\90\8c°ð\90\8c¸",
+       "searchprofile-everything-tooltip": "ð\90\8d\83ð\90\8d\89ð\90\8cºð\90\8c´ð\90\8c¹ ð\90\8c°ð\90\8c»ð\90\8c» ð\90\8c¸ð\90\8c°ð\90\8d\84ð\90\8c° (ð\90\8c¾ð\90\8c°ð\90\8c· ð\90\8c²ð\90\8c°ð\90\8d\85ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c³ð\90\8c¾ð\90\8c°ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c°ð\90\8c½𐍃)",
+       "searchprofile-advanced-tooltip": "ð\90\8d\83ð\90\8d\89ð\90\8cºð\90\8c´ð\90\8c¹ ð\90\8c¹ð\90\8c½ ð\90\8c±ð\90\8c¹ð\90\8c¿ð\90\8c·ð\90\8d\84ð\90\8c°ð\90\8c¹ð\90\8c¼ ð\90\8c½ð\90\8c°ð\90\8c¼ð\90\8c°ð\90\8d\82ð\90\8c¿ð\90\8c¼ð\90\8c°ð\90\8c¼",
        "search-result-size": "$1 ({{PLURAL:$2|•𐌰• 𐍅𐌰𐌿𐍂𐌳|•$2• 𐍅𐌰𐌿𐍂𐌳𐌰}})",
        "search-redirect": "(𐌰𐍆𐍄𐍂𐌰𐍅𐌴𐌹𐍄𐍃 𐍆𐍂𐌰𐌼 𐌸𐌰𐌼𐌼𐌰 $1)",
        "search-section": "(𐍆𐌴𐍂𐌰 $1)",
        "search-suggest": "𐍄𐌰𐌹𐌺𐌽𐌹𐌳𐌰 𐌸𐌿: $1",
        "searchall": "𐌰𐌻𐌻𐍃",
-       "search-nonefound": "𐌽𐌹 𐌰𐌹𐌽𐌷𐌿𐌽 𐌲𐌰𐌲𐌹𐌱𐌾𐍉 𐍆𐌿𐌻𐌻𐌾𐌹𐌸 𐍃𐍉𐌺𐌴𐌹𐌽",
+       "search-showingresults": "{{ZPLURAL:$4|𐍄𐌰𐌿𐌹 <strong>$1 𐍅𐌰𐌹𐌷𐍄𐌰𐌹𐍃 <strong>$3|𐍄𐍉𐌾𐌰 <strong>$1 - $2 𐍅𐌰𐌹𐌷𐍄𐌰𐌹𐍃 <strong>$3}}",
+       "search-nonefound": "𐌽𐌹 𐍄𐌰𐌿𐌹 𐍅𐌰𐍃 𐍃𐌰𐌼𐌰𐌽𐌰 𐍃𐍅𐌰 𐍃𐍉𐌺𐌴𐌹𐌽.",
        "powersearch-legend": "𐍃𐍉𐌺𐌴𐌹𐌸",
        "preferences": "𐌼𐌴𐌹𐌽𐍉𐍃 𐌱𐍂𐌿𐌺𐌾𐌰𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌴𐌹𐍃",
-       "mypreferences": "ð\90\8c¼ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\89ð\90\8d\83 ð\90\8c±ð\90\8d\82ð\90\8c¿ð\90\8cºð\90\8c¾ð\90\8c°",
+       "mypreferences": "ð\90\8c²ð\90\8c°ð\90\8c»ð\90\8c´ð\90\8c¹ð\90\8cºð\90\8c°ð\90\8c½ð\90\8c³ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\83 ð\90\8d\85ð\90\8c°ð\90\8c¹ð\90\8c·ð\90\8d\84ð\90\8d\83",
        "prefs-skin": "Seidofill",
        "skin-preview": "Faúrsaiƕa",
        "saveprefs": "Melja",
        "searchresultshead": "Sokeiþ",
        "grouppage-sysop": "{{ns:project}}:𐍃𐌴𐌹𐌳𐍉𐍆𐌰𐌸𐍃",
+       "right-writeapi": "𐌱𐍂𐌿𐌺𐌴𐌹𐌽𐍃 API 𐌼𐌴𐌻𐌴𐌹𐌽𐌰𐌹𐍃",
        "rightslog": "Niutandis stutjanlog",
        "nchanges": "$1 {{PLURAL:$1|máidein|máideins}}",
-       "recentchanges": "𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍉𐍃 𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌴𐌹𐍃",
-       "rcshowhideminor": "$1 lietila máideins",
-       "rcshowhidebots": "$1 bota",
-       "rcshowhideliu": "$1 niutandis",
-       "rcshowhideanons": "$1 gasteis",
-       "rcshowhidemine": "$1 mein máideins",
-       "diff": "𐌻𐌴𐌹𐌺𐍃",
-       "hist": "𐍆𐍂𐌼𐌵",
+       "enhancedrc-history": "𐍃𐍀𐌹𐌻𐌻",
+       "recentchanges": "𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
+       "recentchanges-summary": "𐌰𐍆𐌰𐍂𐌻𐌰𐌹𐍃𐍄𐌴𐌹 𐌸𐌰𐌹𐌼 𐌰𐌽𐌳𐍅𐌰𐌹𐍂𐌸𐌹𐍃𐍄𐍉𐌼 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐌼 𐌳𐌿 𐍅𐌹𐌺𐌾𐌰 𐌰𐌽𐌰 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰.",
+       "recentchanges-label-newpage": "𐍃𐍉 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 𐌲𐌰𐍃𐌺𐍉𐍀 𐌽𐌹𐌿𐌾𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
+       "recentchanges-label-minor": "𐌸𐌰𐍄𐌰 𐌹𐍃𐍄 𐌻𐌴𐌹𐍄𐌹𐌻𐌰 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
+       "recentchanges-label-bot": "𐍃𐍉 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 𐍄𐍉𐌾𐌰𐌳𐌰 𐍅𐌰𐍂𐌸 𐍆𐍂𐌰𐌼 𐌼𐌰𐌷𐍄𐌹𐍃𐌺𐌰𐌻𐌺𐌰 (𐌱𐌰𐌿𐍄)",
+       "recentchanges-label-plusminus": "𐌻𐌰𐌿𐌱𐌰𐌼𐌹𐌺𐌹𐌻𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌳𐌰 𐌼𐌹𐌸 𐌸𐌹𐌶𐌰𐌹 𐍂𐌰𐌸𐌾𐍉𐌽 𐌱𐌹𐍄𐍉",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (𐍃𐌰𐌹𐍈 𐌾𐌰𐌷[[Special:NewPages|𐍅𐌹𐌺𐍉 𐌽𐌹𐌿𐌾𐌰𐌹𐌶𐌴 𐌻𐌰𐌿𐌱𐌴]])",
+       "rclistfrom": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐌽𐌹𐌿𐌾𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐌽𐍃 𐌰𐌽𐌰𐍃𐍄𐍉𐌳𐌾𐌰𐌽𐌳𐌴𐌹𐌽𐍃 𐍆𐍂𐌰𐌼 $2, $3",
+       "rcshowhideminor": "$1 𐌼𐌹𐌽𐌽𐌹𐌶𐌴𐌹𐌽𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
+       "rcshowhideminor-show": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹",
+       "rcshowhideminor-hide": "𐌰𐍆𐍆𐌹𐌻𐌷",
+       "rcshowhidebots": "$1 𐌼𐌰𐌷𐍄𐌹𐍃𐌺𐌰𐌻𐌺𐍉𐍃",
+       "rcshowhidebots-show": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹",
+       "rcshowhidebots-hide": "𐌰𐍆𐍆𐌹𐌻𐌷",
+       "rcshowhideliu": "$1 𐌰𐌽𐌰𐌼𐌴𐌻𐌹𐌳𐌰𐌹 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐍃",
+       "rcshowhideliu-hide": "𐌰𐍆𐍆𐌹𐌻𐌷",
+       "rcshowhideanons": "$1 𐌰𐍆𐍆𐌹𐌻𐌷𐌰𐌽𐌰𐌹 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐍃",
+       "rcshowhideanons-show": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹",
+       "rcshowhideanons-hide": "𐌰𐍆𐍆𐌹𐌻𐌷",
+       "rcshowhidemine": "$1 𐌼𐌴𐌹𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
+       "rcshowhidemine-show": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹",
+       "rcshowhidemine-hide": "𐌰𐍆𐍆𐌹𐌻𐌷",
+       "rclinks": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍉𐍃 $1 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌽𐌹𐌽𐍃 𐌹𐌽 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰𐌹𐌼 $2 𐌳𐌰𐌲𐌰𐌼 <br />$3",
+       "diff": "𐌼𐌹𐍃𐍃",
+       "hist": "𐍃𐍀𐌹𐌻𐌻",
        "hide": "𐍆𐌹𐌻𐌷𐌰𐌽",
        "show": "𐌷𐌿𐌻𐌾𐌰𐌽",
        "minoreditletter": "l",
        "newpageletter": "N",
        "boteditletter": "b",
-       "recentchangeslinked": "ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c»ð\90\8c¹ð\90\8c´ð\90\8cº𐍃",
+       "recentchangeslinked": "ð\90\8c²ð\90\8c°ð\90\8d\85ð\90\8c¹ð\90\8c³ð\90\8c°ð\90\8c½ð\90\8d\89ð\90\8d\83 ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\89𐍃",
        "recentchangeslinked-feed": "Máideinlieks",
-       "recentchangeslinked-toolbox": "𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌻𐌹𐌴𐌺𐍃",
+       "recentchangeslinked-toolbox": "𐌲𐌰𐍅𐌹𐌳𐌰𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
+       "recentchangeslinked-title": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌲𐌰𐍅𐌹𐌳𐌰𐌽𐍉𐍃 𐌼𐌹𐌸 \"$1\"",
        "recentchangeslinked-summary": "𐍃𐍉 𐌹𐍃𐍄 𐌻𐌴𐌹𐍃𐍄𐌰 𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌴 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍃 𐍃𐌺𐍉𐍀 𐌰𐌽𐌰 𐍃𐌴𐌹𐌳𐍉𐌽𐍃 𐌻𐌴𐌹𐌽𐌺𐍉𐌽𐌳 𐌿𐍃 𐌿𐍃𐍃𐌹𐌽𐌳𐌰𐌹 𐍃𐌴𐌹𐌳𐍉𐌽 (𐌰𐌹𐌸𐌸𐌰𐌿 𐌻𐌹𐌸𐌰𐌿𐍃 𐌿𐍃𐍃𐌹𐌽𐌳𐌰𐌹𐌶𐍉𐍃 𐌷𐌰𐌽𐍃𐍉𐍃). 𐍃𐌴𐌹𐌳𐍉𐌽𐍃 [[Special:Watchlist|𐍅𐌹𐍄𐌰𐌽𐌳𐌻𐌴𐌹𐍃𐍄𐍉𐍃 𐌸𐌴𐌹𐌽𐍉𐍃]] 𐍃𐌹𐌽𐌳 '''𐌳𐌹𐌲𐍂𐍃𐍄𐌰𐍆𐍃'''.",
+       "recentchangeslinked-page": "𐌻𐌰𐌿𐌱𐌰𐌽𐌰𐌼𐍉:",
+       "recentchangeslinked-to": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌻𐌰𐌿𐌱𐌴 𐌸𐌰𐌹𐌴𐌹 𐌲𐌰𐍅𐌹𐌳𐌰𐌽𐌰𐌹 𐌳𐌿 𐌲𐌹𐌱𐌰𐌽𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰.",
        "upload": "𐌿𐍃𐌷𐌻𐌰𐌸𐌰𐌽 𐍆𐌴𐌹𐌻𐌰𐌽𐍃",
        "uploadbtn": "Ushlaþaiþ Feilans",
        "uploadlogpage": "Log af Ushlaþan",
+       "filedesc": "𐌼𐌰𐌿𐍂𐌲𐌿𐍃 𐍃𐌺𐌴𐌹𐍂𐌴𐌹𐌽𐍃",
        "watchthisupload": "Witan so seido",
        "imgfile": "Feilans",
        "listfiles": "Feilans tala",
        "file-anchor-link": "𐍆𐌴𐌹𐌻𐌰𐌽𐍃",
        "filehist": "𐍆𐌴𐌹𐌻𐌰𐌽𐍃 𐌰𐌹𐍂𐌹𐍃",
-       "filehist-help": "ð\90\8cºð\90\8c»ð\90\8c¹ð\90\8cºð\90\8d\89ð\90\8d\83 ð\90\8c°ð\90\8c½ð\90\8c° ð\90\8c³ð\90\8c°ð\90\8d\84ð\90\8c°ð\90\8c¹/ð\90\8d\88ð\90\8c´ð\90\8c¹ð\90\8c»ð\90\8c°ð\90\8c¹ ð\90\8d\83ð\90\8c°ð\90\8c¹ð\90\8d\88ð\90\8c°ð\90\8c½ ð\90\8d\86ð\90\8c´ð\90\8c¹ð\90\8c»ð\90\8c°ð\90\8c½ ð\90\8d\83ð\90\8d\85ð\90\8c´ ð\90\8c°ð\90\8d\84ð\90\8c°ð\90\8c¿ð\90\8c²ð\90\8c¾ð\90\8c¹ð\90\8c³ð\90\8c° ð\90\8d\83ð\90\8c¹ð\90\8cº ð\90\8c¸ð\90\8c°ð\90\8c½.",
+       "filehist-help": "ð\90\8c°ð\90\8d\84ð\90\8d\84ð\90\8c´ð\90\8cº ð\90\8c³ð\90\8c°ð\90\8c²/ð\90\8c¼ð\90\8c´ð\90\8c» ð\90\8c³ð\90\8c¿ ð\90\8c°ð\90\8d\84ð\90\8c°ð\90\8c¿ð\90\8c²ð\90\8c¾ð\90\8c°ð\90\8c½ ð\90\8c³ð\90\8c°ð\90\8d\84ð\90\8c° ð\90\8d\83ð\90\8d\85ð\90\8c°ð\90\8d\83ð\90\8d\85ð\90\8c´ ð\90\8c²ð\90\8c°ð\90\8c±ð\90\8c°ð\90\8c¹ð\90\8d\82ð\90\8c·ð\90\8d\84ð\90\8c¹ð\90\8c³ð\90\8c° ð\90\8c¹ð\90\8c½ ð\90\8c¸ð\90\8c°ð\90\8c¼ð\90\8c¼ð\90\8c° ð\90\8c¼ð\90\8c´ð\90\8c»ð\90\8c°.",
        "filehist-current": "𐌽𐌿",
-       "filehist-datetime": "ð\90\8d\88ð\90\8c´ð\90\8c¹ð\90\8c»ð\90\8c°",
-       "filehist-thumb": "ð\90\8d\86ð\90\8d\89ð\90\8d\82ð\90\8d\83ð\90\8c¾ð\90\8c°ð\90\8c¿",
-       "filehist-thumbtext": "ð\90\8d\86ð\90\8d\89ð\90\8d\82ð\90\8d\83ð\90\8c¾ð\90\8c°ð\90\8c¿ ð\90\8d\86ð\90\8c°ð\90\8c¿ð\90\8d\82 ð\90\8c¿ð\90\8d\83ð\90\8c²ð\90\8c°ð\90\8c±ð\90\8c° ð\90\8d\86ð\90\8d\82ð\90\8c°ð\90\8c¼ $1",
-       "filehist-user": "ð\90\8c½ð\90\8c¹ð\90\8c¿ð\90\8d\84ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8c¹ð\90\8d\83",
+       "filehist-datetime": "ð\90\8c¼ð\90\8c´ð\90\8c»",
+       "filehist-thumb": "ð\90\8c»ð\90\8c´ð\90\8c¹ð\90\8d\84ð\90\8c¹ð\90\8c»ð\90\8c° ð\90\8d\86ð\90\8d\82ð\90\8c¹ð\90\8d\83ð\90\8c°ð\90\8c·ð\90\8d\84ð\90\8d\83",
+       "filehist-thumbtext": "ð\90\8c»ð\90\8c´ð\90\8c¹ð\90\8d\84ð\90\8c¹ð\90\8c»ð\90\8c°ð\90\8d\86ð\90\8d\82ð\90\8c¹ð\90\8d\83ð\90\8c°ð\90\8c·ð\90\8d\84ð\90\8d\83 ð\90\8c¿ð\90\8d\83ð\90\8c¼ð\90\8c´ð\90\8d\82ð\90\8c¾ð\90\8c° ð\90\8c¹ð\90\8c½ $1",
+       "filehist-user": "ð\90\8c±ð\90\8d\82ð\90\8c¿ð\90\8cºð\90\8c¾ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8d\83\90\8c±ð\90\8d\82ð\90\8c¿ð\90\8cºð\90\8c¾ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8c¹",
        "filehist-dimensions": "𐍅𐌰𐌷𐍃𐍄𐌿𐍃",
        "filehist-filesize": "Feilans wahstus",
-       "filehist-comment": "ð\90\8c»ð\90\8c´ð\90\8c¹ð\90\8d\84ð\90\8c»ð\90\8c°ð\90\8d\83ð\90\8d\80ð\90\8c¹ð\90\8c»ð\90\8c»ð\90\8d\89ð\90\8c½",
-       "imagelinks": "ð\90\8d\86ð\90\8c´ð\90\8c¹ð\90\8c»ð\90\8c¹ð\90\8c½ð\90\8d\83 ð\90\8c±ð\90\8d\82ð\90\8c¿ð\90\8cºð\90\8c¹ð\90\8d\83",
+       "filehist-comment": "ð\90\8d\85ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c³",
+       "imagelinks": "ð\90\8c±ð\90\8d\82ð\90\8c¿ð\90\8cºð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\83 ð\90\8d\86ð\90\8c°ð\90\8c´ð\90\8c¹ð\90\8c»ð\90\8c´",
        "linkstoimage": "𐌰𐍆𐍄𐌿𐌼𐌰 {{PLURAL:$1|𐍃𐍉 𐍃𐌴𐌹𐌳𐍉 𐌻𐌴𐌹𐌽𐌺𐍉𐌸|𐌸𐍉𐍃 𐍃𐌴𐌹𐌳𐍉𐌽𐍃 𐌻𐌴𐌹𐌽𐌺𐍉𐌽𐌳}} 𐌸𐌹𐌶𐍉𐌶𐌿𐌷 𐍆𐌴𐌹𐌻𐍉𐍃",
-       "sharedupload-desc-here": "ð\90\8d\83ð\90\8c° ð\90\8d\86ð\90\8c´ð\90\8c¹ð\90\8c»ð\90\8c° ð\90\8c¹ð\90\8d\83ð\90\8d\84 ð\90\8d\86ð\90\8d\82ð\90\8c°ð\90\8c¼ $1 ð\90\8c¾ð\90\8c°ð\90\8c· ð\90\8c¼ð\90\8c°ð\90\8c² ð\90\8d\85ð\90\8c¹ð\90\8d\83ð\90\8c°ð\90\8c½ ð\90\8c±ð\90\8d\82ð\90\8c¿ð\90\8cºð\90\8c¾ð\90\8c°ð\90\8c½ð\90\8d\83 ð\90\8d\86ð\90\8d\82ð\90\8c°ð\90\8c¼ ð\90\8c°ð\90\8c»ð\90\8c¾ð\90\8c°ð\90\8c¹ð\90\8c¼ ð\90\8d\86ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c°ð\90\8d\85ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8d\80ð\90\8d\89ð\90\8c¼.\nð\90\8d\86ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c°ð\90\8c¼ð\90\8c´ð\90\8c»ð\90\8c¾ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8d\83 ð\90\8c°ð\90\8c½ð\90\8c° ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8c°ð\90\8c¹ ð\90\8d\86ð\90\8c´ð\90\8c¹ð\90\8c»ð\90\8c°ð\90\8c½ð\90\8d\83ð\90\8d\86ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c°ð\90\8c¼ð\90\8c´ð\90\8c»ð\90\8c¾ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8c¹ð\90\8d\83 ð\90\8c¸ð\90\8c°ð\90\8d\82 ð\90\8c¹ð\90\8d\83ð\90\8d\84 ð\90\8c³ð\90\8c°ð\90\8c»ð\90\8c°ð\90\8c¸ð\90\8c° ð\90\8c¿ð\90\8d\83ð\90\8c²ð\90\8c¹ð\90\8c±ð\90\8c°ð\90\8c½ð\90\8d\83.",
+       "sharedupload-desc-here": "ð\90\8d\83ð\90\8d\89 ð\90\8c³ð\90\8c°ð\90\8d\84ð\90\8c° ð\90\8c¹ð\90\8d\83ð\90\8d\84 ð\90\8d\86ð\90\8d\82ð\90\8c°ð\90\8c¼ $1 ð\90\8c¾ð\90\8c°ð\90\8c· ð\90\8c¼ð\90\8c°ð\90\8c² ð\90\8c±ð\90\8d\82ð\90\8c¿ð\90\8cºð\90\8c¾ð\90\8c°ð\90\8c³ð\90\8c° ð\90\8d\86ð\90\8d\82ð\90\8c°ð\90\8c¼ ð\90\8c°ð\90\8c½ð\90\8c¸ð\90\8c°ð\90\8d\82ð\90\8c°ð\90\8c¹ð\90\8c¼ ð\90\8d\86ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c°ð\90\8d\85ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8d\80ð\90\8d\89ð\90\8c¼.\nð\90\8c²ð\90\8c°ð\90\8d\83ð\90\8cºð\90\8c´ð\90\8c¹ð\90\8d\82ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\83 ð\90\8c°ð\90\8c½ð\90\8c° ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c°ð\90\8c¼ð\90\8c¼ð\90\8c° [$2 ð\90\8c³ð\90\8c°ð\90\8d\84ð\90\8c° ð\90\8d\83ð\90\8cºð\90\8c´ð\90\8c¹ð\90\8d\82ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c¹ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c°] ð\90\8c¾ð\90\8c°ð\90\8c¹ð\90\8c½ð\90\8c°ð\90\8d\82 ð\90\8c°ð\90\8d\84ð\90\8c°ð\90\8c¿ð\90\8c²ð\90\8c¹ð\90\8c¸ð\90\8d\83 ð\90\8c¹ð\90\8d\83ð\90\8d\84 ð\90\8c¿ð\90\8d\86.",
        "filedelete-submit": "Taíran",
        "mimesearch": "MIME sokeiþ",
        "listredirects": "𐍄𐌰𐌻𐌰 𐌰𐍆 𐍄𐌰𐌹𐌺𐌾𐌰𐌽𐍃𐌴𐌹𐌳𐍉𐍃",
-       "randompage": "ð\90\8d\83ð\90\8c»ð\90\8c¿ð\90\8c¼ð\90\8d\80ð\90\8c¼ð\90\8c°ð\90\8d\83ð\90\8d\83ð\90\8c¹ð\90\8c² ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89",
+       "randompage": "ð\90\8c¸ð\90\8c¿ð\90\8d\83 ð\90\8c¿ð\90\8c½ð\90\8cºð\90\8c¿ð\90\8c½ð\90\8c¸ð\90\8d\83 ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8d\86ð\90\8d\83",
        "statistics": "𐍃𐌴𐌹𐌳𐍉𐍃𐍄𐌰𐍄𐌹𐍃𐍄𐌹𐌺",
        "brokenredirects-edit": "(𐌼𐌰𐌹𐌳𐌾𐌰𐌽)",
        "brokenredirects-delete": "(𐍄𐌰𐌹𐍂𐌰𐌽)",
-       "nbytes": "$1 {{PLURAL:$1|ð\90\8c±ð\90\8c°ð\90\8c¹ð\90\8d\84\90\8c±ð\90\8c°ð\90\8c¹𐍄𐌰}}",
+       "nbytes": "$1 {{PLURAL:$1|ð\90\8c±ð\90\8c¹ð\90\8d\84\90\8c±ð\90\8c°𐍄𐌰}}",
        "ncategories": "$1 {{PLURAL:$1|𐌺𐌿𐌽𐌾𐌰|𐌺𐌿𐌽𐌾𐍉𐍃}}",
        "nlinks": "$1 {{PLURAL:$1|táikjanbandi|táikjanbandja}}",
        "nmembers": "$1 {{PLURAL:$1|niutand|niutanda}}",
-       "wantedpages": "Gaírnedum seidam",
+       "wantedpages": "𐌲𐌰𐌹𐍂𐌽𐌹𐌳𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃",
        "shortpages": "𐌻𐌴𐌹𐍄𐌹𐌻𐌰 𐍃𐌴𐌹𐌳𐍉𐍃",
-       "longpages": "𐌻𐌰𐌲𐌲𐌰 𐍃𐌴𐌹𐌳𐍉𐍃",
+       "longpages": "𐌻𐌰𐌲𐌲𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃",
        "listusers": "𐍂𐌴𐌲𐌹𐍃𐍄𐍂𐌴𐍂𐌰𐌳𐌴 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐍃",
-       "newpages": "𐌽𐌹𐌿𐌾𐌰 𐍃𐌴𐌹𐌳𐍉𐍃",
+       "newpages": "𐌽𐌹𐌿𐌾𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃",
        "move": "𐌽𐌰𐌼𐌾𐌰𐌽 𐌰𐍆𐍄𐍂𐌰",
-       "movethispage": "𐍃𐌺𐌹𐌿𐌱𐌰𐌽 𐍃𐌰 𐍃𐌴𐌹𐌳𐍉",
+       "movethispage": "𐌼𐌹𐌸𐍃𐌰𐍄𐌴𐌹 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
+       "booksources": "𐌱𐍉𐌺𐌰𐌱𐍂𐌿𐌽𐌽𐌰𐌽𐍃",
+       "booksources-search-legend": "𐍃𐍉𐌺𐌴𐌹 𐌱𐍉𐌺𐌰𐌱𐍂𐌿𐌽𐌽𐌰𐌽𐍃",
+       "booksources-search": "𐍃𐍉𐌺𐌴𐌹",
        "specialloguserlabel": "Niutand:",
        "speciallogtitlelabel": "Namo:",
        "log": "𐌻𐍉𐌲𐌱𐍉𐌺𐍉𐍃",
        "all-logs-page": "𐌰𐌻𐌻𐌰 𐌻𐍉𐌲𐍉𐍃",
-       "allpages": "ð\90\8c°ð\90\8c»ð\90\8c»ð\90\8c¹ð\90\8d\83 ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³𐍉𐍃",
+       "allpages": "ð\90\8c°ð\90\8c»ð\90\8c»ð\90\8c°ð\90\8c¹ ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8c±𐍉𐍃",
        "nextpage": "𐌹𐍆𐍄𐌿𐌼𐌰 𐍃𐌴𐌹𐌳𐍉 ($1)",
-       "prevpage": "ð\90\8c°ð\90\8d\86ð\90\8d\84ð\90\8c¿ð\90\8c¼ð\90\8c° ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89 ($1)",
-       "allarticles": "ð\90\8c°ð\90\8c»ð\90\8c¾ð\90\8c° ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³𐍉𐍃",
-       "allpagessubmit": "ð\90\8c°ð\90\8d\86ð\90\8c²ð\90\8c°ð\90\8c²ð\90\8c²ð\90\8c°ð\90\8c½",
-       "categories": "ð\90\8cºð\90\8c¿ð\90\8c½ð\90\8c¾ð\90\8d\89ð\90\8d\83",
+       "prevpage": "ð\90\8c°ð\90\8d\86ð\90\8d\84ð\90\8c¿ð\90\8c¼ð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8d\83 ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8d\86ð\90\8d\83 ($1)",
+       "allarticles": "ð\90\8c°ð\90\8c»ð\90\8c»ð\90\8c°ð\90\8c¹ ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8c±𐍉𐍃",
+       "allpagessubmit": "ð\90\8c²ð\90\8c°ð\90\8c²ð\90\8c²",
+       "categories": "ð\90\8cºð\90\8c¿ð\90\8c½ð\90\8c¾ð\90\8c°",
        "linksearch-ns": "𐍃𐌴𐌹𐌳𐍉𐍆𐌴𐍂𐌰:",
        "emailuser": "𐍃𐌰𐌽𐌳𐌾𐌰𐌽 𐌸𐍉 𐌽𐌹𐌿𐍄𐌰𐌽𐌳 𐌱𐍉𐌺𐍉𐌼",
-       "watchlist": "ð\90\8c¼ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\89ð\90\8d\83 ð\90\8d\85ð\90\8c¹ð\90\8d\84ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8d\83ð\90\8c»ð\90\8c´ð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8c°",
-       "mywatchlist": "ð\90\8c¼ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\89ð\90\8d\83 ð\90\8d\85ð\90\8c¹ð\90\8d\84ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8d\83𐌻𐌴𐌹𐍃𐍄𐌰",
+       "watchlist": "ð\90\8d\85ð\90\8c¹ð\90\8d\84ð\90\8c°ð\90\8d\85ð\90\8c¹ð\90\8cºð\90\8d\89",
+       "mywatchlist": "ð\90\8c»ð\90\8c°ð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8c°𐌻𐌴𐌹𐍃𐍄𐌰",
        "watch": "𐍅𐌰𐍂𐌰𐌽",
        "watchthispage": "𐍅𐌰𐍂𐌰𐌽 𐍃𐌴𐌹𐌳𐍉",
        "unwatch": "𐌽𐌹𐍅𐌰𐍂𐌰𐌽",
-       "watchlist-details": "{{PLURAL:$1|$1 seido|$1 seidona}} witáiþs inu maþleiseidam.",
+       "watchlist-details": "{{PLURAL:$1|$1 𐌻𐌰𐌿𐍆𐍃|$1 𐌻𐌰𐌿𐌱𐍉𐍃}} 𐌰𐌽𐌰 𐌸𐌴𐌹𐌽𐌰𐌹 𐍅𐌹𐍄𐌰𐍅𐌹𐌺𐍉𐌽, 𐌽𐌹 𐍃𐌿𐌽𐌳𐍂𐍉 𐍂𐌰𐌷𐌽𐌾𐌰𐌽𐌳𐌰 𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰𐌻𐌰𐌿𐌱𐍉𐍃.",
        "watching": "Wita...",
        "unwatching": "Niwita...",
        "created": "𐌲𐌰𐍃𐌺𐌰𐍀𐌾𐌰𐌽",
-       "deletepage": "ð\90\8d\84ð\90\8c°ð\90\8c¹ð\90\8d\82ð\90\8c° ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89",
+       "deletepage": "ð\90\8d\86ð\90\8d\82ð\90\8c°ð\90\8cµð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8c´ð\90\8c¹ ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c°",
        "delete-legend": "𐍄𐌰𐌹𐍂𐌰𐌽",
        "actioncomplete": "𐍅𐌰𐍃𐌿𐌷 𐌹𐍄𐌰 𐌲𐌰𐌿𐍃𐍄𐌹𐌿𐌷𐌰𐌽",
        "dellogpage": "𐍄𐌰𐌹𐍂𐌰 𐌰𐌹𐍂𐍅𐌱𐍉𐌺𐌰",
        "deleteotherreason": "𐌰𐌽𐌸𐌰𐍂/𐌼𐌰𐌹𐍃 𐌼𐌹𐍄𐍉𐌽𐍃:",
        "deletereasonotherlist": "𐌰𐌽𐌸𐌰𐍂 𐌼𐌹𐍄𐍉𐌽𐍃",
-       "rollbacklink": "𐌰𐍆𐍅𐌰𐌻𐍅𐌾𐌰𐌽",
+       "rollbacklink": "𐌰𐍆𐍅𐌰𐌻𐍅𐌴𐌹",
+       "rollbacklinkcount": "𐌰𐍆𐍅𐌰𐌻𐍅𐌴𐌹 $1 {{PLURAL:$1|𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽|𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐌽𐍃}}",
        "protectlogpage": "Log af Baírgjan",
        "prot_1movedto2": "[[$1]] skiubiþ du [[$2]]",
-       "protect-level-sysop": "ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89ð\90\8d\86ð\90\8c°ð\90\8c¸ð\90\8d\83 ð\90\8c°ð\90\8c¹ð\90\8c½ð\90\8c°ð\90\8c·ð\90\8c°",
+       "protect-level-sysop": "ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8c»ð\90\8c´ð\90\8d\84ð\90\8c¹ð\90\8c¸ ð\90\8c¸ð\90\8c°ð\90\8d\84ð\90\8c°ð\90\8c¹ð\90\8c½ð\90\8c´ð\90\8c¹ ð\90\8d\82ð\90\8c´ð\90\8c¹ð\90\8cºð\90\8d\83",
        "protect-expiring": "bláuþiþ $1 (UTC)",
        "restriction-type": "Freihals:",
        "restriction-edit": "𐌼𐌰𐌹𐌳𐌾𐌰𐌽",
        "undeletelink": "𐍃𐌰𐌹𐍈𐌰𐌽/𐌰𐍆𐍄𐍂𐌰𐌲𐌰𐍃𐌰𐍄𐌾𐌰𐌽",
        "undeleteviewlink": "𐍃𐌰𐌹𐍈𐌹𐍃",
        "undelete-search-submit": "Sokeiþ",
-       "namespace": "ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89ð\90\8d\86ð\90\8c´ð\90\8d\82ð\90\8c°:",
+       "namespace": "ð\90\8c½ð\90\8c°ð\90\8c¼ð\90\8c°ð\90\8d\82ð\90\8c¿ð\90\8c¼:",
        "invert": "Afwandjan kustus",
        "blanknamespace": "(𐍆𐍂𐌿𐌼𐌹𐍃𐍄𐍃)",
-       "contributions": "ð\90\8c½ð\90\8c¹ð\90\8c¿ð\90\8d\84ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8c¹ð\90\8d\83 ð\90\8c°ð\90\8c¹ð\90\8d\85ð\90\8c»ð\90\8c°ð\90\8c²ð\90\8c¹ð\90\8d\89ð\90\8d\83",
-       "mycontris": "ð\90\8c¼ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\89ð\90\8d\83 ð\90\8c°ð\90\8c¹ð\90\8d\85ð\90\8c»ð\90\8c°ð\90\8c²ð\90\8c¹ð\90\8d\89𐍃",
+       "contributions": "ð\90\8c±ð\90\8c¹ð\90\8c°ð\90\8c¿ð\90\8cºð\90\8c°ð\90\8c¹ð\90\8c½ð\90\8c´ð\90\8c¹ð\90\8d\83 ð\90\8c±ð\90\8d\82ð\90\8c¿ð\90\8cºð\90\8c¾ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8c¹ð\90\8d\83 {{{{GENDER:$1|User}}",
+       "mycontris": "ð\90\8c±ð\90\8c¹ð\90\8c°ð\90\8c¿ð\90\8cºð\90\8c°ð\90\8c¹ð\90\8c½ð\90\8c´ð\90\8c¹𐍃",
        "contribsub2": "𐍆𐌰𐌿𐍂 $1 ($2)",
-       "uctop": "(háubiþ)",
+       "uctop": "(𐌷𐌰𐌿𐌱𐌹𐌸)",
        "month": "𐍆𐍂𐌰𐌼 𐌼𐌴𐌽𐍉𐌸𐍃 (𐌾𐌰𐌷 𐌰𐍆𐍄𐌿𐌼𐌰):",
        "year": "𐍆𐍂𐌰𐌼 𐌾𐌴𐍂𐌰 (𐌾𐌰𐌷 𐌰𐍆𐍄𐌿𐌼𐌰):",
        "sp-contributions-newbies-sub": "Faúr niujis niutandis",
        "sp-contributions-blocklog": "Logboka af afdraúsjan",
-       "sp-contributions-talk": "Maþleiseido",
-       "whatlinkshere": "𐍈𐌰𐍂𐌾𐌹𐍃 𐍃𐌴𐌹𐌳𐍉𐌽𐍃 𐌷𐌻𐌰𐌲𐌺𐌾𐌰𐌽𐌳 𐌷𐌹𐌳𐍂𐌴",
-       "whatlinkshere-title": "Seidos hwarjis du $1 táiknjan",
+       "sp-contributions-talk": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰",
+       "whatlinkshere": "𐌰𐌻𐌻𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃 𐌸𐌰𐌹𐌴𐌹 𐌱𐍂𐌹𐌲𐌲𐌰𐌽𐌳 𐌸𐌿𐌺 𐌷𐌹𐌳𐍂𐌴",
+       "whatlinkshere-title": "𐌻𐌰𐌿𐌱𐍉𐍃 𐌸𐌰𐌹𐌴𐌹 𐍄𐌰𐌹𐌺𐌽𐌾𐌰𐌽𐌳 𐌳𐌿 \"$1\"",
+       "whatlinkshere-page": "𐌻𐌰𐌿𐍆𐍃:",
+       "linkshere": "𐌹𐍆𐍄𐌿𐌼𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃 𐌱𐍂𐌹𐌲𐌲𐌰𐌽𐌳 𐌸𐌿𐌺  <strong>[[:$1]]</strong>:",
        "isredirect": "𐍄𐌰𐌹𐌺𐌾𐌰𐍃𐌴𐌹𐌳𐍉",
        "istemplate": "ináukan",
        "whatlinkshere-prev": "{{PLURAL:$1|aftuma|aftumans $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|iftuma|iftumans $1}}",
        "whatlinkshere-links": "← táikajanbandja",
-       "blockip": "𐌰𐍆𐌳𐍂𐌰𐌿𐍃𐌾𐌰𐌽 𐌽𐌹𐌿𐍄𐌰𐌽𐌳𐌹𐍃",
+       "whatlinkshere-hidelinks": "$1 𐌲𐌰𐍅𐌹𐍃𐍃𐌴𐌹𐍃",
+       "blockip": "𐍆𐌰𐌿𐍂𐌳𐌰𐌼𐌼𐌴𐌹 {{GENDER:$1|user}}",
        "ipbreason": "𐍆𐌰𐌹𐍂𐌹𐌽𐌰:",
        "ipboptions": "𐌱 𐌰𐍅𐍂𐌰:2 hours, 𐌰 𐌳𐌰𐌲𐍃:1 day, 𐌲 𐌳𐌰𐌲𐍉𐍃:3 days, 𐌰 𐍅𐌹𐌺𐍉:1 week, 𐌱 𐍅𐌹𐌺𐍉𐌽𐍃:2 weeks, 𐌰 𐌼𐌴𐌽𐍉𐌸𐍃:1 month, 𐌲 𐌼𐌴𐌽𐍉𐌸𐍉𐍃:3 months, 𐌵 𐌼𐌴𐌽𐍉𐌸𐍉𐍃:6 months, 𐌰 𐌾𐌴𐍂:1 year, 𐌹𐌽𐌿𐍄𐍂𐌹𐌲𐌲𐌴𐌽𐌳𐌴𐌹𐍃:infinite",
        "ipblocklist-submit": "Sokeiþ",
        "infiniteblock": "ajukduþs",
-       "blocklink": "ð\90\8d\85ð\90\8c°ð\90\8d\82ð\90\8c²ð\90\8c¾ð\90\8c°ð\90\8c½",
+       "blocklink": "ð\90\8d\86ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c³ð\90\8c°ð\90\8c¼ð\90\8c¼ð\90\8c´ð\90\8c¹",
        "unblocklink": "𐍅𐌰𐌽𐌳𐌾𐌰𐌽",
        "change-blocklink": "𐌲𐌰𐌼𐌰𐌹𐌳𐌾𐌰𐌽 𐍅𐌰𐌿𐍂𐌾𐌰𐍅𐌰𐌳𐌳𐌾𐌿𐍃",
-       "contribslink": "ð\90\8c²ð\90\8c¹ð\90\8c±ð\90\8d\89𐍃",
+       "contribslink": "ð\90\8c±ð\90\8c¹ð\90\8c°ð\90\8c¿ð\90\8cºð\90\8c°ð\90\8c¹ð\90\8c½ð\90\8c´ð\90\8c¹𐍃",
        "blocklogpage": "𐌻𐍉𐌲𐌱𐍉𐌺𐌰 𐌰𐍆 𐌰𐍆𐌳𐍂𐌰𐌿𐍃𐌾𐌰𐌽",
        "blocklogentry": "𐌰𐍆𐌳𐍂𐌰𐌿𐍃𐌹𐌸 [[$1]] 𐍆𐌰𐌿𐍂 $2 $3",
-       "movearticle": "𐍃𐌺𐌹𐌿𐌱𐌰 𐍃𐌴𐌹𐌳𐍉:",
-       "newtitle": "𐌳𐌿 𐌽𐌹𐌿𐌾𐌹𐍃 𐌽𐌰𐌼𐍉𐍃:",
+       "newtitle": "𐌽𐌹𐌿𐌾𐌹 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹:",
        "move-watch": "𐍅𐌹𐍄𐌰𐌽 𐍃𐍉 𐍃𐌴𐌹𐌳𐍉",
        "movepagebtn": "𐍃𐌺𐌹𐌿𐌱𐌰 𐍃𐌴𐌹𐌳𐍉",
        "movelogpage": "Log af skiubans",
        "movereason": "𐍆𐌰𐌹𐍂𐌹𐌽𐌰:",
        "revertmove": "𐍂𐌰𐌹𐌳𐌾𐌰𐌽",
-       "export": "ð\90\8c¿ð\90\8d\84ð\90\8c¼ð\90\8c¹ð\90\8c¸ð\90\8d\83ð\90\8c°ð\90\8d\84ð\90\8c¾ð\90\8c¹ð\90\8d\83 ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89𐌽𐍃",
-       "thumbnail-more": "𐌱𐌹𐌰𐌿𐌺𐌰𐌽",
-       "tooltip-pt-userpage": "𐌸𐌴𐌹𐌽𐌰 𐌽𐌹𐌿𐍄𐌰𐌽𐌳𐌹𐍃𐍃𐌴𐌹𐌳𐍉",
-       "tooltip-pt-mytalk": "𐌸𐌴𐌹𐌽𐌰 𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰𐍃𐌴𐌹𐌳𐍉",
-       "tooltip-pt-preferences": "𐌼𐌴𐌹𐌽𐍉𐍃 𐌱𐍂𐌿𐌺𐌾𐌰𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌴𐌹𐍃",
-       "tooltip-pt-watchlist": "ð\90\8c»ð\90\8c´ð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8c° ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89ð\90\8c½ð\90\8d\83 ð\90\8c´ð\90\8c¹ ð\90\8c¸ð\90\8c¿ ð\90\8c°ð\90\8d\84ð\90\8d\85ð\90\8c¹ð\90\8d\84ð\90\8c°ð\90\8c¹ð\90\8d\83 ð\90\8d\86ð\90\8c°ð\90\8c¿ð\90\8d\82 ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c¹ð\90\8c½ð\90\8d\83",
-       "tooltip-pt-mycontris": "𐍄𐌰𐌻𐌰 𐌰𐍆 𐌸𐌴𐌹𐌽 𐌲𐌹𐌱𐍉𐌽𐍃",
-       "tooltip-pt-login": "ð\90\8c¸ð\90\8c¿ ð\90\8c¹ð\90\8d\83 ð\90\8c²ð\90\8c°ð\90\8d\88ð\90\8c°ð\90\8d\84ð\90\8c¾ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8d\83 ð\90\8c°ð\90\8d\84ð\90\8c²ð\90\8c°ð\90\8c²ð\90\8c²ð\90\8c°ð\90\8c½; ð\90\8c°ð\90\8c¸ð\90\8c¸ð\90\8c°ð\90\8c½, ð\90\8c½ð\90\8c¹ð\90\8d\83ð\90\8d\84 ð\90\8c¸ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c±ð\90\8c°ð\90\8c½𐍃",
+       "export": "ð\90\8c¿ð\90\8d\84ð\90\8c±ð\90\8c°ð\90\8c¹ð\90\8d\82 ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c°𐌽𐍃",
+       "thumbnail-more": "\n𐌼𐌹𐌺𐌹𐌻𐌴𐌹",
+       "tooltip-pt-userpage": "{{GENDER:|Your user}} 𐌻𐌰𐌿𐍆𐍃",
+       "tooltip-pt-mytalk": "{{GENDER:|Your}} 𐌻𐌰𐌿𐍆𐍃 𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌹𐍃",
+       "tooltip-pt-preferences": "{{GENDER:|Your}} 𐌲𐌰𐌻𐌴𐌹𐌺𐌰𐌽𐌳𐌴𐌹𐌽𐍃 𐍅𐌰𐌹𐌷𐍄𐍃",
+       "tooltip-pt-watchlist": "ð\90\8d\85ð\90\8c¹ð\90\8cºð\90\8d\89 ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c´ ð\90\8c¸ð\90\8c¹ð\90\8c¶ð\90\8c´ð\90\8c´ð\90\8c¹ ð\90\8c°ð\90\8d\84ð\90\8d\85ð\90\8c°ð\90\8c¹ð\90\8d\83ð\90\8d\84 ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c¹ð\90\8c¼",
+       "tooltip-pt-mycontris": "A list of {{GENDER:|your}} 𐌱𐌹𐌰𐌿𐌺𐌰𐌹𐌽𐌴𐌹𐍃 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐌹𐍃",
+       "tooltip-pt-login": "ð\90\8d\84ð\90\8c¹ð\90\8c¼ð\90\8d\82ð\90\8c¾ð\90\8c°ð\90\8c¶ð\90\8c° ð\90\8c³ð\90\8c¿ ð\90\8c°ð\90\8d\84ð\90\8c²ð\90\8c°ð\90\8c²ð\90\8c²ð\90\8c°ð\90\8c½, ð\90\8c¹ð\90\8c¸ ð\90\8c½ð\90\8c¹ð\90\8d\83ð\90\8d\84 ð\90\8d\83ð\90\8cºð\90\8c¿ð\90\8c»ð\90\8c³ ð\90\8c¸ð\90\8c¿𐍃",
        "tooltip-pt-logout": "𐌻𐌴𐌹𐌸𐌰𐌽",
-       "tooltip-ca-talk": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌹 𐌱𐌹 𐌲𐌰𐌷𐌰𐌱𐌾𐌰 𐍃𐌴𐌹𐌳𐍉",
-       "tooltip-ca-edit": "𐌸𐌿 𐌼𐌰𐌲𐍄 𐌼𐌰𐌹𐌳𐌾𐌹𐍃 𐌸𐌰𐍄𐌰 𐍃𐌴𐌹𐌳𐍉. 𐌾𐌰𐌱𐌰𐌹 𐍅𐌹𐌻𐌴𐌹𐍃, 𐌱𐍂𐌿𐌺𐌾𐌹𐍃 𐍆𐌰𐌿𐍂𐍃𐌰𐌹𐍈𐌰𐌹𐍃 𐍆𐍂𐌿𐌼𐌰.",
-       "tooltip-ca-addsection": "𐌰𐌽𐌰𐍃𐍄𐍉𐌳𐌾𐌹𐍃 𐌽𐌹𐌿𐌾𐌰 𐌳𐌰𐌹𐌻",
-       "tooltip-ca-viewsource": "𐍃𐍉 𐍃𐌴𐌹𐌳𐍉 𐌹𐍃𐍄 𐌷𐌻𐌴𐌹𐌱𐌾𐌰𐌽𐌳𐍃\n𐌸𐌿 𐌼𐌰𐌲𐍄 𐍃𐌰𐌹𐍈𐌹𐍃 𐌹𐌶𐍉𐍃 𐌱𐍂𐌿𐌽𐌽𐌰𐌽",
-       "tooltip-ca-history": "𐍆𐌰𐌿𐍂𐌲𐌰𐌼𐌰𐌹𐌳𐌾𐌴𐌹𐌽𐍃 𐌸𐌹𐌶𐌿𐌷 𐍃𐌴𐌹𐌳𐍉𐌽𐍃",
+       "tooltip-pt-createaccount": "𐌱𐌰𐍄𐌹𐌶𐍉 𐌹𐍃𐍄 𐌸𐌿𐍃 𐍃𐌺𐌰𐍀𐌾𐌰𐌽 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽, 𐌹𐌸 𐍃𐌺𐌿𐌻𐌳 𐌽𐌹𐍃𐍄",
+       "tooltip-ca-talk": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌹 𐌱𐌹 𐌷𐌰𐌱𐌰𐌽𐌳𐌰𐌽 𐌻𐌰𐌿𐍆",
+       "tooltip-ca-edit": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
+       "tooltip-ca-addsection": "𐌰𐌽𐌰𐍃𐍄𐍉𐌳𐌴𐌹 𐌽𐌹𐌿𐌾𐌰 𐌳𐌰𐌹𐌻",
+       "tooltip-ca-viewsource": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃 𐌷𐌰𐌱𐌰𐌹𐌸 𐌼𐌿𐌽𐌳. 𐌼𐌰𐌲𐍄 𐌸𐌹𐍃 𐌻𐌰𐌿𐌱𐌹𐍃 𐌼𐌿𐌽𐌳 𐍃𐌰𐌹𐍈𐌰𐌽.",
+       "tooltip-ca-history": "𐌰𐍆𐍄𐌿𐌼𐍉𐍃 𐌲𐌰𐌱𐍉𐍄𐌴𐌹𐌽𐍉𐍃 𐌸𐌹𐍃 𐌻𐌰𐌿𐌱𐌹𐍃",
        "tooltip-ca-protect": "𐌱𐌰𐌹𐍂𐌲𐌰 𐌸𐍉 𐍃𐌴𐌹𐌳𐍉",
-       "tooltip-ca-delete": "ð\90\8d\84ð\90\8c°ð\90\8c¹ð\90\8d\82ð\90\8c°ð\90\8c½ ð\90\8d\83ð\90\8d\89 ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89",
-       "tooltip-ca-move": "ð\90\8d\83ð\90\8cºð\90\8c¹ð\90\8c¿ð\90\8c±ð\90\8c°ð\90\8c½ ð\90\8d\83ð\90\8d\89 ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89",
-       "tooltip-ca-watch": "ð\90\8c°ð\90\8c½ð\90\8c°ð\90\8c°ð\90\8c¿ð\90\8cºð\90\8c¹ð\90\8d\83 ð\90\8c¸ð\90\8c¹ð\90\8c¶ð\90\8c°ð\90\8c¹ ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89ð\90\8c½ ð\90\8c°ð\90\8c½ð\90\8c° ð\90\8c¸ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c° ð\90\8d\85ð\90\8c¹ð\90\8d\84ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8c»ð\90\8c´ð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8c°",
+       "tooltip-ca-delete": "ð\90\8d\86ð\90\8d\82ð\90\8c°ð\90\8cµð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8c´ð\90\8c¹ ð\90\8c¸ð\90\8c°ð\90\8c¼ð\90\8c¼ð\90\8c° ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c°",
+       "tooltip-ca-move": "ð\90\8c¼ð\90\8c¹ð\90\8c¸ð\90\8d\83ð\90\8c°ð\90\8d\84ð\90\8c´ð\90\8c¹ ð\90\8c¸ð\90\8c°ð\90\8c½ð\90\8c° ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8d\86",
+       "tooltip-ca-watch": "ð\90\8c±ð\90\8c¹ð\90\8c°ð\90\8c¹ð\90\8c°ð\90\8c¿ð\90\8cº ð\90\8c¸ð\90\8c°ð\90\8c½ð\90\8c° ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8d\86 ð\90\8c³ð\90\8c¿ ð\90\8c¸ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c°ð\90\8c¹ ð\90\8d\85ð\90\8c¹ð\90\8d\84ð\90\8c°ð\90\8d\85ð\90\8c¹ð\90\8cºð\90\8d\89ð\90\8c½",
        "tooltip-search": "𐍃𐍉𐌺𐌾𐌰𐌽 {{SITENAME}}",
-       "tooltip-search-go": "𐍆𐌰𐍂𐌹𐍃 𐌳𐌿 𐍃𐌴𐌹𐌳𐍉𐌽 𐌼𐌹𐌸 𐌲𐌻𐌰𐌲𐌲𐌿𐌾𐌰𐌼𐌰 𐌽𐌰𐌼𐌹𐌽 𐌾𐌰𐌱𐌰𐌹 𐌹𐍃𐍄",
-       "tooltip-search-fulltext": "𐍃𐍉𐌺𐌾𐌰𐌽 𐍃𐌴𐌹𐌳𐍉𐌽𐍃 𐍆𐌰𐌿𐍂 𐌸𐌰𐌽𐌰 𐌱𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳𐌰𐌽",
-       "tooltip-p-logo": "𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐍃𐌴𐌹𐌳𐍉",
-       "tooltip-n-mainpage": "𐍃𐌰𐌹𐍈𐌰𐌽 𐍃𐌰 𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐍃𐌴𐌹𐌳𐍉",
-       "tooltip-n-mainpage-description": "𐍃𐌰𐌹𐍈𐌰𐌹𐍃 𐍃𐌰 𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐍃𐌴𐌹𐌳𐍉",
-       "tooltip-n-portal": "𐌱𐌹 𐌸𐌹𐌶𐌰𐌹 𐍆𐌰𐌿𐍂𐌰𐍅𐌰𐌿𐍂𐍀𐌰𐌹, 𐍈𐌰𐍃 𐌸𐌿 𐌼𐌰𐌲 𐍄𐌰𐌿𐌾𐌰, 𐍈𐌰𐍃 𐍃𐍄𐌰𐌸𐍃 𐌱𐌹𐌲𐌹𐍄𐌰𐌽 𐌹𐌽𐍃",
-       "tooltip-n-currentevents": "𐌱𐌹𐌲𐌹𐌸𐌹𐍃 𐌱𐌰𐌺𐌲𐌰𐌷𐌰𐌱𐌹 𐌱𐌹 𐌽𐌹𐌿𐌾𐌰𐌽𐍃 𐍅𐌰𐌹𐌷𐍄𐌰𐌽𐍃",
-       "tooltip-n-recentchanges": "𐌻𐌴𐌹𐍃𐍄𐌰 𐌼𐌰𐌹𐌳𐌾𐌴𐌹𐌽𐌴 𐌽𐌿 𐌰𐌽𐌰 𐌸𐌰𐌼𐌼𐌰 𐍅𐌹𐌺𐌾𐌰",
-       "tooltip-n-randompage": "𐌿𐍃𐌻𐌰𐌸𐌰𐌹𐌸 𐍃𐌻𐌿𐌼𐍀𐌼𐌰𐍃𐍃𐌹𐌾𐌹𐍃 𐍃𐌴𐌹𐌳𐍉",
-       "tooltip-n-help": "𐍃𐌰 𐍃𐍄𐌰𐌸𐍃 𐍆𐌹𐌽𐌸𐌰𐌽",
-       "tooltip-t-whatlinkshere": "𐌻𐌴𐌹𐍃𐍄𐌰 𐌰𐌻𐌻𐌹𐍃 𐍅𐌹𐌺𐌾𐍉𐍃 𐍃𐌴𐌹𐌳𐍉𐌽𐍉 𐌴𐌹 𐌻𐌴𐌹𐌽𐌺𐍉𐌽𐌳 𐌷𐌹𐌳𐍂𐌴",
-       "tooltip-t-recentchangeslinked": "𐌲𐌰𐌼𐌰𐌹𐌳𐌾𐌴𐌹𐌽𐍃 𐌽𐌿 𐍅𐌹𐌸𐍂𐌰 𐍃𐌴𐌹𐌳𐍉𐌽𐍃 𐌸𐌰𐍄𐌴𐌹 𐍃𐌹𐌽𐌳 𐌻𐌴𐌹𐌽𐌺𐍉𐌽𐍃 𐌿𐍃 𐌸𐌰𐌼𐌼𐌰 𐍃𐌴𐌹𐌳𐍉𐌽",
-       "tooltip-feed-atom": "𐌰𐍄𐍉𐌼 𐍂𐌹𐌽𐌽𐍉 𐌱𐌹 𐌸𐌹𐌶𐌰𐌹 𐍃𐌴𐌹𐌳𐍉𐌽",
+       "tooltip-search-go": "𐌾𐌰𐌱𐌰𐌹 𐌹𐍃𐍄, 𐌲𐌰𐌲𐌲 𐌳𐌿 𐌻𐌰𐌿𐌱𐌰 𐌼𐌹𐌸 𐍃𐌰𐌼𐌹𐌽 𐌽𐌰𐌼𐌹𐌽.",
+       "tooltip-search-fulltext": "𐍃𐍉𐌺𐌴𐌹 𐌻𐌰𐌿𐌱𐌰𐌽𐍃 𐌸𐌰𐌹𐌼 𐌱𐍉𐌺𐍉𐌼",
+       "tooltip-p-logo": "𐌲𐌰𐍅𐌴𐌹𐍃 𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐌻𐌰𐌿𐌱𐌹𐍃",
+       "tooltip-n-mainpage": "𐌲𐌰𐍅𐌴𐌹𐍃 𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐌻𐌰𐌿𐌱𐌹𐍃",
+       "tooltip-n-mainpage-description": "𐌲𐌰𐍅𐌴𐌹𐍃 𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐌻𐌰𐌿𐌱𐌹𐍃",
+       "tooltip-n-portal": "𐌱𐌹 𐍆𐌰𐌿𐍂𐌰𐍅𐌰𐌿𐍂𐍀𐌰, 𐍈𐌰 𐌼𐌰𐌲𐍄 𐍄𐌰𐌿𐌾𐌰𐌽, 𐍈𐌰𐍂 𐌱𐌹𐌲𐌹𐍄𐌹𐍃 𐍅𐌰𐌹𐌷𐍄𐌹𐌽𐍃",
+       "tooltip-n-currentevents": "𐌱𐌹𐌲𐌹𐍄 𐌼𐌰𐌹𐍃 𐌺𐌿𐌽𐌸𐌹 𐌱𐌹 𐌽𐌹𐌿𐌾𐍉𐍃 𐍅𐌰𐌿𐍂𐌸𐌰𐌽𐍉𐍃 𐍅𐌰𐌹𐌷𐍄𐌹𐌽𐍃",
+       "tooltip-n-recentchanges": "𐍅𐌹𐌺𐍉 𐌰𐌽𐌳𐍅𐌰𐌹𐍂𐌸𐌰𐌹𐌶𐍉 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉 𐌹𐌽 𐌸𐌰𐌼𐌼𐌰 𐍅𐌹𐌺𐌾𐌰",
+       "tooltip-n-randompage": "𐌿𐍃𐌱𐍂𐌹𐌲𐌲 𐌸𐌿𐍃 𐌿𐌽𐌺𐌿𐌽𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
+       "tooltip-n-help": "𐍃𐌰 𐍃𐍄𐌰𐌸𐍃 𐌳𐌿 𐌱𐌹𐌲𐌹𐍄𐌰𐌽",
+       "tooltip-t-whatlinkshere": "𐍅𐌹𐌺𐍉 𐌰𐌻𐌻𐌰𐌹𐌶𐌴 𐍅𐌹𐌺𐌾𐌰𐌻𐌰𐌿𐌱𐌴 𐌸𐌹𐌶𐌴𐌴𐌹 𐌱𐍂𐌹𐌲𐌲𐌰𐌽𐌳 𐌸𐌿𐌺 𐌷𐌹𐌳𐍂𐌴",
+       "tooltip-t-recentchangeslinked": "𐌰𐌽𐌳𐍅𐌰𐌹𐍂𐌸𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌹𐌽 𐌻𐌰𐌿𐌱𐌰𐌼 𐌲𐌰𐍅𐌹𐌳𐌰𐌽𐌰𐌹𐌼 𐌰𐍆 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰.",
+       "tooltip-feed-atom": "𐌰𐍄𐍉𐌼 𐍆𐍉𐌳𐌴𐌹𐌽𐍃 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰",
+       "tooltip-t-contributions": "𐍅𐌹𐌺𐍉 𐌱𐌹𐌰𐌿𐌺𐌰𐌹𐌽𐌴 𐍆𐍂𐌰𐌼 {{GENDER:$1|𐌸𐌰𐌼𐌼𐌰 𐌱𐍂𐌿𐌺𐌾𐌹𐌽}}",
        "tooltip-t-upload": "𐌿𐍃𐌷𐌻𐌰𐌸𐌰𐌽 𐍆𐌴𐌹𐌻𐌰𐌽𐍃",
-       "tooltip-t-specialpages": "𐌻𐌴𐌹𐍃𐍄𐌰 𐌸𐌹𐌶𐍉 𐌿𐍃𐍃𐌹𐌽𐌳𐍃𐌴𐌹𐌳𐍉𐌽𐍉",
-       "tooltip-t-print": "𐍅𐍂𐌴𐌹𐍄𐌼𐌰𐌷𐍄𐌴𐌹𐌲 𐌿𐍃𐌲𐌰𐌱𐍉𐍃 𐌸𐌹𐌶𐍉𐍃 𐍃𐌴𐌹𐌳𐍉𐌽𐍃",
-       "tooltip-t-permalink": "𐍃𐌹𐌽𐍄𐌴𐌹𐌽𐍉 𐍃𐍄𐌰𐌽𐌳𐌰𐌽𐍃 𐌻𐌴𐌹𐌽𐌺𐌰 𐍅𐌹𐌸𐍂𐌰 𐌲𐌰𐌼𐌰𐌹𐌳𐌾𐌴𐌹𐌽 𐌸𐌹𐌶𐍉𐍃 𐍃𐌴𐌹𐌳𐍉𐌽𐍃",
-       "tooltip-ca-nstab-main": "𐍃𐌰𐌹𐍈𐌰𐌹𐍃 𐌸𐌰𐍄𐌰 𐌲𐌰𐌷𐌰𐌱𐌾𐌰 𐍃𐌴𐌹𐌳𐍉",
-       "tooltip-ca-nstab-user": "𐍃𐌰𐌹𐍈𐌰𐌽 𐍃𐌰 𐌽𐌹𐌿𐍄𐌰𐌽𐌳𐌹𐍃𐍃𐌴𐌹𐌳𐍉",
-       "tooltip-ca-nstab-image": "𐍃𐌰𐌹𐍈𐌰𐌽 𐌸𐍉 𐍆𐌴𐌹𐌻𐌰𐍃𐌴𐌹𐌳𐍉𐌽",
+       "tooltip-t-specialpages": "𐍅𐌹𐌺𐍉 𐌰𐌻𐌻𐌰𐌹𐌶𐌴 𐌿𐍃𐍃𐌹𐌽𐌳𐌰𐌹𐌶𐌴 𐌻𐌰𐌿𐌱𐌴",
+       "tooltip-t-print": "𐌿𐍃𐌼𐌴𐍂𐌴𐌹𐌽𐍃 𐌸𐌹𐍃 𐌻𐌰𐌿𐌱𐌹𐍃 𐌳𐌿 𐌿𐍃𐌼𐌴𐌻𐌾𐌰𐌽",
+       "tooltip-t-permalink": "𐌰𐌹𐍅𐌴𐌹𐌽𐌰 𐌲𐌰𐍅𐌹𐍃𐍃 𐌳𐌿 𐌸𐌹𐌶𐌰𐌹 𐌰𐍆𐍄𐍂𐌰𐍃𐌹𐌿𐌽𐌰𐌹 𐌸𐌹𐍃 𐌻𐌰𐌿𐌱𐌹𐍃",
+       "tooltip-ca-nstab-main": "𐍃𐌰𐌹𐍈 𐌷𐌰𐌱𐌰𐌽𐌳𐌰𐌽 𐌻𐌰𐌿𐍆",
+       "tooltip-ca-nstab-user": "𐍃𐌰𐌹𐍈 𐌱𐍂𐌿𐌺𐌾𐌰𐌻𐌰𐌿𐍆",
+       "tooltip-ca-nstab-special": "𐍃𐌰 𐌹𐍃𐍄 𐌿𐍃𐍃𐌹𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃 𐌾𐌰𐌷 𐌽𐌹 𐌼𐌰𐌲 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌳𐌰.",
+       "tooltip-ca-nstab-project": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍅𐌰𐌿𐍂𐍀𐌰𐌻𐌰𐌿𐍆",
+       "tooltip-ca-nstab-image": "𐍃𐌰𐌹𐍈 𐍆𐌰𐌴𐌹𐌻𐌰𐌻𐌰𐌿𐍆",
        "tooltip-ca-nstab-template": "𐍃𐌰𐌹𐍈𐌹𐍃 𐍆𐌰𐌿𐍂𐌰𐌼𐌴𐌻𐌴𐌹𐌽",
-       "tooltip-ca-nstab-category": "𐍃𐌰𐌹𐍈𐌹𐍃 𐍃𐌴𐌹𐌳𐍉𐌽 𐌷𐌰𐌽𐍃𐍉",
-       "tooltip-save": "ð\90\8d\83ð\90\8cºð\90\8d\82ð\90\8c´ð\90\8c¹ð\90\8c±ð\90\8c°ð\90\8c¹ð\90\8c½ ð\90\8c¸ð\90\8c´ð\90\8c¹ð\90\8c½ ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c´𐌹𐌽𐍃",
+       "tooltip-ca-nstab-category": "𐍃𐌰𐌹𐍈 𐌺𐌿𐌽𐌾𐌰𐌻𐌰𐌿𐍆",
+       "tooltip-save": "ð\90\8c²ð\90\8c°ð\90\8d\86ð\90\8c°ð\90\8d\83ð\90\8d\84 ð\90\8c¸ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\89ð\90\8d\83 ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c´ð\90\8c¹ð\90\8c½𐌹𐌽𐍃",
        "tooltip-preview": "𐍆𐌰𐌿𐍂𐍃𐌰𐍈𐌹𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌴𐌹𐌽𐍉𐍃 𐌸𐌴𐌹𐌽𐌰, 𐌱𐌹𐌳𐌾𐌰 𐌸𐌿𐌺 𐌱𐍂𐌿𐌺𐌾𐌰𐌽 𐌸𐌰𐍄𐌰 𐍆𐌰𐌿𐍂𐌰 𐌼𐌴𐌻𐌾𐌹𐍃!",
-       "tooltip-diff": "ð\90\8d\83ð\90\8c°ð\90\8c¹ð\90\8d\88ð\90\8c¹ð\90\8c¸ ð\90\8c¸ð\90\8c°ð\90\8c½ð\90\8c¶ð\90\8c´ð\90\8c¹ ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c¾ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\89ð\90\8d\83 ð\90\8c¸ð\90\8c°ð\90\8d\84ð\90\8c´ð\90\8c¹ ð\90\8c±ð\90\8d\82ð\90\8c¿ð\90\8cºð\90\8c¾ð\90\8c¹ð\90\8d\83 ð\90\8c±ð\90\8d\89ð\90\8cºð\90\8c°ð\90\8d\85ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c³ð\90\8c¹ð\90\8c½ð\90\8d\83",
-       "tooltip-rollback": "\"ð\90\8c°ð\90\8d\86ð\90\8d\85ð\90\8c°ð\90\8c»ð\90\8d\85ð\90\8c¾ð\90\8c°ð\90\8c½\" ð\90\8c±ð\90\8c°ð\90\8cºð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c¾ð\90\8c¹ð\90\8c¸ ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c¾ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\83 ð\90\8c±ð\90\8c¹ ð\90\8c¸ð\90\8c¹ð\90\8c¶ð\90\8c°ð\90\8c¹ ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89ð\90\8c½ ð\90\8d\85ð\90\8c¹ð\90\8d\83ð\90\8c°ð\90\8c½ ð\90\8d\83ð\90\8d\89 ð\90\8c²ð\90\8c°ð\90\8c¼ð\90\8c°ð\90\8c³ð\90\8c¾ð\90\8c´ð\90\8c¹ ð\90\8c¼ð\90\8c°ð\90\8c½ð\90\8c°ð\90\8c²ð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8d\83 ð\90\8c½ð\90\8c¹ð\90\8c¿ð\90\8c¾ð\90\8c° ð\90\8c²ð\90\8c¹ð\90\8c±ð\90\8c°ð\90\8c¾ð\90\8c¹ð\90\8c½ð\90\8d\83 ð\90\8d\86ð\90\8d\82ð\90\8c°ð\90\8c¼ ð\90\8c°ð\90\8c¹ð\90\8c½ð\90\8d\83 ð\90\8cºð\90\8c»ð\90\8c¹ð\90\8cº",
+       "tooltip-diff": "ð\90\8c°ð\90\8d\84ð\90\8c°ð\90\8c¿ð\90\8c²ð\90\8c´ð\90\8c¹ ð\90\8d\88ð\90\8c¹ð\90\8c»ð\90\8c´ð\90\8c¹ð\90\8cºð\90\8d\89ð\90\8d\83 ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c¹ð\90\8c½ð\90\8d\83 ð\90\8c²ð\90\8c°ð\90\8d\84ð\90\8c°ð\90\8d\85ð\90\8c¹ð\90\8c³ð\90\8c´ð\90\8d\83 ð\90\8c³ð\90\8c¿ ð\90\8c¸ð\90\8c°ð\90\8c¹ð\90\8c¼ ð\90\8c±ð\90\8d\89ð\90\8cºð\90\8d\89ð\90\8c¼",
+       "tooltip-rollback": "\"ð\90\8c°ð\90\8d\86ð\90\8d\85ð\90\8c°ð\90\8c»ð\90\8d\85ð\90\8c´ð\90\8c¹\" ð\90\8c²ð\90\8c°ð\90\8c½ð\90\8c°ð\90\8d\83ð\90\8c¾ð\90\8c¹ð\90\8c¸ ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c´ð\90\8c¹ð\90\8c½(ð\90\8d\89ð\90\8d\83) ð\90\8c³ð\90\8c¿ ð\90\8c¸ð\90\8c°ð\90\8c¼ð\90\8c¼ð\90\8c° ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c° ð\90\8c°ð\90\8d\86ð\90\8d\84ð\90\8c¿ð\90\8c¼ð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8c¹ð\90\8d\83 ð\90\8c±ð\90\8c¹ð\90\8c°ð\90\8c¿ð\90\8cºð\90\8c°ð\90\8c½ð\90\8c³ð\90\8c¹ð\90\8d\83\90\8c°ð\90\8d\86ð\90\8d\84ð\90\8c¿ð\90\8c¼ð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8c°ð\90\8c¹ð\90\8c¶ð\90\8d\89ð\90\8d\83 ð\90\8c±ð\90\8c¹ð\90\8c°ð\90\8c¿ð\90\8cºð\90\8c°ð\90\8c½ð\90\8c³ð\90\8c¾ð\90\8d\89ð\90\8d\83 ð\90\8c¹ð\90\8c½ ð\90\8c°ð\90\8c¹ð\90\8c½ð\90\8c°ð\90\8c¼ð\90\8c¼ð\90\8c° ð\90\8d\83ð\90\8c¹ð\90\8c½ð\90\8c¸ð\90\8c°",
        "tooltip-undo": "\"𐌽𐌹𐌿𐍃𐌺𐌰𐍀𐌾𐌰𐌽\" 𐌱𐌰𐌺𐌼𐌰𐌹𐌳𐌾𐌹𐌸 𐌹𐌽𐌼𐌰𐌹𐌳𐌲𐌴𐌹𐌽𐍃 𐌾𐌰𐌷 𐌿𐍃𐌻𐌿𐌺𐍉𐌸 𐌼𐌰𐌹𐌳𐌾𐌰𐍆𐍉𐍂𐌼𐍉𐌽 𐍃𐍅𐌴 𐍆𐌰𐌿𐍂𐍃𐌰𐌹𐍈𐌰 𐌷𐌹𐍅𐌾𐌰. 𐌸𐌰𐍄𐌰 𐌻𐌴𐍄 𐌰𐌽𐌰𐌿𐌺𐌰𐌽𐌰𐌽 𐍃𐌰𐌿𐌸𐌰 𐌹𐌽 𐌹𐌽𐌽𐌰𐌷𐌰𐌻𐌳𐌰𐌰𐌽𐌲𐌰𐌱𐌰.",
        "tooltip-summary": "𐌰𐍄𐌲𐌰𐌲𐌲𐌹𐍃 𐌹𐌽𐌽𐌰𐌷𐌰𐌻𐌳𐌰𐌰𐌽𐌲𐌰𐌱𐌰 𐌼𐌰𐌿𐍂𐌲𐌾𐌰",
+       "pageinfo-toolboxlink": "𐌺𐌿𐌽𐌸𐌹 𐌻𐌰𐌿𐌱𐌹𐍃",
        "previousdiff": "← 𐌰𐍆𐍄𐌿𐌼𐌰 𐌰𐌹𐍂𐌹𐍃",
-       "nextdiff": "Iftuma áiris →",
+       "nextdiff": "𐌽𐌹𐌿𐌾𐌹𐌶𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 →",
        "file-info-size": "$1 × $2 𐍀𐌹𐌺𐍃𐌴𐌻𐌰, 𐍆𐌴𐌹𐌻𐍅𐌰𐌷𐍃𐍄𐌿𐍃: $3, 𐌼𐌹𐌼𐌴 𐌺𐌿𐌽𐌹: $4",
-       "show-big-image": "Fullis wahstus",
+       "show-big-image": "𐍆𐍂𐌿𐌼𐌹𐍃𐍄𐌰 𐌳𐌰𐍄𐌰",
+       "show-big-image-preview": "𐌼𐌹𐌺𐌹𐌻𐌴𐌹 𐌸𐌹𐌶𐍉𐍃 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽𐌰𐌹𐍃: $1.",
+       "show-big-image-size": "$1 × $2 𐍆𐍂𐌹𐍃𐌰𐌷𐍄𐌹𐍃𐍄𐌰𐌱𐌴𐌹𐍃",
        "ilsubmit": "Sokeiþ",
        "metadata": "𐌿𐍆𐌰𐍂𐌳𐌰𐍄𐌰",
-       "namespacesall": "𐌰𐌻𐌻𐌹𐍃",
+       "exif-colorspace": "𐍆𐌰𐍂𐍅𐌰𐍂𐌿𐌼",
+       "exif-orientation-1": "𐌱𐌹 𐌱𐌹𐌿𐌷𐍄𐌾𐌰",
+       "namespacesall": "𐌰𐌻𐌻",
        "monthsall": "𐌰𐌻𐌻𐌹𐍃",
        "imgmultigo": "Afgaggan!",
        "table_pager_limit_submit": "Affgaggan",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰]])",
        "version-other": "Anþar",
-       "specialpages": "ð\90\8c¿ð\90\8d\83ð\90\8d\83ð\90\8c¹ð\90\8c½ð\90\8c³ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³𐍉𐍃",
+       "specialpages": "ð\90\8c¿ð\90\8d\83ð\90\8d\83ð\90\8c¹ð\90\8c½ð\90\8c³ð\90\8c°ð\90\8c¹ ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8c±𐍉𐍃",
        "tag-filter": "[[Special:Tags|𐍄𐌰𐌹𐌺𐌽𐍉𐍃]] 𐍆𐌹𐌻𐌷𐌰",
-       "rightsnone": "(ni áinshun)"
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|𐍃𐍉𐌺𐌴𐌹𐌽𐌹𐍅𐌰𐌿𐍂𐌳|𐍃𐍉𐌺𐌴𐌹𐌽𐌹𐍅𐌰𐌿𐍂𐌳𐌰}}]]: $2)",
+       "tags-source-header": "𐌱𐍂𐌿𐌽𐌽𐌰",
+       "tags-actions-header": "𐌳𐌴𐌳𐌴𐌹𐍃",
+       "tags-source-none": "𐌽𐌹 𐌾𐌿 𐌱𐍂𐌿𐌺𐌾𐌰𐌳𐌰",
+       "tags-delete": "𐌿𐍃𐌽𐌹𐌼",
+       "tags-activate": "𐌲𐌰𐌵𐌹𐌿𐌴𐌹",
+       "tags-deactivate": "𐌿𐌽𐌲𐌰𐌵𐌹𐌿𐌴𐌹",
+       "tags-create-heading": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌽𐌹𐌿𐌾𐌰𐍄𐌰 𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳",
+       "tags-create-tag-name": "𐌽𐌰𐌼𐍉 𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳𐌹𐍃:",
+       "tags-create-reason": "𐌳𐌿𐌸𐌸𐌴:",
+       "tags-create-submit": "𐍃𐌺𐌰𐍀𐌴𐌹",
+       "tags-create-warnings-below": "𐍅𐌹𐌻𐌴𐌹𐌶𐌿 𐌸𐌰𐌹𐍂𐍈𐌹𐍃𐌰𐌽 𐍃𐌺𐌰𐍀𐌾𐌰𐌽 𐌸𐌰𐍄𐌰 𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳?",
+       "tags-delete-title": "𐌿𐍃𐌽𐌹𐌼 𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳",
+       "tags-delete-explanation-initial": "𐍅𐌰𐌹𐍂𐌸𐌰𐌹𐍃 𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳 \"$1\" 𐌿𐍃𐌽𐌹𐌼𐌰𐌽 𐌿𐍃 𐌲𐌹𐌱𐌰𐌲𐌰𐍃𐌰𐍄𐌴𐌹𐌽𐌰𐌹.",
+       "tags-delete-reason": "𐌳𐌿𐌸𐌸𐌴:",
+       "tags-delete-not-found": "𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳 \"$1\" 𐌽𐌹𐍃𐍄.",
+       "tags-activate-title": "𐌲𐌰𐌵𐌹𐌿𐌴𐌹 𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳",
+       "tags-activate-question": "𐍅𐌰𐌹𐍂𐌸𐌰𐌹𐍃 𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳 \"$1\" 𐌲𐌰𐌵𐌹𐌿𐌾𐌰𐌽.",
+       "tags-activate-reason": "𐌳𐌿𐌸𐌸𐌴:",
+       "tags-activate-not-found": "𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳 \"$1\" 𐌽𐌹𐍃𐍄.",
+       "tags-activate-submit": "𐌲𐌰𐌵𐌹𐌿𐌴𐌹",
+       "tags-deactivate-title": "𐌿𐌽𐌲𐌰𐌵𐌹𐌿𐌴𐌹 𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳",
+       "tags-deactivate-reason": "𐌳𐌿𐌸𐌸𐌴:",
+       "tags-deactivate-submit": "𐌿𐌽𐌲𐌰𐌵𐌹𐌿𐌴𐌹",
+       "logentry-delete-delete": "$1 {{GENDER:$2|𐌿𐍃𐌽𐌰𐌼}} 𐌻𐌰𐌿𐍆 $3",
+       "logentry-move-move": "$1 {{GENDER:$2|𐌼𐌹𐌸𐍃𐌰𐍄𐌹𐌳𐌰}} 𐌻𐌰𐌿𐍆𐍃 $3 𐌳𐌿 $4",
+       "logentry-newusers-create": "𐌱𐍂𐌿𐌺𐌾𐌰𐌺𐌰𐍅𐍄𐍃𐌾𐍉 $1 𐍅𐌰𐍃 {{{{GENDER:$2|𐌲𐌰𐍃𐌺𐌰𐍀𐌰𐌽𐌰}}",
+       "rightsnone": "(ni áinshun)",
+       "searchsuggest-search": "𐍃𐍉𐌺𐌴𐌹"
 }
index fd5e37f..f1cf530 100644 (file)
                        "Macofe"
                ]
        },
-       "tog-underline": "鏈接加底線:",
-       "tog-hideminor": "隱藏最近更改肚嘅細微編寫",
-       "tog-hidepatrolled": "隱藏最近更改肚巡查過嘅編寫",
-       "tog-newpageshidepatrolled": "隱藏新頁面清單肚巡查過嘅頁面",
-       "tog-extendwatchlist": "展開監視列表來顯示所有更改,毋單淨係最近嘅",
-       "tog-usenewrc": "在最近更改和監視列表肚整合同一頁嘅修改",
-       "tog-numberheadings": "標題自動編號",
-       "tog-showtoolbar": "展示編寫工具欄",
-       "tog-editondblclick": "雙撳編寫頁面",
-       "tog-editsectiononrightclick": "允許右撳標題編寫段落",
-       "tog-watchcreations": "加亻厓建立嘅頁面撈上傳嘅文件加入亻厓嘅監視列表",
-       "tog-watchdefault": "將亻厓編寫嘅頁面撈檔案加入亻厓嘅監視列表",
-       "tog-watchmoves": "將亻厓移動嘅頁面撈檔案加入亻厓嘅監視列表",
+       "tog-underline": "Lièn-chiap kâ-tái sien:",
+       "tog-hideminor": "Yún-chhông chui-khiûn kiên-kói tú ke se-mì phiên-siá",
+       "tog-hidepatrolled": "Yún-chhông chui-khiûn kiên-kói tú sùn-chhà ko ke phiên-siá",
+       "tog-newpageshidepatrolled": "Yún-chhông sîn ya̍p-mien chhîn-tân tú sùn-chhà ko ke ya̍p-mien",
+       "tog-extendwatchlist": "Chán-khôi kâm-sṳ lie̍t-péu lòi hién-sṳ só-yû kiên-kói, m̀  tân-chhiang he chui-khiûn ke",
+       "tog-usenewrc": "Chhai chui-khiûn kiên-kói lâu kâm-sṳ lie̍t-péu tú cháng-ha̍p thùng yit-ya̍p ke siû-kói",
+       "tog-numberheadings": "Phiêu-thì chhṳ-thûng phiên-ho",
+       "tog-showtoolbar": "Chán-sṳ phiên-siá kûng-khí-làn",
+       "tog-editondblclick": "Sûng-khim phiên-siá ya̍p-mien",
+       "tog-editsectiononrightclick": "Yún-hí yu-khim phiêu-thì phiên-siá thon-lo̍k",
+       "tog-watchcreations": "Kâ ngài kien-li̍p ke ya̍p-mien lâu sông-chhòn ke tóng-on kâ-ngi̍p ngài-ke kâm-sṳ lie̍t-péu",
+       "tog-watchdefault": "Chiông ngài phiên-siá ke ya̍p-mien lâu tóng-on kâ-ngi̍p ngài-ke kâm-sṳ lie̍t-péu",
+       "tog-watchmoves": "Chiông ngài yì-thûng ke ya̍p-mien lâu tóng-on kâ-ngi̍p ngài-ke kâm-sṳ lie̍t-péu",
        "tog-watchdeletion": "加亻厓刪除嘅頁面撈文件入亻厓嘅監視列表",
        "tog-minordefault": "默認標記全部編寫係細微修改",
        "tog-previewontop": "在編寫框上頭顯示預覽",
@@ -42,7 +42,7 @@
        "tog-shownumberswatching": "展示監視中嘅使用人數目",
        "tog-oldsig": "現有簽名:",
        "tog-fancysig": "將簽名看做維基文字(毋會自動產生鏈接)",
-       "tog-uselivepreview": "使用即時預覽(實驗中)",
+       "tog-uselivepreview": "Sṳ́-yung chit-sṳ̀ yi-lám",
        "tog-forceeditsummary": "還吂輸入編寫摘要時提醒亻厓",
        "tog-watchlisthideown": "監視列表肚隱藏亻厓嘅編寫",
        "tog-watchlisthidebots": "監視列表肚隱藏機器人嘅編寫",
        "tog-showhiddencats": "展示隱藏分類",
        "tog-norollbackdiff": "执行回退後毋顯示差別",
        "tog-useeditwarning": "當離開頁面之時變更還吂儲存,請提醒𠊎",
-       "tog-prefershttps": "登入時一直使用安全連線",
+       "tog-prefershttps": "Tên-ngi̍p sṳ̀ yit-chhṳ̍t sṳ́-yung ôn-chhiòn lièn-sien",
        "underline-always": "總係使用",
-       "underline-never": "從來毋用",
-       "underline-default": "外皮或瀏覽器默認",
+       "underline-never": "Chhiùng-lòi m̀-yung",
+       "underline-default": "Ngoi-phì fe̍t liù-lám-hi me̍t-ngin",
        "editfont-style": "編寫區字型樣式:",
-       "editfont-default": "瀏覽器默認",
+       "editfont-default": "Liù-lám-hi me̍t-ngin",
        "editfont-monospace": "等距字型",
        "editfont-sansserif": "無襯線字型",
        "editfont-serif": "襯線字型",
-       "sunday": "禮拜日",
-       "monday": "禮拜一",
-       "tuesday": "禮拜二",
-       "wednesday": "禮拜三",
-       "thursday": "禮拜四",
-       "friday": "禮拜五",
-       "saturday": "禮拜六",
-       "sun": "",
-       "mon": "",
-       "tue": "",
-       "wed": "",
-       "thu": "",
-       "fri": "",
-       "sat": "",
-       "january": "一月",
-       "february": "二月",
-       "march": "三月",
-       "april": "四月",
-       "may_long": "五月",
-       "june": "六月",
-       "july": "七月",
-       "august": "八月",
-       "september": "九月",
-       "october": "十月",
-       "november": "十一月",
-       "december": "十二月",
-       "january-gen": "一月",
-       "february-gen": "二月",
-       "march-gen": "三月",
-       "april-gen": "四月",
-       "may-gen": "五月",
-       "june-gen": "六月",
-       "july-gen": "七月",
-       "august-gen": "八月",
-       "september-gen": "九月",
-       "october-gen": "十月",
-       "november-gen": "十一月",
-       "december-gen": "十二月",
-       "jan": "1月",
-       "feb": "2月",
-       "mar": "3月",
-       "apr": "4月",
-       "may": "5月",
-       "jun": "6月",
-       "jul": "7月",
-       "aug": "8月",
-       "sep": "9月",
-       "oct": "10月",
-       "nov": "11月",
-       "dec": "12月",
-       "january-date": "1月$1日",
-       "february-date": "2月$1日",
-       "march-date": "3月$1日",
-       "april-date": "4月$1日",
-       "may-date": "5月$1日",
-       "june-date": "6月$1日",
-       "july-date": "7月$1日",
-       "august-date": "8月$1日",
-       "september-date": "9月$1日",
-       "october-date": "10月$1日",
-       "november-date": "11月$1日",
-       "december-date": "12月$1日",
-       "pagecategories": "$1隻分類",
-       "category_header": "“$1”分類肚嘅頁面",
-       "subcategories": "子分類",
-       "category-media-header": "“$1”分類肚嘅媒體",
-       "category-empty": "''邇隻分類目前還吂包含頁面或者媒體文件。''",
-       "hidden-categories": "$1隻隱藏分類",
-       "hidden-category-category": "隱藏分類",
-       "category-subcat-count": "{{PLURAL:$2|邇隻分類有下背一隻子分類。|邇隻分類有$2隻子分類,下背列出矣$1隻。}}",
+       "sunday": "Lî-pai-ngit",
+       "monday": "Lî-pai-yit",
+       "tuesday": "Lî-pai-ngi",
+       "wednesday": "Lî-pai-sâm",
+       "thursday": "Lî-pai-si",
+       "friday": "Lî-pai-ńg",
+       "saturday": "Lî-pai-liuk",
+       "sun": "Ngit",
+       "mon": "Yit",
+       "tue": "Ngi",
+       "wed": "Sâm",
+       "thu": "Si",
+       "fri": "Ńg",
+       "sat": "Liuk",
+       "january": "Yit-ngie̍t",
+       "february": "Ngi-ngie̍t",
+       "march": "Sâm-ngie̍t",
+       "april": "Si-ngie̍t",
+       "may_long": "Ńg-ngie̍t",
+       "june": "Liuk-ngie̍t",
+       "july": "Chhit-ngie̍t",
+       "august": "Pat-ngie̍t",
+       "september": "Kiú-ngie̍t",
+       "october": "Sṳ̍p-ngie̍t",
+       "november": "Sṳ̍p-yit-ngie̍t",
+       "december": "Sṳ̍p-ngi-ngie̍t",
+       "january-gen": "Yit-ngie̍t",
+       "february-gen": "Ngi-ngie̍t",
+       "march-gen": "Sâm-ngie̍t",
+       "april-gen": "Si-ngie̍t",
+       "may-gen": "Ńg-ngie̍t",
+       "june-gen": "Liuk-ngie̍t",
+       "july-gen": "Chhit-ngie̍t",
+       "august-gen": "Pat-ngie̍t",
+       "september-gen": "Kiú-ngie̍t",
+       "october-gen": "Sṳ̍p-ngie̍t",
+       "november-gen": "Sṳ̍p-yit-ngie̍t",
+       "december-gen": "Sṳ̍p-ngi-ngie̍t",
+       "jan": "Yit-ngie̍t",
+       "feb": "Ngi-ngie̍t",
+       "mar": "Sâm-ngie̍t",
+       "apr": "Si-ngie̍t",
+       "may": "Ńg-ngie̍t",
+       "jun": "Liuk-ngie̍t",
+       "jul": "Chhit-ngie̍t",
+       "aug": "Pat-ngie̍t",
+       "sep": "Kiú-ngie̍t",
+       "oct": "Sṳ̍p-ngie̍t",
+       "nov": "Sṳ̍p-yit-ngie̍t",
+       "dec": "Sṳ̍p-ngi-ngie̍t",
+       "january-date": "1-ngie̍t $1-ngit",
+       "february-date": "2-ngie̍t $1-ngit",
+       "march-date": "3-ngie̍t $1-ngit",
+       "april-date": "4-ngie̍t $1-ngit",
+       "may-date": "5-ngie̍t $1-ngit",
+       "june-date": "6-ngie̍t $1-ngit",
+       "july-date": "7-ngie̍t $1-ngit",
+       "august-date": "8-ngie̍t $1-ngit",
+       "september-date": "9-ngie̍t $1-ngit",
+       "october-date": "10-ngie̍t $1-ngit",
+       "november-date": "11-ngie̍t $1-ngit",
+       "december-date": "12-ngie̍t $1-ngit",
+       "pagecategories": "{{PLURAL:$1|Category|$1-chak fûn-lui}}",
+       "category_header": "\"$1\" fûn-lui tú ke ya̍p-mien",
+       "subcategories": "Chṳ́ fûn-lui",
+       "category-media-header": "\"$1\" fûn-lui tú ke mòi-thí",
+       "category-empty": "<em>Liá-chak fûn-lui muk-chhièn hàn-mò pâu-hàm ya̍p-mien fe̍t-chá mòi-thí vùn-khien.</em>",
+       "hidden-categories": "$1-chak yún-chhông fûn-lui",
+       "hidden-category-category": "Yún-chhông fûn-lui",
+       "category-subcat-count": "{{PLURAL:$2|Liá-chak fûn-lui yû hâ-poi yit-chak chṳ́ fûn-lui.|Liá-chak fûn-lui yû $2-chak chṳ́ fûn-lui, hâ-poi lie̍t-chhut yí $1-chak.}}",
        "category-subcat-count-limited": "邇隻分類有下背$1隻子分類。",
        "category-article-count": "{{PLURAL:$2|本分類有下背一隻頁面。|本分類有$2隻頁面,下背列出矣$1隻。}}",
        "category-article-count-limited": "邇隻分類有下背$1隻頁面。",
        "category-file-count": "{{PLURAL:$2|邇隻分類有下背一隻文件。|邇隻分類有$2隻文件,下背列出矣$1隻。}}",
        "category-file-count-limited": "邇隻分類有$1隻文件。",
-       "listingcontinuesabbrev": "",
+       "listingcontinuesabbrev": "sa",
        "index-category": "既索引嘅頁面",
-       "noindex-category": "還無索引嘅頁面",
+       "noindex-category": "Hàn-mò sok-yín ke ya̍p-mien",
        "broken-file-category": "含有損壞文件鏈接嘅頁面",
-       "about": "關於",
-       "article": "內容頁面",
-       "newwindow": "(在新視窗肚打開)",
-       "cancel": "取消",
-       "moredotdotdot": "還較多...",
-       "morenotlisted": "邇列表吂完成。",
+       "about": "kôan-yî",
+       "article": "Nui-yùng ya̍p- mien",
+       "newwindow": "(chhai sîn sṳ-chhûng tú tá-khôi)",
+       "cancel": "Chhí-sêu",
+       "moredotdotdot": "Hàn kha-tô...",
+       "morenotlisted": "Liá lie̍t-péu mâng vàn-sṳ̀n.",
        "mypage": "頁面",
-       "mytalk": "交流",
-       "anontalk": "本IP地址嘅交流",
-       "navigation": "導航",
-       "and": "&#32;撈",
-       "qbfind": "找尋",
-       "qbbrowse": "瀏覽",
-       "qbedit": "編寫",
-       "qbpageoptions": "頁面選項",
-       "qbmyoptions": "𠊎嘅頁面",
-       "faq": "常見問題解答",
-       "faqpage": "Project:常見問題解答",
-       "actions": "動作",
-       "namespaces": "名字空間",
-       "variants": "變換",
-       "navigation-heading": "導航菜單",
-       "errorpagetitle": "差錯",
-       "returnto": "轉頭到$1。",
-       "tagline": "從{{SITENAME}}來",
-       "help": "幫手",
-       "search": "搜尋",
-       "searchbutton": "搜尋",
-       "go": "入",
-       "searcharticle": "入",
-       "history": "頁面歷史",
-       "history_short": "歷史",
-       "updatedmarker": "亻厓上擺訪問以來嘅更新",
-       "printableversion": "做得印刷嘅版本",
-       "permalink": "固定連結",
-       "print": "印刷",
-       "view": "查看",
-       "edit": "編寫",
-       "create": "建立",
-       "editthispage": "編寫本頁",
-       "create-this-page": "建立本頁",
-       "delete": "刪除",
-       "deletethispage": "刪除本頁",
-       "undeletethispage": "取消刪除邇頁",
+       "mytalk": "Kâu-liù",
+       "anontalk": "Kâu-liù",
+       "navigation": "Thô-hòng",
+       "and": "&#32;lâu",
+       "qbfind": "Cháu-chhìm",
+       "qbbrowse": "Liù-lám",
+       "qbedit": "Phiên-siá",
+       "qbpageoptions": "Ya̍p-mien sién-hong",
+       "qbmyoptions": "Ngài-ke ya̍p-mien",
+       "faq": "Sòng-kien mun-thì kié-tap",
+       "faqpage": "Project:Sòng-kien mun-thì kié-tap",
+       "actions": "Thûng-chok",
+       "namespaces": "Miàng-sṳ khûng-kiên",
+       "variants": "Pien-von",
+       "navigation-heading": "Thô-hòng chhoi-tân",
+       "errorpagetitle": "Chhâ-chho",
+       "returnto": "Chón-thèu to $1.",
+       "tagline": "Chhiùng {{SITENAME}} lòi",
+       "help": "Pông-sú",
+       "search": "Sêu-chhìm",
+       "searchbutton": "Sêu-chhìm",
+       "go": "Ngi̍p",
+       "searcharticle": "Ngi̍p",
+       "history": "Ya̍p-mien li̍t-sṳ́",
+       "history_short": "Li̍t-sṳ́",
+       "updatedmarker": "ngài sông-pái fóng-mun yî-lòi ke kiên-sîn",
+       "printableversion": "Cho-tet yin-chho ke pán-pún",
+       "permalink": "Ku-thin lièn-kiet",
+       "print": "Yin-chho",
+       "view": "Chhà-khon",
+       "view-foreign": "Chhai $1 kiám-sṳ",
+       "edit": "Phiên-siá",
+       "create": "Kien-li̍p",
+       "create-local": "Sîn-chen pún-thi sot-mìn",
+       "editthispage": "Phiên-siá liá ya̍p",
+       "create-this-page": "Kien-li̍p pún-ya̍p",
+       "delete": "San-chhù",
+       "deletethispage": "San-chhù pún-ya̍p",
+       "undeletethispage": "Chhí-sêu san-chhù liá-ya̍p.",
        "undelete_short": "恢復$1隻分删除个编寫",
        "viewdeleted_short": "查看$1項已刪除个修訂",
-       "protect": "保護",
-       "protect_change": "更改",
-       "protectthispage": "保護本頁",
+       "protect": "Pó-fu",
+       "protect_change": "Kiên-kói",
+       "protectthispage": "Pó-fu pún-ya̍p",
        "unprotect": "更改保護",
        "unprotectthispage": "更改本頁保護",
-       "newpage": "新頁面",
-       "talkpage": "討論本頁",
-       "talkpagelinktext": "交流",
-       "specialpage": "特殊頁面",
-       "personaltools": "私人工具",
-       "articlepage": "查看內容頁面",
-       "talk": "討論",
-       "views": "查看數",
+       "newpage": "Sîn ya̍p-mien",
+       "talkpage": "Thó-lun pún-ya̍p",
+       "talkpagelinktext": "kâu-liù",
+       "specialpage": "Thi̍t-sû ya̍p-mien",
+       "personaltools": "Sṳ̂-ngìn kûng-khí",
+       "articlepage": "Khon nui-yùng ya̍p",
+       "talk": "Thó-lun",
+       "views": "Chhà-khon-sú",
        "toolbox": "Kûng-khí-siông",
        "userpage": "查看用戶頁面",
        "projectpage": "查看項目頁面",
-       "imagepage": "查看文件頁面",
-       "mediawikipage": "查看消息頁面",
-       "templatepage": "查看模板頁面",
-       "viewhelppage": "查看幫手頁面",
-       "categorypage": "查看分類頁面",
-       "viewtalkpage": "查看討論",
-       "otherlanguages": "其他語言",
-       "redirectedfrom": "(重定向自$1)",
-       "redirectpagesub": "重定向頁",
-       "lastmodifiedat": "邇隻頁面最近修訂於$1 $2。",
+       "imagepage": "Chhà-khon vùn-khien ya̍p-mien",
+       "mediawikipage": "Chhà-khon sêu-sit ya̍p-mien",
+       "templatepage": "Chhà-khon mù-pán ya̍p-mien",
+       "viewhelppage": "Chhà-khon pông-sú ya̍p-mien",
+       "categorypage": "Chhà-khon fûn-lui ya̍p-mien",
+       "viewtalkpage": "Chhà-khon thó-lun",
+       "otherlanguages": "Khì-thâ ngî-ngièn",
+       "redirectedfrom": "(Chhùng-thin-hiong chhṳ $1)",
+       "redirectpagesub": "Chhùng-thin-hiong ya̍p",
+       "redirectto": "Chhùng-thin-hiong to:",
+       "lastmodifiedat": "Liá-chak ya̍p-mien chui-khiûn siû-thin yî $1 $2.",
        "viewcount": "邇隻頁面已經分人瀏覽過$1次。",
-       "protectedpage": "受保護頁面",
-       "jumpto": "跳轉到:",
-       "jumptonavigation": "導航",
-       "jumptosearch": "搜尋",
+       "protectedpage": "Su pó-fu ya̍p-mien",
+       "jumpto": "Thiàu-chón to:",
+       "jumptonavigation": "thô-hòng",
+       "jumptosearch": "sêu-chhìm",
        "view-pool-error": "好抱歉,太多用戶嘗試緊瀏覽邇頁,使服務器超出負擔。請等多一刻再嘗試。\n\n$1",
        "pool-timeout": "等待鎖定超時",
        "pool-queuefull": "請求隊列满矣",
-       "pool-errorunknown": "毋知得嘅差錯",
-       "aboutsite": "關於 {{SITENAME}}",
-       "aboutpage": "Project:關於",
-       "copyright": "除非另有講明,否則本站內容都係以$1條款提供。",
-       "copyrightpage": "{{ns:project}}:版權信息",
-       "currentevents": "新聞動態",
-       "currentevents-url": "Project:新聞動態",
-       "disclaimers": "免責聲明",
-       "disclaimerpage": "Project:一般免責聲明",
-       "edithelp": "編寫幫手",
-       "mainpage": "頭頁",
-       "mainpage-description": "頭頁",
-       "policy-url": "Project:方針",
-       "portal": "社區主頁",
-       "portal-url": "Project:社區主頁",
-       "privacy": "隱私政策",
-       "privacypage": "Project:隱私政策",
-       "badaccess": "權限差錯",
-       "badaccess-group0": "系統毋准汝執行頭先講求嘅操作。",
+       "pool-errorunknown": "M̀ tî-tet ke chhâ-chho",
+       "aboutsite": "Kôan-yî {{SITENAME}}",
+       "aboutpage": "Project:Kôan-yî",
+       "copyright": "Chhù-fî nang-yû kóng-mìn, féu-chet pún-chhàm nui-yùng tû-he yî $1 thiàu-khóan thì-kiûng.",
+       "copyrightpage": "{{ns:project}}: Pán-khièn sin-sit",
+       "currentevents": "Sîn-vùn thûng-thai",
+       "currentevents-url": "Project:Sîn-vùn thûng-thai",
+       "disclaimers": "Miên-chit sâng-mìn",
+       "disclaimerpage": "Project:Yit-pân miên-chit sâng-mìn",
+       "edithelp": "Phiên-siá pông-sú",
+       "mainpage": "Thèu-ya̍p",
+       "mainpage-description": "Thèu-ya̍p",
+       "policy-url": "Project:Fông-chṳ̂m",
+       "portal": "Sa-khî chú-ya̍p",
+       "portal-url": "Project:Sa-khî chú-ya̍p",
+       "privacy": "Yún-sṳ̂ chṳn-chhet",
+       "privacypage": "Project:Yún-sṳ̂ chṳn-chhet",
+       "badaccess": "Khièn-han chhâ-chho",
+       "badaccess-group0": "Hì-thúng m̀ -chún ngì chṳp-hàng thèu-siên kóng-khiù ke chhâu-chok.",
        "badaccess-groups": "汝正先請求嘅操作單淨有{{PLURAL:$2|邇隻|邇兜}}用戶群組嘅用戶做得使用:$1",
-       "versionrequired": "愛有MediaWiki $1版",
+       "versionrequired": "Oi yû MediaWiki $1 pán",
        "versionrequiredtext": "愛有版本$1嘅MediaWiki正做得使用本頁。\n參詳[[Special:Version|版本頁面]]。",
-       "ok": "做得",
-       "retrievedfrom": "來自\"$1\"",
-       "youhavenewmessages": "汝有$1($2)。",
+       "ok": "Cho-tet",
+       "retrievedfrom": "Lòi chhṳ \"$1\"",
+       "youhavenewmessages": "Ngì yû $1 ($2)",
        "youhavenewmessagesfromusers": "汝有來自{{PLURAL:$3|另一位用戶|$3位用戶}}嘅$1($2)。",
        "youhavenewmessagesmanyusers": "汝有來自多位用戶嘅$1( $2 )。",
        "newmessageslinkplural": "{{PLURAL:$1|yit-thiàu sîn sêu-sit|999=sîn sêu-sit}}",
        "newmessagesdifflinkplural": "chui-khiun{{PLURAL:$1|kiên-kói|kiên-kói}}",
-       "youhavenewmessagesmulti": "汝在$1肚有新消息",
-       "editsection": "編寫",
-       "editold": "編寫",
-       "viewsourceold": "查看源碼",
-       "editlink": "編寫",
-       "viewsourcelink": "查看源碼",
-       "editsectionhint": "編寫章節: $1",
-       "toc": "目錄",
-       "showtoc": "展示",
-       "hidetoc": "隱藏",
-       "collapsible-collapse": "摺叠",
-       "collapsible-expand": "展開",
-       "thisisdeleted": "查看或者恢復$1?",
-       "viewdeleted": "查看$1?",
-       "restorelink": "$1隻分人刪除嘅版本",
-       "feedlinks": "訂閱:",
-       "feed-invalid": "無效嘅訂閱類型。",
+       "youhavenewmessagesmulti": "Ngì chhai $1-tú yû sîn sêu-sit",
+       "editsection": "phiên-siá",
+       "editold": "phiên-siá",
+       "viewsourceold": "Khon ngièn-sṳ́-mâ",
+       "editlink": "phiên-siá",
+       "viewsourcelink": "Khon ngièn-sṳ́-mâ",
+       "editsectionhint": "Phiên-siá chông-chiet: $1",
+       "toc": "Muk-liu̍k",
+       "showtoc": "Chán-sṳ",
+       "hidetoc": "yún-chhông",
+       "collapsible-collapse": "Chap-thia̍p",
+       "collapsible-expand": "Chán-khôi",
+       "thisisdeleted": "Chhà-khon fe̍t-chá fî-fu̍k $1?",
+       "viewdeleted": "Chhà-khon $1?",
+       "restorelink": "$1-chak fûn ngìn san-chhù ke pán-pún",
+       "feedlinks": "Thin-ye̍t:",
+       "feed-invalid": "Mò-háu ke thin-ye̍t lui-hîn.",
        "feed-unavailable": "毋提供聯合訂閱源",
-       "site-rss-feed": "$1嘅RSS訂閱",
-       "site-atom-feed": "$1嘅Atom訂閱",
-       "page-rss-feed": "“$1”嘅RSS訂閱",
-       "page-atom-feed": "“$1”嘅Atom訂閱",
-       "red-link-title": "$1(頁面還無存在)",
+       "site-rss-feed": "$1-ke RSS thin-ye̍t",
+       "site-atom-feed": "$1-ke Atom thin-ye̍t",
+       "page-rss-feed": "\"$1\"-ke RSS thin-ye̍t",
+       "page-atom-feed": "\"$1\" ke Atom thin-ye̍t",
+       "red-link-title": "$1 (ya̍p-mien hàn-mò chhùn-chhai)",
        "sort-descending": "降序",
        "sort-ascending": "升序",
-       "nstab-main": "頁面",
-       "nstab-user": "用戶頁面",
-       "nstab-media": "媒體頁面",
-       "nstab-special": "特殊頁面",
-       "nstab-project": "項目頁面",
-       "nstab-image": "文件",
-       "nstab-mediawiki": "信息",
-       "nstab-template": "模板",
-       "nstab-help": "幫手頁面",
-       "nstab-category": "分類",
-       "nosuchaction": "無邇條命令",
+       "nstab-main": "Ya̍p-mien",
+       "nstab-user": "Yung-fu ya̍p-mien",
+       "nstab-media": "Mòi-thí ya̍p-mien",
+       "nstab-special": "Thi̍t-sû ya̍p-mien",
+       "nstab-project": "Hong-muk ya̍p-mien",
+       "nstab-image": "Vùn-khien",
+       "nstab-mediawiki": "Sin-sit",
+       "nstab-template": "Mù-pán",
+       "nstab-help": "Pông-sú ya̍p-mien",
+       "nstab-category": "Fûn-lui",
+       "mainpage-nstab": "Thèu-ya̍p",
+       "nosuchaction": "Mò liá-thiàu miang-lin",
        "nosuchactiontext": "邇URL所指定嘅動作無效。\n汝可能打錯URL,或撳到錯誤鏈接。\n還可能係{{SITENAME}}所使用嘅軟件出現矣錯誤。",
        "nosuchspecialpage": "邇隻特殊页面毋存在",
        "nospecialpagetext": "<strong>汝請求嘅特殊頁面無效。</strong>\n\n[[Special:SpecialPages|{{int:specialpages}}]]肚列出矣所有效特殊頁面嘅列表。",
-       "error": "差錯",
-       "databaseerror": "數據庫差錯",
-       "databaseerror-text": "出現資料庫查詢錯誤。\n邇可能表示軟件肚存在錯誤。",
+       "error": "Chhâ-chho",
+       "databaseerror": "Sú-kí-khù chhâ-chho",
+       "databaseerror-text": "Chhut-hien chṳ̂-liau-khù chhà-sûn chho-ngu. \nLiá khó-nèn péu-sṳ ngiôn-khien tú chhùn-chhai chho-ngu.",
        "databaseerror-textcl": "chṳ̂-liau-ku chhà-chhìm chho-ngu",
        "databaseerror-query": "chhà-chhìm:$1",
        "databaseerror-function": "kûng-nèn:$1",
        "databaseerror-error": "chho-ngu:$1",
-       "laggedslavemode": "'''警告:'''頁面可能毋包含最近嘅更新。",
-       "readonly": "數據庫分人鎖定",
-       "enterlockreason": "請撳入禁止訪問原因, 包括估計重新開放嘅時間",
+       "laggedslavemode": "<strong>Kín-ko:</strong> Ya̍p-mien khó-nèn m̀ pâu-hàm chui-khiûn ke kiên-sîn.",
+       "readonly": "Sú-kí-khù fûn ngìn só-thin",
+       "enterlockreason": "Chhiáng khim-ngi̍p kim-chṳ́ fóng-mun ngièn-yîn, pâu-koat kû-kie chhùng-sîn khôi-piong ke sṳ̀-kiên",
        "readonlytext": "數據庫今下禁止輸入新內容撈更改,\n邇好有可能係由於數據庫維修緊,完成後就會恢復。\n\n管理員有下背嘅解釋:$1",
        "missing-article": "數據庫尋毋到文字“$1”$2。\n\n邇通常係由於點撳矣鏈向過期毋同或曆史頁面嘅鏈接,但原有修訂已分刪除所導致嘅。\n\n假使情況毋係恁樣,汝可能尋到矣軟件嘅一隻臭蟲(bug)。請錄下URL地址,並向[[Special:ListUsers/sysop|管理員]]報告。",
        "missingarticle-rev": "(修訂版本號#: $1)",
        "cannotdelete-title": "無辦法刪除頁面「$1」",
        "delete-hook-aborted": "刪除分勾仔中止。\n其毋曾提供任何解釋。",
        "no-null-revision": "mò-fap chhóng-kien \"$1\" ya̍p-mien sîn-ke khûng-pa̍k siû-thin",
-       "badtitle": "有錯嘅標題",
+       "badtitle": "Yû chho ke phiêu-thì",
        "badtitletext": "所請求頁面嘅標題是無效嘅、毋存在嘅,跨語言或跨wiki鏈接嘅標題有錯。其可能包含一隻或還較多做毋得用於標題嘅字符。",
        "perfcached": "下列係緩存數據,因此可能毋係最新嘅。最多{{PLURAL:$1|單淨有1嘅結果|$1嘅結果}}可用。",
        "perfcachedts": "下列係緩存數據,其最後更新時間係$1。單淨有{{PLURAL:$4|一嘅結果|$4嘅結果}}會畀顯示。",
        "querypage-no-updates": "當前禁止對邇頁面進行更新。\n邇位嘅數據將做毋得分立即重新整理。",
-       "viewsource": "查看源碼",
-       "viewsource-title": "查看$1嘅源代碼",
+       "viewsource": "Khon ngièn-sṳ́-mâ",
+       "viewsource-title": "Khon $1 ke ngièn-sṳ́-mâ",
        "actionthrottled": "動作已經壓制",
        "actionthrottledtext": "基於反垃圾嘅考量,短時間內毋可以多次重複某操作,今下汝已經超過邇隻上限。\n請在數分鐘後再嘗試。",
        "protectedpagetext": "邇隻頁面已經分人保護以防止編輯或其他操作。",
        "mycustomjsprotected": "汝無編輯邇頁JavaScript之權限。",
        "myprivateinfoprotected": "汝無權限編輯汝个個人信息。",
        "mypreferencesprotected": "汝無權限編輯汝个個人設定。",
-       "ns-specialprotected": "邇兜特殊頁面係毋做得編輯嘅。",
+       "ns-specialprotected": "Liá-têu thi̍t-sû ya̍p-mien he m̀ cho-tet phiên-si̍p ke.",
        "titleprotected": "邇隻標題已經分[[User:$1|$1]]保護來防止建立。理由係<em>$2</em>。",
        "filereadonlyerror": "無辦法修改文件「$1」因為文件庫「$2」處於唯讀模式。 !\n管理員鎖定其嘅解釋係:「$3」。",
        "invalidtitle-knownnamespace": "使用名字空間「$2」與文本「$3」嘅無效標題",
        "invalidtitle-unknownnamespace": "使用未知名字空間編號$1與文本“$2”嘅無效標題",
-       "exception-nologin": "還吂登入",
-       "exception-nologin-text": "汝愛[[Special:Userlogin|登入]]本wiki查看邇頁或者進行操作。",
+       "exception-nologin": "Hàn-mò tên-ngi̍p",
+       "exception-nologin-text": "Ngì oi [[Special:Userlogin|tên-ngi̍p]] pún wiki chhà-khon liá-ya̍p fe̍t-chá chin-hàng chhâu-chok.",
        "virus-badscanner": "損壞設定: 未知嘅病毒掃瞄器: ''$1''",
        "virus-scanfailed": "掃瞄失敗 (代碼 $1)",
-       "virus-unknownscanner": "還吂知嘅反病毒軟件:",
-       "logouttext": "'''汝今下既經登出。'''\n\n請注意一兜頁面可能還顯示汝係登入狀態,一直到汝清空汝嘅瀏覽器緩存為止。",
-       "welcomeuser": "歡迎,$1!",
+       "virus-unknownscanner": "hàn m̀-tî ke fán-phiang-thu̍k ngiôn-khien:",
+       "logouttext": "'''Ngì kîm-hâ ki-kîn tên-chhut.'''\n\nChhiáng chu-yi yit-têu ya̍p-mien khó-nèn hàn hién-sṳ ngì he tên-ngi̍p chhong-thai, yit-chhṳ̍t to ngì chhîn-khûng ngì ke liù-lám-hi fòn-chhùn vì-chṳ́.",
+       "welcomeuser": "Fôn-ngiàng, $1!",
        "welcomecreation-msg": "汝嘅賬號已經建立。\n莫添忘訖設置[[Special:Preferences|{{SITENAME}}嘅個人參數]]。",
-       "yourname": "用戶名:",
-       "userlogin-yourname": "用戶名",
-       "userlogin-yourname-ph": "輸入汝嘅用戶名",
+       "yourname": "Yung-fu-miàng:",
+       "userlogin-yourname": "Yung-fu-miàng:",
+       "userlogin-yourname-ph": "Sû-ngi̍p ngì ke Yung-fu-miàng:",
        "createacct-another-username-ph": "輸入用戶名:",
-       "yourpassword": "密碼:",
-       "userlogin-yourpassword": "密碼",
-       "userlogin-yourpassword-ph": "輸入汝嘅密碼",
-       "createacct-yourpassword-ph": "輸入汝嘅密碼",
-       "yourpasswordagain": "再一擺輸入密碼:",
-       "createacct-yourpasswordagain": "確認密碼",
-       "createacct-yourpasswordagain-ph": "再一擺輸入密碼",
-       "remembermypassword": "在邇隻瀏覽器上記下𠊎嘅登入狀態(最長$1日)",
-       "userlogin-remembermypassword": "保持𠊎嘅登入狀態",
+       "yourpassword": "Me̍t-ma:",
+       "userlogin-yourpassword": "Me̍t-ma",
+       "userlogin-yourpassword-ph": "Sû-ngi̍p ngì-ke me̍t-ma",
+       "createacct-yourpassword-ph": "Sû-ngi̍p ngì-ke me̍t-ma",
+       "yourpasswordagain": "Chai yit-pái sû-ngi̍p me̍t-ma:",
+       "createacct-yourpasswordagain": "Khok-ngin me̍t-ma",
+       "createacct-yourpasswordagain-ph": "Chai yit-pái sû-ngi̍p me̍t-ma",
+       "remembermypassword": "Chhai liá-chak liù-lám-hi sông ki-hâ ngài-ke tên-ngi̍p chhong-thai (chui-chhòng $1-ngit)",
+       "userlogin-remembermypassword": "Pó-chhṳ̀ ngài-ke tên-ngi̍p chhong-thai",
        "userlogin-signwithsecure": "使用安全連線",
-       "yourdomainname": "汝嘅域名:",
+       "yourdomainname": "Ngì ke vet-miàng:",
        "password-change-forbidden": "汝做毋得更改本wiki上嘅密碼。",
-       "externaldberror": "邇可能係由於驗證數據庫差錯或者汝分系統禁止更新汝嘅外部賬號。",
-       "login": "登入",
-       "nav-login-createaccount": "登入/建立新帳號",
-       "userlogin": "登入/建立新帳號",
-       "userloginnocreate": "登入",
-       "logout": "登出",
-       "userlogout": "登出",
-       "notloggedin": "還吂登入",
-       "userlogin-noaccount": "還無帳戶係無?",
-       "userlogin-joinproject": "參與 {{SITENAME}}",
-       "nologin": "還無帳號係無?$1。",
-       "nologinlink": "建立帳號",
-       "createaccount": "建立帳號",
-       "gotaccount": "已經擁有帳號係無?$1。",
-       "gotaccountlink": "登入",
-       "userlogin-resetlink": "毋記得汝嘅登入信息?",
-       "userlogin-resetpassword-link": "添忘訖汝嘅密碼?",
+       "externaldberror": "Liá khó-nèn he yù-yî ngiam-chṳn sú-kí-khù chhâ-chho fe̍t-chá ngì fûn hì-thúng kim-chṳ́ kiên-sîn ngì ke ngoi-phu chòng-ho.",
+       "login": "Tên-ngi̍p",
+       "nav-login-createaccount": "Tên-ngi̍p / kien-li̍p sîn chong-ho",
+       "userlogin": "Tên-ngi̍p / kien-li̍p sîn chong-ho",
+       "userloginnocreate": "Tên-ngi̍p",
+       "logout": "Tên-chhut",
+       "userlogout": "Tên-chhut",
+       "notloggedin": "Hàn-mò tên-ngi̍p",
+       "userlogin-noaccount": "Hàn-mò chong-fu he mò?",
+       "userlogin-joinproject": "Chhâm-yi  {{SITENAME}}",
+       "nologin": "Hàn-mò chong-ho he-mò? $1.",
+       "nologinlink": "Kien-li̍p chong-ho",
+       "createaccount": "Kien-li̍p chong-ho",
+       "gotaccount": "Yí-kîn yúng-yû chong-ho he-mò? $1.",
+       "gotaccountlink": "Tên-ngi̍p",
+       "userlogin-resetlink": "M̀-ki-tet ngì-ke tên-ngi̍p sin-sit?",
+       "userlogin-resetpassword-link": "Thiâm mong-ki ngì ke me̍t-ma?",
+       "userlogin-helplink2": "Tên-ngi̍p hia̍p-chhu",
        "userlogin-loggedin": "汝已作為{{GENDER:$1|$1}}登錄。\n利用以下表單以作為另一賬戶登錄。",
-       "createacct-emailrequired": "電郵地址:",
-       "createacct-emailoptional": "電郵地址(可選)",
-       "createacct-email-ph": "設置電郵地址",
+       "createacct-emailrequired": "Thien-yù thi-chí:",
+       "createacct-emailoptional": "Thien-yù thi-chí (khó-sién)",
+       "createacct-email-ph": "Sat-chì thien-yù thi-chí",
        "createacct-another-email-ph": "輸入電郵地址",
-       "createaccountmail": "使用一隻臨時嘅隨機密碼,並將其發送到指定嘅電子郵件地址",
+       "createaccountmail": "Sṳ́-yung yit-chak lìm-sṳ̀ ke sùi-kî me̍t-ma, pin chiông khì fat-sung to chṳ́-thin ke thien-chṳ́ yù-khien thi-chí",
        "createacct-realname": "實名(可選)",
-       "createaccountreason": "原因:",
-       "createacct-reason": "原因",
+       "createaccountreason": "Ngièn-yîn:",
+       "createacct-reason": "Ngièn-yîn:",
        "createacct-reason-ph": "汝做麽嘅愛創建另一隻帳號",
-       "createacct-submit": "建立帳號",
-       "createacct-benefit-heading": "{{SITENAME}}是由撈您共樣嘅人建立。",
-       "createacct-benefit-body1": "$1次編寫",
-       "createacct-benefit-body2": "$1",
-       "createacct-benefit-body3": "近期$1隻貢獻人",
-       "badretype": "汝所撳入嘅密碼並毋相同",
+       "createacct-submit": "Kien-li̍p chong-ho",
+       "createacct-benefit-heading": "{{SITENAME}} he yù lâu Ngì khiung-ngióng ke ngìn kien-li̍p.",
+       "createacct-benefit-body1": "$1-chhṳ phiên-siá",
+       "createacct-benefit-body2": "$1-ya̍p",
+       "createacct-benefit-body3": "khiûn-khì $1-chak kung-hien-ngìn",
+       "badretype": "Ngì só khim-ngi̍p ke me̍t-ma pin m̀  siông-thùng.",
        "userexists": "汝所填入嘅用戶名稱已經存在。\n請另選一隻名稱。",
-       "loginerror": "登入差錯",
-       "createacct-error": "帳戶建立差錯",
-       "createaccounterror": "無辦法建立帳號:$1",
+       "loginerror": "Tên-ngi̍p chhâ-chho",
+       "createacct-error": "Chong-fu kien-li̍p chhâ-chho",
+       "createaccounterror": "Mò phan-fap kien-li̍p chong-ho: $1",
        "nocookiesnew": "本用戶賬號已分建立,但係汝登入失敗。{{SITENAME}}使用cookie登入。汝已停用cookie。請啓用cookie,之後使用汝嘅新用戶名和密碼登入。",
        "nocookieslogin": "{{SITENAME}}用cookie登入。汝已停用cookie。請啓用cookie後再試一擺。",
        "nocookiesfornew": "邇隻用戶嘅賬戶未建立,亻厓兜無法度確認其嘅來源。\n請確定汝已經開啟cookies,重新載入後再試一擺。",
        "noname": "汝還吂輸入一隻有效嘅用戶名。",
-       "loginsuccesstitle": "登入成功",
-       "loginsuccess": "汝今下以\"$1\"嘅身份在{{SITENAME}}登入。",
-       "nosuchuser": "尋毋到用戶 \"$1\"。\n用戶名稱係有大小寫區分嘅。\n檢查汝嘅拼寫,或者用下面嘅表格[[Special:CreateAccount|建立一隻新賬號]]。",
+       "loginsuccesstitle": "Yí-kîn tên-ngi̍p",
+       "loginsuccess": "Ngì kîm-hâ yî \"$1\"-ke sṳ̂n-fun chhai {{SITENAME}} tên-ngi̍p.",
+       "nosuchuser": "Chhìm m̀ -to yung-fu \"$1\". \nYung-fu miàng-chhṳ̂n he yû thai-séu siá khî-fûn ke . \nKiám-chhà ngì ke piâng-siá, fe̍t-chá yung hâ-mien ke péu-kak [[Special:CreateAccount|kien-li̍p yit-chak sîn chòng-ho]].",
        "nosuchusershort": "無有喊做“$1”嘅用戶。請檢查汝輸入嘅文字係毋係有差錯。",
        "nouserspecified": "汝愛指定一隻用戶名。",
        "login-userblocked": "邇隻用戶已分封鎖。毋做得登入。",
        "passwordtooshort": "汝嘅密碼毋得少過$1隻字符。",
        "password-name-match": "汝嘅密碼必須撈汝嘅用戶名毋相同。",
        "password-login-forbidden": "邇隻用戶名稱及密碼嘅使用係分禁止嘅。",
-       "mailmypassword": "重設密碼",
+       "mailmypassword": "Chhùng-sat me̍t-ma",
        "passwordremindertitle": "{{SITENAME}}嘅新臨時密碼",
        "passwordremindertext": "有人(可能係汝本人,來自IP地址$1)已請求{{SITENAME}}嘅新密碼 ($4)。\n用戶\"$2\"嘅一隻新臨時密碼今下已分設定好為\"$3\"。\n係話邇隻動作係汝所指示嘅,汝就愛立即登入並選擇一隻新嘅密碼。\n汝嘅臨時密碼將於{{PLURAL:$5|一|$5}}日之內過期。\n\n假使係其他人發出邇隻請求,或者汝已經回想起汝嘅密碼,故所毋準備改變其,\n汝可以忽略略邇條消息並且繼續使用汝嘅舊密碼。",
        "noemail": "用戶“$1”無登記電子郵件地址。",
        "noemailcreate": "汝愛提供一隻有效嘅電子郵件地址。",
        "passwordsent": "用戶“$1”嘅新密碼已經寄到所登記嘅電子郵件地址。\n請在收到後再登入。",
        "blocked-mailpassword": "汝嘅IP地址處於查封狀態故所毋允許編輯,為矣安全起見,密碼恢復功能已分禁用。",
-       "eauthentsent": "一封確認信已經發送到汝設定嘅電郵地址。\n在任何其他郵件發到賬戶之前,汝必須首先照邇封信嘅指示,確認介隻賬戶確實係汝嘅。",
+       "eauthentsent": "Yit-fûng khok-ngin sin yí-kîn fat-sung to ngì sat-thin ke thien-yù thi-chí. Chhai ngim-hò khì-thâ yù-khien fat-to chòng-fu chṳ̂-chhièn, ngì pit-sî sú-siên cheu liá fûng sin ke chṳ́-sṳ, khok-ngin kie-chak chòng-fu khok-sṳ̍t he ngì-ke.",
        "throttled-mailpassword": "密碼提醒已經在最近$1小時內發送。\n為防止濫用,限定在$1小時內僅發送一次密碼提醒。",
        "mailerror": "發送郵件出差錯:$1",
        "acct_creation_throttle_hit": "在邇隻wiki上係話訪客利用汝个IP地址在昨天創建矣$1個賬戶,係在邇段時間肚的上限。\n結果利用這個IP地址个訪客在邇段時間中無辦法創建更多个賬戶。",
-       "emailauthenticated": "汝嘅電郵地址已經於$2 $3確認。",
+       "emailauthenticated": "Ngì ke thien-yù thi-chí yí-kîn yî $2 $3 khok-ngin.",
        "emailnotauthenticated": "汝个電郵位址還㬟確認。\n將收毋到以下功能相關个電郵。",
        "noemailprefs": "在嘅嘅偏好設定肚指定一隻電子郵件地址來使用邇隻功能。",
        "emailconfirmlink": "確認汝嘅郵箱地址",
        "createaccount-text": "有人在{{SITENAME}}肚利用汝嘅電郵創建矣一隻喊做 \"$2\" 嘅新賬戶($4),密碼係 \"$3\" 。汝應該立即登入並更改密碼。\n\n如果該賬戶建立錯誤嘅話,汝可以忽略邇條訊息。",
        "login-throttled": "汝已經嘗試多次登入動作。\n請等$1後再試。",
        "login-abort-generic": "登入錯誤 - 中止",
-       "loginlanguagelabel": "語言:$1",
+       "loginlanguagelabel": "Ngî-ngièn: $1",
        "suspicious-userlogout": "汝登出嘅要求已經分拒絕,因為其可能係由已損壞嘅瀏覽器或者緩存代理傳送。",
+       "pt-login": "Tên-ngi̍p",
+       "pt-login-button": "Tên-ngi̍p",
+       "pt-createaccount": "Kien-li̍p chong-ho",
+       "pt-userlogout": "Tên-chhut",
        "php-mail-error-unknown": "在PHP嘅mail()參數肚嘅未知錯誤",
        "user-mail-no-addy": "嘗試毋帶電郵地址發送電郵。",
        "user-mail-no-body": "試圖發送空嘅或主體毋合理短嘅電子郵件。",
        "changepassword": "更改密碼",
-       "resetpass_announce": "汝係通過一隻發送到電子郵件肚嘅臨時代碼登入的。愛完成登入,汝必須在邇位設定一隻新密碼:",
-       "resetpass_text": "<!-- 在邇處加入文字 -->",
+       "resetpass_announce": "Oi vàn-sṳ̀n tên-ngi̍p, ngì pit-sî sat-thin yit-chak sîn me̍t-ma:",
+       "resetpass_text": "<!-- Chhai liá-chhú kâ-ngi̍p vùn-sṳ -->",
        "resetpass_header": "更改賬戶密碼",
-       "oldpassword": "舊密碼:",
-       "newpassword": "舊密碼:",
-       "retypenew": "再一擺輸入密碼:",
-       "resetpass_submit": "設定密碼並登入",
-       "changepassword-success": "汝成功更改矣汝嘅密碼!\n今下為汝登入緊...",
+       "oldpassword": "Khiu me̍t-ma:",
+       "newpassword": "Sîn me̍t-ma:",
+       "retypenew": "Chai yit-pái sû-ngi̍p sîn me̍t-ma:",
+       "resetpass_submit": "Sat-thin me̍t-ma pin tên-ngi̍p",
+       "changepassword-success": "Ngì yí-kîn kiên-kói ngì-ke me̍t-ma! \nKîm-hâ vì ngì tên-ngi̍p kín...",
        "resetpass_forbidden": "無辦法更改密碼",
        "resetpass-no-info": "汝必須登入後直接進入邇隻頁面。",
-       "resetpass-submit-loggedin": "更改密碼",
-       "resetpass-submit-cancel": "取消",
+       "resetpass-submit-loggedin": "Kiên-kói me̍t-ma",
+       "resetpass-submit-cancel": "Chhí-sêu",
        "resetpass-wrong-oldpass": "無效嘅臨時或現有嘅密碼。\n汝可能已成功地更改矣汝嘅密碼,或者已經請求一隻新嘅臨時密碼。",
        "resetpass-temp-password": "臨時密碼:",
        "resetpass-abort-generic": "擴充插件已中止矣更改密碼操作。",
-       "passwordreset": "重設密碼",
+       "passwordreset": "Chhùng-sat me̍t-ma",
        "passwordreset-disabled": "邇隻維基上已禁止矣重設密碼。",
        "passwordreset-emaildisabled": "電子郵件功能在此 wiki 上已禁用。",
-       "passwordreset-username": "用戶名:",
-       "passwordreset-domain": "域名:",
+       "passwordreset-username": "Yung-fu-miàng:",
+       "passwordreset-domain": "Vet-miàng:",
        "passwordreset-capture": "查看生成嘅電子郵件係無?",
        "passwordreset-capture-help": "係講汝選中邇隻框,電子郵件(包括臨時密碼)將顯示,並發送分用戶。",
-       "passwordreset-email": "電郵地址:",
+       "passwordreset-email": "Thien-yù thi-chí:",
        "passwordreset-emailtitle": "在{{SITENAME}}上嘅詳細信息",
        "passwordreset-emailsentemail": "密碼重置電子郵件已發送。",
        "changeemail": "更改電子郵件地址",
        "changeemail-no-info": "汝必須登入後直接進入邇隻頁面。",
        "changeemail-oldemail": "當前電郵地址:",
        "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": "摘要:",
+       "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": "邇係一隻細微修改",
-       "watchthis": "監視本頁",
-       "savearticle": "保存本頁",
+       "minoredit": "Liá-he yit-chak se-mì siû-kói",
+       "watchthis": "Kâm-sṳ pún-ya̍p",
+       "savearticle": "Pó-chhùn pún-ya̍p",
        "preview": "預覽",
-       "showpreview": "展示預覽",
-       "showdiff": "展示差別",
-       "anoneditwarning": "'''警告:'''汝還吂登入。\n汝嘅IP地址將記錄在邇頁嘅編寫歷史肚。",
+       "showpreview": "Chán-sṳ yi-lám",
+       "showdiff": "Chán-sṳ chhâ-phe̍t",
+       "anoneditwarning": "<strong>Kín-ko : </strong>Ngì hàn-m̀ tên-ngi̍p. Ngì ke IP thi-chí chiông ki-liu̍k chhai liá-ya̍p ke phiên-siá li̍t-sṳ́ tú. Ká-sṳ́ ngì  <strong>[$1 tên-ngi̍p]</strong> fe̍t  <strong>[$2 kien-li̍p chong-ho]</strong>, ngì ke phiên-si̍p chiông-fi yî ngì ke sṳ́-yung-chá miàng-chhṳ̂n phiêu-sṳ, yúng-yû khì-thâ yù-tiám.",
        "anonpreviewwarning": "“警告:汝還吂登入。汝嘅IP地址將會記錄在邇頁嘅編輯歷史中”",
        "missingsummary": "'''提示:''' 汝無提供一隻編寫摘要。假使汝再次單擊「{{int:savearticle}}」,汝嘅編寫將毋帶編寫摘要保存。",
        "missingcommenttext": "請在下背輸入評論。",
        "nosuchsectiontitle": "Mò-yû liá-ke thon-lo̍k",
        "nosuchsectiontext": "Ngì sòng-chhṳ phiên-cho ke thon-lo̍k pin-put chhùn-chhai.",
        "loginreqtitle": "愛登入",
-       "loginreqlink": "登入",
+       "loginreqlink": "tên-ngi̍p",
        "loginreqpagetext": "汝必須$1正做得查看其他頁面。",
        "accmailtitle": "密碼已經寄出",
        "accmailtext": "'$1' ke pi-me̍t yí-kîn ki-kî to $2.",
-       "newarticle": "(新)",
-       "newarticletext": "汝入到矣一隻還吂建立嘅頁面。\n愛建立本頁面,請在下面嘅編寫框肚輸入內容(詳情參詳[$1 幫手])。\n係講汝係毋小心來到本頁面,直接點擊汝嘅瀏覽器肚嘅“轉頭”撳掣轉頭。",
+       "newarticle": "(Sîn)",
+       "newarticletext": "Ngì ngi̍p-to yí yit-chak hàn-mò kien-li̍p ke ya̍p-mien. \nOi kien-li̍p pún ya̍p-mien, chhiáng chhai hâ-mien ke phiên-siá khiông tú sû-ngi̍p nui-yùng (siòng-chhìn chhâm-siòng [$1 pông-sú]). \nHe-kóng ngì he-m̀ séu-sîm lòi-to pún ya̍p-mien, chhṳ̍t-chiap tiám-kit ngì-ke liù-lám-hi tú ke  <strong>chón-thèu </strong> khim chhe̍t chón-thèu.",
        "anontalkpagetext": "---- ''Liá-he yit-ke hàn-mò kien-li̍p chong-ho ke ngia̍k-miàng yung-fu ke tui-fa-hong. Só-yî chṳ́-nèn yung IP thi-tiám lòi lâu kí lièn-lo̍k. Ke-IP thi-tiám khó-nèn yù-chhai kí-miàng yung-fu khiung-hióng. Kó-yèn ngì-he yit-miàng ngia̍k-miàng yung-fu ngin-vì pún-hong song ke phìn-lî kiên ngì mò-kôan, chhiáng [[Special:UserLogin|Chhóng-kien sîn chong-ho fe̍t-chá Tên-ngi̍p]] khó-yî phit-miên lòi-yì khì-thâ ngia̍k-miàng yung-fu ke fun-lon.''",
-       "noarticletext": "邇頁當前無內容,汝做得在其他頁[[Special:Search/{{PAGENAME}}|搜尋邇頁標題]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋有關日誌],\n或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 編寫邇頁]</span>。",
+       "noarticletext": "Liá-ya̍p tông-chhièn mò nui-yùng, ngì cho-tet chhai khì-thâ [[Special:Search/{{PAGENAME}}|sêu-chhìm liá-ya̍p phiêu-thì]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sêu-chhìm yû-kôan ngit-chì] fe̍t [{{fullurl:{{FULLPAGENAME}}|action=edit}} phiên-siá liá-ya̍p]</span>.",
        "noarticletext-nopermission": "邇頁當前無內容。\n汝做得在其它頁[[Special:Search/{{PAGENAME}}|搜尋邇頁標題]],或者<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋有關日誌]</span>,但汝無權限建立邇頁。",
        "userpage-userdoesnotexist": "用戶帳號“$1:還吂註冊。\n請在建立/編寫邇隻頁面前先檢查一下。",
        "clearyourcache": "'''Chu-yi:''' Chhai tú-chhùn yî-heu, ngì pit-sî khoai chhái-chhí chhîn-chhù hi-khí chhòi-nèn khon-tó chok-chhut ke kói-pien. '''Mozilla / Firefox / Safari:''' on-tén ''Shift'' chai tiám-kit '' Chhùng-sîn chṳ́n-lî ''(fe̍t-chá on-hâ ''Ctrl-Shift-R'', chhai Phìn-kó Mac song on-hâ ''Cmd-Shift-R''); '''IE:''' on-tén ''Ctrl'' chai tiám-kit ''Chhùng-sîn chṳ́n-lî'', fe̍t-he on-hâ ''Ctrl-F5'';'''Konqueror:''' chak  sî-yeu tiám-kit ''Chhùng-sîn chṳ́n-lî''; '''Opera:''' yung-fu sî-yeu chhai ''kûng-khí-sat-thin'' chûng vàn-cháng-thi chhîn-chhù ke khoai-chhí.",
        "usercsspreview": "'''Chu-yi ngì chak-he chhai yi-liau ngì ke-ngìn CSS, hàn-mò tú-chhùn!'''",
        "userjspreview": "'''記緊汝單單係在測試/預覽汝嘅用戶JavaScript。'''\n'''還吂保存!'''",
        "userinvalidcssjstitle": "'''警告:''' 毋存在外皮“$1”。\n注意自定嘅.css撈.js頁愛使用小寫標題,例如,{{ns:user}}:Foo/vector.css撈 {{ns:user}}:Foo/Vector.css毋同。",
-       "updated": "(已經更新)",
-       "note": "'''注意:'''",
+       "updated": "(Yí-kîn kiên-sîn)",
+       "note": "<strong>Chu-yi:</strong>",
        "previewnote": "'''請記到邇單淨係預覽。'''\n汝嘅更改還吂保存!",
        "previewconflict": "邇隻預覽展示矣上片文字編寫區肚嘅內容。其將在汝選擇保存後出現。",
        "session_fail_preview": "'''好抱歉!由於部份數據遺失,𠊎兜無辦法處理汝嘅編寫。'''\n請試多一擺。\n係講還係失敗,請[[Special:UserLogout|登出]]後重新登入。",
        "session_fail_preview_html": "'''Chṳ̂n tui-put-hí! Phu-fun chṳ̂-liau yí-kîn yì-sṳt, mò-fap chhú-lî ngì-ke phiên-siá.'''\n\n'''Kó-yèn liá-ke phiên-siá ko-chhàng mò-yû mun-thì, chhiáng chai-chhṳ yit-chhṳ. Yìn-yèn yû mun-thì, chhiáng tên-chhut heu chhùng-sîn tên-ngi̍p yit-chhṳ.'''",
-       "editing": "編寫 $1",
-       "creating": "創建 $1",
-       "editingsection": "編寫 $1 (段落)",
+       "editing": "Phiên-siá $1",
+       "creating": "Chhóng-kien $1",
+       "editingsection": "Phiên-siá $1 (thon-lo̍k)",
        "editingcomment": "Chang-chhai phiên-siá $1 (phìn-lun)",
-       "editconflict": "編寫衝突:$1",
+       "editconflict": "Phiên-siá chhûng-thu̍t: $1",
        "explainconflict": "有人在汝開始編寫後更改矣頁面。\n上片嘅文字框內展示嘅是當前本頁嘅內容。\n汝所做嘅修改展示在下背嘅文字框肚。\n汝應該將汝所做嘅修改加入現有嘅內容肚。\n'''單淨'''在上片文字框肚嘅內容會在汝點擊「{{int:savearticle}}」後分保存。",
-       "yourtext": "汝嘅文字",
-       "storedversion": "已保存嘅修訂版本",
+       "yourtext": "Ngì-ke vùn-sṳ",
+       "storedversion": "Yí pó-chhùn ke siû-thin pán-pún",
        "nonunicodebrowser": "'''警告: 汝嘅瀏覽器毋兼容Unicode編碼。'''邇位有一隻工作區將使汝做得安全編寫頁面: 非ASCII字符將以十六進製編碼模式出現在編輯框肚。",
        "editingold": "'''警告:汝在編輯中嘅係本頁嘅舊版本。'''\n係講汝保存其嘅話,在本版本之後嘅任何更改都會遺失。",
-       "yourdiff": "差別",
+       "yourdiff": "Chhâ-phe̍t",
        "copyrightwarning": "Chhiáng chu-yi ngì tui {{SITENAME}} ke só-yû kung-hien tû pûn-ngìn ngin-vì he chhai $2-hâ fat-phu, chhiáng chhà-khon chhai $1-ke se-chiet. Kó-yèn ngì chhin-mò hî-mong ngì-ke vùn-sṳ pûn-ngìn ngim-yi siù-chho lâu chai san-pu, chhiáng mò-yeu thì-kâu.<br /> Ngì thùng-sṳ̀ ya-yeu hiong Wikimedia pó-chṳn ngì só thì-kâu ke nui-yùng he chhṳ-kí só chok, fe̍t-chá lòi-chhṳ yit-ke mò-su pán-khièn pó-fu fe̍t-he siông-thùng chhṳ-yù ke lòi-ngièn. '''Mò-yeu chhai hàn-mò su-khièn ke chhìn-khóng-hâ fat-péu!'''<br />",
        "copyrightwarning2": "請注意汝對{{SITENAME}}嘅所有貢獻\n都可能分其他貢獻人編寫、修改或刪除。\n係講汝毋希望您嘅文字分任意修改撈再散佈,請毋好提交。<br />\n汝同時也愛向𠊎兜保證汝所提交嘅內容係自家所作,或得自一隻毋受版權保護或相似自由嘅來源(參閱$1的細節)。\n'''毋好在未獲授權嘅情況下發表!'''",
        "longpageerror": "'''Chho-ngu: Ngì só thì-kâu ke vùn-sṳ chhòng-thu yû $1KB, liá thai-yî $2KB ke chui-thai chhṳ̍t, ke-vùn-chông put-nèn pûn tú-chhùn.'''",
        "protectedpagewarning": "'''Kín-ko: Pún-chông yí-kîn pûn pó-fu, chṳ́-yû yúng-yû Kón-lî-yèn hí-khó-khièn ke yung-fu chhòi-nèn siù-chho.'''",
        "semiprotectedpagewarning": "'''Chu-yi:''' Pún vùn-chông pûn só-thin, tên-ki ke yung-fu hí-khó phiên-siá.",
        "cascadeprotectedwarning": "'''警告:'''本頁已經分保護,單淨係擁有管理員權限嘅用戶正做得修改,因為本頁已分下背連鎖保護嘅{{PLURAL:$1|一隻|多隻}}頁面所包含:",
-       "templatesused": "邇頁面包含下背{{PLURAL:$1|模板|模板}}:",
+       "templatesused": "Liá ya̍p-mien pâu-hàm hâ-poi {{PLURAL:$1|Mù-pán|Mù-pán}}:",
        "templatesusedpreview": "Chhṳ́-chhṳ yi-siên chûng sṳ́-yung ke mù-pán yû:",
        "templatesusedsection": "Chhai liá-ke thon-lo̍k song sṳ́-yung ke mù-pán yû:",
-       "template-protected": "(保護)",
-       "template-semiprotected": "(半保護)",
-       "hiddencategories": "邇頁屬於$1隻隱藏分類嘅成員:",
+       "template-protected": "(Pó-fu)",
+       "template-semiprotected": "(Pan pó-fu)",
+       "hiddencategories": "Liá-ya̍p su̍k-yî $1-chak yún-chhông fûn-lui ke sṳ̀n-yèn:",
        "edittools": "<!-- 邇肚嘅文字將分展示在編寫撈上傳表單以下。 -->\n<div id=\"editpage-specialchars\" class=\"plainlinks edittools-version-test003\" style=\"margin-top: 15px; border-width: 1px; border-style: solid; border-color: #aaaaaa; padding: 2px;\"> <span id=\"edittools_main\">'''Insert:''' <charinsert>– — … ‘ “ ’ ” ° ″ ′ ≈ ≠ ≤ ≥ ± − × ÷ ← → · § </charinsert></span><span id=\"edittools_name\">&nbsp;&nbsp;'''Sign your username:''' <charinsert>--~~&#126;~</charinsert> <small>(on [[Help:Talk pages|talk pages]])</small></span> ---- <small id=\"edittools_newsectionshere\"><span id=\"edittools_hide_for_script_test\"><span id=\"edittools_wikimarkup\">'''Wiki markup:''' <charinsert><nowiki>{{</nowiki>+<nowiki>}}</nowiki> </charinsert> &nbsp; <charinsert><nowiki>{{{</nowiki>+<nowiki>}}}</nowiki> </charinsert> &nbsp; <charinsert><nowiki>|</nowiki></charinsert> &nbsp; <charinsert>[+]</charinsert> &nbsp; <charinsert>[[+]]</charinsert> &nbsp; <charinsert>[[Category:+]]</charinsert> &nbsp; <charinsert>#REDIRECT&#32;[[+]]</charinsert> &nbsp; <charinsert>{{Subst:Fôn-ngiàng}}</charinsert> &nbsp; <charinsert>{{Subst:PAGENAME}}</charinsert> &nbsp; <charinsert>&nbsp;</charinsert> &nbsp; <charinsert><s>+</s></charinsert> &nbsp; <charinsert><sup>+</sup></charinsert> &nbsp; <charinsert><sub>+</sub></charinsert> &nbsp; <charinsert><code>+</code></charinsert> &nbsp; <charinsert><blockquote>+</blockquote></charinsert> &nbsp; <charinsert><ref>+</ref></charinsert> &nbsp; <charinsert><nowiki>{{</nowiki>Reflist<nowiki>}}</nowiki></charinsert> &nbsp; <charinsert><references/></charinsert> &nbsp; <charinsert><includeonly>+</includeonly></charinsert> &nbsp; <charinsert><noinclude>+</noinclude></charinsert> &nbsp; <charinsert><nowiki>{{</nowiki>DEFAULTSORT:+<nowiki>}}</nowiki></charinsert> &nbsp; <charinsert>&lt;nowiki>+</nowiki></charinsert> &nbsp; <charinsert><nowiki><!-- </nowiki>+<nowiki> --></nowiki></charinsert>&nbsp; <charinsert><nowiki><span class=\"plainlinks\"></nowiki>+<nowiki></span></nowiki></charinsert>&nbsp;&nbsp;&bull;&nbsp; ([[Wikipedia:Template messages|templates]])<br/></span> <span id=\"edittools_symbols\">'''Symbols:''' <charinsert> ~ | ¡ ¿ † ‡ ↔ ↑ ↓ • ¶</charinsert> &nbsp; <charinsert> # ½ ⅓ ⅔ ¼ ¾ ⅛ ⅜ ⅝ ⅞ ∞ </charinsert> &nbsp; <charinsert> ‘ “ ’ ” «+»</charinsert> &nbsp; <charinsert> ¤ ₳ ฿ ₵ ¢ ₡ ₢ $ ₫ ₯ € ₠ ₣ ƒ ₴ ₭ ₤ ℳ ₥ ₦ № ₧ ₰ £ ៛ ₨ ₪ ৳ ₮ ₩ ¥ </charinsert> &nbsp; <charinsert> ♠ ♣ ♥ ♦ </charinsert>&nbsp; <charinsert>m²</charinsert>&nbsp;<charinsert>m³</charinsert><br/></span> <span id=\"edittools_characters\">'''Characters:''' <span class=\"latinx\"> <charinsert> Á á Ć ć É é Í í Ĺ ĺ Ḿ ḿ Ń ń Ó ó Ŕ ŕ Ś ś Ú ú Ý ý Ź ź </charinsert> &nbsp; <charinsert> À à È è Ì ì M̀ m̀  Ǹ ǹ Ò ò Ù ù </charinsert> &nbsp; <charinsert> Â â Ĉ ĉ Ê ê Ĝ ĝ Ĥ ĥ Î î Ĵ ĵ Ô ô Ŝ ŝ Û û Ŵ ŵ Ŷ ŷ </charinsert> &nbsp; <charinsert> A̤ a̤ E̤ e̤ I̤ i̤ O̤ o̤ Ṳ ṳ </charinsert> &nbsp;\n<charinsert> A̍ a̍ E̍ e̍ I̍ i̍ O̍ o̍ U̍ u̍ </charinsert> &nbsp; <charinsert> À̤ à̤ È̤ è̤ Ì̤ ì̤ Ò̤ ò̤ Ṳ̀ ṳ̀ </charinsert> &nbsp;\n<charinsert> Á̤ á̤ É̤ é̤ Í̤ í̤ Ó̤ ó̤ Ṳ́ ṳ́ </charinsert> &nbsp; <charinsert> A̤̍ a̤̍ E̤̍ e̤̍ I̤̍ i̤̍ O̤̍ o̤̍ Ṳ̍ ṳ̍ </charinsert> &nbsp;\n<charinsert> Â̤ â̤ Ê̤ ê̤ Î̤ î̤ Ô̤ ô̤ Ṳ̂ ṳ̂ </charinsert> &nbsp; <charinsert> Â â Ĉ ĉ Ê ê Ĝ ĝ Ĥ ĥ Î î Ĵ ĵ Ô ô Ŝ ŝ Û û Ŵ ŵ Ŷ ŷ </charinsert> &nbsp; <charinsert> Ä ä Ë ë Ï ï Ö ö Ü ü Ÿ ÿ </charinsert> &nbsp; <charinsert> ß </charinsert> &nbsp; <charinsert> Ã ã Ẽ ẽ Ĩ ĩ Ñ ñ Õ õ Ũ ũ Ỹ ỹ</charinsert> &nbsp; <charinsert> Ç ç Ģ ģ Ķ ķ Ļ ļ Ņ ņ Ŗ ŗ Ş ş Ţ ţ </charinsert> &nbsp; <charinsert> Đ đ </charinsert> &nbsp; <charinsert> Ů ů </charinsert> &nbsp; <charinsert> Ǎ ǎ Č č Ď ď Ě ě Ǐ ǐ Ľ ľ Ň ň Ǒ ǒ Ř ř Š š Ť ť Ǔ ǔ Ž ž </charinsert> &nbsp; <charinsert> Ā ā Ē ē Ī ī Ō ō Ū ū Ȳ ȳ Ǣ ǣ </charinsert> &nbsp; <charinsert> ǖ ǘ ǚ ǜ </charinsert> &nbsp; <charinsert> Ă ă Ĕ ĕ Ğ ğ Ĭ ĭ Ŏ ŏ Ŭ ŭ </charinsert> &nbsp; <charinsert> Ċ ċ Ė ė Ġ ġ İ ı Ż ż </charinsert> &nbsp; <charinsert> Ą ą Ę ę Į į Ǫ ǫ Ų ų </charinsert> &nbsp; <charinsert> Ḍ ḍ Ḥ ḥ Ḷ ḷ Ḹ ḹ Ṃ ṃ Ṇ ṇ Ṛ ṛ Ṝ ṝ Ṣ ṣ Ṭ ṭ </charinsert> &nbsp; <charinsert> Ł ł </charinsert> &nbsp; <charinsert> Ő ő Ű ű </charinsert> &nbsp; <charinsert> Ŀ ŀ </charinsert> &nbsp; <charinsert> Ħ ħ </charinsert> &nbsp; <charinsert> Ð ð Þ þ </charinsert> &nbsp; <charinsert> Œ œ </charinsert> &nbsp; <charinsert> Æ æ Ø ø Å å </charinsert> &nbsp; <charinsert> Ə ə </charinsert></span>&nbsp;<span id=\"edittools_latinx_template\">&nbsp;&bull;&nbsp; <charinsert><nowiki>{{</nowiki><nowiki>Unicode|</nowiki>+<nowiki>}}</nowiki></charinsert></span><br/></span> <span id=\"edittools_greek\">'''Hî-lia̍p-vùn:''' <charinsert> Ά ά Έ έ Ή ή Ί ί Ό ό Ύ ύ Ώ ώ </charinsert> &nbsp; <charinsert> Α α Β β Γ γ Δ δ </charinsert> &nbsp; <charinsert> Ε ε Ζ ζ Η η Θ θ </charinsert> &nbsp; <charinsert> Ι ι Κ κ Λ λ Μ μ </charinsert> &nbsp; <charinsert> Ν ν Ξ ξ Ο ο Π π </charinsert> &nbsp; <charinsert> Ρ ρ Σ σ ς Τ τ Υ υ </charinsert> &nbsp; <charinsert> Φ φ Χ χ Ψ ψ Ω ω </charinsert> &nbsp;<span id=\"edittools_greek_template\">•&nbsp; <charinsert><nowiki>{{</nowiki><nowiki>Polytonic|</nowiki>+<nowiki>}}</nowiki></charinsert></span> &nbsp;<span id=\"edittools_greek_example\">•&nbsp; ([[Greek diacritics#Computer encoding|polytonic list]])</span><br/></span> <span id=\"edittools_cyrillic\">'''Cyrillic:''' <charinsert> А а Б б В в Г г </charinsert> &nbsp; <charinsert> Ґ ґ Ѓ ѓ Д д Ђ ђ </charinsert> &nbsp; <charinsert> Е е Ё ё Є є Ж ж </charinsert> &nbsp; <charinsert> З з Ѕ ѕ И и І і </charinsert> &nbsp; <charinsert> Ї ї Й й Ј ј К к </charinsert> &nbsp; <charinsert> Ќ ќ Л л Љ љ М м </charinsert> &nbsp; <charinsert> Н н Њ њ О о П п </charinsert> &nbsp; <charinsert> Р р С с Т т Ћ ћ </charinsert> &nbsp; <charinsert> У у Ў ў Ф ф Х х </charinsert> &nbsp; <charinsert> Ц ц Ч ч Џ џ Ш ш </charinsert> &nbsp; <charinsert> Щ щ Ъ ъ Ы ы Ь ь </charinsert> &nbsp; <charinsert> Э э Ю ю Я я </charinsert> &nbsp;<br/></span> <span id=\"edittools_ipa\">'''IPA:''' <span title=\"Pronunciation in IPA\" class=\"IPA\"><charinsert>t̪ d̪ ʈ ɖ ɟ ɡ ɢ ʡ ʔ </charinsert> &nbsp; <charinsert> ɸ ʃ ʒ ɕ ʑ ʂ ʐ ʝ ɣ ʁ ʕ ʜ ʢ ɦ </charinsert> &nbsp; <charinsert> ɱ ɳ ɲ ŋ ɴ </charinsert> &nbsp; <charinsert> ʋ ɹ ɻ ɰ </charinsert> &nbsp; <charinsert> ʙ ʀ ɾ ɽ </charinsert> &nbsp; <charinsert> ɫ ɬ ɮ ɺ ɭ ʎ ʟ </charinsert> &nbsp; <charinsert> ɥ ʍ ɧ </charinsert> &nbsp; <charinsert> ɓ ɗ ʄ ɠ ʛ </charinsert> &nbsp; <charinsert> ʘ ǀ ǃ ǂ ǁ </charinsert> &nbsp; <charinsert> ɨ ʉ ɯ </charinsert> &nbsp; <charinsert> ɪ ʏ ʊ </charinsert> &nbsp; <charinsert> ɘ ɵ ɤ </charinsert> &nbsp; <charinsert> ə ɚ </charinsert> &nbsp; <charinsert> ɛ ɜ ɝ ɞ ʌ ɔ </charinsert> &nbsp; <charinsert> ɐ ɶ ɑ ɒ </charinsert> &nbsp; <charinsert> ʰ ʷ ʲ ˠ ˤ ⁿ ˡ </charinsert> &nbsp; <charinsert> ˈ ˌ ː ˑ ̪ </charinsert>&nbsp;</span> &nbsp;&bull;&nbsp; <charinsert><nowiki>{{</nowiki><nowiki>IPA|</nowiki>+<nowiki>}}</charinsert></small>\n</div>",
        "nocreatetext": "Chhṳ́ mióng-chham han-chṳ chhóng-chho sîn hong-mien ke kûng-yung. ngì khó-yî fán-fì pin phiên-cho yí-kîn yû ke hong-mien, fe̍t-chá [[Special:UserLogin|tên-liu̍k fe̍t-he chhóng-kien sîn chong-fu]].",
        "nocreate-loggedin": "汝並無權限去創建新頁面。",
-       "permissionserrors": "權限差錯",
+       "permissionserrors": "Khièn-han chhâ-chho",
        "permissionserrorstext": "Kîn-kí yî-ha ke ngièn-yîn, ngì vù-yû khièn-han hi-tso yî-ha ke thung-tsok:",
        "permissionserrorstext-withaction": "根據下背嘅{{PLURAL:$1|原因|原因}},汝並無權限去做$2:",
        "recreate-moveddeleted-warn": "'''警告:汝今下重新建立一隻先前曾經刪除過嘅頁面。'''\n\n汝應該愛考慮一下繼續編寫邇一隻頁面係毋係合適。\n為到方便,邇一個頁面嘅刪除日誌已經在下背提供:",
-       "moveddeleted-notice": "邇隻頁面已經刪除。\n邇隻頁面嘅刪除撈移動日誌已經在下背提供來參考。",
-       "log-fulllog": "查看完整日誌",
-       "edit-hook-aborted": "編寫分鈎取消。\n其並無分出解釋。",
+       "moveddeleted-notice": "Liá-chak ya̍p-mien yí-kîn san-chhù. \nLiá-chak ya̍p-mien ke san-chhù lâu yì-thûng ngit-chì yí-kîn chhai hâ-poi thì-kiûng lòi chhâm-kháu.",
+       "log-fulllog": "Chhà-khon vàn-cháng ngit-chì",
+       "edit-hook-aborted": "Phiên-siá fûn-keu chhí-sêu. \nKhì pin-mò fûn-chhut kié-sṳt.",
        "edit-gone-missing": "毋做得更新頁面。\n其可能正正分刪除。",
-       "edit-conflict": "編寫衝突。",
+       "edit-conflict": "Phiên-siá chhûng-thu̍t.",
        "edit-no-change": "汝嘅編寫已經略過,因為文字無任何改動。",
        "edit-already-exists": "毋做得建立一隻新頁面。\n其已經存在。",
-       "defaultmessagetext": "默認消息文字",
+       "defaultmessagetext": "Me̍t-ngin sêu-sit vùn-sṳ",
        "invalid-content-data": "無效嘅數據內容",
-       "content-model-wikitext": "wiki語法",
-       "content-model-text": "純文字",
+       "content-model-wikitext": "Wki ngî-fap",
+       "content-model-text": "sùn vùn-sṳ",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "post-expand-template-inclusion-warning": "警告: 包含模板大小過大。\n一兜模板將毋會包含。",
        "undo-failure": "由於中途嘅編寫毋一致,本編輯毋做得撤銷。",
        "undo-norev": "由於其嘅修訂版本毋存在或已刪除,本編寫毋做得撤銷。",
        "undo-summary": "Chhí-sêu yù [[Special:Contributions/$2|$2]] ([[User talk:$2|tui-fa]]) só chok-chhut ke siû-thin $1",
-       "cantcreateaccounttitle": "無法建立帳號",
+       "cantcreateaccounttitle": "Mò-fap kien-li̍p chong-ho",
        "cantcreateaccount-text": "從邇隻IP地址('''$1''')建立帳號已經分[[User:$3|$3]]禁止。\n\n當中分$3封禁嘅原因是''$2''",
-       "viewpagelogs": "查看邇隻頁面嘅日誌",
+       "viewpagelogs": "Chhà-khon liá-chak ya̍p-mien ke ngit-chì",
        "nohistory": "無本頁嘅修訂版本記錄。",
        "currentrev": "最新版本",
-       "currentrev-asof": "$1嘅最新修訂版本",
-       "revisionasof": "$1嘅修訂版本",
-       "revision-info": "在$1由$2所做嘅修訂版本",
-       "previousrevision": "←上隻版本",
-       "nextrevision": "下隻版本→",
-       "currentrevisionlink": "最新版本",
-       "cur": "當前",
+       "currentrev-asof": "$1 ke chui-sîn siû-thin pán-pún",
+       "revisionasof": "$1 ke siû-thin pán-pún",
+       "revision-info": "chhai $1 yù {{GENDER:$6|$2}} só cho ke siû-thin pán-pún $7",
+       "previousrevision": "← Sông-chak pán-pún",
+       "nextrevision": "Hâ-chak pán-pún →",
+       "currentrevisionlink": "Chui-sîn pán-pún",
+       "cur": "tông-chhièn",
        "next": "下一隻",
-       "last": "上一隻",
-       "page_first": "最早",
-       "page_last": "最尾",
+       "last": "sông yit-chak",
+       "page_first": "chui-chó",
+       "page_last": "chui-mî",
        "histlegend": "差別選擇:標記愛比較版本嘅單選按鈕並點擊底部嘅按鈕進行比較。<br />\n說明:'''({{int:cur}})''' 指撈最新版本比較,'''({{int:last}})''' 指撈上隻版本比較,'''{{int:minoreditletter}}''' = 細微修改。",
-       "history-fieldset-title": "瀏覽歷史",
-       "history-show-deleted": "單淨係已刪除嘅",
-       "histfirst": "最早",
-       "histlast": "最新",
+       "history-fieldset-title": "Liù-lám li̍t-sṳ́",
+       "history-show-deleted": "Tân-chhiang he yí san-chhù ke",
+       "histfirst": "chui-chó",
+       "histlast": "chui-sîn",
        "historysize": "($1字節)",
        "historyempty": "(空)",
        "history-feed-title": "修訂歷史",
        "rev-deleted-event": "(日誌已刪除)",
        "rev-deleted-text-permission": "Ke-vùn-chông siû-thin yí-kîn pûn-chhiùng kûng-khiung vùn-tóng chûng yì-chhù. Chhai [{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} chhù-thet ngit-ki] chûng khó-nèn kiám-chhà to siòng-se ke sin-sit.",
        "rev-deleted-text-view": "Ke-vùn-chông siû-thin yí-kîn pûn-chhiùng kûng-khiung vùn-tóng chûng yì-chhù. Chok-vi mióng-chham ke kón-lî-yèn, khó-yî kiám-chhà; Chhai[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} chhù-thet ngit-ki] chûng khó-nèn kiám-chhà to siòng-se ke sin-sit.",
-       "rev-delundel": "展現/隱藏",
+       "rev-delundel": "chán-hien / yún-chhông",
        "rev-showdeleted": "展現",
        "revisiondelete": "刪除/恢復刪除修訂版本",
        "revdelete-nooldid-title": "無效嘅目標修訂版本",
        "mergehistory-from": "來源頁面:",
        "mergehistory-into": "目的頁面:",
        "mergehistory-list": "做得合併嘅編寫歷史",
-       "mergehistory-merge": "以下[[:$1]]嘅修訂可以合併到[[:$2]]。用邇選項按鈕欄去合併單淨有在指定時間以前所創建嘅修訂。愛留意嘅係使用導航連接就會重設邇一欄。",
+       "mergehistory-merge": "Yî-hâ [[:$1]] ke siû-thin cho-tet ha̍p-pìn to [[:$2]]. Yung liá sién-hong on-néu-làn hi ha̍p-pìn tân-chhiang yû chhai chṳ́-thin sṳ̀-kiên yî-chhièn só chhóng-kien ke siû-thin. Oi liù-yi ke he sṳ́-yung thô-hòng lièn-chiap chhiu-fi chhùng-sat liá-yit làn.",
        "revertmerge": "解除合併",
-       "history-title": "“$1”嘅修訂歷史",
-       "lineno": "第$1行:",
+       "history-title": "\"$1\" ke siû-thin li̍t-sṳ́",
+       "difference-title": "\"$1\" siû-thin kiên ke chhâ-bie",
+       "lineno": "Thi $1 hàng:",
        "compareselectedversions": "比較選定嘅修訂版本",
-       "editundo": "撤銷",
-       "searchresults": "搜尋結果",
-       "searchresults-title": "搜尋\"$1\"嘅結果",
+       "editundo": "Chha̍t-siau",
+       "searchresults": "Sêu-chhìm kiet-kó",
+       "searchresults-title": "Sêu -chhìm \"$1\" ke kiet-kó",
        "titlematches": "頁面標題相符",
        "textmatches": "頁面內容配得上",
        "notextmatches": "無頁面內容配上",
-       "prevn": "前頭$1隻",
-       "nextn": "後背$1隻",
+       "prevn": "chhièn-thèu $1 chak",
+       "nextn": "heu-poi $1 chak",
        "prevn-title": "前頭$1隻結果",
-       "nextn-title": "後背$1隻結果",
-       "shown-title": "每頁展示$1項結果",
-       "viewprevnext": "查看($1 {{int:pipe-separator}} $2)($3)",
+       "nextn-title": "Heu-poi $1-chak kiet-kó",
+       "shown-title": "Mî-ya̍p chán-sṳ $1-hong kiet-kó",
+       "viewprevnext": "Chhà-khon ( $1 {{int:pipe-separator}} $2) ( $3)",
        "searchmenu-exists": "'''在邇隻wiki上已經有一頁喊做“[[:$1]]”。'''",
-       "searchmenu-new": "'''在本wiki上建立邇隻頁面“[[:$1]]”!'''",
-       "searchprofile-articles": "內容頁面",
-       "searchprofile-images": "多媒體",
-       "searchprofile-everything": "全部",
-       "searchprofile-advanced": "高級",
-       "searchprofile-articles-tooltip": "在$1肚搜尋",
-       "searchprofile-images-tooltip": "搜尋文件",
-       "searchprofile-everything-tooltip": "搜索全部(包括討論頁面)",
-       "searchprofile-advanced-tooltip": "在用戶安名空間肚搜尋",
-       "search-result-size": "$1 ($2隻字)",
+       "searchmenu-new": "<strong>Chhai pún Wiki sông kien-li̍p liá-chak ya̍p-mien \"[[:$1]]\"!</strong>{{PLURAL:$2|0=|fe̍t chhiáng chhâm-kháu ngì sû-ngi̍p ke thiàu-khien cháu-to ke sêu-chhìm kiet-kó. |fe̍t chhiáng chhâm-kháu khì-thâ sêu-chhìm kiet-kó.}}",
+       "searchprofile-articles": "Nui-yùng ya̍p-mien",
+       "searchprofile-images": "Tô mòi-thí",
+       "searchprofile-everything": "Chhiòn-phu",
+       "searchprofile-advanced": "Kô-kip",
+       "searchprofile-articles-tooltip": "Chhai $1 tú sêu-chhìm",
+       "searchprofile-images-tooltip": "Sêu-chhìm vùn-khien",
+       "searchprofile-everything-tooltip": "Sêu-sok chhiòn-phu (pâu-koat thó-lun ya̍p-mien)",
+       "searchprofile-advanced-tooltip": "Chhai yung-fu ôn-miàng khûng-kiên tú sêu-chhìm",
+       "search-result-size": "$1 ($2-chak sṳ)",
        "search-result-category-size": "$1隻成員($2隻子分類,$3隻文件)",
-       "search-redirect": "(重定向 $1)",
-       "search-section": "(段落 $1)",
-       "search-suggest": "汝係毋係尋:$1",
+       "search-redirect": "(Chhùng-thin-hiong $1)",
+       "search-section": "(thon-lo̍k $1)",
+       "search-suggest": "Ngì he-m̀-he chhìm: $1",
        "search-interwiki-caption": "姊妹計劃",
        "search-interwiki-default": "來自$1嘅結果:",
        "search-interwiki-more": "(還較多)",
        "searchrelated": "相關",
-       "searchall": "全部",
+       "searchall": "chhiòn-phu",
        "showingresults": "Ha-mien hién-sṳ chhiùng thi-'''$2'''-thiàu khôi-sṳ́ ke '''$1'''-thiàu kiet-kó:",
-       "search-nonefound": "在查詢肚無結果相符。",
+       "search-showingresults": "{{PLURAL:$4|thi <strong>$1</strong> pit kiet-kó, khiung <strong>$3</strong> pit |thi <strong>$1 - $2</strong> pit kiet-kó, khiung <strong>$3</strong> pit }}",
+       "search-nonefound": "Chhai chhà-sûn tú mò kiet-kó siông-fù.",
        "powersearch-legend": "高級搜尋",
        "powersearch-ns": "在下背嘅名字空間肚搜尋:",
        "powersearch-togglelabel": "監查:",
        "searchdisabled": "{{SITENAME}}由於性能方面嘅原因,全文搜已分暫時停用。汝做得暫時通過Google搜尋。請留意佢兜嘅索引可能會過時。",
        "preferences": "偏好設定",
-       "mypreferences": "偏好設定",
-       "prefs-skin": "外皮",
+       "mypreferences": "Phiên-hó sat-thin",
+       "prefs-skin": "Ngoi-phì",
        "skin-preview": "預覽",
        "datedefault": "預設值",
        "prefs-personal": "用戶資料",
-       "prefs-rc": "最近更改",
+       "prefs-rc": "Chui-khiûn kiên-kói",
        "prefs-watchlist": "監視列表",
        "prefs-watchlist-days": "Kam-sṳ lie̍t-péu chûng hién-sṳ ki-liu̍k ke thiên-su:",
        "prefs-watchlist-edits": "擴展監視列表肚顯示更改次數上限:",
        "prefs-misc": "雜項",
        "saveprefs": "保存",
-       "restoreprefs": "恢復所有默認設定",
+       "restoreprefs": "Fî-fu̍k só-yû me̍t-ngin sat-thin (só-yû hong-muk)",
        "prefs-editing": "編寫緊",
        "rows": "行数:",
        "columns": "列:",
        "searchresultshead": "搜尋",
        "stub-threshold": "<a href=\"#\" class=\"stub\">短頁面鏈接</a>格式門檻值(字節):",
-       "recentchangesdays": "最近更改肚嘅顯示日數:",
+       "recentchangesdays": "Chui-khiûn kiên-kói tú ke hién-sṳ ngit-sú:",
        "recentchangescount": "Chui-khiûn kiên-kói chûng ke phiên-siá chúng-su:",
        "savedprefs": "汝嘅個人偏好設定已經保存。",
        "timezonelegend": "Sṳ̀-khî",
        "badsiglength": "Tshiâm-miàng ko-liong.\nTshòng-tón pit-sî chhai $1-ke sṳ-ngièn yî-ha.",
        "email": "電子郵件",
        "prefs-help-realname": "真名係做得選嘅。\n假使汝選擇提供其,其會用在貢獻署名。",
-       "prefs-help-email": "電郵地址係選填項目,但係,假使汝毋記得汝嘅密碼,其做得用於重設密碼。",
+       "prefs-help-email": "Thien-yù thi-chí he sién-thiàm hong-muk, than-he, ká-sṳ́ ngì m̀-ki-tet ngì-ke me̍t-ma, khì cho-tet yung-yî chhùng-sat me̍t-ma.",
        "prefs-help-email-others": "汝也做得選擇分其他用戶通過汝嘅用戶頁或交流頁上嘅鏈接用電子郵件聯繫汝。\n其他用戶聯繫汝時汝嘅電子郵件毋會顯示出來。",
        "userrights": "用戶權限管理",
        "userrights-lookup-user": "管理用戶群組",
        "group-bureaucrat-member": "行政員",
        "grouppage-bot": "{{ns:project}}:機器人",
        "grouppage-sysop": "{{ns:project}}:管理員",
-       "right-upload": "上傳文件",
-       "newuserlogpage": "新建用戶名冊",
+       "right-upload": "Sông-chhòn tóng-on",
+       "right-writeapi": "Sṳ́-yung siá-ngi̍p API",
+       "newuserlogpage": "Sîn-kien yung-fu miàng-chhak",
        "newuserlogpagetext": "邇係一隻最近人創建用戶嘅新日誌",
        "rightslog": "用戶權限日誌",
        "rightslogtext": "下背記錄矣用戶權限嘅更改日誌。",
        "action-edit": "編寫本頁",
        "nchanges": "$1次更改",
-       "recentchanges": "最近更改",
-       "recentchanges-legend": "最近更改選項",
-       "recentchanges-summary": "跟蹤本wiki上嘅最新更改。",
-       "recentchanges-feed-description": "跟蹤本訂閱在wiki上嘅最近更改。",
-       "recentchanges-label-newpage": "邇次編輯建立起一隻新頁面",
-       "recentchanges-label-minor": "邇係一隻細微修改",
-       "recentchanges-label-bot": "邇次編寫係由機器人進行",
-       "recentchanges-label-unpatrolled": "邇次編寫還吂巡查過",
+       "enhancedrc-history": "Li̍t-sṳ́",
+       "recentchanges": "Chui-khiûn kiên-kói",
+       "recentchanges-legend": "Chui-khiûn kiên-kói sién-hong",
+       "recentchanges-summary": "Kiên-chiûng pún wiki sông ke chui-sîn kiên-kói.",
+       "recentchanges-feed-description": "Kiên-chiûng pún thin-ye̍t chhai wiki sông ke chui-khiûn kiên-kói.",
+       "recentchanges-label-newpage": "Liá-ke phiên-siá kien-li̍p sîn ya̍p",
+       "recentchanges-label-minor": "Liá-he yit-chak se-mì siû-kói",
+       "recentchanges-label-bot": "Liá-chhṳ phiên-siá he yù kî-hi-ngìn chin-hàng",
+       "recentchanges-label-unpatrolled": "Liá-chhṳ phiên-siá hàn-mò sùn-chhà ko",
+       "recentchanges-label-plusminus": "Kâi ya̍p-mien kiên-kói ke thai-séu  (vi-ngièn-chû)",
+       "recentchanges-legend-heading": "<strong>Chu-yi:</strong>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (chhâm-siòng [[Special:NewPages|sîn ya̍p]])",
        "rcnotefrom": "下背係從'''$2'''起嘅更改(最多展示'''$1'''):",
-       "rclistfrom": "展示從$3 $2以來嘅新更改",
+       "rclistfrom": "Chán-sṳ chhiùng $3 $2 yî-lòi ke sîn kiên-kói",
        "rcshowhideminor": "$1細微編寫",
-       "rcshowhidebots": "$1機器人嘅編寫",
-       "rcshowhideliu": "$1已登入用戶嘅編寫",
-       "rcshowhideanons": "$1匿名用戶嘅編寫",
+       "rcshowhideminor-show": "Chán-sṳ",
+       "rcshowhideminor-hide": "Yún-chhông",
+       "rcshowhidebots": "$1 kî-hi-ngìn ke phiên-siá",
+       "rcshowhidebots-show": "Chán-sṳ",
+       "rcshowhidebots-hide": "Yún-chhông",
+       "rcshowhideliu": "$1 yí-kîn tên-ngi̍p ke yung-fu",
+       "rcshowhideliu-hide": "Yún-chhông",
+       "rcshowhideanons": "$1 nit-miàng yung-fu ke phiên-siá",
+       "rcshowhideanons-show": "Chán-sṳ",
+       "rcshowhideanons-hide": "Yún-chhông",
        "rcshowhidepatr": "$1巡查過嘅編寫",
-       "rcshowhidemine": "$1亻厓嘅編寫",
-       "rclinks": "展示最近$2日內最新嘅$1次改動。<br />$3",
-       "diff": "差別",
-       "hist": "歷史",
-       "hide": "隱藏",
-       "show": "展示",
-       "minoreditletter": "細微",
-       "newpageletter": "新",
-       "boteditletter": "機",
+       "rcshowhidemine": "$1 ngài-ke phiên-siá",
+       "rcshowhidemine-show": "Chán-sṳ",
+       "rcshowhidemine-hide": "Yún-chhông",
+       "rclinks": "Chán-sṳ chui-khiûn $2-ngit nui chui-sîn ke $1 chhṳ kói-thûng. <br />$3",
+       "diff": "chhâ-phe̍t",
+       "hist": "li̍t-sṳ́",
+       "hide": "Yún-chhông",
+       "show": "Chán-sṳ",
+       "minoreditletter": "se-mì",
+       "newpageletter": "Sîn",
+       "boteditletter": "kî",
        "number_of_watching_users_pageview": "[$1隻用戶關注]",
        "rc_categories": "分類界限(以“|”分割)",
        "rc_categories_any": "任意",
+       "rc-change-size-new": "Kiên-kói heu ke $1 vi-ngièn-chû",
        "rc-enhanced-expand": "展示細節 (愛有JavaScript)",
        "rc-enhanced-hide": "隱藏細節",
-       "recentchangeslinked": "相關更改",
+       "recentchangeslinked": "Siông-kôan kiên-kó",
        "recentchangeslinked-feed": "相關更改",
-       "recentchangeslinked-toolbox": "相關更改",
-       "recentchangeslinked-title": "撈“$1”有關嘅更改",
+       "recentchangeslinked-toolbox": "Siông-kôan kiên-kói",
+       "recentchangeslinked-title": "lâu \"$1\" yû-kôan ke kiên-kói",
        "recentchangeslinked-summary": "邇一隻特殊頁面列示''由''所分出嘅一隻頁面之鏈接到頁面嘅最近更改(或者是對於指定分類嘅成員)。\n在[[Special:Watchlist|汝嘅監視列表]]肚嘅頁面會用'''粗體'''顯示。",
-       "recentchangeslinked-page": "頁面名:",
-       "recentchangeslinked-to": "展示連到所分出嘅頁面",
-       "upload": "上傳文件",
-       "uploadbtn": "上傳文件",
+       "recentchangeslinked-page": "Ya̍p-mien miàng:",
+       "recentchangeslinked-to": "Chán-sṳ lièn-to só fûn-chhut ke ya̍p-mien",
+       "upload": "Sông-chhòn tóng-on",
+       "uploadbtn": "Sông-chhòn tóng-on",
        "reuploaddesc": "取消上載並返回上載表單",
        "uploadnologin": "還吂登入",
        "uploadnologintext": "汝必須先[[Special:UserLogin|登入]]\n正做得上傳文件。",
        "uploaderror": "上傳差錯",
        "uploadtext": "Sṳ́-yung ha-mien ke péu-tân lòi song-chhòn yung-chhai vùn-chông nui sîn-ke thù-hìn tóng-on. Yeu kiám-sṳ fe̍t-chá sêu-chhà yî-chhièn song-chhòn ke thù-phién khó-yî chin-ngi̍p [[Special:FileList|Thù-hìn chhîn-tân]], song-chhòn lâu chhù-hi chiông-chhai [[Special:Log/upload|Song-chhòn ngit-ki]] chûng ki-liu̍k. Yeu-chhai vùn-chông chûng kâ-ngi̍p thù-hiong, sṳ́-yung yî-ha hìn-sṳt ke lièn-chiap: '''<nowiki>[[{{ns:file}}:file.jpg]]</nowiki>''', '''<nowiki>[[{{ns:file}}:file.png|Thi-von vùn-sṳ]]</nowiki>''' fe̍t-he '''<nowiki>[[{{ns:media}}:file.ogg]]</nowiki>'''.",
        "uploadlogpage": "上傳日誌",
-       "uploadlogpagetext": "Yî-ha he chui-khiûn song-chhòn vùn-khien ke chúng-péu.",
+       "uploadlogpagetext": "Yî-ha he chui-khiûn sông-chhòn tóng-on ke chúng-péu.",
        "filename": "文件名",
-       "filedesc": "文件說明",
+       "filedesc": "Vùn-khien sot-mìn",
        "fileuploadsummary": "文件摘要:",
        "filestatus": "版權狀態:",
        "filesource": "來源:",
        "php-uploaddisabledtext": "PHP文件上傳已經停用。請檢查file_uploads設定。",
        "uploadscripted": "邇文件包含可能分網絡瀏覽器錯誤解釋嘅HTML或腳本代碼。",
        "uploadvirus": "邇文件包含有病毒!\n詳情:$1",
-       "sourcefilename": "來源文件名",
-       "destfilename": "目標文件名",
-       "watchthisupload": "監視本文件",
+       "sourcefilename": "Lòi-ngièn vùn-khien miàng:",
+       "destfilename": "Muk-phiêu vùn-khien miàng",
+       "watchthisupload": "Kâm-sṳ pún vùn-khien",
        "filewasdeleted": "早先已經有一隻同名文件分上傳後又分刪除矣。在上傳邇文件之前汝愛檢查$1。",
        "upload-proto-error": "協議毋著",
        "upload-proto-error-text": "遠程上傳要求URL以<code>http://</code>或 <code>ftp://</code>開頭。",
        "upload-file-error": "內部差錯",
-       "upload-file-error-text": "當嘗試在服務器上建立臨時檔案時發生內部差錯。請撈[[Special:ListUsers/sysop|管理員]]聯繫。",
+       "upload-file-error-text": "Tông sòng-sṳ chhai fu̍k-vu-hi sông kien-li̍p lìm-sṳ̀ tóng-on sṳ̀ fat-sâng nui-phu chhâ-chho. Chhiáng lâu [[Special:ListUsers/sysop|Kón-lî-yèn]] lièn-hì.",
        "upload-misc-error": "吂知嘅上傳差錯",
-       "upload-misc-error-text": "在上傳時發生還吂知嘅錯誤。請驗証使用矣正確並可訪問嘅 URL,然後重新嘗試。假使問題還係存在,請撈[[Special:ListUsers/sysop|管理員]]聯繫。",
+       "upload-misc-error-text": "Chhai sông-chhòn sṳ̀ fat-sâng hàn mâng-tî ke chho-ngu. Chhiáng ngiam-chṳn sṳ́-yung yí chang-khok pin-khó fóng-mun ke URL, yèn-heu chhùng-sîn sòng-sṳ. Ká-sṳ́ mun-thì hàn-he chhùn-chhai, chhiáng lâu [[Special:ListUsers/sysop|Kón-lî-yèn]] lièn-hì.",
        "upload-curl-error6": "無法訪問URL",
        "upload-curl-error6-text": "無法訪問所提供嘅URL。請再次檢查邇URL係毋係正確,並且網站嘅訪問係毋係正常。",
        "upload-curl-error28": "上傳超時",
        "upload-curl-error28-text": "網站回應時間過長。請檢查邇網站嘅訪問係毋係正常,過一陣再試。汝可能愛在網路訪問有閒時節再試。",
        "license": "授權:",
-       "license-header": "授權",
+       "license-header": "Su-khièn",
        "nolicense": "無有選定",
        "upload_source_url": " (一隻有效、做得公開訪問嘅URL)",
        "upload_source_file": " (在汝電腦上嘅一隻文件)",
        "listfiles_search_for": "按媒體名搜尋:",
-       "imgfile": "文件",
+       "imgfile": "vùn-khien",
        "listfiles": "文件列表",
        "listfiles_date": "日期",
        "listfiles_name": "名",
        "listfiles_user": "用戶",
        "listfiles_size": "大細",
        "listfiles_description": "描述",
-       "file-anchor-link": "文件",
-       "filehist": "文件歷史",
-       "filehist-help": "點撳日期/時間來查看當時出現過嘅文件。",
+       "file-anchor-link": "vùn-khien",
+       "filehist": "Vùn-khien li̍t-sṳ́",
+       "filehist-help": "Tiám-khim ngit-khì / sṳ̀-kiên lòi chhà-khon tông-sṳ̀ chhut-hien-ko ke vùn-khien.",
        "filehist-deleteone": "刪除",
        "filehist-revert": "恢復",
-       "filehist-current": "當前",
-       "filehist-datetime": "日期/時間",
-       "filehist-thumb": "縮略圖",
-       "filehist-thumbtext": "$1嘅版本嘅縮略圖",
-       "filehist-user": "用戶",
-       "filehist-dimensions": "維度",
-       "filehist-comment": "意見",
-       "imagelinks": "文件用處",
-       "linkstoimage": "下背嘅$1隻頁面鏈接到本文件:",
-       "nolinkstoimage": "無頁面鏈接到本文件。",
-       "sharedupload": "本檔案來自於$1,渠可能在其它計劃項目肚分人應用。",
+       "filehist-current": "tông-chhièn",
+       "filehist-datetime": "Ngit khì / Sṳ̀-kiên",
+       "filehist-thumb": "Suk-lio̍k-thù",
+       "filehist-thumbtext": "$1 ke pán-pún ke Suk-lio̍k-thù",
+       "filehist-user": "Yung-fu",
+       "filehist-dimensions": "Vì-thu",
+       "filehist-comment": "Yi-kien",
+       "imagelinks": "Vùn-khien yung-chhú",
+       "linkstoimage": "Hâ poi ke $1-chak ya̍p-mien lièn-chiap to pún vùn-khien:",
+       "nolinkstoimage": "Mò ya̍p-mien lièn-chiap to pún vùn-khien.",
+       "sharedupload": "Pún tóng-on lòi-chhṳ yî $1, khî khó-nèn chhai khì-thâ kie-va̍k hong-muk tú fûn-ngìn yin-yung.",
        "sharedupload-desc-here": "邇文件來自於$1,其可能在其它計劃項目肚分應用。\n其在[$2文件描述頁面]介片上嘅描述在下背展示。",
        "uploadnewversion-linktext": "上傳邇隻文件嘅新版本",
+       "shared-repo-name-wikimediacommons": "Wikimedia Commons",
+       "upload-disallowed-here": "Ngì mò-fap fu̍k-koi liá-chak tóng-on.",
        "filedelete-submit": "刪除",
        "mimesearch": "MIME搜尋",
        "mimesearch-summary": "本頁面啟用文件MIME類型過濾器。撳入︰內容類型/子類型,如 <code>image/jpeg</code>。",
        "unusedtemplates": "吂使用嘅模板",
        "unusedtemplatestext": "<p>Chhiáng chu-yi khì-thâ mióng-chham khó-nèn chhṳ̍t-chiap theu-ko URL lièn-chiap chhṳ́ thù-hìn, só-yî liá-piên clie̍t-chhut ke thù-hìn yû khó-nèn pûn sṳ́-yung.</p>",
        "unusedtemplateswlh": "其他鏈接",
-       "randompage": "隨機頁面",
+       "randompage": "Sùi-kî ya̍p-mien",
        "randompage-nopages": "Chhai liá-ke miàng-sṳ khûng-kiên chûng mò-yû hong-mien.",
        "randomredirect": "隨機重定向頁",
        "randomredirect-nopages": "Chhai liá-ke miàng-sṳ khûng-kiên mò-yû chhùng-thin hong-mien.",
        "withoutinterwiki": "無有語言鏈接頁面",
        "withoutinterwiki-summary": "下背嘅頁面還吂有語言鏈接到其它語言版本。",
        "fewestrevisions": "最少修訂嘅頁面",
-       "nbytes": "$1字節",
+       "nbytes": "$1 sṳ-chiet",
        "ncategories": "$1隻分類",
        "nlinks": "$1隻鏈接",
-       "nmembers": "$1隻成員",
+       "nmembers": "$1-chak sṳ̀n-yèn",
        "nrevisions": "$1隻修訂版本",
        "specialpage-empty": "本報告無結果。",
        "lonelypages": "孤立頁面",
        "protectedpagesempty": "在邇兜參數下無頁面保護緊。",
        "listusers": "用戶列表",
        "usercreated": "$1 $2{{GENDER:$3|建立}}",
-       "newpages": "新頁面",
+       "newpages": "Sîn ya̍p-mien",
        "newpages-username": "用戶名:",
        "ancientpages": "最舊頁面",
        "move": "移動",
        "notargettitle": "無目標",
        "notargettext": "汝還吂指定一隻目標頁面或用戶來進行邇項操作。",
        "pager-newer-n": "新$1次",
-       "pager-older-n": "舊$1次",
-       "booksources": "網絡書源",
-       "booksources-search-legend": "尋找網絡書源",
+       "pager-older-n": "khiu $1-chhṳ",
+       "booksources": "Mióng-lok sû-ngièn",
+       "booksources-search-legend": "Chhìm-cháu mióng-lok sû-ngièn",
+       "booksources-search": "Chhìm",
        "booksources-text": "下背係一份銷售新書或二手書嘅列表,並可能有汝尋找緊嘅書嘅進一步信息:",
        "specialloguserlabel": "Yung-fu:",
        "speciallogtitlelabel": "Phêu-thì:",
-       "log": "日誌",
+       "log": "Ngit-chì",
        "alllogstext": "Lièn-ha̍p hién-sṳ song-chhòn, chhù-chhiang, pó-fu, chhà-fûng yî-khi̍p chham-vu",
        "logempty": "在日誌肚無匹配項。",
        "log-title-wildcard": "搜尋以邇隻文字開頭嘅標題",
        "prevpage": "上一頁($1)",
        "allpagesfrom": "顯示從邇處開始嘅頁面:",
        "allpagesto": "顯示從邇位結束嘅頁面:",
-       "allarticles": "全部頁面",
+       "allarticles": "Chhiòn-phu ya̍p-mien",
        "allinnamespace": "所有頁面(屬於$1名字空間)",
-       "allpagessubmit": "提交",
+       "allpagessubmit": "Thì-kâu",
        "allpagesprefix": "顯示有邇前綴(名字空間)嘅頁面:",
        "allpagesbadtitle": "分定嘅頁面標題係非法嘅,或者有一隻內部語言或內部wiki嘅前綴。其可能包含一隻或還較多毋做得用於標題嘅字符。",
-       "categories": "分類",
+       "categories": "Fûn-lui",
        "categoriespagetext": "Yî-ha lie̍t-chhut só-yû ke hong-mien fûn-lui.\n[[Special:UnusedCategories|Unused categories]] are not shown here.\nAlso see [[Special:WantedCategories|wanted categories]].",
        "linksearch": "Ngoi-phu lièn-chiap",
        "linksearch-ok": "搜尋",
        "emailsent": "電子郵件已發送",
        "emailsenttext": "汝嘅電子郵件已經發出。",
        "watchlist": "監視列表",
-       "mywatchlist": "監視列表",
+       "mywatchlist": "Kâm-sṳ lie̍t-péu",
        "watchlistfor2": "$1嘅監視列表$2",
        "nowatchlist": "汝嘅監視列表係空嘅。",
        "watchlistanontext": "請$1來查看或編寫汝嘅監視列表。",
        "watchnologin": "還吂登入",
        "addedwatchtext": "Hong-mien \"[[:$1]]\" yí-kîn pûn kâ-ngi̍p to ngì-ke [[Special:Watchlist|Kam-sṳ chhîn-tân]] chûng. Chiông-lòi yû-kôan chhṳ́ hong-mien khi̍p khì-thâ thó-lun-hong ke ngim-hò siû-cháng chiông-voi chhai hong-mien lie̍t-chhut, song-chhiá hàn-voi chhai [[Special:RecentChanges|Chui-khiûn ke kiên-kói]] chûng ke '''chhû-thí''' hìn-sṳt lie̍t-chhut. Kó-yèn  ngì heu-lòi sióng chhiùng hong-mien kam-sṳ chhîn-tân chûng chhîn-chhù, hí-khó tiám-kit thô-hòng thiàu-chûng \"thìn-chṳ́ kam-sṳ\" ke lièn-kiet。",
        "removedwatchtext": "Vùn-chông \"[[:$1]]\" yí-kîn chhiùng Ngì kekam-sṳ lie̍t-péu mien-chûng yì-chhù.",
-       "watch": "監視",
+       "watch": "Kâm-sṳ",
        "watchthispage": "監視本頁",
        "unwatch": "取消監視",
        "unwatchthispage": "停止監視",
        "actioncomplete": "操作完成",
        "actionfailed": "操作失敗",
        "deletedtext": "“$1”已經分刪除。最近刪除嘅記錄請參見$2。",
-       "dellogpage": "刪除日誌",
+       "dellogpage": "San-chhù ngit-chì",
        "dellogpagetext": "下背係最近刪除嘅列表。",
        "deletionlog": "刪除日誌",
        "reverted": "恢復到早期版本",
        "deleteotherreason": "其它/附加理由:",
        "deletereasonotherlist": "其它理由",
        "rollback": "編寫倒轉頭",
-       "rollbacklink": "打轉頭",
+       "rollbacklink": "tá chón-thèu",
+       "rollbacklinkcount": "chha̍t-siau $1 chhṳ phiên-siá",
        "rollbackfailed": "無法倒轉頭",
        "cantrollback": "編寫無法打轉頭;最後嘅貢獻者人本文嘅唯一作者。",
        "alreadyrolled": "Mò-fap fî-fu̍k yù [[User:$2|$2]] ([[User talk:$2|thó-lun]]) chin-hàng ke [[$1]] ke chui-heu phiên-si̍p; khì-thâ ngìn yí-kîn phiên-siá fe̍t-he fî-fu̍k liáu ke-hong. Chui-heu phiên-si̍p-chá: [[User:$3|$3]] ([[User talk:$3|Thó-lun]])。",
        "editcomment": "Phiên-siá sot-mìn he: <em>$1</em>。",
        "revertpage": "Fî-fu̍k yù [[Special:Contributions/$2|$2]] ([[User talk:$2|tui-fa]]) ke phiên-cho; kiên-kói fì-fu̍k [[User:$1|$1]] ke chui-heu yit-ke pán-pún",
        "sessionfailure": "汝嘅登入會話好像有問題;\n為到防止會話劫持,邇次操作已經畀取消。\n請轉到先前嘅頁面,重新載入邇頁面,然後重試。",
-       "protectlogpage": "保護日誌",
+       "protectlogpage": "Pó-fu ngit-chì",
        "protectlogtext": "Ha-mien he vùn-chông só-thin lâu chhí-sêu só-thin ke lie̍t-péu. Chhiáng chhâm-kháu [[Special:ProtectedPages|Pó-fu vùn-chông chhîn-tân]] yî-khi̍p kiám-sṳ tông-chhièn chin-hàng ke vùn-chông pó-fu.",
        "protectedarticle": "已保護“[[$1]]”",
        "modifiedarticleprotection": "已經更改“[[$1]]”嘅保護等級",
        "undeleterevdel": "Kó-yèn pá chui-sîn siû-thin phu-fun chhù-thet, fán chhù-hi phien mò-fap chin-hàng. Kó-yèn ngi-to liá-chúng chhìn-khóng, ngì pit-sî fán-sién fe̍t-chá fán-chhòng chui-sîn yí-kîn chhù-hi ke siû-thin. Tui-yî ngì mò-yû khièn-han hi kiám-sṳ ke siû-thin he mò-fap fî-fu̍k ke.",
        "undeletehistorynoadmin": "邇隻頁面已經分刪除,刪除原因顯示在下方編寫摘要肚。分刪除前嘅所有修訂版本,連同刪除前貢獻用戶等等細節單淨管理員做得看見。",
        "undelete-revision": "Chhù-thet pán-pún $1 chhṳ $2:",
-       "undeleterevision-missing": "無效或者丟失嘅修訂版本。汝可能使用矣有差錯嘅鏈接,或者本修訂版本既經分從存檔肚恢復或移除。",
+       "undeleterevision-missing": "Mò-háu fe̍t-chá tiû-sṳt ke siû-thin pán-pún. \nNgì khó-nèn sṳ́-yung yí yû chhâ-chho ke lièn-chiap, fe̍t-chá pún siû-thin pán-pún ki kîn-fûn chhiùng chhùn-tóng tú fî-fu̍k fe̍t yì-chhù.",
        "undeletebtn": "恢復",
        "undeletelink": "查看/恢復",
        "undeleteviewlink": "查看",
        "undeletecomment": "Ngièn-yîn:",
-       "undeletedrevisions": "$1隻修訂版本已經恢復",
-       "undeletedrevisions-files": "$1隻版本撈$2隻文件分恢復",
-       "undeletedfiles": "$1隻文件分恢復",
+       "undeletedrevisions": "$1-chak siû-thin pán-pún yí-kîn fî-fu̍k",
+       "undeletedrevisions-files": "$1-chak pán-pún lâu $2-chak vùn-khien fûn fî-fu̍k",
+       "undeletedfiles": "$1-chak vùn-khien fûn fî-fu̍k",
        "cannotundelete": "Fî-fu̍k sṳt-phai; khó-nèn chṳ̂-chhièn yí-kîn pûn khì-thâ-ngìn fî-fu̍k.",
-       "undeletedpage": "'''$1已經分恢復''' 請參考[[Special:Log/delete|刪除日誌]]來查詢刪除撈恢復記錄。",
-       "undelete-header": "假使愛查詢最近嘅記錄請參看[[Special:Log/delete|刪除日誌]]。",
-       "undelete-search-box": "搜尋已刪除頁面",
-       "undelete-search-prefix": "展示頁面自:",
-       "undelete-search-submit": "搜尋",
-       "undelete-no-results": "刪除記錄肚無符合嘅結果。",
-       "namespace": "名字空間:",
-       "invert": "反向選擇",
-       "blanknamespace": "(主要)",
-       "contributions": "{{GENDER:$1|用戶}}貢獻",
+       "undeletedpage": "<strong>$1 yí-kîn fûn fî-fu̍k</strong>\n\nChhiáng chhâm-kháu [[Special:Log/delete|san-chhù ngit-chì]] lòi chhà-sûn san-chhù lâu fî-fu̍k ki-liu̍k.",
+       "undelete-header": "Ká-sṳ́ oi chhà-sûn chui-khiûn ke ki-liu̍k chhiáng chhâm-khon [[Special:Log/delete|san-chhù ngit-chì]].",
+       "undelete-search-box": "Sêu-chhìm yí san-chhù ya̍p-mien",
+       "undelete-search-prefix": "Chán-sṳ ya̍p-mien chhṳ:",
+       "undelete-search-submit": "Sêu-chhìm",
+       "undelete-no-results": "San-chhù ki-liu̍k tú mò fù-ha̍p ke kiet-kó.",
+       "namespace": "Miàng-sṳ khûng-kiên:",
+       "invert": "Fán-hiong sién-tho̍k",
+       "namespace_association": "Siông-kôan miang-miàng khûng-kiên",
+       "blanknamespace": "(Chú-yeu)",
+       "contributions": "{{GENDER:$1|Yung-fu}} kung-hien",
        "contributions-title": "$1嘅用戶貢獻",
-       "mycontris": "貢獻",
+       "mycontris": "Kung-hien",
+       "anoncontribs": "Kung-hien",
        "contribsub2": "$1嘅貢獻($2)",
        "nocontribs": "毋尋到符合特徵嘅更改。",
        "uctop": "(最新修改)",
-       "month": "從邇月(或還較早):",
-       "year": "從邇年(或還較早):",
+       "month": "Chhiùng liá-ngie̍t (fe̍t hàn kha-chó):",
+       "year": "Chhiùng liá-ngièn (fe̍t hàn kha-chó):",
        "sp-contributions-newbies": "單淨展示新建用戶嘅貢獻",
        "sp-contributions-newbies-sub": "新手",
        "sp-contributions-blocklog": "封禁日誌",
        "sp-contributions-username": "IP地址或用戶名:",
        "sp-contributions-toponly": "單淨展示最新修訂版本嘅編寫",
        "sp-contributions-submit": "搜尋",
-       "whatlinkshere": "鏈接入頁面",
-       "whatlinkshere-title": "鏈接到“$1”嘅頁面",
-       "whatlinkshere-page": "頁面:",
-       "linkshere": "下背頁面鏈接到[[:$1]]:",
+       "whatlinkshere": "Nâi-têu lièn to liá-têu",
+       "whatlinkshere-title": "Lièn-chiap to \"$1\" ke ya̍p-mien",
+       "whatlinkshere-page": "Ya̍p-mien:",
+       "linkshere": "Hâ-poi ya̍p-mien lièn-chiap to <strong>[[:$1]]</strong>:",
        "nolinkshere": "無頁面鏈接到'''[[:$1]]'''。",
-       "nolinkshere-ns": "在所選嘅名字空間肚無頁面連接到[[:$1]]。",
-       "isredirect": "重定向頁",
-       "istemplate": "包含",
-       "isimage": "文件鏈接",
-       "whatlinkshere-prev": "前頭$1隻",
-       "whatlinkshere-next": "後背$1隻",
-       "whatlinkshere-links": "←連入",
-       "whatlinkshere-hideredirs": "$1重定向",
-       "whatlinkshere-hidetrans": "$1嵌入",
-       "whatlinkshere-hidelinks": "$1鏈接",
+       "nolinkshere-ns": "Chhai só-sién ke miàng-sṳ khûng-kiên tú mò ya̍p-mien lièn-chiap to [[:$1]].",
+       "isredirect": "chhùng-thin-hiong ya̍p",
+       "istemplate": "pâu-hàm",
+       "isimage": "vùn-khien lièn-chiap",
+       "whatlinkshere-prev": "chhièn-thèu $1-chak",
+       "whatlinkshere-next": "heu-poi $1-chak",
+       "whatlinkshere-links": "← lièn-ngi̍p",
+       "whatlinkshere-hideredirs": "$1 Chhùng-thin-hiong",
+       "whatlinkshere-hidetrans": "$1 pâu-hàm",
+       "whatlinkshere-hidelinks": "$1 lièn-kiet",
        "whatlinkshere-hideimages": "$1條文件鏈接",
-       "whatlinkshere-filters": "過濾器",
-       "blockip": "封禁用戶",
+       "whatlinkshere-filters": "Ko-lì-hi",
+       "blockip": "Fûng-kim {{GENDER:$1|yung-fu}}",
        "blockiptext": "用下背嘅表單來禁止來自某一特定IP地址嘅修改許可權。\n單淨在為防止破壞,撈符合[[{{MediaWiki:Policy-url}}|守則]]嘅情況下正做得採取邇行動。\n請在下背輸入一隻具體嘅理由(例如引述一隻分破壞嘅頁面)。",
-       "ipaddressorusername": "IP地址或用戶名:",
-       "ipbexpiry": "期限:",
-       "ipbreason": "原因:",
-       "ipbreason-dropdown": "*一般嘅封禁理由\n** 多次加入虛假資料\n** 刪除頁面內容\n** 外部鏈接廣告\n** 在頁面肚增加無意義文字\n** 無禮嘅行為、攻擊/騷擾別儕\n** 濫用多隻賬號\n** 做毋得接受嘅用戶名",
-       "ipbcreateaccount": "阻止創建新賬號",
-       "ipbenableautoblock": "自動查封邇用戶最後所用嘅IP地址,撈後來試圖編寫所用嘅所有地址",
-       "ipbsubmit": "查封邇用戶",
+       "ipaddressorusername": "IP thi-chí fe̍t yung-fu-miàng:",
+       "ipbexpiry": "Khì-han:",
+       "ipbreason": "Ngièn-yîn:",
+       "ipbreason-dropdown": "*Yit-pân ke fûng-kim lî-yù \n** Tô-chhṳ kâ-ngi̍p hî-ká chṳ̂-liau \n** San-chhù ya̍p-mien nui-yùng \n** Ngoi-phu lièn-chiap kóng-ko \n** Chhai ya̍p-mien tú chen-kâ mò yi-ngi vùn-sṳ \n** Mò-lî ke hàng-vì, kûng-kit / sâu-yéu phe̍t-sâ \n** Làm-yung tô-chak chòng-ho \n** Cho-m̀ tet chiap-su ke yung-fu-miàng",
+       "ipbcreateaccount": "Chú-chṳ́ chhóng-kien sîn chòng-ho",
+       "ipbenableautoblock": "Chhṳ-thûng chhà-fûng liá yung-fu chui-heu só yung ke IP thi-chí, lâu heu-lòi sṳ-thù phiên-siá só yung ke só-yû thi-chí",
+       "ipbsubmit": "Chhà-fûng liá yung-fu",
        "ipbother": "其它時間:",
        "ipboptions": "2小時:2 hours,1日:1 day,3日:3 days,1星期:1 week,2星期:2 weeks,1隻月:1 month,3隻月:3 months,6隻月:6 months,1年:1 year,無限期:infinite",
        "ipbhidename": "Chhai chhà-fûng ngit-ki, fa̍t-chhiok chhà-fûng lie̍t-péu yî-khi̍p yung-fu lie̍t-péu chûng yún-chhòng yung-fu-miàng.",
-       "badipaddress": "無效IP地址",
-       "blockipsuccesssub": "查封成功",
+       "badipaddress": "Mò-háu IP thi-chí",
+       "blockipsuccesssub": "Chhà-fûng sṳ̀n-kûng",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] yí-kîn pûn chhà-fûng. <br />Chhâm-siòng [[Special:BlockList|pûn-fûng IP thi-tiám lie̍t-péu]] yî fu̍k-sṳ́m chhà-fûng.",
-       "ipb-edit-dropdown": "編寫查封原因",
-       "ipb-unblock-addr": "解封$1",
-       "ipb-unblock": "解封用戶名或IP地址",
-       "ipb-blocklist": "查看今下嘅封禁",
-       "unblockip": "解封用戶",
-       "unblockiptext": "用下背嘅表單來恢復先前分查封嘅IP地址或用戶嘅寫權限。",
+       "ipb-edit-dropdown": "Phiên-siá chhà-fûng ngièn-yîn",
+       "ipb-unblock-addr": "Kié-fûng $1",
+       "ipb-unblock": "Kié-fûng yung-fu miàng fe̍t IP thi-chí",
+       "ipb-blocklist": "Chhà-khon kîm-hâ ke fûng-kim",
+       "unblockip": "Kié-fûng yung-fu",
+       "unblockiptext": "Yung hâ-poi ke péu-tân lòi fî-fu̍k siên-chhièn fûn chhà-fûng ke IP thi-chí fe̍t yung-fu ke siá-khièn han.",
        "ipusubmit": "Kié-chhù kim-fûng",
        "unblocked": "[[User:$1|$1]]已經分解封。",
-       "unblocked-id": "封禁$1已經分移除",
+       "unblocked-id": "Fûng-kim $1 yí-kîn fûn yì-chhù。",
        "ipblocklist": "分封用戶列表",
-       "ipblocklist-submit": "搜尋",
-       "infiniteblock": "無限期",
+       "ipblocklist-submit": "Sêu-chhìm",
+       "infiniteblock": "mò-han-khì",
        "expiringblock": "$1 $2 to-khì",
-       "anononlyblock": "單淨匿名用戶",
-       "noautoblockblock": "禁用自動查封",
-       "createaccountblock": "禁止創建賬戶",
-       "ipblocklist-empty": "查封列表係空嘅。",
-       "ipblocklist-no-results": "所請求嘅IP地址/用戶名無分查封。",
-       "blocklink": "查封",
+       "anononlyblock": "tân-chhiang nit-miàng yung-fu",
+       "noautoblockblock": "kim-yung chhṳ-thûng chhà-fûng",
+       "createaccountblock": "kim-chṳ́ chhóng-kien chòng-fu",
+       "ipblocklist-empty": "Chhà-fûng lie̍t-péu he khûng ke.",
+       "ipblocklist-no-results": "Só chhiáng-khiù ke IP thi-chí fe̍t yung-fu-miàng mò-fûn chhà-fûng.",
+       "blocklink": "chhà-fûng",
        "unblocklink": "解封",
        "change-blocklink": "更改封禁",
-       "contribslink": "貢獻",
+       "contribslink": "Kung-hien",
        "autoblocker": "Ngì-ke IP lâu pûn fûng-liáu ke \"$1\" he yit-yong ke. Fûng-só ngièn-yîn: \"$2\".",
        "blocklogpage": "查封日誌",
        "blocklogentry": "封禁[[$1]],到期時間係$2$3",
        "blocklogtext": "Liá-he kôan-yî yung-fu fûng-kim lâu kié-chhù fûng-kim chhâu-chok ke ki-liu̍k. Pûn chhṳ-thung fûng-kim ke IP thi-tiám mò-yû lie̍t-chhut. Chhiáng chhâm-kháu [[Special:BlockList|Pûn chhà-fûng ke IP thi-tiám lâu yung-fu lie̍t-péu]].",
        "unblocklogentry": "$1已分解封",
-       "block-log-flags-anononly": "單淨匿名用戶",
+       "block-log-flags-anononly": "tân-chhiang nit-miàng yung-fu",
        "block-log-flags-nocreate": "帳號建立已禁",
-       "block-log-flags-noautoblock": "禁用自動查封",
-       "range_block_disabled": "單淨管理員正做得創建禁止查封嘅範圍。",
+       "block-log-flags-noautoblock": "kim-yung chhṳ-thûng chhà-fûng",
+       "range_block_disabled": "Tân-chhiang Kón-lî-yèn chang cho-tet chhóng-kien kim-chṳ́ chhà-fûng ke fam-vì.",
        "ipb_expiry_invalid": "無效嘅終止時間。",
        "ipb_hide_invalid": "Put-tet yit-chak yung-fu; Kì yû chhêu-ko {{PLURAL:$1|$1}} chhṳ-su phiên-siá",
        "ipb_already_blocked": "Yí-kîn fûng-só \"$1\"",
-       "ipb_cant_unblock": "差錯: 尋毋到查封ID$1。可能已經解除封禁。",
-       "ip_range_invalid": "無效嘅IP範圍。",
-       "proxyblocker": "代理封鎖器",
-       "proxyblockreason": "汝嘅IP地址係一隻開放嘅代理,其已經分封鎖。請聯繫汝嘅網際網路服務提供商或技術支援者並講佢兜聽邇隻嚴重嘅安全問題。",
+       "ipb_cant_unblock": "Chhâ-chho: Chhìm m̀ -to chhà-fûng ID $1. Khó-nèn yí-kîn kié-chhù fûng-kim.",
+       "ip_range_invalid": "Mò-háu ke IP fam-vì.",
+       "proxyblocker": "Thoi-lî fûng-só-hi",
+       "proxyblockreason": "Ngì ke IP thi-chí he yit-chak khôi-piong ke thoi-lî, khì yí-kîn fûn-fûng-só. \nChhiáng lièn-hì ngì ke mióng-chi mióng-lu fu̍k-vu thì-kiûng-sông fe̍t kî-su̍t kî-yên-chá pin kóng kì-têu thâng liá-chak ngiàm-chhùng ke ôn-chhiòn mun-thì.",
        "sorbsreason": "Ngì-ke IP chhô-vi pûn DNSBL lie̍t-vi su̍k-yî khôi-fong thoi-lî fu̍k-vu-khí.",
        "sorbs_create_account_reason": "Ngì-ke IP chhô-vi pûn DNSBL lie̍t-vi su̍k-yî khôi-fong thoi-lî fu̍k-vu-khí. Só-yî ngì mò-fap kien-li̍p chong-ho.",
        "lockdb": "鎖定數據庫",
        "movepage-moved": "'''\"$1\" yí-kîn pûn yì-thung to \"$2\"'''",
        "articleexists": "Ke miàng-sṳ ke hong-mien yí-kîn chhùn-chhai, fe̍t-chá ngì sién-chet ke miàng-sṳ mò-háu. Chhiáng chai-hi sién yit-ke miàng-sṳ.",
        "movetalk": "Chhiáng thùng-sṳ̀ yì-thung tui-fa-chông",
-       "movelogpage": "移動日誌",
+       "movelogpage": "Yì-thûng ngit-chì",
        "movelogpagetext": "Yî-ha he yí-kîn yì-thung ke vùn-chông chhîn-tân.",
-       "movereason": "原因:",
+       "movereason": "Ngièn-yîn:",
        "revertmove": "恢復",
-       "delete_and_move_text": "==愛刪除==\n\n目標頁面\"[[:$1]]\"已經存在。汝確認愛刪除原頁面並進行移動係無?",
+       "delete_and_move_text": "Muk-phiêu ya̍p-mien \"[[:$1]]\" yí-kîn chhùn-chhai. \nNgì khok-ngin oi san-chhù ngièn ya̍p-mien pin chin-hàng yì-thûng he-mò?",
        "delete_and_move_confirm": "著,刪除邇頁",
        "delete_and_move_reason": "Chhù-thet yî-phien yì-thung",
        "selfmove": "Ngièn-sṳ́ phêu-thì khi̍p muk-phêu phêu-thì siông-thùng, vù-nèn yì-thung yit-chông fu̍k-koi pún-sṳ̂n.",
-       "export": "導出頁面",
+       "export": "Thô-chhut ya̍p-mien",
        "exporttext": "汝做得將特定頁面或一組頁面嘅文字以及編輯歷史用XML格式導出;恁樣做得將有關頁面通過「[[Special:Import|導入頁面]]」頁面導入到另一隻執行MediaWiki嘅網站。\n\n愛導出頁面,請在下背嘅文字框肚輸入頁面標題,每行一隻標題,並選擇汝係毋係愛匯出帶有頁面歷史嘅以前嘅修訂版本,或係單淨選擇導出帶有最後一次編寫信息嘅當前修訂版本。\n\n另外汝還可以利用鏈接導出文件,例如汝做得使用[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]導出「[[{{MediaWiki:Mainpage}}]]」頁面。",
        "exportcuronly": "單淨導出當前版本,毋包含完整歷史版本",
        "exportnohistory": "----\n'''注意:''' 由於性能原因,從本表單導出頁面嘅全部歷史已分停用。",
        "allmessagescurrent": "Tông-chhièn ke vùn-sṳ",
        "allmessagestext": "Liá-piên lie̍t-chhut só-yû hí-khó thin-chṳ ke ne-thúng kie-mien.\nPlease visit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] and [https://translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
        "allmessagesnotsupportedDB": "Ne-thúng kie-mien kûng-yung chhu-yî kôan-pit chong-thai (wgUseDatabaseMessages)。",
-       "thumbnail-more": "放大",
+       "thumbnail-more": "Piong-thai",
        "filemissing": "Mò-fap cháu-to tóng-on",
        "thumbnail_error": "建立縮略圖差錯:$1",
        "djvu_page_error": "DjVu頁面超出範圍",
        "importlogpagetext": "管理性導入在其他Wiki上有編寫歷史嘅頁面",
        "import-logentry-upload-detail": "$1-ke siû-thin",
        "import-logentry-interwiki-detail": "Lòi-chhṳ $2-ke $1-ke siû-thin",
-       "tooltip-pt-userpage": "汝嘅用戶頁面",
+       "tooltip-pt-userpage": "{{GENDER:|Ngì ke sṳ́-yung-chá}} ya̍p-mien",
        "tooltip-pt-anonuserpage": "Ngì-ke phiên-siá pún-chham só yung IP ke tui-yin yung-fu-chông",
-       "tooltip-pt-mytalk": "汝嘅交流頁",
+       "tooltip-pt-mytalk": "{{GENDER:|Ngì ke}} kâu-liù ya̍p",
        "tooltip-pt-anontalk": "Tui-yî lòi-chhṳ chhṳ́IP thi-tiám phiên-siá ke tui-fa",
-       "tooltip-pt-preferences": "汝嘅偏好設定",
-       "tooltip-pt-watchlist": "汝監視中頁面嘅更改列表",
-       "tooltip-pt-mycontris": "汝嘅貢獻列表",
-       "tooltip-pt-login": "建議汝登入,但係並非必須嘅",
-       "tooltip-pt-logout": "登出",
-       "tooltip-ca-talk": "關於頁面正文嘅討論",
-       "tooltip-ca-edit": "汝做得編寫邇頁,請在保存前用預覽撳掣。",
-       "tooltip-ca-addsection": "開始一隻新段落",
-       "tooltip-ca-viewsource": "本頁面受到保護。\n汝做得查看其嘅源碼。",
-       "tooltip-ca-history": "本頁面早先嘅修訂版本",
+       "tooltip-pt-preferences": "{{GENDER:|Ngì ke}} phiên-hó sat-thin",
+       "tooltip-pt-watchlist": "Ngì kâm-sṳ chûng ya̍p-mien ke kiên-kói lie̍t-péu",
+       "tooltip-pt-mycontris": "{{GENDER:|Ngì ke}} kung-hien lie̍t-péu",
+       "tooltip-pt-login": "Kien-ngi ngì tên-ngi̍p, than-he pin fî pit-sî ke",
+       "tooltip-pt-logout": "Tên-chhut",
+       "tooltip-ca-talk": "Liá ya̍p ke thó-lun",
+       "tooltip-ca-edit": "Phiên-siá pún-ya̍p",
+       "tooltip-ca-addsection": "Khôi-sṳ́ yit-chak sîn thon-lo̍k",
+       "tooltip-ca-viewsource": "Liá-ke ya̍p-mien su-to pó-fu. \nNgì cho-tet khon khì ke ngièn-sṳ́-mâ.",
+       "tooltip-ca-history": "Liá ya̍p chó-siên ke pán-pún",
        "tooltip-ca-protect": "保護邇頁",
        "tooltip-ca-delete": "刪除邇頁",
        "tooltip-ca-undelete": "Chiông liá-ke vùn-chông fî-fu̍k to pûn chhù-hi yî-chhièn ke chhong-khóng",
-       "tooltip-ca-move": "移動本頁",
-       "tooltip-ca-watch": "加邇頁入監視列表",
+       "tooltip-ca-move": "Yì-thûng pún-ya̍p",
+       "tooltip-ca-watch": "Kâ liá-ya̍p ngi̍p kâm-sṳ lie̍t-péu",
        "tooltip-ca-unwatch": "從監視列表肚移除本頁",
-       "tooltip-search": "搜尋{{SITENAME}}",
-       "tooltip-search-go": "係講相同嘅標題存在嘅話就直接到遐頁",
-       "tooltip-search-fulltext": "搜查包含邇兜文字嘅頁",
-       "tooltip-p-logo": "訪問頭頁",
-       "tooltip-n-mainpage": "探訪頭頁",
-       "tooltip-n-mainpage-description": "探訪頭頁",
-       "tooltip-n-portal": "關於本計劃,汝可以做麼嘅,應該愛樣般做",
-       "tooltip-n-currentevents": "提供當前新聞事件嘅背景信息",
-       "tooltip-n-recentchanges": "列出網站肚嘅最近修改",
-       "tooltip-n-randompage": "隨機載入一隻頁面",
-       "tooltip-n-help": "尋找幫手",
-       "tooltip-t-whatlinkshere": "全部鏈接入本頁嘅維基頁面列表",
-       "tooltip-t-recentchangeslinked": "頁面鏈接出嘅所有頁面嘅更改",
+       "tooltip-search": "Sêu-chhìm {{SITENAME}}",
+       "tooltip-search-go": "He kóng siông-thùng ke phiêu-thì chhùn-chhai ke fa chhiu chhṳ̍t-chiap to hâ-ya̍p",
+       "tooltip-search-fulltext": "Sêu-chhà pâu-hàm liá-têu vùn-sṳ ke ya̍p",
+       "tooltip-p-logo": "Fóng-mun thèu-ya̍p",
+       "tooltip-n-mainpage": "Thâm-fóng thèu-ya̍p",
+       "tooltip-n-mainpage-description": "Thâm-fóng thèu-ya̍p",
+       "tooltip-n-portal": "Kôan-yî pún kie-va̍k, ngì cho-tet cho má-ke, yin-kâi oi ngióng-pân cho",
+       "tooltip-n-currentevents": "Thì-kiûng tông-chhièn sîn-vùn sṳ-khien ke poi-kín sin-sit",
+       "tooltip-n-recentchanges": "Lie̍t-chhut mióng-chhàm tú ke chui-khiûn siû-kói",
+       "tooltip-n-randompage": "Sùi-kî chai-ngi̍p yit-chak ya̍p-mien",
+       "tooltip-n-help": "Chhìm-cháu pông-sú",
+       "tooltip-t-whatlinkshere": "Chhiòn-phu lièn-chiap ngi̍p pún-ya̍p ke Vì-kî ya̍p-mien lie̍t-péu",
+       "tooltip-t-recentchangeslinked": "Ya̍p-mien lièn-chiap chhut ke só-yû ya̍p-mien ke kiên-kói",
        "tooltip-feed-rss": "Chṳ́-thin pún vùn-chông li̍t-sṳ́ ke RSS chṳ̂-liau",
-       "tooltip-feed-atom": "訂閱邇頁嘅Atom源",
-       "tooltip-t-contributions": "查看邇隻用戶嘅貢獻列表",
+       "tooltip-feed-atom": "Thin-ye̍t liá-ya̍p ke Atom ngièn",
+       "tooltip-t-contributions": "Chhà-khon {{GENDER:$1|liá-chak yung-fu}} ke kung-hien lie̍t-péu",
        "tooltip-t-emailuser": "向邇隻用戶發送電子郵件",
-       "tooltip-t-upload": "上傳文件",
-       "tooltip-t-specialpages": "全部特殊文章嘅列表",
-       "tooltip-t-print": "本頁面做得打印嘅版本",
-       "tooltip-t-permalink": "邇隻頁面版本嘅固定連結",
-       "tooltip-ca-nstab-main": "查看內容頁",
-       "tooltip-ca-nstab-user": "查看用戶頁面",
+       "tooltip-t-upload": "Sông-chhòn tóng-on",
+       "tooltip-t-specialpages": "Chhiòn-phu thi̍t-sû vùn-chông ke lie̍t-péu",
+       "tooltip-t-print": "Pún ya̍p-mien cho-tet tá-yin ke pán-pún",
+       "tooltip-t-permalink": "Liá-chak ya̍p-mien pán-pún ke ku-thin lièn-kiet",
+       "tooltip-ca-nstab-main": "Khon nui-yùng ya̍p",
+       "tooltip-ca-nstab-user": "Chhà-khon yung-fu ya̍p-mien",
        "tooltip-ca-nstab-media": "Chhà-khon hìn-thí-chông",
-       "tooltip-ca-nstab-special": "本頁面係特殊頁面,汝做毋得編寫本頁",
-       "tooltip-ca-nstab-project": "查看項目頁面",
-       "tooltip-ca-nstab-image": "查看文件頁面",
+       "tooltip-ca-nstab-special": "Pún ya̍p-mien he thi̍t-sû ya̍p-mien, ngì cho-m̀-tet phiên-siá pún-ya̍p",
+       "tooltip-ca-nstab-project": "Chhà-khon hong muk ya̍p-mien",
+       "tooltip-ca-nstab-image": "Chhà-khon vùn-khien ya̍p-mien",
        "tooltip-ca-nstab-mediawiki": "Chhà-khon ne-thúng chṳ̂-liau",
-       "tooltip-ca-nstab-template": "查看模板",
+       "tooltip-ca-nstab-template": "Chhà-khon mù-pán",
        "tooltip-ca-nstab-help": "Chhà-khon pông-chhu thiàu-muk",
-       "tooltip-ca-nstab-category": "查看分類頁面",
+       "tooltip-ca-nstab-category": "Chhà-khon fûn-lui ya̍p-mien",
        "tooltip-minoredit": "標記做細微修改",
-       "tooltip-save": "保存汝嘅修改",
-       "tooltip-preview": "預覽汝嘅編寫,請先使用本功能後再保存!",
-       "tooltip-diff": "展示汝對頁面嘅貢獻",
+       "tooltip-save": "Pó-chhùn ngì-ke siû-kói",
+       "tooltip-preview": "Yi-lám ngì-ke phiên-siá, chhiáng siên sṳ́-yung pún kûng-nèn heu chai pó-chhùn.",
+       "tooltip-diff": "Chán-sṳ ngì tui ya̍p-mien ke kung-hien",
        "tooltip-compareselectedversions": "查看本頁分點選嘅兩個版本間嘅差別",
        "tooltip-watch": "加邇頁入監視列表",
        "tooltip-recreate": "Chhùng-kien ke-vùn-chông, mò-lun he-feu pûn chhù-chhîn",
-       "tooltip-rollback": "撳“打轉頭”恢復上一位貢獻人對本頁面嘅編寫",
+       "tooltip-rollback": "Khim \"tá chón-thèu\" fî-fu̍k sông yit-vi kung-hien-ngìn tui pún ya̍p-mien ke phiên-siá",
        "tooltip-undo": "“撤銷”做得在編寫模式上開啟編輯寫表格來方便復原。其允許在摘要肚加入原因。",
-       "tooltip-summary": "輸入一條簡短嘅摘要",
+       "tooltip-summary": "Sû-ngi̍p yit-thiàu kién-tón ke chak-yeu",
        "common.css": "/* Chhṳ́-chhu ke CSS chiông-chhiu yin-yung chhai só-yû ke mien-pán */",
        "common.js": "/* Chhṳ́-chhu ke JavaScript chiông chai-ngi̍p yî só-yû ying-fu mî yit-ke vùn-chông. */",
        "anonymous": "{{SITENAME}} ke ngia̍k-miàng yung-fu",
        "spambot_username": "MediaWiki kóng-ko chhîn-chhù",
        "spam_reverting": "Fî-fu̍k to put pâu-hàm lièn-kiet chṳ $1 ke chui-khiûn pán-pún",
        "spam_blanking": "Só-yû pâu-hàm lièn-kiet chṳ $1 ke siû-thin, chhîn-v",
+       "simpleantispam-label": "Fòng là-sap sêu-sit kiám-chhà yung ke. \nChhiáng  <strong>cho-m̀-tet </strong> thiàm-siá liá-chak làn-vi!",
+       "pageinfo-toolboxlink": "Ya̍p-mien chṳ̂-sín",
        "markaspatrolleddiff": "Phêu-ki sṳ̀n-vì yí-kîn kiám-chhà",
        "markaspatrolledtext": "Phêu-ki chhṳ́ vùn-chông sṳ̀n-vì yí-kîn kiám-chhà",
        "markedaspatrolled": "Phêu-ki yí-kîn kiám-chhà",
        "markedaspatrollederror-noautopatrol": "Ngì mò-fap chiông ngì chhṳ-kí só-chok ke kiên-kói phêu-ki sṳ̀n-vì yí-kîn kiám-chhà.",
        "patrol-log-page": "巡邏檢查日誌",
        "deletedrevision": "已刪除舊版本$1",
-       "previousdiff": "←上隻版本",
-       "nextdiff": "下隻版本→",
+       "previousdiff": "← Sông-hak pán-pún",
+       "nextdiff": "Hâ-chak pán-pún →",
        "mediawarning": "'''Kín-ko''': Ke-tóng-on khó-nèn pâu-hàm ok-yi am-ho, chṳp-hàng kì khó-nèn tui ngì-ke ne-thúng tai-lòi ngùi-hiám.",
        "imagemaxsize": "Chhai thù-chhiong mèu-siá chông tui thù-chhiong thai-séu han-chṳ he:",
        "thumbsize": "Lio̍k-thù thai-séu:",
        "file-info": "tóng-on thai-séu: $1, MIME lui-hìn: $2",
-       "file-info-size": "$1 × $2像素,文件大小:$3,MIME類型:$4",
-       "file-nohires": "無做得提供嘅還較高分辨率。",
+       "file-info-size": "$1 × $2 chhiong-su, vùn-khien thai-séu: $3, MIME lui-hîn: $4",
+       "file-nohires": "Mò cho-tet thì-kiûng ke hàn kha-kô fûn-phièn-sut.",
        "svg-long-desc": "SVG文件,尺寸:$1×$2像素,文件大細:$3",
-       "show-big-image": "完整分辨率",
+       "show-big-image": "Ngièn-pún tóng-on",
+       "show-big-image-preview": "Yi-lám thai séu: $1.",
+       "show-big-image-other": "Khì-thâ {{PLURAL:$2||}} kié-sak-thu: $1.",
+       "show-big-image-size": "$1 × $2 chhiong-su",
        "newimages": "Sîn-kien thù-chhiong ke va̍k-lòng",
        "imagelisttext": "Yî-ha he on $2 phài-lie̍t ke $1-ke tóng-on lie̍t-péu.",
        "noimages": "Mò-khó kiám-sṳ thù-chhiong.",
-       "ilsubmit": "Chhìm-cháu",
+       "ilsubmit": "Chhìm",
        "bydate": "on-cheu ngit-khì",
        "sp-newimages-showfrom": "Chhiùng $1 khôi-sṳ́ hién-sṳ sîn thù-phién",
        "bad_image_list": "請按照下列格式編寫:\n\n單淨係有(以*開頭)列出嘅項目會分考慮。\n每一行嘅第一條鏈接必須係損壞文件嘅鏈接。\n然後同一行後方嘅鏈接會分看做例外,也就係講邇文件做得在哪兜頁面肚分顯示。",
-       "metadata": "元數據",
+       "metadata": "Ngièn sú-kí",
        "metadata-help": "邇文件肚包含有擴展嘅信息。邇兜信息可能係由數碼相機或掃描儀在創建或數字化過程肚所加入嘅。\n\n係講邇文件嘅源文件已經分修改,一兜信息在修改後嘅文件肚將毋做得完全反映出來。",
        "metadata-expand": "Hién-sṳ siòng-se ke chṳ̂-liau",
        "metadata-collapse": "Yún-chhòng siòng-se ke chṳ̂-liau",
        "metadata-fields": "在本信息肚所列出嘅EXIF元數據域將包含在圖片顯示頁面,當元數據表損壞時單淨顯示下背信息。\n其他嘅元數據默認做隱藏。\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
-       "namespacesall": "全部",
-       "monthsall": "全部",
+       "exif-orientation": "Fông-vi",
+       "exif-xresolution": "Súi-phìn kié-sak-thu",
+       "exif-yresolution": "Chhùi-chhṳ̍t kié-sak-thu",
+       "exif-datetime": "Tóng-on siû-kói ngit-khì sṳ̀-kiên",
+       "exif-make": "Siông-kî chṳ-chho-sông",
+       "exif-model": "Siông-kî hîn-ho",
+       "exif-software": "Sṳ́-yung ngiôn-thí",
+       "exif-exifversion": "Exif pán-pún",
+       "exif-colorspace": "Set-chhái khûng-kiên",
+       "exif-datetimeoriginal": "Chṳ̂-liau sán-sâng ke ngit-khì sṳ̀-kiên",
+       "exif-datetimedigitized": "Sú-vi-fa ke ngit-khì sṳ̀-kiên",
+       "exif-orientation-1": "Phiêu-chún",
+       "namespacesall": "chhiòn-phu",
+       "monthsall": "chhiòn-phu",
        "confirmemail": "確認電郵地址",
        "confirmemail_noemail": "汝還吂在汝嘅[[Special:Preferences|用戶偏好設定]]肚輸入一隻有效嘅電郵地址。",
        "confirmemail_text": "Chhṳ́ mióng-chham yêu-khiù ngì chhai sṳ́-yung sin-siông kûng-nèn chṳ̂-chhièn ngiam-chṳn ngì-ke sin-siông thi-tiám. Tiám-kit yî-ha on-néu chhṳ̍t-hiong ngì-ke sin-siông fat-sung yit-fûng khok-ngin sin-siông. Ke-sin-siông pâu-hàm yû yit-hòng me̍t-me̍t lièn-kiet; chhiáng chhai ngì-ke hi-khí chûng kâ-chai chhṳ́ lièn-kiet yî khok-ngin ngì-ke sin-siông thi-tiám he yû-háu ke.",
        "watchlisttools-view": "查看有關更改",
        "watchlisttools-edit": "查看並編寫監視列表",
        "watchlisttools-raw": "編寫原始監視列表",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|kâu-liù]])",
        "duplicate-defaultsort": "'''警告:'''默認排序關鍵字“$2”蓋過矣先前嘅默認排序關鍵字“$1”。",
        "version": "Pán-pún",
-       "fileduplicatesearch-submit": "Chhìm-cháu",
-       "specialpages": "特殊頁",
+       "fileduplicatesearch-submit": "Chhìm",
+       "specialpages": "Thi̍t-sû ya̍p",
        "external_image_whitelist": " #留下撈邇行一樣嘅文字<pre>\n#在下背(//中間部份)輸入正則表達式\n#邇兜將會撈外部(已超鏈接嘅)圖片配合\n#遐兜配合上嘅會顯示成圖片,否則就單淨會顯示成鏈接\n#有#開頭嘅行會當成意見\n#大小寫並無區分\n\n#在邇行上片輸入全部正則表達式。留下撈邇行一樣嘅文字</pre>",
-       "tag-filter": "[[Special:Tags|標籤]]過濾器:",
+       "tag-filter": "[[Special:Tags|Phiêu-chhiam]] ko-lì-hi:",
+       "tag-list-wrapper": "([[Special:Tags|$1 ke phiêu-chhiam]]: $2)",
+       "logentry-delete-delete": "$1 san-chhù ya̍p-mien $3",
        "revdelete-restricted": "yí-kîn yin-yung han-tsṳ tsṳ tshâu-tsok-yèn",
        "revdelete-unrestricted": "yí-kîn yì-tshù yû-kûan tshâu-tsok-yè ke han-tsṳ",
+       "logentry-move-move": "$1 {{GENDER:$2|yí-kîn yì-thûng}} ya̍p-mien $3 to $4",
+       "logentry-newusers-create": "Yí-kîn {{GENDER:$2|kien-li̍p}} sṳ́-yung-chá chong-ho  $1",
+       "logentry-upload-upload": "$1 {{GENDER:$2|yí-kîn sông-chhòn}} $3",
        "rightsnone": "(無)",
-       "revdelete-summary": "piên-sip tsak-yêu"
+       "revdelete-summary": "piên-sip tsak-yêu",
+       "searchsuggest-search": "Chhìm"
 }
index 3643b28..1779eb9 100644 (file)
@@ -42,7 +42,7 @@
        "tog-hideminor": "הסתרת עריכות משניות בדף השינויים האחרונים",
        "tog-hidepatrolled": "הסתרת עריכות בדוקות בדף השינויים האחרונים",
        "tog-newpageshidepatrolled": "הסתרת דפים בדוקים ברשימת הדפים החדשים",
-       "tog-hidecategorization": "הסתרת שינויים בקטגוריות של דפים",
+       "tog-hidecategorization": "הסתרת שינויים בקטגוריות",
        "tog-extendwatchlist": "הרחבת רשימת המעקב כך שתציג את כל השינויים, לא רק את השינויים האחרונים בכל דף",
        "tog-usenewrc": "קיבוץ השינויים לפי דפים בדף השינויים האחרונים וברשימת המעקב",
        "tog-numberheadings": "מספור כותרות אוטומטי",
@@ -60,7 +60,7 @@
        "tog-previewonfirst": "הצגת תצוגה מקדימה בעריכה הראשונה",
        "tog-enotifwatchlistpages": "לשלוח אליי דוא\"ל כאשר משתנה דף או קובץ ברשימת המעקב שלי",
        "tog-enotifusertalkpages": "לשלוח אליי דוא\"ל כאשר נעשה שינוי בדף שיחת המשתמש שלי",
-       "tog-enotifminoredits": "×\9cש×\9c×\95×\97 ×\90×\9c×\99×\99 ×\93×\95×\90\"×\9c ×\92×\9d ×¢×\9c ×¢×¨×\99×\9b×\95ת ×\9eשנ×\99×\95ת ×©×\9c דפים וקבצים",
+       "tog-enotifminoredits": "×\9cש×\9c×\95×\97 ×\90×\9c×\99×\99 ×\93×\95×\90\"×\9c ×\92×\9d ×¢×\9c ×¢×¨×\99×\9b×\95ת ×\9eשנ×\99×\95ת ×\91דפים וקבצים",
        "tog-enotifrevealaddr": "חשיפת כתובת הדוא\"ל שלי בהתראות דוא\"ל",
        "tog-shownumberswatching": "הצגת מספר המשתמשים העוקבים",
        "tog-oldsig": "החתימה הנוכחית:",
@@ -74,7 +74,7 @@
        "tog-watchlistreloadautomatically": "רענון אוטומטי של רשימת המעקב בכל פעם שמסנן משתנה (דרוש JavaScript)",
        "tog-watchlisthideanons": "הסתרת עריכות של משתמשים אנונימיים ברשימת המעקב",
        "tog-watchlisthidepatrolled": "הסתרת עריכות בדוקות ברשימת המעקב",
-       "tog-watchlisthidecategorization": "הסתרת שינויים בקטגוריות של דפים",
+       "tog-watchlisthidecategorization": "הסתרת שינויים בקטגוריות",
        "tog-ccmeonemails": "לשלוח אליי העתקים של הודעות דוא\"ל שאני {{GENDER:|שולח|שולחת}} למשתמשים",
        "tog-diffonly": "לא להציג את תוכן הדף מתחת להבדלים בין הגרסאות",
        "tog-showhiddencats": "הצגת קטגוריות מוסתרות",
        "category_header": "דפים בקטגוריה \"$1\"",
        "subcategories": "קטגוריות משנה",
        "category-media-header": "קובצי מדיה בקטגוריה \"$1\"",
-       "category-empty": "<strong>קטגוריה זו אינה כוללת דפים או קובצי מדיה.</strong>",
+       "category-empty": "<em>קטגוריה זו אינה מכילה כרגע דפים או קובצי מדיה.</em>",
        "hidden-categories": "{{PLURAL:$1|קטגוריה מוסתרת|קטגוריות מוסתרות}}",
        "hidden-category-category": "קטגוריות מוסתרות",
        "category-subcat-count": "{{PLURAL:$2|קטגוריה זו כוללת את קטגוריית המשנה הבאה בלבד.|קטגוריה זו כוללת את {{PLURAL:$1|קטגוריית המשנה המוצגת להלן|$1 קטגוריות המשנה המוצגות להלן}}, וכוללת בסך־הכול $2 קטגוריות משנה.}}",
        "privacy": "מדיניות הפרטיות",
        "privacypage": "Project:מדיניות הפרטיות",
        "badaccess": "שגיאה בהרשאות",
-       "badaccess-group0": "×\90×\99× ×\9a ×\9e×\95רש×\94 ×\9c×\91צע ×\90ת ×\94פע×\95×\9c×\94 ×©×\91×\99קשת.",
-       "badaccess-groups": "הפעולה שביקשת לבצע מוגבלת למשתמשים ב{{PLURAL:$2|קבוצה הבאה|אחת הקבוצות הבאות}}: $1.",
+       "badaccess-group0": "×\90×\99×\9f {{GENDER:|×\9c×\9a\9c×\9a\9c×\9b×\9d}} ×\94רש×\90×\94 ×\9c×\91צע ×\90ת ×\94פע×\95×\9c×\94 ×©{{GENDER:|×\91×\99קשת|×\91×\99קשת|×\91×\99קשת×\9d}}.",
+       "badaccess-groups": "הפעולה ש{{GENDER:|ביקשת|ביקשת|ביקשתם}} לבצע מוגבלת למשתמשים ב{{PLURAL:$2|קבוצה הבאה|אחת הקבוצות הבאות}}: $1.",
        "versionrequired": "נדרשת גרסה $1 של מדיה־ויקי",
        "versionrequiredtext": "גרסה $1 של מדיה־ויקי נדרשת לשימוש בדף זה. למידע נוסף, ראו את [[Special:Version|דף הגרסה]].",
        "ok": "אישור",
        "actionthrottled": "הפעולה הוגבלה",
        "actionthrottledtext": "כאמצעי נגד שימוש לרעה, קיימת מגבלה על ביצוע פעולה זו פעמים רבות מדי בזמן קצר, וחרגת מהמגבלה הזאת.\nנא לנסות שוב בעוד מספר דקות.",
        "protectedpagetext": "דף זה מוגן כדי למנוע עריכה ופעולות אחרות.",
-       "viewsourcetext": "באפשרותכם לצפות בטקסט המקור של הדף ולהעתיקו.",
-       "viewyourtext": "באפשרותך לצפות בטקסט המקור של <strong>העריכות שלך</strong> בדף הזה ולהעתיקו.",
-       "protectedinterface": "×\93×£ ×\96×\94 ×\94×\95×\90 ×\90×\97×\93 ×\9eס×\93רת דפים המספקים הודעות מערכת לתוכנה שמפעילה את {{SITENAME}}, והוא מוגן כדי למנוע השחתות.\nכדי להוסיף או לשנות תרגומים של הודעות מערכת עבור כל אתרי הוויקי, יש להשתמש ב־[https://translatewiki.net/ translatewiki.net], פרויקט התרגום של מדיה־ויקי.",
-       "editinginterface": "<strong>×\90×\96×\94ר×\94:</strong> ×\94×\93×£ ×©{{GENDER:|×\90ת×\94 ×¢×\95ר×\9a\90ת ×¢×\95ר×\9bת|×\90ת×\9d ×¢×\95ר×\9b×\99×\9d}} ×\94×\95×\90 ×\90×\97×\93 ×\94×\93פ×\99×\9d ×\94×\9eספק×\99×\9d ×\94×\95×\93×¢×\95ת ×\9eער×\9bת ×\9cת×\95×\9b× ×\94 ×©×\9eפע×\99×\9c×\94 ×\90ת {{SITENAME}}.\nש×\99× ×\95×\99×\99×\9d ×\91×\93×£ ×\94×\96×\94 ×\99שפ×\99×¢×\95 ×¢×\9c ×ª×¦×\95×\92ת ×\9e×\9eשק ×\94×\9eשת×\9eש ×©×\9c ×\9eשת×\9eש×\99×\9d ×\90×\97ר×\99×\9d ×\91×\90תר.",
+       "viewsourcetext": "ב{{GENDER:|אפשרותך|אפשרותך|אפשרותכם}} לצפות בטקסט המקור של הדף ולהעתיקו.",
+       "viewyourtext": "ב{{GENDER:|אפשרותך|אפשרותך|אפשרותכם}} לצפות בטקסט המקור של <strong>העריכות {{GENDER:|שלך|שלך|שלכם}}</strong> בדף הזה ולהעתיקו.",
+       "protectedinterface": "×\93×£ ×\96×\94 ×\94×\95×\90 ×\90×\97×\93 ×\94דפים המספקים הודעות מערכת לתוכנה שמפעילה את {{SITENAME}}, והוא מוגן כדי למנוע השחתות.\nכדי להוסיף או לשנות תרגומים של הודעות מערכת עבור כל אתרי הוויקי, יש להשתמש ב־[https://translatewiki.net/ translatewiki.net], פרויקט התרגום של מדיה־ויקי.",
+       "editinginterface": "<strong>אזהרה:</strong> הדף ש{{GENDER:|אתה עורך|את עורכת|אתם עורכים}} הוא אחד הדפים המספקים הודעות מערכת לתוכנה שמפעילה את {{SITENAME}}.\nשינויים בדף הזה ישפיעו על ממשק המשתמש של משתמשים אחרים באתר.",
        "translateinterface": "כדי להוסיף או לשנות תרגומים של הודעות מערכת עבור כל אתרי הוויקי, יש להשתמש ב־[https://translatewiki.net/ translatewiki.net], פרויקט התרגום של מדיה־ויקי.",
        "cascadeprotected": "דף זה מוגן מעריכה כי הוא מוכלל {{PLURAL:$1|בדף הבא, שמופעלת עליו|בדפים הבאים, שמופעלת עליהם}} הגנה מדורגת:\n$2",
-       "namespaceprotected": "אין לך הרשאה לערוך דפים במרחב השם <strong>$1</strong>.",
+       "namespaceprotected": "אין {{GENDER:|לך|לך|לכם}} הרשאה לערוך דפים במרחב השם <strong>$1</strong>.",
        "customcssprotected": "אינך מורשה לערוך דף CSS זה כיוון שהוא כולל הגדרות אישיות של משתמש אחר.",
        "customjsprotected": "אינך מורשה לערוך דף JavaScript זה כיוון שהוא כולל הגדרות אישיות של משתמש אחר.",
        "mycustomcssprotected": "אין לך הרשאה לערוך דף CSS זה.",
        "createacct-benefit-body3": "{{PLURAL:$1|תורם|תורמים}} לאחרונה",
        "badretype": "הסיסמאות שהזנת אינן מתאימות.",
        "usernameinprogress": "יצירת חשבון עבור שם המשתמש הזה כבר התחילה.\nנא להמתין.",
-       "userexists": "שם המשתמש שבחרתם כבר נמצא בשימוש.\nאנא בחרו שם אחר.",
+       "userexists": "שם המשתמש שבחרת כבר נמצא בשימוש.\nנא לבחור שם אחר.",
        "loginerror": "שגיאה בכניסה לחשבון",
        "createacct-error": "שגיאה ביצירת חשבון",
        "createaccounterror": "לא ניתן היה ליצור את החשבון: $1",
        "resetpass-temp-password": "סיסמה זמנית:",
        "resetpass-abort-generic": "שינוי הסיסמה בוטל על־ידי הרחבה.",
        "resetpass-expired": "סיסמתכם פקעה. אנא הגדירו סיסמה חדשה כדי להיכנס.",
-       "resetpass-expired-soft": "ס×\99ס×\9eת×\9b×\9d ×¤×§×¢×\94 ×\95×\99ש ×\9c×\90פס ×\90×\95ת×\94. ×\90× ×\90 ×\91×\97ר×\95 ×¡×\99ס×\9e×\94 ×\97×\93ש×\94 ×\9bעת, ×\90×\95 ×\9c×\97צ×\95 על \"{{int:authprovider-resetpass-skip-label}}\" כדי לאפס אותה מאוחר יותר.",
-       "resetpass-validity-soft": "ס×\99ס×\9eת×\9a ×\90×\99× ×\94 ×ª×§×\99× ×\94: $1\n\n×\99ש ×\9c×\91×\97×\95ר ×¡×\99ס×\9e×\94 ×\97×\93ש×\94 ×¢×\9bש×\99×\95 ×\90×\95 ×\9c×\9c×\97×\95×¥ \"{{int:authprovider-resetpass-skip-label}}\" כדי לאפס את הסיסמה מאוחר יותר.",
+       "resetpass-expired-soft": "×\94ס×\99ס×\9e×\94 ×©×\9c×\9a ×¤×§×¢×\94, ×\95צר×\99×\9a ×\9c×\90פס ×\90×\95ת×\94. ×\99ש ×\9c×\91×\97×\95ר ×¡×\99ס×\9e×\94 ×\97×\93ש×\94 ×\9bעת, ×\90×\95 ×\9c×\9c×\97×\95×¥ על \"{{int:authprovider-resetpass-skip-label}}\" כדי לאפס אותה מאוחר יותר.",
+       "resetpass-validity-soft": "×\94ס×\99ס×\9e×\94 ×©×\9c×\9a ×\90×\99× ×\94 ×ª×§×\99× ×\94: $1\n\n×\99ש ×\9c×\91×\97×\95ר ×¡×\99ס×\9e×\94 ×\97×\93ש×\94 ×\9bעת ×\90×\95 ×\9c×\9c×\97×\95×¥ ×¢×\9c \"{{int:authprovider-resetpass-skip-label}}\" כדי לאפס את הסיסמה מאוחר יותר.",
        "passwordreset": "איפוס סיסמה",
        "passwordreset-text-one": "מלאו טופס זה כדי לקבל סיסמה זמנית בדוא\"ל.",
        "passwordreset-text-many": "{{PLURAL:$1||מלאו אחד מהשדות הבאים כדי לקבל סיסמה זמנית בדוא\"ל.}}",
        "minoredit": "זוהי עריכה משנית",
        "watchthis": "מעקב אחרי דף זה",
        "savearticle": "שמירת הדף",
+       "savechanges": "שמירת השינויים",
        "publishpage": "פרסום הדף",
+       "publishchanges": "פרסום השינויים",
        "preview": "תצוגה מקדימה",
        "showpreview": "תצוגה מקדימה",
        "showdiff": "הצגת שינויים",
        "blankarticle": "<strong>אזהרה:</strong> הדף שאתם יוצרים הוא ריק.\nאם תלחצו שוב על \"{{int:savearticle}}\", הדף ייווצר ללא תוכן.",
        "anoneditwarning": "<strong>אזהרה:</strong> אינכם מחוברים לחשבון. כתובת ה־IP שלכם תוצג בפומבי אם תבצעו עריכות כלשהן. אם <strong>[$1 תיכנסו לחשבון]</strong> או <strong>[$2 תיצרו חשבון]</strong>, העריכות שלכם תיוחסנה לשם המשתמש שלכם ותקבלו גם יתרונות אחרים.",
-       "anonpreviewwarning": "''אינכם מחוברים לחשבון. שמירה תגרום לכתובת ה־IP שלכם להירשם בהיסטוריית העריכות של הדף.''",
+       "anonpreviewwarning": "<em>אתם לא מחוברים לחשבון. שמירה תגרום לכתובת ה־IP שלכם להירשם בהיסטוריית העריכות של הדף.</em>",
        "missingsummary": "<strong>תזכורת:</strong> לא הזנת תקציר עריכה.\nלחיצה חוזרת על הכפתור \"{{int:savearticle}}\" תגרום לעריכה שלך להישמר בלעדיו.",
        "selfredirect": "<strong>אזהרה:</strong> ניסית ליצור הפניה מדף זה לעצמו.\nאולי כתבת יעד שגוי להפניה, ואולי ערכת את הדף הלא־נכון.\nלחיצה חוזרת על הכפתור \"{{int:savearticle}}\" תגרום להפניה להיווצר בכל זאת.",
        "missingcommenttext": "יש להקליד את ההודעה למטה.",
        "accmailtext": "סיסמה אקראית עבור [[User talk:$1|$1]] נשלחה אל $2. ניתן לשנותה בדף '''[[Special:ChangePassword|שינוי הסיסמה]]''' לאחר הכניסה.",
        "newarticle": "(חדש)",
        "newarticletext": "{{GENDER:|הגעת|הגעת|הגעתם}} לדף שעדיין אינו קיים.\nכדי ליצור את הדף הזה, {{GENDER:|התחל|התחילי|התחילו}} להקליד בתיבת הטקסט שלמטה ({{GENDER:|ראה|ראי|ראו}} את [$1 דף העזרה] למידע נוסף).\nאם {{GENDER:|הגעת|הגעת|הגעתם}} לכאן בטעות, {{GENDER:|לחץ|לחצי|לחצו}} על כפתור ה<strong>חזרה</strong> (Back) בדפדפן {{GENDER:|שלך|שלך|שלכם}}.",
-       "anontalkpagetext": "----\n<em>×\96×\94×\95 ×\93×£ ×©×\99×\97×\94 ×©×\9c ×\9eשת×\9eש ×\90× ×\95× ×\99×\9e×\99 ×©×¢×\93×\99×\99×\9f ×\9c×\90 ×\99צר ×\97ש×\91×\95×\9f ×\91×\9eער×\9bת, ×\90×\95 ×©×\94×\95×\90 ×\9c×\90 ×\9eשת×\9eש ×\91×\95.</em>\n×\9c×\9b×\9f ×¢×\9c×\99× ×\95 ×\9c×\94שת×\9eש ×\91×\9bת×\95×\91ת ×\94Ö¾IP ×\94×\9eספר×\99ת ×\9b×\93×\99 ×\9c×\96×\94×\95ת×\95.\n×\99×\99ת×\9b×\9f ×©×\9bת×\95×\91ת IP ×\96×\95 ×ª×\94×\99×\94 ×\9eש×\95תפת ×\9c×\9eספר ×\9eשת×\9eש×\99×\9d.\n×\90×\9d ×\90ת×\9d ×\9eשת×\9eש×\99×\9d ×\90× ×\95× ×\99×\9e×\99×\99×\9d ×\95×\9eר×\92×\99ש×\99×\9d ×©×§×\99×\91×\9cת×\9d ×\94×\95×\93×¢×\95ת ×\91×\9cת×\99 ×¨×\9c×\95×\95× ×\98×\99×\95ת, ×\90× ×\90 [[Special:CreateAccount|צר×\95 ×\97ש×\91×\95×\9f]] ×\90×\95 [[Special:UserLogin|×\94×\99×\9bנס×\95 ×\9c×\97ש×\91×\95×\9f]] ×\9b×\93×\99 ×\9c×\94×\99×\9e× ×¢ ×\9e×\91×\9c×\91×\95×\9c×\99×\9d ×¢×ª×\99×\93×\99×\99×\9d ×¢×\9d ×\9eשת×\9eש×\99×\9d ×\90× ×\95× ×\99×\9e×\99×\99×\9d × ×\95ספים.",
+       "anontalkpagetext": "----\n<em>×\96×\94×\95 ×\93×£ ×©×\99×\97×\94 ×©×\9c ×\9eשת×\9eש ×\90× ×\95× ×\99×\9e×\99 ×©×¢×\93×\99×\99×\9f ×\9c×\90 ×\99צר ×\97ש×\91×\95×\9f ×\91×\90תר, ×\90×\95 ×©×\94×\95×\90 ×\9c×\90 ×\9eשת×\9eש ×\91×\95.</em>\n×\9c×\9b×\9f ×¢×\9c×\99× ×\95 ×\9c×\94שת×\9eש ×\91×\9bת×\95×\91ת ×\94Ö¾IP ×\94×\9eספר×\99ת ×\9b×\93×\99 ×\9c×\96×\94×\95ת×\95.\n×\99×\99ת×\9b×\9f ×©×\9bת×\95×\91ת IP ×\96×\95 ×ª×\94×\99×\94 ×\9eש×\95תפת ×\9c×\9eספר ×\9eשת×\9eש×\99×\9d.\n×\90×\9d ×\90ת×\9d ×\9eשת×\9eש×\99×\9d ×\90× ×\95× ×\99×\9e×\99×\99×\9d ×\95×\9eר×\92×\99ש×\99×\9d ×©×§×\99×\91×\9cת×\9d ×\94×\95×\93×¢×\95ת ×©×\90×\99× ×\9f ×¨×\9c×\95×\95× ×\98×\99×\95ת ×¢×\91×\95ר×\9b×\9d, ×\90× ×\90 [[Special:CreateAccount|צר×\95 ×\97ש×\91×\95×\9f]] ×\90×\95 [[Special:UserLogin|×\94×\99×\9bנס×\95 ×\9c×\97ש×\91×\95×\9f]] ×\9b×\93×\99 ×\9c×\94×\99×\9e× ×¢ ×\9e×\91×\9c×\91×\95×\9c×\99×\9d ×¢×ª×\99×\93×\99×\99×\9d ×¢×\9d ×\9eשת×\9eש×\99×\9d ×\90× ×\95× ×\99×\9e×\99×\99×\9d ×\90×\97רים.",
        "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}}|לחפש את כותרת הדף]] בדפים אחרים או <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} לחפש את הדף ביומנים]</span>, אך אין לך הרשאה ליצור את הדף.",
        "missing-revision": "גרסה #$1 של הדף \"{{FULLPAGENAME}}\" אינה קיימת.\n\nזה נגרם בדרך־כלל עקב לחיצה על קישור ישן לגרסה של דף שנמחק.\nאפשר למצוא פרטים ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
-       "userpage-userdoesnotexist": "×\97ש×\91×\95×\9f ×\94×\9eשת×\9eש \"$1\" ×\90×\99× ×\95 ×¨×©×\95×\9d.\n× ×\90 ×\9c×\91×\93×\95ק ×\90×\9d ×\91רצ×\95× ×\9a ליצור/לערוך את הדף הזה.",
+       "userpage-userdoesnotexist": "×\97ש×\91×\95×\9f ×\94×\9eשת×\9eש \"$1\" ×\90×\99× ×\95 ×¨×©×\95×\9d.\n×\90× ×\90 {{GENDER:|×\91×\93×\95ק|×\91Ö´×\93ק×\99\91Ö´×\93ק×\95}} ×\90×\9d {{GENDER:|×\91רצ×\95× ×\9a\91רצ×\95× ×\9a\91רצ×\95× ×\9b×\9d}} ליצור/לערוך את הדף הזה.",
        "userpage-userdoesnotexist-view": "חשבון המשתמש \"$1\" אינו רשום.",
        "blocked-notice-logextract": "{{GENDER:$1|המשתמש הזה חסום|המשתמשת הזו חסומה}} כרגע.\nהפעולה האחרונה ביומן החסימות מוצגת להלן:",
-       "clearyourcache": "<strong>הערה:</strong> לאחר השמירה, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.\n* <strong>פיירפוקס / ספארי:</strong> להחזיק את המקש <em>Shift</em> בעת לחיצה על <strong>טעינה מחדש</strong> (Reload), או ללחוץ על צירוף המקשים <em>Ctrl-F5</em> או <em>Ctrl-R</em> (במחשב מק: <em dir=\"ltr\">⌘-R</em>)\n* <strong>גוגל כרום:</strong> ללחוץ על צירוף המקשים <em>Ctrl-Shift-R</em> (במחשב מק: <em dir=\"ltr\">⌘-Shift-R</em>)\n* <strong>אינטרנט אקספלורר:</strong> ללחוץ ולהחזיק את המקש <em>Ctrl</em> בעת לחיצה על <strong>רענן</strong> (Refresh), או ללחוץ על צירוף המקשים <em>Ctrl-F5</em>\n* <strong>אופרה:</strong> לפתוח <em>תפריט ← הגדרות</em> (במחשב מק <em>Opera ← העדפות</em>) ואז ללחוץ על <em>פרטיות ואבטחה ← מחק היסטוריית גלישה ← Cached images and files</em>.",
+       "clearyourcache": "<strong>הערה:</strong> לאחר השמירה, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.\n* <strong>פיירפוקס / ספארי:</strong> להחזיק את המקש <em>Shift</em> בעת לחיצה על <strong>טעינה מחדש</strong> (Reload), או ללחוץ על צירוף המקשים <em>Ctrl-F5</em> או <em>Ctrl-R</em> (במחשב מק: <em dir=\"ltr\">⌘-R</em>).\n* <strong>גוגל כרום:</strong> ללחוץ על צירוף המקשים <em>Ctrl-Shift-R</em> (במחשב מק: <em dir=\"ltr\">⌘-Shift-R</em>).\n* <strong>אינטרנט אקספלורר:</strong> להחזיק את המקש <em>Ctrl</em> בעת לחיצה על <strong>רענן</strong> (Refresh), או ללחוץ על צירוף המקשים <em>Ctrl-F5</em>.\n* <strong>אופרה:</strong> לפתוח <em>תפריט ← הגדרות</em> (במחשב מק: <em>Opera ← העדפות</em>) ואז ללחוץ על <em>פרטיות ואבטחה ← מחק היסטוריית גלישה ← Cached images and files</em>.",
        "usercssyoucanpreview": "<strong>עצה:</strong> השתמשו בכפתור \"{{int:showpreview}}\" כדי לבחון את גיליון ה־CSS החדש שלכם לפני השמירה.",
        "userjsyoucanpreview": "<strong>עצה:</strong> השתמשו בכפתור \"{{int:showpreview}}\" כדי לבחון את סקריפט ה־JavaScript החדש שלכם לפני השמירה.",
        "usercsspreview": "<strong>זִכרו שזו רק תצוגה מקדימה של גיליון ה־CSS שלכם.\nהוא עדיין לא נשמר!</strong>",
        "yourtext": "הטקסט שלך",
        "storedversion": "גרסה שמורה",
        "nonunicodebrowser": "'''אזהרה: הדפדפן שלך אינו תואם לתקן יוניקוד.'''\nכדי למנוע בעיות הנוצרות כתוצאה מכך ולאפשר לך לערוך דפים בבטחה, תווים שאינם ב־ASCII יוצגו בתיבת העריכה כקודים הקסדצימליים.",
-       "editingold": "<strong>אזהרה: אתם עורכים גרסה לא עדכנית של דף זה.</strong>\nאם תשמרו את הדף, כל השינויים שנעשו מאז גרסה זו יאבדו.",
+       "editingold": "<strong>אזהרה: {{GENDER:|אתה עורך|את עורכת|אתם עורכים}} גרסה ישנה של דף זה.</strong>\nאם {{GENDER:|תשמור|תשמרי|תשמרו}} את העריכה, כל השינויים שנעשו מאז גרסה זו יאבדו.",
        "yourdiff": "הבדלים",
        "copyrightwarning": "'''שימו לב:''' תרומתכם ל{{grammar:תחילית|{{SITENAME}}}} תפורסם תחת תנאי הרישיון $2 (ראו $1 לפרטים נוספים). אם אינכם רוצים שעבודתכם תהיה זמינה לעריכה על־ידי אחרים, שתופץ לעיני כול, ושאחרים יוכלו להעתיק ממנה בציון המקור – אל תפרסמו אותה פה. כמו־כן, אתם מבטיחים לנו כי כתבתם את הטקסט הזה בעצמכם, או העתקתם אותו ממקור שאינו מוגן בזכויות יוצרים. '''אל תעשו שימוש בחומר המוגן בזכויות יוצרים ללא רשות!'''",
        "copyrightwarning2": "'''שימו לב:''' תורמים אחרים עשויים לערוך או אף להסיר את תרומתכם ל{{grammar:תחילית|{{SITENAME}}}}. אם אינכם רוצים שעבודתכם תהיה זמינה לעריכה על־ידי אחרים, אל תפרסמו אותה פה. כמו־כן, אתם מבטיחים לנו כי כתבתם את הטקסט הזה בעצמכם, או העתקתם אותו ממקור שאינו מוגן בזכויות יוצרים (ראו $1 לפרטים נוספים). '''אל תעשו שימוש בחומר המוגן בזכויות יוצרים ללא רשות!'''",
        "sectioneditnotsupported-title": "עריכת פסקאות אינה נתמכת",
        "sectioneditnotsupported-text": "עריכת פסקאות אינה נתמכת בדף זה.",
        "permissionserrors": "שגיאת הרשאה",
-       "permissionserrorstext": "×\90×\99× ×\9b×\9d ×\9e×\95רש×\99×\9d לבצע פעולה זו, {{PLURAL:$1|מהסיבה הבאה|מהסיבות הבאות}}:",
-       "permissionserrorstext-withaction": "×\90×\99× ×\9b×\9d ×\9e×\95רש×\99×\9d $2, {{PLURAL:$1|×\9e×\94ס×\99×\91×\94 ×\94×\91×\90×\94\9e×\94סיבות הבאות}}:",
+       "permissionserrorstext": "×\90×\99×\9f ×\91{{GENDER:|×\90פשר×\95ת×\9a\90פשר×\95ת×\9a\90פשר×\95ת×\9b×\9d}} לבצע פעולה זו, {{PLURAL:$1|מהסיבה הבאה|מהסיבות הבאות}}:",
+       "permissionserrorstext-withaction": "×\90×\99×\9f ×\91{{GENDER:|×\90פשר×\95ת×\9a\90פשר×\95ת×\9a\90פשר×\95ת×\9b×\9d}} $2, ×\9e×\94{{PLURAL:$1|ס×\99×\91×\94 ×\94×\91×\90×\94|סיבות הבאות}}:",
        "contentmodelediterror": "לא ניתן לערוך את הגרסה הזאת כי מודל התוכן שלה הוא <code>$1</code>, השונה ממודל התוכן הנוכחי של הדף, <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''אזהרה: הנכם יוצרים דף חדש שנמחק בעבר.'''\n\nכדאי לשקול אם יהיה זה נכון להמשיך לערוך את הדף.\nיומני המחיקות וההעברות של הדף מוצגים להלן:",
        "moveddeleted-notice": "דף זה נמחק.\nיומני המחיקות וההעברות של הדף מוצגים להלן.",
        "content-failed-to-parse": "פענוח $2 כתוכן מסוג $1 נכשל: $3",
        "invalid-content-data": "מידע שגוי על התוכן",
        "content-not-allowed-here": "תוכן מסוג \"$1\" אינו מותר בדף [[$2]]",
-       "editwarning-warning": "עזיבת הדף הזה עלולה לגרום לך לאבד את כל השינויים שביצעת. אם יש לך חשבון באתר, באפשרותך לבטל את האזהרה הזאת בחלק \"{{int:prefs-editing}}\" שבהעדפות שלך.",
+       "editwarning-warning": "עזיבת הדף הזה עלולה לגרום לך לאבד את כל השינויים שביצעת.\nאם יש לך חשבון באתר, באפשרותך לבטל את האזהרה הזאת בחלק \"{{int:prefs-editing}}\" שבהעדפות שלך.",
        "editpage-notsupportedcontentformat-title": "סוג התוכן אינו נתמך",
        "editpage-notsupportedcontentformat-text": "תוכן מסוג $1 אינו נתמך על־ידי מודל התוכן $2.",
        "content-model-wikitext": "קוד ויקי",
-       "content-model-text": "×\98קס×\98 ×¤×©×\95×\98",
+       "content-model-text": "×\98קס×\98 ×¨×\92×\99×\9c",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "content-json-empty-object": "אוביקט ריק",
        "content-json-empty-array": "מערך ריק",
+       "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\". ייעשה שימוש רק בערך האחרון.",
        "duplicate-args-category": "דפים שמשתמשים בפרמטרים כפולים בקריאות לתבניות",
        "duplicate-args-category-desc": "הדף מכיל קריאות לתבניות שמשתמשות בפרמטרים כפולים, כגון <code><nowiki>{{תאריך|יום=1|יום=2}}</nowiki></code> או <code><nowiki>{{שעה|חמש|1=שש}}</nowiki></code>.",
        "last": "קודמת",
        "page_first": "ראשון",
        "page_last": "אחרון",
-       "histlegend": "בחירת גרסאות להשוואה: סמנו את תיבות האפשרויות של הגרסאות המיועדות להשוואה, והקישו על Enter או על הכפתור למטה.<br />\nמקרא: '''({{int:cur}})''' = השוואה עם הגרסה הנוכחית, '''({{int:last}})''' = השוואה עם הגרסה הקודמת, '''{{int:minoreditletter}}''' = שינוי משני.",
+       "histlegend": "בחירת גרסאות להשוואה: {{GENDER:|בחר|בחרי|בחרו}} את הגרסאות ש{{GENDER:|ברצונך|ברצונך|ברצונכם}} להשוות ולאחר מכן {{GENDER:|הקש|הקישי|הקישו}} על Enter או {{GENDER:|לחץ|לחצי|לחצו}} על הכפתור שלמטה.<br />\nמקרא: <strong>({{int:cur}})</strong> = השוואה עם הגרסה הנוכחית, <strong>({{int:last}})</strong> = השוואה עם הגרסה הקודמת, <strong>{{int:minoreditletter}}</strong> = עריכה משנית.",
        "history-fieldset-title": "חיפוש בהיסטוריית הדף",
-       "history-show-deleted": "רק ×\9e×\97×\95ק×\95ת",
+       "history-show-deleted": "ער×\99×\9b×\95ת ×\9e×\95סתר×\95ת ×\91×\9c×\91×\93",
        "histfirst": "הישנות ביותר",
        "histlast": "החדשות ביותר",
-       "historysize": "({{PLURAL:$1|×\91×\99ת ×\90×\97×\93|$1 ×\91תים}})",
+       "historysize": "({{PLURAL:$1|×\91×\99×\99×\98 ×\90×\97×\93|$1 ×\91×\99×\99×\98ים}})",
        "historyempty": "(ריק)",
        "history-feed-title": "היסטוריית גרסאות",
        "history-feed-description": "היסטוריית הגרסאות של הדף הזה בוויקי",
        "search-suggest": "האם התכוונת ל: $1",
        "search-rewritten": "מוצגות התוצאות עבור $1. ניתן לחפש $2 במקום זאת.",
        "search-interwiki-caption": "מיזמי אחות",
-       "search-interwiki-default": "תוצאות מ{{GRAMMAR:תחילית|$1}}:",
+       "search-interwiki-default": "תוצאות מתוך $1:",
        "search-interwiki-more": "(עוד)",
        "search-relatedarticle": "קשור",
        "searchrelated": "קשור",
        "savedprefs": "ההעדפות שלך נשמרו.",
        "savedrights": "ההרשאות של {{GENDER:$1|המשתמש|המשתמשת}} \"$1\" נשמרו.",
        "timezonelegend": "אזור זמן:",
-       "localtime": "×\96×\9e×\9f ×\9eק×\95×\9e×\99:",
+       "localtime": "שע×\94 ×\9eק×\95×\9e×\99ת:",
        "timezoneuseserverdefault": "ברירת המחדל של האתר ($1)",
        "timezoneuseoffset": "אחר (יש לציין את ההפרש)",
        "servertime": "השעה הנוכחית בשרת:",
        "prefs-custom-css": "קובץ CSS מותאם אישית",
        "prefs-custom-js": "קובץ JavaScript מותאם אישית",
        "prefs-common-css-js": "קובצי CSS/JavaScript משותפים לכל העיצובים:",
-       "prefs-reset-intro": "×\91×\90פשר×\95ת×\9a ×\9c×\94שת×\9eש ×\91×\93×£ ×\96×\94 כדי להחזיר את ההעדפות שלך להגדרות ברירת המחדל של האתר.\nלא ניתן לבטל פעולה זו.",
+       "prefs-reset-intro": "×\91×\90פשר×\95ת×\9a ×\9c×\94שת×\9eש ×\91×\90פשר×\95ת ×\96×\95 כדי להחזיר את ההעדפות שלך להגדרות ברירת המחדל של האתר.\nלא ניתן לבטל פעולה זו.",
        "prefs-emailconfirm-label": "אימות כתובת דוא\"ל:",
        "youremail": "דואר אלקטרוני:",
        "username": "שם {{GENDER:$1|המשתמש|המשתמשת}}:",
        "email": "דוא\"ל",
        "prefs-help-realname": "לא חובה למלא את השם האמיתי.\nאם סופק, הוא עשוי לשמש כדי לייחס לך את עבודתך.",
        "prefs-help-email": "כתובת דואר אלקטרוני היא אופציונלית, אבל היא חיונית לאיפוס הסיסמה במקרה ש{{GENDER:|תשכח|תשכחי}} אותה.",
-       "prefs-help-email-others": "×\91×\90פשר×\95ת×\9a ×\92×\9d ×\9c×\91×\97×\95ר ×\9c×\90פשר ×\9c×\9eשת×\9eש×\99×\9d ×\9c×\99צ×\95ר ×\90×\99ת×\9a ×§×©×¨ ×\91×\90×\9eצע×\95ת ×\93×\95×\90\"×\9c ×\93ר×\9a ×§×\99ש×\95ר ×\91×\93×£ ×\94×\9eשת×\9eש ×\90×\95 ×\91×\93×£ ×\94ש×\99×\97×\94 ×©×\9c×\9a.\n×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ×©×\9c×\9a ×\9c×\90 ×ª×\99×\97שף ×\9bש×\9eשת×\9eש×\99×\9d ×\99×\99צר×\95 ×\90×\99ת×\9a ×§×©×¨.",
+       "prefs-help-email-others": "באפשרותך גם לאפשר למשתמשים ליצור איתך קשר באמצעות דוא\"ל דרך קישור בדף המשתמש או בדף השיחה שלך.\nכתובת הדוא\"ל שלך לא תיחשף כשמשתמשים ייצרו איתך קשר.",
        "prefs-help-email-required": "כתובת דואר אלקטרוני נדרשת לכתיבה באתר.",
        "prefs-info": "מידע בסיסי",
        "prefs-i18n": "בינאום",
        "right-movefile": "העברת קבצים",
        "right-suppressredirect": "הימנעות מיצירת הפניות מדפי המקור בעת העברת דפים",
        "right-upload": "העלאת קבצים",
-       "right-reupload": "×\93ר×\99סת קבצים קיימים",
-       "right-reupload-own": "×\93ר×\99סת ×§×\91צ×\99×\9d ×§×\99×\99×\9e×\99×\9d ×©×\94×\95×¢×\9c×\95 ×¢×\9cÖ¾×\99×\93×\99 ×\90×\95ת×\95 ×\94×\9eשת×\9eש",
+       "right-reupload": "×\94×¢×\9c×\90ת ×\92רס×\90×\95ת ×\97×\93ש×\95ת ×©×\9c קבצים קיימים",
+       "right-reupload-own": "×\94×¢×\9c×\90ת ×\92רס×\90×\95ת ×\97×\93ש×\95ת ×©×\9c ×§×\91צ×\99×\9d ×§×\99×\99×\9e×\99×\9d ×©×\94×\95×¢×\9c×\95 ×¢×\9cÖ¾×\99×\93×\99 ×\94×\9eשת×\9eש ×¢×¦×\9e×\95",
        "right-reupload-shared": "דריסה מקומית של קבצים מאתר קובצי המדיה המשותף",
-       "right-upload_by_url": "×\94×¢×\9c×\90ת ×§×\95×\91×¥ ×\9e×\9bת×\95×\91ת ×\90×\99× ×\98רנ×\98",
-       "right-purge": "רענ×\95×\9f ×\96×\99×\9bר×\95×\9f ×\94×\9e×\98×\9e×\95×\9f ×©×\9c ×\94×\90תר ×\9c×\9c×\90 ×\9e×¢×\91ר ×\9cדף אישור",
-       "right-autoconfirmed": "עק×\99פת ×\94×\92×\91×\9cת ×§×¦×\91 ×\94ער×\99×\9b×\95ת ×\94×\9e×\91×\95ססת ×¢×\9c ×\9bת×\95×\91ת IP",
+       "right-upload_by_url": "×\94×¢×\9c×\90ת ×§×\91צ×\99×\9d ×\9e×\9bת×\95×\91ת ×\90×\99× ×\98רנ×\98 (URL)",
+       "right-purge": "רענ×\95×\9f ×\96×\99×\9bר×\95×\9f ×\94×\9e×\98×\9e×\95×\9f ×©×\9c ×\94×\90תר ×\9c×\9c×\90 ×\9e×¢×\91ר ×\91דף אישור",
+       "right-autoconfirmed": "עק×\99פת ×\94×\94×\92×\91×\9c×\94 ×¢×\9c ×§×¦×\91 ×\94פע×\95×\9c×\95ת ×©× ×\99ת×\9f ×\9c×\91צע ×\9e×\9bת×\95×\91ת IP ×\9eס×\95×\99×\9eת",
        "right-bot": "התייחסות לעריכות כאוטומטיות",
        "right-nominornewtalk": "ביטול שליחת התראה על הודעה חדשה למשתמש בעת עריכה משנית בדף השיחה שלו",
        "right-apihighlimits": "שימוש ב־API עם פחות הגבלות",
        "right-bigdelete": "מחיקת דפים המכילים כמות גדולה של עריכות בהיסטוריית הגרסאות",
        "right-deletelogentry": "מחיקה ושחזור של פעולות יומן",
        "right-deleterevision": "מחיקה ושחזור של גרסאות מסוימות בדפים",
-       "right-deletedhistory": "צפ×\99×\99×\94 ×\91פר×\98×\99×\9d ×©×\9c ×\92רס×\90×\95ת ×\9e×\97×\95ק×\95ת, ×\9c×\9c×\90 ×\94×\98קס×\98 השייך להן",
+       "right-deletedhistory": "צפ×\99×\99×\94 ×\91פר×\98×\99×\9d ×©×\9c ×\92רס×\90×\95ת ×©× ×\9e×\97ק×\95, ×\9c×\9c×\90 ×\94ת×\95×\9b×\9f השייך להן",
        "right-deletedtext": "צפייה בתוכן שנמחק ובהבדלים בין גרסאות שנמחקו",
        "right-browsearchive": "חיפוש דפים מחוקים",
-       "right-undelete": "ש×\97×\96×\95ר ×\93×£ ×\9e×\97×\95ק",
-       "right-suppressrevision": "×\94צ×\92×\94, ×\94סתר×\94 ×\95×\91×\99×\98×\95×\9c ×\94סתר×\94 ×©×\9c ×\92רס×\90×\95ת ×\9eס×\95×\99×\9e×\95ת ×©×\9c דפים מכל המשתמשים",
-       "right-viewsuppressed": "×\94צ×\92ת ×\92רס×\90×\95ת ×©×\9e×\95סתר×\95ת מכל המשתמשים",
+       "right-undelete": "ש×\97×\96×\95ר ×\93פ×\99×\9d ×\9e×\97×\95ק×\99×\9d",
+       "right-suppressrevision": "צפ×\99×\99×\94, ×\94סתר×\94 ×\95×\91×\99×\98×\95×\9c ×\94סתר×\94 ×©×\9c ×\92רס×\90×\95ת ×\9eס×\95×\99×\9e×\95ת ×\91דפים מכל המשתמשים",
+       "right-viewsuppressed": "צפ×\99×\99×\94 ×\91×\92רס×\90×\95ת ×©×\94×\95סתר×\95 מכל המשתמשים",
        "right-suppressionlog": "צפייה ביומנים פרטיים",
        "right-block": "חסימת משתמשים מעריכה",
        "right-blockemail": "חסימת משתמשים משליחת דואר אלקטרוני",
        "right-hideuser": "חסימת שם משתמש תוך הסתרתו מהציבור",
        "right-ipblock-exempt": "עקיפת חסימות של כתובות IP, חסימות אוטומטיות וחסימות טווחים",
        "right-unblockself": "שחרור חסימה של המשתמש עצמו",
-       "right-protect": "שינוי רמות הגנה ועריכת דפים המוגנים בהגנה מדורגת",
+       "right-protect": "ש×\99× ×\95×\99 ×¨×\9e×\95ת ×\94×\92× ×\94 ×©×\9c ×\93פ×\99×\9d ×\95ער×\99×\9bת ×\93פ×\99×\9d ×\94×\9e×\95×\92× ×\99×\9d ×\91×\94×\92× ×\94 ×\9e×\93×\95ר×\92ת",
        "right-editprotected": "עריכת דפים המוגנים ברמת ההגנה \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "עריכת דפים המוגנים ברמת ההגנה \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "שינוי מודל התוכן של דפים",
        "right-editmyuserjs": "עריכת קובצי JavaScript של המשתמש עצמו",
        "right-viewmywatchlist": "צפייה ברשימת המעקב של המשתמש עצמו",
        "right-editmywatchlist": "עריכת רשימת המעקב של המשתמש עצמו. מספר פעולות יוסיפו דפים גם ללא הרשאה זו.",
-       "right-viewmyprivateinfo": "צפייה במידע הפרטי של המשתמש עצמו (כגון כתובת דוא\"ל, שם אמיתי)",
+       "right-viewmyprivateinfo": "צפייה במידע הפרטי של המשתמש עצמו (כגון: כתובת דוא\"ל, שם אמיתי)",
        "right-editmyprivateinfo": "עריכת המידע הפרטי של המשתמש עצמו (כגון: כתובת דוא\"ל, שם אמיתי)",
        "right-editmyoptions": "עריכת ההעדפות של המשתמש עצמו",
-       "right-rollback": "ש×\97×\96×\95ר ×\9e×\94×\99ר ×©×\9c ×¢×¨×\99×\9b×\95ת ×\94×\9eשת×\9eש ×\94×\90×\97ר×\95×\9f ×©×¢×¨×\9a ×\93×£ ×\9eס×\95ים",
+       "right-rollback": "ש×\97×\96×\95ר ×\9e×\94×\99ר ×©×\9c ×\94ער×\99×\9b×\95ת ×©× ×¢×©×\95 ×¢×\9cÖ¾×\99×\93×\99 ×\94×¢×\95ר×\9a ×\94×\90×\97ר×\95×\9f ×\91×\93פים",
        "right-markbotedits": "סימון עריכות משוחזרות כעריכות של בוט",
-       "right-noratelimit": "עק×\99פת ×\94×\92×\91×\9cת ×§×¦×\91 ×\94ער×\99×\9bות",
+       "right-noratelimit": "עק×\99פת ×\94×\94×\92×\91×\9c×\94 ×¢×\9c ×§×¦×\91 ×\94פע×\95×\9cות",
        "right-import": "ייבוא דפים מאתרי ויקי אחרים",
        "right-importupload": "ייבוא דפים באמצעות העלאת קבצים",
        "right-patrol": "סימון עריכות של אחרים כבדוקות",
        "right-autopatrol": "סימון אוטומטי של עריכות המשתמש עצמו כבדוקות",
        "right-patrolmarks": "הבחנה בין עריכות שנבדקו לעריכות שטרם נבדקו בדף השינויים האחרונים",
-       "right-unwatchedpages": "×\94צ×\92ת ×¨×©×\99×\9e×\94 ×©×\9c דפים שאינם במעקב",
+       "right-unwatchedpages": "צפ×\99×\99×\94 ×\91רש×\99×\9eת ×\94דפים שאינם במעקב",
        "right-mergehistory": "מיזוג היסטוריית גרסאות של דפים",
-       "right-userrights": "ער×\99×\9bת כל הרשאות המשתמש",
-       "right-userrights-interwiki": "ער×\99×\9bת ×\94רש×\90×\95ת ×\94×\9eשת×\9eש של משתמשים באתרי ויקי אחרים",
+       "right-userrights": "ש×\99× ×\95×\99 כל הרשאות המשתמש",
+       "right-userrights-interwiki": "ש×\99× ×\95×\99 ×\94רש×\90×\95ת של משתמשים באתרי ויקי אחרים",
        "right-siteadmin": "נעילה וביטול נעילה של בסיס הנתונים",
        "right-override-export-depth": "ייצוא דפים כולל הדפים המקושרים (עד עומק של 5 דפים)",
        "right-sendemail": "שליחת דואר אלקטרוני למשתמשים אחרים",
        "rightslogtext": "יומן זה מציג את השינויים בהרשאות של המשתמשים.",
        "action-read": "לקרוא דף זה",
        "action-edit": "לערוך דף זה",
-       "action-createpage": "×\9c×\99צ×\95ר ×\93פ×\99×\9d",
-       "action-createtalk": "×\9c×\99צ×\95ר ×\93פ×\99 ×©×\99×\97ה",
-       "action-createaccount": "×\9c×\99צ×\95ר ×\90ת ×\97ש×\91×\95×\9f ×\94×\9eשת×\9eש ×\94×\96×\94",
-       "action-autocreateaccount": "ליצור את חשבון המשתמש החיצוני הזה",
+       "action-createpage": "×\9c×\99צ×\95ר ×\93×£ ×\96×\94",
+       "action-createtalk": "×\9c×\99צ×\95ר ×\93×£ ×\96ה",
+       "action-createaccount": "×\9c×\99צ×\95ר ×\97ש×\91×\95× ×\95ת ×\9eשת×\9eש ×\97×\93ש×\99×\9d",
+       "action-autocreateaccount": "ליצור את חשבון המשתמש החיצוני הזה באופן אוטומטי",
        "action-history": "לצפות בהיסטוריה של דף זה",
        "action-minoredit": "לסמן עריכה זו כמשנית",
        "action-move": "להעביר דף זה",
        "action-writeapi": "להשתמש ב־API לשינוי דפים",
        "action-delete": "למחוק דף זה",
        "action-deleterevision": "למחוק גרסה זו",
-       "action-deletedhistory": "×\9cצפ×\95ת ×\91×\94×\99ס×\98×\95ר×\99×\94 ×\94×\9e×\97×\95ק×\94 ×©×\9c ×\93×£ ×\96×\94",
+       "action-deletedhistory": "×\9cצפ×\95ת ×\91×\94×\99ס×\98×\95ר×\99×\94 ×\94×\9e×\97×\95ק×\94 ×©×\9c ×\93פ×\99×\9d",
        "action-browsearchive": "לחפש דפים מחוקים",
        "action-undelete": "לשחזר דף זה",
        "action-suppressrevision": "לבדוק ולשחזר גרסה מוסתרת זו",
-       "action-suppressionlog": "×\9cצפ×\95ת ×\91×\99×\95×\9e×\9f ×¤×¨×\98×\99 זה",
-       "action-block": "לחסום משתמש זה מעריכה",
-       "action-protect": "×\9cשנ×\95ת ×\90ת ×¨×\9eת ×\94×\94×\92× ×\94 ×¢ל דף זה",
-       "action-rollback": "×\9cש×\97×\96ר ×\91×\9e×\94×\99ר×\95ת ×\90ת ×¢×¨×\99×\9b×\95ת ×\94×\9eשת×\9eש ×\94×\90×\97ר×\95×\9f ×©×¢×¨×\9a ×\93×£ ×\9eס×\95ים",
-       "action-import": "לייבא דפים מאתר ויקי אחר",
-       "action-importupload": "×\9c×\99×\99×\91×\90 ×\93פ×\99×\9d ×\91×\90×\9eצע×\95ת ×\94×¢×\9c×\90ת ×§×\95×\91×¥",
+       "action-suppressionlog": "×\9cצפ×\95ת ×\91×\99×\95×\9e×\9f ×\94פר×\98×\99 ×\94זה",
+       "action-block": "לחסום משתמשים מעריכה",
+       "action-protect": "×\9cשנ×\95ת ×\90ת ×¨×\9eת ×\94×\94×\92× ×\94 ×©ל דף זה",
+       "action-rollback": "×\9c×\91צע ×©×\97×\96×\95ר ×\9e×\94×\99ר ×©×\9c ×\94ער×\99×\9b×\95ת ×©× ×¢×©×\95 ×¢×\9cÖ¾×\99×\93×\99 ×\94×¢×\95ר×\9a ×\94×\90×\97ר×\95×\9f ×\91×\93פים",
+       "action-import": "לייבא דפים מאתרי ויקי אחרים",
+       "action-importupload": "×\9c×\99×\99×\91×\90 ×\93פ×\99×\9d ×\91×\90×\9eצע×\95ת ×\94×¢×\9c×\90ת ×§×\91צ×\99×\9d",
        "action-patrol": "לסמן עריכות של אחרים כבדוקות",
-       "action-autopatrol": "לסמן את העריכות שלך כבדוקות",
+       "action-autopatrol": "לסמן את העריכות {{GENDER:|שלך|שלך|שלכם}} כבדוקות",
        "action-unwatchedpages": "לצפות ברשימת הדפים שאינם במעקב",
-       "action-mergehistory": "×\9c×\9e×\96×\92 ×\90ת ×\94×\94×\99ס×\98×\95ר×\99×\94 של דף זה",
-       "action-userrights": "×\9cער×\95×\9a את כל הרשאות המשתמש",
-       "action-userrights-interwiki": "×\9cער×\95×\9a ×\90ת ×\94הרשאות של משתמשים באתרי ויקי אחרים",
-       "action-siteadmin": "×\9c× ×¢×\95×\9c ×\90×\95 ×\9c×\91×\98×\9c ×\90ת × ×¢×\99×\9cת בסיס הנתונים",
-       "action-sendemail": "לשלוח דואר אלקטרוני",
-       "action-editmywatchlist": "לערוך את רשימת המעקב שלך",
-       "action-viewmywatchlist": "לצפות ברשימת המעקב שלך",
-       "action-viewmyprivateinfo": "לצפות במידע הפרטי שלך",
-       "action-editmyprivateinfo": "לערוך את המידע הפרטי שלך",
-       "action-editcontentmodel": "×\9cער×\95×\9a ×\90ת ×\9e×\95×\93×\9c ×\94ת×\95×\9b×\9f ×©×\9c ×\93×£",
-       "action-managechangetags": "×\9c×\99צ×\95ר, ×\9c×\94פע×\99×\9c ×\95לבטל תגיות",
-       "action-applychangetags": "×\9c×\94×\97×\99×\9c ×ª×\92×\99×\95ת ×\99×\97×\93 ×¢×\9d ×\94ש×\99× ×\95×\99×\99×\9d ×©×\9c×\9bם",
-       "action-changetags": "×\9c×\94×\95ס×\99×£ ×\95×\9c×\94ס×\99ר ×ª×\92×\99×\95ת ×\9b×\9cש×\94×\9f ×\9c×\92רס×\90×\95ת ×\9eס×\95×\99×\9e×\95ת ×\95×\9cרשומות יומן",
+       "action-mergehistory": "×\9c×\9e×\96×\92 ×\90ת ×\94×\99ס×\98×\95ר×\99×\99ת ×\94×\92רס×\90×\95ת של דף זה",
+       "action-userrights": "×\9cשנ×\95ת את כל הרשאות המשתמש",
+       "action-userrights-interwiki": "×\9cשנ×\95ת הרשאות של משתמשים באתרי ויקי אחרים",
+       "action-siteadmin": "×\9c× ×¢×\95×\9c ×\90×\95 ×\9c×\91×\98×\9c ×\90ת ×\94× ×¢×\99×\9c×\94 ×©×\9c בסיס הנתונים",
+       "action-sendemail": "לשלוח דואר אלקטרוני למשתמשים",
+       "action-editmywatchlist": "לערוך את רשימת המעקב {{GENDER:|שלך|שלך|שלכם}}",
+       "action-viewmywatchlist": "לצפות ברשימת המעקב {{GENDER:|שלך|שלך|שלכם}}",
+       "action-viewmyprivateinfo": "לצפות במידע הפרטי {{GENDER:|שלך|שלך|שלכם}}",
+       "action-editmyprivateinfo": "לערוך את המידע הפרטי {{GENDER:|שלך|שלך|שלכם}}",
+       "action-editcontentmodel": "×\9cשנ×\95ת ×\90ת ×\9e×\95×\93×\9c ×\94ת×\95×\9b×\9f ×©×\9c ×\93פ×\99×\9d",
+       "action-managechangetags": "×\9c×\99צ×\95ר, ×\9c×\94פע×\99×\9c ×\90×\95 לבטל תגיות",
+       "action-applychangetags": "×\9c×\94×\97×\99×\9c ×ª×\92×\99×\95ת ×\99×\97×\93 ×¢×\9d ×©×\99× ×\95×\99×\99ם",
+       "action-changetags": "×\9c×\94×\95ס×\99×£ ×\90×\95 ×\9c×\94ס×\99ר ×ª×\92×\99×\95ת ×\9e×\92רס×\90×\95ת ×\95×\9eרשומות יומן",
        "action-deletechangetags": "למחוק תגיות מבסיס הנתונים",
        "nchanges": "{{PLURAL:$1|שינוי אחד|$1 שינויים}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|מאז ביקורך האחרון}}",
        "rcshowhidemine": "$1 עריכות שלי",
        "rcshowhidemine-show": "הצגת",
        "rcshowhidemine-hide": "הסתרת",
-       "rcshowhidecategorization": "$1 שינויים בקטגוריות של דפים",
+       "rcshowhidecategorization": "$1 שינויים בקטגוריות",
        "rcshowhidecategorization-show": "הצגת",
        "rcshowhidecategorization-hide": "הסתרת",
-       "rclinks": "×\94צ×\92ת $1 ×©×\99× ×\95×\99×\99×\9d ×\90×\97ר×\95× ×\99×\9d ×\91Ö¾$2 ×\94×\99×\9e×\99×\9d ×\94×\90×\97ר×\95× ×\99×\9d.<br /> $3",
+       "rclinks": "×\94צ×\92ת $1 ×\94ש×\99× ×\95×\99×\99×\9d ×\94×\90×\97ר×\95× ×\99×\9d ×\91Ö¾$2 ×\94×\99×\9e×\99×\9d ×\94×\90×\97ר×\95× ×\99×\9d<br />$3",
        "diff": "הבדל",
        "hist": "היסטוריה",
        "hide": "הסתרת",
        "ignorewarnings": "התעלמות מכל האזהרות",
        "minlength1": "שמות קבצים צריכים להיות בני תו אחד לפחות.",
        "illegalfilename": "שם הקובץ \"$1\" מכיל תווים שאינם מותרים בכותרות דפים.\nנא לשנות את השם ולנסות להעלותו שנית.",
-       "filename-toolong": "ש×\9e×\95ת ×§×\91צ×\99×\9d ×\9c×\90 ×\99×\9b×\95×\9c×\99×\9d ×\9c×\94×\99×\95ת ×\90ר×\95×\9b×\99×\9d ×\9eÖ¾240 ×\91תים.",
+       "filename-toolong": "ש×\9e×\95ת ×©×\9c ×§×\91צ×\99×\9d ×\9c×\90 ×\99×\9b×\95×\9c×\99×\9d ×\9c×\94×\99×\95ת ×\90ר×\95×\9b×\99×\9d ×\99×\95תר ×\9eÖ¾240 ×\91×\99×\99×\98ים.",
        "badfilename": "שם הקובץ שונה ל־\"$1\".",
        "filetype-mime-mismatch": "סיומת הקובץ \".$1\" אינה מתאימה לסוג ה־MIME שנמצא לקובץ זה ($2).",
        "filetype-badmime": "לא ניתן להעלות קבצים שסוג ה־MIME שלהם הוא \"$1\".",
        "upload-http-error": "התרחשה שגיאת HTTP‏: $1",
        "upload-copy-upload-invalid-domain": "העלאת קבצים משרת זה אינה אפשרית.",
        "upload-foreign-cant-upload": "באתר הוויקי הזה לא מופעלת האפשרות להעלאת קבצים למאגר הקבצים הזר המבוקש.",
+       "upload-foreign-cant-load-config": "טעינת ההגדרות הדרושות להעלאת קבצים למאגר הקבצים הזר נכשלה.",
+       "upload-dialog-disabled": "אין אפשרות להעלות קבצים באמצעות תיבת הדו־שיח הזאת באתר זה.",
        "upload-dialog-title": "העלאת קובץ",
        "upload-dialog-button-cancel": "ביטול",
        "upload-dialog-button-done": "בוצע",
        "backend-fail-closetemp": "לא הייתה אפשרות לסגור את הקובץ הזמני.",
        "backend-fail-read": "לא ניתן היה לקרוא את הקובץ \"$1\".",
        "backend-fail-create": "לא ניתן היה לכתוב את הקובץ \"$1\".",
-       "backend-fail-maxsize": "×\9c×\90 × ×\99ת×\9f ×\94×\99×\94 ×\9c×\9bת×\95×\91 ×\90ת ×\94ק×\95×\91×¥ \"$1\" ×\9b×\99×\95×\95×\9f ×©×\94×\95×\90 ×\92×\93×\95×\9c ×\99×\95תר {{PLURAL:$2|×\9e×\91×\99ת ×\90×\97×\93\9eÖ¾$2 ×\91תים}}.",
+       "backend-fail-maxsize": "×\9c×\90 × ×\99ת×\9f ×\94×\99×\94 ×\9c×\9bת×\95×\91 ×\90ת ×\94ק×\95×\91×¥ \"$1\" ×\9b×\99×\95×\95×\9f ×©×\94×\95×\90 ×\92×\93×\95×\9c ×\99×\95תר {{PLURAL:$2|×\9e×\91×\99×\99×\98 ×\90×\97×\93\9eÖ¾$2 ×\91×\99×\99×\98ים}}.",
        "backend-fail-readonly": "מאגר האחסון לקבצים \"$1\" הוא כרגע במצב קריאה בלבד. הסיבה שניתנה לכך היא: <em>$2</em>",
        "backend-fail-synced": "הקובץ \"$1\" נמצא במצב לא עקבי בתוך מאגרי אחסון הקבצים הפנימיים",
        "backend-fail-connect": "לא ניתן היה להתחבר למאגר אחסון הקבצים הפנימי \"$1\".",
        "mostimages": "הקבצים המקושרים ביותר",
        "mostinterwikis": "הדפים עם המספר הרב ביותר של קישורי בינוויקי",
        "mostrevisions": "הדפים עם מספר העריכות הגבוה ביותר",
-       "prefixindex": "כל דפים עם התחילית",
-       "prefixindex-namespace": "כל דפים עם התחילית (במרחב השם $1)",
+       "prefixindex": "×\9b×\9c ×\94×\93פ×\99×\9d ×¢×\9d ×\94ת×\97×\99×\9c×\99ת",
+       "prefixindex-namespace": "×\9b×\9c ×\94×\93פ×\99×\9d ×¢×\9d ×\94ת×\97×\99×\9c×\99ת (×\91×\9eר×\97×\91 ×\94ש×\9d $1)",
        "prefixindex-submit": "הצגה",
        "prefixindex-strip": "הסתרת התחילית ברשימה",
        "shortpages": "דפים קצרים",
        "protectedpages-unknown-timestamp": "לא ידוע",
        "protectedpages-unknown-performer": "משתמש לא ידוע",
        "protectedtitles": "כותרות מוגנות",
-       "protectedtitles-summary": "×\91×\93×£ ×\96×\94 ×¨×©×\95×\9e×\95ת ×\94×\9b×\95תר×\95ת ×©×\9e×\95×\92× ×\95ת ×\9bעת ×\9eפנ×\99 ×\99צ×\99ר×\94. ×\9cרש×\99×\9eת ×\94×\93פ×\99×\9d ×\94ק×\99×\99×\9e×\99×\9d ×©×\9e×\95×\92× ×\99×\9d, ×¨×\90×\95 [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
+       "protectedtitles-summary": "×\91×\93×£ ×\96×\94 ×¨×©×\95×\9e×\95ת ×\94×\9b×\95תר×\95ת ×©×\9c ×\94×\93פ×\99×\9d ×©×\9e×\95×\92× ×\99×\9d ×\9bעת ×\9eפנ×\99 ×\99צ×\99ר×\94. ×\9cרש×\99×\9eת ×\94×\93פ×\99×\9d ×\94ק×\99×\99×\9e×\99×\9d ×©×\9e×\95×\92× ×\99×\9d, {{GENDER:|ר×\90×\94|ר×\90×\99|ר×\90×\95}} [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "אין כרגע כותרות מוגנות עם הפרמטרים האלה.",
        "protectedtitles-submit": "הצגת הדפים",
        "listusers": "רשימת משתמשים",
        "activeusers-noresult": "לא נמצאו משתמשים.",
        "activeusers-submit": "הצגת משתמשים פעילים",
        "listgrouprights": "רשימת הרשאות לקבוצה",
-       "listgrouprights-summary": "×\96×\95×\94×\99 ×¨×©×\99×\9e×\94 ×©×\9c ×§×\91×\95צ×\95ת ×\94×\9eשת×\9eש ×\94×\9e×\95×\92×\93ר×\95ת ×\91×\90תר ×\96×\94, ×¢×\9d ×\94×\94רש×\90×\95ת ×©×\9c ×\9b×\9c ×\90×\97ת.\nמידע נוסף על ההרשאות ניתן למצוא [[{{MediaWiki:Listgrouprights-helppage}}|כאן]].",
+       "listgrouprights-summary": "×\96×\95×\94×\99 ×¨×©×\99×\9e×\94 ×©×\9c ×§×\91×\95צ×\95ת ×\94×\9eשת×\9eש ×\94×\9e×\95×\92×\93ר×\95ת ×\91×\90תר ×\96×\94, ×¢×\9d ×\94×\94רש×\90×\95ת ×©×\9c ×\9b×\9c ×§×\91×\95צ×\94.\nמידע נוסף על ההרשאות ניתן למצוא [[{{MediaWiki:Listgrouprights-helppage}}|כאן]].",
        "listgrouprights-key": "מקרא:\n* <span class=\"listgrouprights-granted\">הרשאה שהוענקה</span>\n* <span class=\"listgrouprights-revoked\">הרשאה שהוסרה</span>",
        "listgrouprights-group": "קבוצה",
        "listgrouprights-rights": "הרשאות",
        "listgrouprights-helppage": "Help:הרשאות",
        "listgrouprights-members": "(רשימת חברים)",
        "listgrouprights-right-display": "<span class=\"listgrouprights-granted\">$1 <code dir=\"ltr\">($2)</code></span>",
-       "listgrouprights-addgroup": "הוספת {{PLURAL:$2|הקבוצה|הקבוצות}}: $1",
-       "listgrouprights-removegroup": "הסרת {{PLURAL:$2|הקבוצה|הקבוצות}}: $1",
-       "listgrouprights-addgroup-all": "הוספת כל הקבוצות",
-       "listgrouprights-removegroup-all": "הסרת כל הקבוצות",
-       "listgrouprights-addgroup-self": "הוספת {{PLURAL:$2|הקבוצה|הקבוצות}} לחשבון האישי: $1",
-       "listgrouprights-removegroup-self": "הסרת {{PLURAL:$2|הקבוצה|הקבוצות}} מהחשבון האישי: $1",
-       "listgrouprights-addgroup-self-all": "×\94×\95ספת ×\9b×\9c ×\94ק×\91×\95צ×\95ת ×\9c×\97ש×\91×\95×\9f ×\94×\90×\99ש×\99",
-       "listgrouprights-removegroup-self-all": "×\94סרת ×\9b×\9c ×\94ק×\91×\95צ×\95ת ×\9e×\94×\97ש×\91×\95×\9f ×\94×\90×\99ש×\99",
+       "listgrouprights-addgroup": "הוספת משתמשים ל{{PLURAL:$2|קבוצה|קבוצות}}: $1",
+       "listgrouprights-removegroup": "הסרת משתמשים מה{{PLURAL:$2|קבוצה|קבוצות}}: $1",
+       "listgrouprights-addgroup-all": "×\94×\95ספת ×\9eשת×\9eש×\99×\9d ×\9c×\9b×\9c ×\94ק×\91×\95צ×\95ת",
+       "listgrouprights-removegroup-all": "×\94סרת ×\9eשת×\9eש×\99×\9d ×\9e×\9b×\9c ×\94ק×\91×\95צ×\95ת",
+       "listgrouprights-addgroup-self": "הוספת המשתמש עצמו ל{{PLURAL:$2|קבוצה|קבוצות}}: $1",
+       "listgrouprights-removegroup-self": "הסרת המשתמש עצמו מה{{PLURAL:$2|קבוצה|קבוצות}}: $1",
+       "listgrouprights-addgroup-self-all": "×\94×\95ספת ×\94×\9eשת×\9eש ×¢×¦×\9e×\95 ×\9c×\9b×\9c ×\94ק×\91×\95צ×\95ת",
+       "listgrouprights-removegroup-self-all": "×\94סרת ×\94×\9eשת×\9eש ×¢×¦×\9e×\95 ×\9e×\9b×\9c ×\94ק×\91×\95צ×\95ת",
        "listgrouprights-namespaceprotection-header": "הגבלות על מרחבי שם",
        "listgrouprights-namespaceprotection-namespace": "מרחב השם",
        "listgrouprights-namespaceprotection-restrictedto": "ההרשאה או ההרשאות המאפשרות למשתמשים לערוך",
        "wlshowhideanons": "משתמשים אנונימיים",
        "wlshowhidepatr": "עריכות בדוקות",
        "wlshowhidemine": "עריכות שלי",
-       "wlshowhidecategorization": "שינויים בקטגוריות של דפים",
+       "wlshowhidecategorization": "שינויים בקטגוריות",
        "watchlist-options": "אפשרויות ברשימת המעקב",
        "watching": "בהוספה לרשימת המעקב...",
        "unwatching": "בהסרה מרשימת המעקב...",
        "restriction-level": "רמת ההגנה:",
        "minimum-size": "גודל מינימלי",
        "maximum-size": "גודל מרבי:",
-       "pagesize": "(×\91×\91תים)",
+       "pagesize": "(×\91×\91×\99×\99×\98ים)",
        "restriction-edit": "עריכה",
        "restriction-move": "העברה",
        "restriction-create": "יצירה",
        "viewdeletedpage": "הצגה של דפים מחוקים",
        "undeletepagetext": "{{PLURAL:$1|הדף שלהלן נמחק, אך הוא עדיין בארכיון וניתן לשחזר אותו|הדפים שלהלן נמחקו, אך הם עדיין בארכיון וניתן לשחזר אותם}}.\nייתכן שהארכיון ינוקה מעת לעת.",
        "undelete-fieldset-title": "שחזור גרסאות",
-       "undeleteextrahelp": "כדי לשחזר את היסטוריית הגרסאות המלאה של הדף, אל {{GENDER:|תסמן|תסמני|תסמנו}} שום תיבת סימון; פשוט {{GENDER:|לחץ|לחצי|לחצו}} על <strong><em>{{int:undeletebtn}}</em></strong>.\nכדי לשחזר גרסאות מסוימות בלבד, {{GENDER:|סמן|סמני|סמנו}} את הגרסאות ש{{GENDER:|ברצונך|ברצונך|ברצונכם}} לשחזר ולאחר מכן {{GENDER:|לחץ|לחצי|לחצו}} על <strong><em>{{int:undeletebtn}}</em></strong>.",
+       "undeleteextrahelp": "כדי לשחזר את היסטוריית הגרסאות המלאה של הדף, אל {{GENDER:|תסמן|תסמני|תסמנו}} שום תיבת סימון; פשוט {{GENDER:|לחץ|לחצי|לחצו}} על <strong>{{int:undeletebtn}}</strong>.\nכדי לשחזר גרסאות מסוימות בלבד, {{GENDER:|סמן|סמני|סמנו}} את הגרסאות ש{{GENDER:|ברצונך|ברצונך|ברצונכם}} לשחזר ולאחר מכן {{GENDER:|לחץ|לחצי|לחצו}} על <strong>{{int:undeletebtn}}</strong>.",
        "undeleterevisions": "{{PLURAL:$1|גרסה אחת נמחקה|$1 גרסאות נמחקו}}",
        "undeletehistory": "אם {{GENDER:|תשחזר|תשחזרי|תשחזרו}} את הדף, הגרסאות ישוחזרו להיסטוריית השינויים שלו.\nאם הדף הזה נמחק בעבר ולאחר מכן נוצר מחדש, הגרסאות ש{{GENDER:|תשחזר|תשחזרי|תשחזרו}} ימוזגו להיסטוריית השינויים של הדף ויופיעו בתור הגרסאות הישנות ביותר שלו.",
        "undeleterevdel": "השחזור לא יכול להתבצע אם הגרסה האחרונה של הדף מחוקה או מוסתרת.\nבמקרה כזה, יש לבטל קודם את ההסתרה של הגרסה האחרונה.",
        "sp-contributions-username": "כתובת IP או שם משתמש:",
        "sp-contributions-toponly": "הצגת עריכות שהן הגרסאות האחרונות בלבד",
        "sp-contributions-newonly": "הצגת עריכות שהן יצירות של דפים בלבד",
+       "sp-contributions-hideminor": "הסתרת עריכות משניות",
        "sp-contributions-submit": "חיפוש",
        "whatlinkshere": "דפים המקושרים לכאן",
        "whatlinkshere-title": "דפים המקשרים לדף \"$1\"",
        "autoblockid": "חסימה אוטומטית #$1",
        "block": "חסימת משתמש",
        "unblock": "שחרור חסימה של משתמש",
-       "blockip": "חסימת {{GENDER:$1|משתמש|משתמשת}}",
+       "blockip": "חסימת ה{{GENDER:$1|משתמש|משתמשת}}",
        "blockip-legend": "חסימת משתמש",
        "blockiptext": "השתמשו בטופס שלהלן כדי לחסום את הרשאות הכתיבה מכתובת IP או משתמש מסוימים.\nחסימות כאלה צריכות להתבצע רק כדי למנוע השחתה, ובהתאם ל[[{{MediaWiki:Policy-url}}|נהלים]].\nאנא מלאו את הסיבה הפרטנית לחסימה להלן (לדוגמה, באמצעות ציון דפים מסוימים שהשחית המשתמש).\nבאפשרותכם לחסום טווחי כתובות IP באמצעות תחביר [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; הטווח הגדול ביותר שניתן לחסום הוא <span dir=\"ltr\">/$1</span> עבור IPv4 ו־<span dir=\"ltr\">/$2</span> עבור IPv6.",
        "ipaddressorusername": "כתובת IP או שם משתמש:",
        "ipblocklist-localblock": "חסימה מקומית",
        "ipblocklist-otherblocks": "{{PLURAL:$1|חסימה אחרת|חסימות אחרות}}",
        "infiniteblock": "ללא הגבלת זמן",
-       "expiringblock": "החסימה פוקעת ב{{GRAMMAR:תחילית|$1}} בשעה $2",
+       "expiringblock": "החסימה פוקעת ב־$1 בשעה $2",
        "anononlyblock": "משתמשים אנונימיים בלבד",
        "noautoblockblock": "חסימה אוטומטית מבוטלת",
        "createaccountblock": "יצירת חשבונות נחסמה",
        "move-page-legend": "העברת דף",
        "movepagetext": "{{GENDER:|השתמש|השתמשי|השתמשו}} בטופס שלהלן כדי לשנות את השם של הדף הזה, ולהעביר את כל היסטוריית העריכות שלו לשם החדש.\nהשם הישן יהפוך לדף הפניה אל השם החדש.\n{{GENDER:|באפשרותך|באפשרותך|באפשרותכם}} לעדכן באופן אוטומטי דפי הפניה שכרגע מפנים לשם הנוכחי של הדף.\nאם {{GENDER:|תבחר|תבחרי|תבחרו}} לא לעשות זאת, אנא {{GENDER:|ודא|ודאי|ודאו}} לאחר ההעברה שאין [[Special:DoubleRedirects|הפניות כפולות]] או [[Special:BrokenRedirects|הפניות שבורות]].\nב{{GENDER:|אחריותך|אחריותך|אחריותכם}} לוודא שכל הקישורים ימשיכו לקשר למקומות שאליהם הם אמורים לקשר.\n\n{{GENDER:|שים|שימי|שימו}} לב שהדף <strong>לא</strong> יועבר אם כבר יש דף תחת השם החדש ש{{GENDER:|תבחר|תבחרי|תבחרו}}, אלא אם כן הדף עם השם החדש הוא הפניה ואין לו עריכות קודמות.\nזה אומר ש{{GENDER:|תוכל|תוכלי|תוכלו}} להחזיר את הדף לשם המקורי במקרה שתיעשה טעות, אבל לא ניתן \"לדרוס\" דף קיים.\n\n<strong>לתשומת {{GENDER:|לבך|לבך|לבכם}}:</strong>\nהעברה זו עלולה להיות שינוי דרסטי ומהותי לדף פופולרי;\nאנא {{GENDER:|ודא שאתה מבין|ודאי שאת מבינה|ודאו שאתם מבינים}} את התוצאות של הפעולה הזאת לפני ביצוע ההעברה.",
        "movepagetext-noredirectfixer": "{{GENDER:|השתמש|השתמשי|השתמשו}} בטופס שלהלן כדי לשנות את השם של הדף הזה, ולהעביר את כל היסטוריית העריכות שלו לשם החדש.\nהשם הישן יהפוך לדף הפניה אל השם החדש.\nאנא {{GENDER:|ודא|ודאי|ודאו}} לאחר ההעברה שאין [[Special:DoubleRedirects|הפניות כפולות]] או [[Special:BrokenRedirects|הפניות שבורות]].\nב{{GENDER:|אחריותך|אחריותך|אחריותכם}} לוודא שכל הקישורים ימשיכו לקשר למקומות שאליהם הם אמורים לקשר.\n\n{{GENDER:|שים|שימי|שימו}} לב שהדף <strong>לא</strong> יועבר אם כבר יש דף תחת השם החדש ש{{GENDER:|תבחר|תבחרי|תבחרו}}, אלא אם כן הדף עם השם החדש הוא הפניה ואין לו עריכות קודמות.\nזה אומר ש{{GENDER:|תוכל|תוכלי|תוכלו}} להחזיר את הדף לשם המקורי במקרה שתיעשה טעות, אבל לא ניתן \"לדרוס\" דף קיים.\n\n<strong>לתשומת {{GENDER:|לבך|לבך|לבכם}}:</strong>\nהעברה זו עלולה להיות שינוי דרסטי ומהותי לדף פופולרי;\nאנא {{GENDER:|ודא שאתה מבין|ודאי שאת מבינה|ודאו שאתם מבינים}} את התוצאות של הפעולה הזאת לפני ביצוע ההעברה.",
-       "movepagetalktext": "×\90×\9d ×\94ת×\99×\91×\94 ×\94×\96×\90ת ×\9eס×\95×\9eנת, ×\93×£ ×\94ש×\99×\97×\94 ×©×\9c ×\93×£ ×\96×\94 ×\99×\95×¢×\91ר ×\90×\95×\98×\95×\9e×\98×\99ת ×\9c×\9b×\95תרת ×\94×\97×\93ש×\94, ×\90×\9c×\90 ×\90×\9d ×§×\99×\99×\9d ×©×\9d ×\93×£ ×©×\99×\97×\94 ×©×\90×\99× ×\95 ×¨×\99ק.\n\n×\91×\9eקר×\94 ×\94×\96×\94, ×ª×¦×\98ר×\9b×\95 ×\9c×\94×¢×\91×\99ר ×\90×\95 ×\9cש×\9c×\91 ×\90ת ×\94×\93פ×\99×\9d ×\91×\90×\95פ×\9f ×\99×\93× ×\99, ×\90×\9d ×ª×¨×¦×\95.",
+       "movepagetalktext": "×\90×\9d ×\94×\90פשר×\95ת ×\94×\96×\90ת ×\9eס×\95×\9eנת, ×\93×£ ×\94ש×\99×\97×\94 ×©×\9c ×\94×\93×£ ×\94×\96×\94 ×\99×\95×¢×\91ר ×\90×\95×\98×\95×\9e×\98×\99ת ×\9cש×\9d ×\94×\97×\93ש, ×\90×\9c×\90 ×\90×\9d ×§×\99×\99×\9d ×\93×£ ×©×\99×\97×\94 ×©×\90×\99× ×\95 ×¨×\99ק ×ª×\97ת ×\94ש×\9d ×\94×\97×\93ש. ×\91×\9eקר×\94 ×\9b×\96×\94, ×\99ש ×\9c×\94×¢×\91×\99ר ×\90×\95 ×\9c×\9e×\96×\92 ×\90ת ×\94×\93פ×\99×\9d ×\91×\90×\95פ×\9f ×\99×\93× ×\99, ×\91×\9e×\99×\93ת ×\94צ×\95ר×\9a.",
        "moveuserpage-warning": "'''אזהרה:''' אתם עומדים להעביר דף משתמש. שימו לב שרק הדף יועבר וששם המשתמש '''לא''' ישתנה.",
        "movecategorypage-warning": "<strong>אזהרה:</strong> אתם עומדים להעביר דף קטגוריה. שימו לב שרק הדף יועבר ושכל הדפים בקטגוריה הישנה <strong>לא</strong> יסווגו לקטגוריה החדשה.",
        "movenologintext": "עליכם להיות רשומים ו[[Special:UserLogin|להיכנס לחשבון]] כדי להעביר דפים.",
        "move-watch": "מעקב אחרי דף המקור ואחרי דף היעד",
        "movepagebtn": "העברת הדף",
        "pagemovedsub": "ההעברה הושלמה בהצלחה",
-       "movepage-moved": "הדף \"$1\" הועבר לשם \"$2\".",
+       "movepage-moved": "<strong>הדף \"$1\" הועבר לשם \"$2\"</strong>",
        "movepage-moved-redirect": "נוצרה הפניה.",
        "movepage-moved-noredirect": "יצירת ההפניה בוטלה.",
        "articleexists": "קיים כבר דף באותו שם, או שהשם שבחרת אינו תקין.\nנא לבחור שם אחר.",
        "movepage-page-unmoved": "לא ניתן להעביר את הדף $1 לשם $2.",
        "movepage-max-pages": "{{PLURAL:$1|דף אחד כבר הועבר|$1 דפים כבר הועברו}}. זה המספר המרבי ולא ניתן להעביר דפים נוספים אוטומטית.",
        "movelogpage": "יומן העברות",
-       "movelogpagetext": "×\9c×\94×\9c×\9f ×¨×©×\99×\9e×\94 ×©×\9c ×\9b×\9c ×\94×\93פ×\99×\9d ×©×\94×\95×¢×\91ר×\95.",
+       "movelogpagetext": "×\9c×\94×\9c×\9f ×¨×©×\99×\9e×\94 ×©×\9c ×\9b×\9c ×\94×\93פ×\99×\9d ×©×©×\9e×\9d ×©×\95Ö¼× ×\94.",
        "movesubpage": "{{PLURAL:$1|דף משנה|דפי משנה}}",
        "movesubpagetext": "לדף זה יש {{PLURAL:$1|דף משנה אחד המוצג להלן|$1 דפי משנה המוצגים להלן}}.",
        "movenosubpage": "לדף זה אין דפי משנה.",
        "fix-double-redirects": "עדכון הפניות לכותרת הדף המקורית",
        "move-leave-redirect": "השארת הפניה בדף המקורי",
        "protectedpagemovewarning": "'''אזהרה:''' דף זה מוגן כך שרק מפעילי מערכת יכולים להעביר אותו.\nפעולת היומן האחרונה מוצגת להלן:",
-       "semiprotectedpagemovewarning": "'''הערה:''' דף זה מוגן כך שרק משתמשים רשומים יכולים להעביר אותו.\nפעולת היומן האחרונה מוצגת להלן:",
+       "semiprotectedpagemovewarning": "<strong>הערה:</strong> דף זה מוגן כך שרק משתמשים רשומים יכולים להעביר אותו.\nפעולת היומן האחרונה מוצגת להלן:",
        "move-over-sharedrepo": "[[:$1]] כבר קיים במאגר משותף. העברת הקובץ לכותרת זו תדרוס את הקובץ המשותף.",
        "file-exists-sharedrepo": "קובץ בשם שנבחר כבר קיים כקובץ משותף.\nיש לבחור שם אחר.",
        "export": "ייצוא דפים",
        "tooltip-pt-userpage": "דף {{GENDER:|המשתמש|המשתמשת}} שלך",
        "tooltip-pt-anonuserpage": "דף המשתמש של משתמש אנונימי זה",
        "tooltip-pt-mytalk": "דף השיחה שלך",
-       "tooltip-pt-anontalk": "×\93×\99×\95×\9f ×¢×\9c ×\94ער×\99×\9b×\95ת ×©× ×¢×©×\95 ×\9e×\9b×\95תבת ה־IP הזאת",
+       "tooltip-pt-anontalk": "×\93×\99×\95×\9f ×¢×\9c ×\94ער×\99×\9b×\95ת ×©× ×¢×©×\95 ×\9e×\9bת×\95בת ה־IP הזאת",
        "tooltip-pt-preferences": "ההעדפות שלך",
        "tooltip-pt-watchlist": "רשימת הדפים ש{{GENDER:|אתה עוקב|את עוקבת}} אחרי השינויים בהם",
-       "tooltip-pt-mycontris": "רש×\99×\9eת ×\94תר×\95×\9e×\95ת ×©×\9c×\9a",
+       "tooltip-pt-mycontris": "רש×\99×\9eת ×\94ער×\99×\9b×\95ת ×©×\91×\99צעת",
        "tooltip-pt-anoncontribs": "רשימת העריכות שנעשו מכתובת ה־IP הזאת",
-       "tooltip-pt-login": "×\9e×\95×\9e×\9c×¥ ×\9c×\94×\99×\9bנס ×\9c×\97ש×\91×\95×\9f, ×\90×\91×\9c ×\9c×\90 חובה לעשות זאת",
+       "tooltip-pt-login": "×\9e×\95×\9e×\9c×¥ ×\9c×\94×\99×\9bנס ×\9c×\97ש×\91×\95×\9f, ×\90×\9a ×\90×\99×\9f חובה לעשות זאת",
        "tooltip-pt-logout": "יציאה מהחשבון",
-       "tooltip-pt-createaccount": "×\9e×\95×\9e×\9c×¥ ×\9c×\99צ×\95ר ×\97ש×\91×\95×\9f ×\95×\9c×\94×\99×\9bנס ×\90×\9c×\99×\95, ×\90×\91×\9c ×\9c×\90 חובה לעשות זאת",
+       "tooltip-pt-createaccount": "×\9e×\95×\9e×\9c×¥ ×\9c×\99צ×\95ר ×\97ש×\91×\95×\9f ×\95×\9c×\94×\99×\9bנס ×\90×\9c×\99×\95, ×\90×\9a ×\90×\99×\9f חובה לעשות זאת",
        "tooltip-ca-talk": "שיחה על דף זה",
        "tooltip-ca-edit": "עריכת דף זה",
        "tooltip-ca-addsection": "הוספת פסקה חדשה",
        "tooltip-ca-move": "שינוי השם של דף זה",
        "tooltip-ca-watch": "הוספת דף זה לרשימת המעקב שלך",
        "tooltip-ca-unwatch": "הסרת דף זה מרשימת המעקב שלך",
-       "tooltip-search": "חיפוש ב{{grammar:תחילית|{{SITENAME}}}}",
+       "tooltip-search": "חיפוש ב{{GRAMMAR:תחילית|{{SITENAME}}}}",
        "tooltip-search-go": "מעבר לדף בשם הזה בדיוק, אם הוא קיים",
        "tooltip-search-fulltext": "חיפוש טקסט זה בדפים",
        "tooltip-p-logo": "ביקור בעמוד הראשי",
        "tooltip-n-mainpage": "ביקור בעמוד הראשי",
        "tooltip-n-mainpage-description": "ביקור בעמוד הראשי",
-       "tooltip-n-portal": "×\90×\95×\93×\95ת ×\94×\9e×\99×\96×\9d, ×\9b×\99צ×\93 ×ª×\95×\9b×\9c×\95 ×\9c×¢×\96×\95ר, ×\94×\99×\9b×\9f למצוא דברים",
+       "tooltip-n-portal": "×\90×\95×\93×\95ת ×\94×\9e×\99×\96×\9d, ×\90×\99×\9a ×\90פשר ×\9c×¢×\96×\95ר, ×\90×\99פ×\94 למצוא דברים",
        "tooltip-n-currentevents": "מציאת מידע רקע על האירועים האחרונים",
        "tooltip-n-recentchanges": "רשימת השינויים האחרונים באתר",
        "tooltip-n-randompage": "טעינת דף אקראי",
        "tooltip-n-help": "עזרה בשימוש באתר",
-       "tooltip-t-whatlinkshere": "רש×\99×\9eת ×\9b×\9c ×\94×\93פ×\99×\9d ×\94×\9eק×\95שר×\99×\9d ×\9c×\9b×\90×\9f",
+       "tooltip-t-whatlinkshere": "רש×\99×\9e×\94 ×©×\9c ×\9b×\9c ×\94×\93פ×\99×\9d ×©×\9e×\9b×\99×\9c×\99×\9d ×§×\99ש×\95ר×\99×\9d ×\9c×\93×£ ×\94×\96×\94",
        "tooltip-t-recentchangeslinked": "השינויים האחרונים שבוצעו בדפים המקושרים מדף זה",
        "tooltip-feed-rss": "הזנת RSS עבור דף זה",
        "tooltip-feed-atom": "הזנת Atom עבור דף זה",
        "tooltip-t-emailuser": "שליחת דואר אלקטרוני {{GENDER:$1|למשתמש זה|למשתמשת זו}}",
        "tooltip-t-info": "מידע נוסף על דף זה",
        "tooltip-t-upload": "העלאת קבצים",
-       "tooltip-t-specialpages": "רשימה של כל הדפים המיוחדים",
+       "tooltip-t-specialpages": "רשימה של כל הדפים המיוחדים באתר",
        "tooltip-t-print": "גרסה להדפסה של דף זה",
        "tooltip-t-permalink": "קישור קבוע לגרסה זו של הדף",
        "tooltip-ca-nstab-main": "צפייה בדף התוכן",
        "pageinfo-header-properties": "מאפייני הדף",
        "pageinfo-display-title": "כותרת התצוגה",
        "pageinfo-default-sort": "מפתח המיון הרגיל",
-       "pageinfo-length": "×\90×\95ר×\9a ×\94×\93×£ (×\91×\91תים)",
+       "pageinfo-length": "×\90×\95ר×\9a ×\94×\93×£ (×\91×\91×\99×\99×\98ים)",
        "pageinfo-article-id": "מזהה הדף",
        "pageinfo-language": "שפת התוכן של הדף",
-       "pageinfo-content-model": "ס×\95×\92 התוכן של הדף",
+       "pageinfo-content-model": "×\9e×\95×\93×\9c התוכן של הדף",
        "pageinfo-robot-policy": "איסוף על־ידי רובוטים של מנועי חיפוש",
        "pageinfo-robot-index": "מותר",
        "pageinfo-robot-noindex": "אסור",
        "table_pager_limit_label": "מספר פריטים בדף:",
        "table_pager_limit_submit": "הצגה",
        "table_pager_empty": "ללא תוצאות",
-       "autosumm-blank": "×\94סרת ×\9b×\9c ×\94ת×\95×\9b×\9f ×\9e×\93×£ ×\96×\94",
+       "autosumm-blank": "×\94סרת ×\9b×\9c ×\94ת×\95×\9b×\9f ×\9e×\94×\93×£",
        "autosumm-replace": "החלפת הדף בתוכן \"$1\"",
        "autoredircomment": "הפניה לדף [[$1]]",
        "autosumm-new": "יצירת דף עם התוכן \"$1\"",
        "size-kilobytes": "{{PLURAL:$1|קילו־בייט אחד|$1 קילו־בייטים}}",
        "size-megabytes": "{{PLURAL:$1|מגה־בייט אחד|$1 מגה־בייטים}}",
        "size-gigabytes": "{{PLURAL:$1|ג'יגה־בייט אחד|$1 ג'יגה־בייטים}}",
-       "size-terabytes": "$1 טרה־בייט",
+       "size-terabytes": "{{PLURAL:$1|טרה־בייט אחד|$1 טרה־בייטים}}",
        "size-petabytes": "{{PLURAL:$1|פטה־בייט אחד|$1 פטה־בייטים}}",
        "size-exabytes": "{{PLURAL:$1|אקסה־בייט אחד|$1 אקסה־בייטים}}",
-       "size-zetabytes": "$1 זטה־בייט",
-       "size-yottabytes": "$1 יוטה־בייט",
+       "size-zetabytes": "{{PLURAL:$1|זטה־בייט אחד|$1 זטה־בייטים}}",
+       "size-yottabytes": "{{PLURAL:$1|יוטה־בייט אחד|$1 יוטה־בייטים}}",
        "size-pixel": "{{PLURAL:$1|פיקסל אחד|$1 פיקסלים}}",
        "size-kilopixel": "{{PLURAL:$1|קילו־פיקסל אחד|$1 קילו־פיקסלים}}",
        "size-megapixel": "{{PLURAL:$1|מגה־פיקסל אחד|$1 מגה־פיקסלים}}",
        "size-gigapixel": "{{PLURAL:$1|ג'יגה־פיקסל אחד|$1 ג'יגה־פיקסלים}}",
+       "size-terapixel": "{{PLURAL:$1|טרה־פיקסל אחד|$1 טרה־פיקסלים}}",
+       "size-petapixel": "{{PLURAL:$1|פטה־פיקסל אחד|$1 פטה־פיקסלים}}",
        "size-exapixel": "{{PLURAL:$1|אקסה־פיקסל אחד|$1 אקסה־פיקסלים}}",
+       "size-zetapixel": "{{PLURAL:$1|זטה־פיקסל אחד|$1 זטה־פיקסלים}}",
+       "size-yottapixel": "{{PLURAL:$1|יוטה־פיקסל אחד|$1 יוטה־פיקסלים}}",
        "lag-warn-normal": "שינויים שבוצעו לפני פחות מ{{PLURAL:$1|שנייה אחת|־$1 שניות}} אינם מוצגים ברשימה זו.",
        "lag-warn-high": "בגלל עיכוב בעדכון בסיס הנתונים, שינויים שבוצעו לפני פחות מ{{PLURAL:$1|שנייה אחת|־$1 שניות}} אינם מוצגים ברשימה זו.",
        "watchlistedit-normal-title": "עריכת רשימת המעקב",
        "limitreport-ppvisitednodes": "מספר הצמתים שקדם־המפענח ביקר בהם",
        "limitreport-ppgeneratednodes": "מספר הצמתים שקדם־המפענח יצר",
        "limitreport-postexpandincludesize": "גודל הטקסט המוכלל לאחר הפריסה",
-       "limitreport-postexpandincludesize-value": "{{PLURAL:$2|$1 ×\9eת×\95×\9a ×\91×\99ת ×\90×\97×\93|$1/$2 ×\91תים}}",
+       "limitreport-postexpandincludesize-value": "{{PLURAL:$2|$1 ×\9eת×\95×\9a ×\91×\99×\99×\98 ×\90×\97×\93|$1/$2 ×\91×\99×\99×\98ים}}",
        "limitreport-templateargumentsize": "גודל הפרמטרים של התבניות",
-       "limitreport-templateargumentsize-value": "{{PLURAL:$2|$1 ×\9eת×\95×\9a ×\91×\99ת ×\90×\97×\93|$1/$2 ×\91תים}}",
+       "limitreport-templateargumentsize-value": "{{PLURAL:$2|$1 ×\9eת×\95×\9a ×\91×\99×\99×\98 ×\90×\97×\93|$1/$2 ×\91×\99×\99×\98ים}}",
        "limitreport-expansiondepth": "עומק הפריסה הגבוה ביותר",
        "limitreport-expensivefunctioncount": "מספר פונקציות המפענח שגוזלות משאבים",
        "expandtemplates": "פריסת תבניות",
        "pagelang-use-default": "להשתמש בשפה הרגילה",
        "pagelang-select-lang": "בחירת שפה",
        "pagelang-submit": "שליחה",
-       "right-pagelang": "ש×\99× ×\95×\99 ×©×¤×ª ×\94×\93×£",
+       "right-pagelang": "ש×\99× ×\95×\99 ×©×¤×\95ת ×©×\9c ×\93פ×\99×\9d",
        "action-pagelang": "לשנות את שפת הדף",
        "log-name-pagelang": "יומן שינוי שפה",
        "log-description-pagelang": "זהו יומן של שינויים בשפות של הדפים.",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>מבוטל</strong>)",
        "mediastatistics": "סטטיסטיקות קבצים",
        "mediastatistics-summary": "סטטיסטיקה על סוגי קבצים שהועלו. הסטטיסטיקה כוללת רק את הגרסה החדשה ביותר של הקובץ: גרסאות ישנות או מחוקות של קבצים אינן כלולות.",
-       "mediastatistics-nbytes": "{{PLURAL:$1|×\91×\99ת ×\90×\97×\93|$1 ×\91תים}} ($2; $3%)",
-       "mediastatistics-bytespertype": "×\94×\92×\95×\93×\9c ×\94×\9b×\95×\9c×\9c ×©×\9c ×\94ק×\91צ×\99×\9d ×\91פרק ×\96×\94: {{PLURAL:$1|×\91×\99ת ×\90×\97×\93|$1 ×\91תים}} ($2; $3%).",
-       "mediastatistics-allbytes": "×\94×\92×\95×\93×\9c ×\94×\9b×\95×\9c×\9c ×©×\9c ×\9b×\9c ×\94ק×\91צ×\99×\9d: {{PLURAL:$1|×\91×\99ת ×\90×\97×\93|$1 ×\91תים}} ($2).",
+       "mediastatistics-nbytes": "{{PLURAL:$1|×\91×\99×\99×\98 ×\90×\97×\93|$1 ×\91×\99×\99×\98ים}} ($2; $3%)",
+       "mediastatistics-bytespertype": "×\94×\92×\95×\93×\9c ×\94×\9b×\95×\9c×\9c ×©×\9c ×\94ק×\91צ×\99×\9d ×\91פרק ×\96×\94: {{PLURAL:$1|×\91×\99×\99×\98 ×\90×\97×\93|$1 ×\91×\99×\99×\98ים}} ($2; $3%).",
+       "mediastatistics-allbytes": "×\94×\92×\95×\93×\9c ×\94×\9b×\95×\9c×\9c ×©×\9c ×\9b×\9c ×\94ק×\91צ×\99×\9d: {{PLURAL:$1|×\91×\99×\99×\98 ×\90×\97×\93|$1 ×\91×\99×\99×\98ים}} ($2).",
        "mediastatistics-table-mimetype": "סוג MIME",
        "mediastatistics-table-extensions": "סיומות אפשריות",
        "mediastatistics-table-count": "מספר הקבצים",
        "mw-widgets-dateinput-no-date": "לא נבחר תאריך",
        "mw-widgets-titleinput-description-new-page": "הדף עדיין לא קיים",
        "mw-widgets-titleinput-description-redirect": "הפניה ל{{GRAMMAR:תחילית|$1}}",
-       "api-error-blacklisted": "נא לבחור כותרת אחרת, המתארת טוב יותר את התוכן.",
        "sessionmanager-tie": "לא ניתן לצרף מספר סוגי אימות זהות: $1.",
        "sessionprovider-generic": "התחברויות של $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "התחברויות המבוססות על עוגיות",
        "log-action-filter-patrol": "סוג הסימונים של השינויים כבדוקים:",
        "log-action-filter-protect": "סוג ההגנות:",
        "log-action-filter-rights": "סוג שינויי ההרשאות:",
-       "log-action-filter-suppress": "סוג ההעלמות",
+       "log-action-filter-suppress": "סוג ההעלמות:",
        "log-action-filter-upload": "סוג ההעלאות:",
        "log-action-filter-all": "הכול",
        "log-action-filter-block-block": "חסימות",
        "log-action-filter-suppress-delete": "העלמות של דפים",
        "log-action-filter-suppress-block": "העלמות של משתמשים באמצעות חסימה",
        "log-action-filter-suppress-reblock": "העלמות של משתמשים באמצעות חסימה מחדש",
-       "log-action-filter-upload-upload": "×\94×¢×\9c×\90×\95ת ×\97×\93ש×\95ת",
+       "log-action-filter-upload-upload": "×\94×¢×\9c×\90×\95ת ×©×\9c ×§×\91צ×\99×\9d ×\97×\93ש×\99×\9d",
        "log-action-filter-upload-overwrite": "דריסות של קבצים קיימים",
        "authmanager-authn-not-in-progress": "האימות נכשל או שנתוני הפעולה נאבדו. נא להתחיל את התהליך מחדש.",
        "authmanager-authn-no-primary": "לא ניתן היה לאמת את האישורים שסופקו.",
        "linkaccounts-success-text": "החשבון קושר.",
        "linkaccounts-submit": "קישור החשבונות",
        "unlinkaccounts": "ביטול הקישור של החשבונות",
-       "unlinkaccounts-success": "קישור החשבון בוטל."
+       "unlinkaccounts-success": "קישור החשבון בוטל.",
+       "authenticationdatachange-ignored": "השינוי בנתוני האימות לא הצליח. ייתכן שלא הוגדר ספק."
 }
index e101e44..68eb647 100644 (file)
                        "Srdjan m",
                        "Teoo3",
                        "Matma Rex",
-                       "Vrhnje"
+                       "Vrhnje",
+                       "Ivi104"
                ]
        },
-       "tog-underline": "Podcrtane poveznice",
+       "tog-underline": "Podcrtavanje poveznica",
        "tog-hideminor": "Sakrij manje izmjene u nedavnim promjenama",
        "tog-hidepatrolled": "Sakrij pregledane izmjene u nedavnim promjenama",
        "tog-newpageshidepatrolled": "Sakrij pregledane stranice iz popisa novih stranica",
@@ -76,7 +77,7 @@
        "tog-ccmeonemails": "Pošalji mi kopiju e-maila kojeg pošaljem drugim suradnicima",
        "tog-diffonly": "Ne prikazuj sadržaj stranice prilikom usporedbe inačica",
        "tog-showhiddencats": "Prikaži skrivene kategorije",
-       "tog-norollbackdiff": "Izostavi razliku nakon upotrebe ukloni",
+       "tog-norollbackdiff": "Izostavi razliku nakon vraćanja",
        "tog-useeditwarning": "Upozori me kad napuštam stranicu za uređivanje bez spremanja izmjena",
        "tog-prefershttps": "Uvijek koristi sigurnu vezu kod prijave",
        "underline-always": "Uvijek",
        "readonly_lag": "Baza podataka je automatski zaključana dok se sekundarni bazni poslužitelji ne usklade s glavnim",
        "internalerror": "Pogreška sustava",
        "internalerror_info": "Interna pogrješka: $1",
+       "internalerror-fatal-exception": "Terminalna pogreška \"$1\"",
        "filecopyerror": "Ne mogu kopirati datoteku \"$1\" u \"$2\".",
        "filerenameerror": "Ne mogu preimenovati datoteku \"$1\" u \"$2\".",
        "filedeleteerror": "Ne mogu obrisati datoteku \"$1\".",
        "cannotdelete": "Ne može se obrisati stranica ili datoteka \"$1\".\nMoguće je da ju je netko drugi već obrisao.",
        "cannotdelete-title": "Brisanje stranice \"$1\" nije moguće",
        "delete-hook-aborted": "Brisanje prekinuto softverskim priključkom (hook).\nNema obrazloženja ili poruke o pogrješci.",
+       "no-null-revision": "Ne mogu stvoriti praznu izmjenu stranice \"$1\"",
        "badtitle": "Loš naslov",
        "badtitletext": "Navedeni naslov stranice nepravilan ili loše formirana interwiki poveznica.",
        "title-invalid-empty": "Naslov tražene stranice je prazan ili sadrži samo naziv prostora imena.",
        "title-invalid-interwiki": "Traženi naziv stranice sadrži interwiki poveznicu koja se ne može koristiti u nazivima.",
        "title-invalid-talk-namespace": "Traženi naziv stranice odnosi se na stranicu rasprave koja ne može postojati.",
        "title-invalid-characters": "Traženi naziv stranice sadrži nevažeće znakove: \"$1\"",
+       "title-invalid-relative": "Naslov ima relativan put. Relativni putovi u naslovu su nevažeći, jer ih web pretraživač često ne može doseći.",
+       "title-invalid-too-long": "Naslov stranice je predugačak. Naslov ne smije biti duži od $1 {{PLURAL:$1|bajt|bajtova}} u UTF-8 kodiranju.",
        "perfcached": "Sljedeći podaci su iz međuspremnika i možda nisu najsvježiji. Međuspremnik sadrži $1 {{PLURAL:$1|rezultat|rezultata}} pretraživanja.",
        "perfcachedts": "Sljedeći podaci su iz međuspremnika i posljednji puta su ažurirani u $1. Međuspremnik sadrži $4 {{PLURAL:$4|rezultat|rezultata}} pretraživanja.",
        "querypage-no-updates": "Osvježavanje ove stranice je trenutačno onemogućeno. Nove promjene neće biti vidljive.",
        "viewsource": "Vidi izvornik",
        "viewsource-title": "Vidi kôd stranice $1",
        "actionthrottled": "Uređivanje je usporeno",
-       "actionthrottledtext": "Kao anti-spam mjeru, ograničeni ste u broju ovih radnji u određenom vremenu, i trenutačno ste dosegli to ograničenje. Pokušajte opet za koju minutu.",
+       "actionthrottledtext": "Kao mjera protiv spama, ograničeni vam je broj ovih radnji u određenom vremenu, i trenutačno ste dostigli to ograničenje. Pokušajte opet za par minuta.",
        "protectedpagetext": "Ova stranica je zaključana da bi se onemogućile izmjene.",
        "viewsourcetext": "Možete pogledati i kopirati izvorni sadržaj ove stranice.",
        "viewyourtext": "Možete vidjeti i kopirati tekst <strong>vaših uređivanja</strong> na ovoj stranici.",
        "password-change-forbidden": "Ne možete promjeniti zaporku na ovom projektu.",
        "externaldberror": "Došlo je do pogreške s vanjskom autorizacijom ili Vam nije dopušteno osvježavanje vanjskog suradničkog računa.",
        "login": "Prijavi se",
+       "login-security": "Potvrdite svoj identitet",
        "nav-login-createaccount": "Prijavi se",
        "userlogin": "Prijavi se / stvori račun",
        "userloginnocreate": "Prijavi se",
        "saveusergroups": "Snimi suradničke skupine",
        "userrights-groupsmember": "Član:",
        "userrights-groupsmember-auto": "Uključeni član:",
-       "userrights-groups-help": "Možete promijeniti skupine za ovog suradnika:\n* Označena kućica pokazuje skupinu kojoj suradnik pripada.\n* Neoznačena kućica pokazuje skupinu kojoj suradnik ne pripada.\n* Zvjezdica * označava skupinu koju ne možete ukloniti kad ju jednom dodate, ili obratno.",
+       "userrights-groups-help": "Možete promijeniti skupine za ovog suradnika:\n* označena kućica pokazuje skupinu kojoj suradnik pripada;\n* neoznačena kućica pokazuje skupinu kojoj suradnik ne pripada;\n* zvjezdica (*) označava skupinu koju ne možete ukloniti kad ju jednom dodate, ili obratno.",
        "userrights-reason": "Razlog:",
        "userrights-no-interwiki": "Nemate dopuštenje za uređivanje suradničkih prava na drugim wikijima.",
        "userrights-nodatabase": "Baza podataka $1 ne postoji ili nije lokalno dostupna.",
        "unusedimages": "Nekorištene slike",
        "wantedcategories": "Tražene kategorije",
        "wantedpages": "Tražene stranice",
+       "wantedpages-summary": "Niže je popis nepostojećih stranica s najviše poveznica prema njima, osim stranica koje imaju preusmjeravanje na njih. Cijeli popis nepostojećih stranica na koje postoje preusmjeravanja može se vidjeti na [[{{#special:BrokenRedirects}}|popisu]].",
        "wantedpages-badtitle": "Nevaljani naslov kao rezultat: $1",
        "wantedfiles": "Tražene datoteke",
        "wantedfiletext-cat": "Sljedeće datoteke se rabe ali ne postoje. Datoteke iz drugih izvora mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbrisane</del> s popisa. Osim toga, stranice koje sadrže nepostojeće datoteke popisane su [[:$1|ovdje]].",
        "sp-contributions-username": "IP adresa ili suradnik:",
        "sp-contributions-toponly": "Prikaži samo najnovije izmjene",
        "sp-contributions-newonly": "Pokaži samo stranice koje je suradnik započeo",
+       "sp-contributions-hideminor": "Sakrij manje izmjene",
        "sp-contributions-submit": "Traži",
        "whatlinkshere": "Što vodi ovamo",
        "whatlinkshere-title": "Stranice koje vode na \"$1\"",
        "svg-long-error": "Nevaljana SVG datoteka: $1",
        "show-big-image": "Vidi sliku u punoj veličini",
        "show-big-image-preview": "Veličina ovog prikaza: $1.",
+       "show-big-image-preview-differ": "Veličina ovog $3 prikaza ove $2 datoteke: $1.",
        "show-big-image-other": "{{PLURAL:$2|Druga rezolucija|Ostale rezolucije}}: $1.",
        "show-big-image-size": "$1 × $2 piksela",
        "file-info-gif-looped": "animacija se ponavlja",
        "mw-widgets-dateinput-placeholder-month": "GGGG-MM",
        "mw-widgets-titleinput-description-new-page": "stranica još ne postoji",
        "mw-widgets-titleinput-description-redirect": "preusmjeravanje na $1",
+       "log-action-filter-block": "Vrsta blokiranja:",
+       "log-action-filter-newusers": "Način stvaranja računa:",
        "log-action-filter-upload": "Vrsta postavljanja:",
        "log-action-filter-all": "sve",
+       "log-action-filter-block-block": "blokiranje",
+       "log-action-filter-block-reblock": "promjena blokiranja",
+       "log-action-filter-block-unblock": "deblokiranje",
+       "log-action-filter-newusers-create": "stvorio anonimni suradnik",
+       "log-action-filter-newusers-create2": "stvorio registrirani suradnik",
+       "log-action-filter-newusers-autocreate": "automatski stvoren",
+       "log-action-filter-newusers-byemail": "stvoren lozinkom poslanom na e-poštu",
        "log-action-filter-upload-upload": "novo postavljanje",
        "log-action-filter-upload-overwrite": "ponovno postavljanje"
 }
index 11357f8..567cf1a 100644 (file)
@@ -53,7 +53,7 @@
        "tog-ccmeonemails": "Mi kopije e-mejlkow pósłać, kotrež druhim wužiwarjam pósćelu",
        "tog-diffonly": "Jenož rozdźěle pokazać (nic pak zbytny wobsah)",
        "tog-showhiddencats": "Schowane kategorije pokazać",
-       "tog-norollbackdiff": "Rozdźěl po wróćostajenju zanjechać",
+       "tog-norollbackdiff": "Rozdźěl po wróćostajenju njepokazać",
        "tog-useeditwarning": "Warnować, hdyž so wobdźěłowanska strona z njeskładowanymi změnami wopušća",
        "tog-prefershttps": "Po přizjewjenju přeco wěsty zwisk wužiwać",
        "underline-always": "Přeco",
        "morenotlisted": "Tuta lisćina dospołna njeje.",
        "mypage": "Strona",
        "mytalk": "Diskusija",
-       "anontalk": "Diskusijna strona tuteje IP.adresy",
+       "anontalk": "Diskusija",
        "navigation": "Nawigacija",
        "and": "&#32;a",
        "qbfind": "Namakać",
        "laggedslavemode": "'''Kedźbu:''' Je móžno, zo strona žane zaktualizowanja njewobsahuje.",
        "readonly": "Datowa banka je zawrjena",
        "enterlockreason": "Zapodaj přičinu za zawrjenje a přibližny čas, hdy budźe zawrjenje zběhnjene",
-       "readonlytext": "Datowa banka je tuchwilu za nowe zapiski a druhe změny zawrjena, najskerje wothladowanskich dźěłow dla; po jich zakónčenju budźe wšitko zaso normalne.\n\nAdministrator, kiž je datowu banku zawrěł, je jako přičinu podał: $1",
+       "readonlytext": "Datowa banka je tuchwilu za nowe zapiski a druhe změny zawrjena, najskerje wothladowanskich dźěłow dla; po jich zakónčenju budźe wšitko zaso normalne.\n\nSystemowy administrator, kiž je datowu banku zawrěł, je slědowacu přičinu podał: $1",
        "missing-article": "Datowa banka njenamaka tekst strony z mjenom \"$1\" $2, kotryž dyrbjał so namakać.\n\nTo so zwjetša zawinuje, hdyž so njepłaćiwa změna abo zapisk stawiznow na stronu wotkazuje, kotraž bu wušmórnjena.\n\nJeli to njetrjechi, sy najskerje programowy zmylk w softwarje namakał.\nZdźěl to prošu [[Special:ListUsers/sysop|admininistratorej]] podawajo wotpowědny URL.",
        "missingarticle-rev": "(Wersijowe čisło: $1)",
        "missingarticle-diff": "(Rozdźěl: $1, $2)",
        "viewsource": "Žórłowy tekst",
        "viewsource-title": "Žórłowy tekst za $1 sej wobhladać",
        "actionthrottled": "Akcije wobmjezowane",
-       "actionthrottledtext": "Jako připrawa přećiwo spamej, je častosć wuwjedźenja tuteje akcije w krótkej dobje wobmjezowana a ty sy tutón limit překročił. Prošu spytaj za něšto mjeńšiny hišće raz.",
+       "actionthrottledtext": "Jako naprawa přećiwo znjewužiwanju, je ličba wuwjedźenjow tuteje akcije w krótkej dobje wobmjezowana a ty sy tutón limit překročił. Prošu spytaj za něšto mjeńšin hišće raz.",
        "protectedpagetext": "Tuta strona je přećiwo wobdźěłowanju abo druhim akcijam škitana.",
-       "viewsourcetext": "Móžeš sej žórłowy tekst tuteje strony wobhladać a jón kopěrować:",
-       "viewyourtext": "Móžeš sej žórłowy tekst '''swojich změnow''' wobhladać a do slědowaceje strony kopěrować:",
+       "viewsourcetext": "Móžeš sej žórłowy tekst tuteje strony wobhladać a jón kopěrować.",
+       "viewyourtext": "Móžeš sej žórłowy tekst <strong>swojich změnow</strong> wobhladać a do slědowaceje strony kopěrować.",
        "protectedinterface": "Tuta strona wobsahuje tekst za wužiwarski powjerch softwary na tutym wikiju a je škitana, zo by so znjewužiwanje zadźěwało.\nZo by přełožki za wšě wikije přidał abo změnił, wužij prošu [https://translatewiki.net/ translatewiki.net], projekt MediaWiki za lokalizaciju.",
        "editinginterface": "<strong>Warnowanje:</strong> Wobdźěłuješ stronu, kotraž so wužiwa, zo by tekst za wužiwarski powjerch softwary k dispoziciji stajiła. Změny na stronje  wuskutkuja so na napohlad wužiwarskeho powjercha za druhich wužiwarjow na tutym wikiju.",
        "translateinterface": "Zo by přełožki za wšě wikije přidał abo změnił, wužiwajće prošu [https://translatewiki.net/ translatewiki.net], lokalizaciski projekt MediaWiki.",
-       "cascadeprotected": "Tuta strona je za wobdźěłowanje zawrjena, dokelž je w {{PLURAL:$1|slědowacej stronje|slědowacymaj stronomaj|slědowacych stronach|slědowacych stronach}} zapřijata, {{PLURAL:$1|kotraž je|kotrejž stej|kotrež su|kotrež su}} přez kaskadowu opciju {{PLURAL:$1|škitana|škitanej|škitane|škitane}}:\n$2",
+       "cascadeprotected": "Tuta strona je za wobdźěłowanje zawrjena, dokelž je w {{PLURAL:$1|slědowacej stronje|slědowacymaj stronomaj|slědowacych stronach}} zapřijata, {{PLURAL:$1|kotraž je|kotrejž stej|kotrež su}} přez kaskadowu opciju {{PLURAL:$1|škitana|škitanej|škitane}}:\n$2",
        "namespaceprotected": "Nimaš dowolnosć, zo by stronu w mjenowym rumje '''$1''' wobdźěłał.",
        "customcssprotected": "Nimaš prawo, zo by tutu CSS-stronu wobdźěłał, dokelž wosobinske nastajenja druheho wužiwarja wobsahuje.",
        "customjsprotected": "Nimaš prawo, zo by tutu JavaScript-stronu wobdźěłał, dokelž wosobinske nastajenja druheho wužiwarja wobsahuje.",
        "mypreferencesprotected": "Nimaš prawo swoje nastajenja wobdźěłać.",
        "ns-specialprotected": "Specialne strony njedadźa so wobdźěłać.",
        "titleprotected": "Tutón titul bu přećiwo wutworjenju přez [[User:$1|$1]] škitany.\nPodata přičina je <em>$2</em>.",
-       "filereadonlyerror": "Njeje móžno dataju \"$1\" změnić, dokelž datajowy repozitorij \"$2\" je jenož čitajomny.\n\nAdministrator, kiž je jón zawrěł, je tule přičinu podał: \"$3\".",
+       "filereadonlyerror": "Njeje móžno dataju \"$1\" změnić, dokelž datajowy repozitorij \"$2\" je jenož čitajomny.\n\nSystemowy administrator, kiž je jón zawrěł, je tule přičinu podał: \"$3\".",
        "invalidtitle-knownnamespace": "Njepłaćiwy titul z mjenowym rumom \"$2\" a tekstom \"$3\"",
        "invalidtitle-unknownnamespace": "Njepłaćiwy titul z njeznatym mjenowym rumom $1 a tekstom \"$2\"",
        "exception-nologin": "Njejsy přizjewjeny",
        "nocookieslogin": "{{SITENAME}} wužiwa placki za přizjewjenje wužiwarjow.\nSy placki znjemóžnił. \nProšu zmóžń je a spytaj hišće raz.",
        "nocookiesfornew": "Wužiwarske konto njeje so załožiło, dokelž njemóžachmy jeho žórło wobkrućić.\nPřeswědč so, zo placki su zmóžnjene, ačitaj tutu stronu znowa a spytaj hišće raz.",
        "noname": "Njejsy płaćiwe wužiwarske mjeno podał.",
-       "loginsuccesstitle": "Přizjewjenje wuspěšne",
+       "loginsuccesstitle": "Přizjewjeny",
        "loginsuccess": "'''Sy nětko jako \"$1\" w {{GRAMMAR:lokatiw|{{SITENAME}}}} {{GENDER:|přizjewjeny|přizjewjena|přizjewjene}}.'''",
-       "nosuchuser": "Njeje wužiwar z mjenom \"$1\".\nWužiwarske mjena wobkedźbuja wulkopisanje.\nPřepruwuj swój prawopis abo [[Special:CreateAccount|wutwor nowe konto]].",
+       "nosuchuser": "Njeje wužiwar z mjenom \"$1\".\nWužiwarske mjena dźiwaja na wulkopisanje.\nPřepruwuj swój prawopis abo [[Special:CreateAccount|załož nowe konto]].",
        "nosuchusershort": "Wužiwarske mjeno „$1” njeeksistuje. Prošu skontroluj prawopis.",
        "nouserspecified": "Dyrbiš wužiwarske mjeno podać",
        "login-userblocked": "Tutón wužiwar je zablokowany. Přizjewjenje njedowolene.",
        "noemail": "Za wužiwarja \"$1\" žana e-mejlowa adresa podata njeje.",
        "noemailcreate": "Dyrbiš płaćiwu e-mejlowa adresu podać",
        "passwordsent": "Nowe hesło bu na e-mejlowu adresu zregistrowanu za wužiwarja „$1” pósłane.\nProšu přizjew so znowa, po tym zo sy je přijał.",
-       "blocked-mailpassword": "Twoja IP-adresa je přećiwo wobdźěłowanju zablokowana, a tohodla njeje dowolene, funkciju za wobnowjenje hesłow wužiwać, zo by znjewužiwanju zadźěwało.",
+       "blocked-mailpassword": "Twoja IP-adresa je přećiwo wobdźěłowanju zablokowana. Zo by znjewužiwanju zadźěwało, njeje dowolene, funkciju za wobnowjenje hesłow z tuteje IP-adresy wužiwać.",
        "eauthentsent": "Wobkrućenska e-mejlka je so na podatu e-mejlowu adresu pósłała.\nPrjedy hač so druha e-mejlka na konto pósćele, dyrbiš so po instrukcijach w e-mejlce měć, zo by wobkrućił, zo konto woprawdźe tebi słuša.",
        "throttled-mailpassword": "E-mejl za anulowanje hesło je so za {{PLURAL:$1|poslednju hodźinu|poslednjej $1 hodźinje|poslednje $1 hodźiny|poslednich $1 hodźin}} pósłała. Zo by znjewužiwanju zadźěwało, so jenož jedna e-mejl za anulowanje hesła na {{PLURAL:$1|hodźinu|$1 hodźinje|$1 hodźiny|$1 hodźin}} pósćele.",
        "mailerror": "Zmylk při słanju e-mejlki: $1",
        "createaccount-title": "Wutworjenje wužiwarskeho konta za {{SITENAME}}",
        "createaccount-text": "Něchtó je wužiwarske konto za twoju e-mejlowu adresu na {{SITENAME}} ($4) z mjenom \"$2\" z hesłom \"$3\" wutworił. Ty měł so nětko přizjewić a swoje hesło změnić.\n\nMóžeš tutu zdźělenku ignorować, jeli so wužiwarske konto zmylnje wutworiło.",
        "login-throttled": "Sy přehusto spytał so přizjewić. Počakaj prošu $1, prjedy hač hišće raz spytaš.",
-       "login-abort-generic": "Twoje přizjewjenje njebě wuspěšne - přetorhnjene",
+       "login-abort-generic": "Twoje přizjewjenje je so nimokuliło - přetorhnjene",
        "login-migrated-generic": "Waše konto je so přesunyło, a waše wužiwarske mjeno na tutym wikiju hižo njeeksistuje.",
        "loginlanguagelabel": "Rěč: $1",
        "suspicious-userlogout": "Twoje naprašowanje za wotzjewjenje bu wotpokazane, dokelž zda so, jako by so přez wobškodźeny wobhladowak abo pufrowacy proksy pósłało",
        "newpassword": "Nowe hesło:",
        "retypenew": "Nowe hesło wospjetować:",
        "resetpass_submit": "Hesło posrědkować a so přizjewić",
-       "changepassword-success": "Twoje hesło je so wuspěšnje změniło!",
+       "changepassword-success": "Twoje hesło je so změniło!",
        "changepassword-throttled": "Sy přehusto spytał so přizjewić. Počakaj prošu $1, prjedy hač hišće raz spytaš.",
        "resetpass_forbidden": "Hesła njedadźa so změnić.",
        "resetpass-no-info": "Dyrbiš so přizjewić, zo by direktny přistup na tutu stronu měł.",
        "resetpass-submit-loggedin": "Hesło změnić",
        "resetpass-submit-cancel": "Přetorhnyć",
-       "resetpass-wrong-oldpass": "Njepłaćiwe nachwilne abo aktualne hesło.\nSnano sy swoje hesło hižo wuspěšnje změnił abo nowe nachwilne hesło požadał.",
+       "resetpass-wrong-oldpass": "Njepłaćiwe nachwilne abo aktualne hesło.\nSnano sy swoje hesło hižo změnił abo nowe nachwilne hesło požadał.",
        "resetpass-recycled": "Prošu staj swoje hesło na druhe hesło hač twoje aktualne hesło.",
        "resetpass-temp-emailed": "Sy so z nachwilnym e-mejlowym kodom přizjewił.\nZo by přizjewjenje skónčił, dyrbiš tu nowe hesło postajić:",
        "resetpass-temp-password": "Nachwilne hesło:",
        "passwordreset-emailtext-ip": "Něchtó (najskerje ty, z IP-adresu $1) je anulowanje hesła za {{GRAMMAR:akuzatiw|{{SITENAME}}}} požadał ($4).  {{PLURAL:$3|Slědowace wužiwarske konto je|Slědowacej wužiwarskej konće stej|Slědowace wužiwarske konta su}} z tutej e-mejlowej adresu {{PLURAL:$3|zwjazane|zwjazanej|zwjazane}}:\n\n$2\n\n{{PLURAL:$3|Tute nachwilne hesło spadnje|Tutej nachwilnej hesle spadnjetej|Tute nachwilne hesła spadnu}} za {{PLURAL:$5|jedyn dźeń|$5 dnjej|$5 dny|$5 dnjow}}.\nTy měł so nětko přizjewić a nowe hesło wubrać. Jeli něchtó druhi je tute naprašowanje pósłał, abo jeli sy so zaso na prěnjotne hesło dopomnił a wjace nochceš jo změnić, móžeš tutu zdźělenku ignorować a swoje stare hesło dale wužiwać.",
        "passwordreset-emailtext-user": "Wužiwar $1 na {{GRAMMAR:lokatiw|{{SITENAME}}}} je anulowanje twojeho hesła za {{GRAMMAR:akuzatiw|{{SITENAME}}}} požadał ($4).  {{PLURAL:$3|Slědowace wužiwarske konto je|Slědowacej wužiwarskej konće stej|Slědowace wužiwarske konta su}} z tutej e-mejlowej adresu {{PLURAL:$3|zwjazane|zwjazanej|zwjazane}}:\n\n$2\n\n{{PLURAL:$3|Tute nachwilne hesło spadnje|Tutej nachwilnej hesle spadnjetej|Tute nachwilne hesła spadnu}} za {{PLURAL:$5|jedyn dźeń|$5 dnjej|$5 dny|$5 dnjow}}.\nTy měł so nětko přizjewić a nowe hesło wubrać. Jeli něchtó druhi je tute naprašowanje pósłał, abo jeli sy so zaso na prěnjotne hesło dopomnił a wjace nochceš jo změnić, móžeš tutu zdźělenku ignorować a swoje stare hesło dale wužiwać.",
        "passwordreset-emailelement": "Wužiwarske mjeno: \n$1\n\nNachwilne hesło: \n$2",
-       "passwordreset-emailsentemail": "E-mejl za anulowanje hesło je so pósłała.",
+       "passwordreset-emailsentemail": "Jeli tuta e-mejlowa adresa je z wašim kontom zwjazana, so mejlka za wróćostajenje hesła pósćele.",
        "passwordreset-emailsent-capture": "E-mejl za anulowanje hesła je so pósłała, kotraž so deleka pokazuje.",
        "passwordreset-emailerror-capture": "E-mejl za anulowanje hesła je so wutworiła, kotraž so deleka pokazuje, ale słanje {{GENDER:$2|wužiwarjej|wužiwarce}} je so njeporadźiło: $1",
        "changeemail": "E-mejlowu adresu změnić abo wotstronić",
-       "changeemail-header": "Kontowu e-mejlowu adresu změnić",
+       "changeemail-header": "Wupjelń tutón formular, zo by swoju e-mejlowu adresu změnił. Jeli chceš zwisk e-mejloweje adresy ze swijim kontom wotstronić,  wostaj polo e-mejloweje adresy prózdne, hdyž formular preč sćeleš.",
        "changeemail-no-info": "Dyrbiš so přizjewić, zo by direktny přistup na tutu stronu měł.",
        "changeemail-oldemail": "Aktualna e-mejlowa adresa:",
        "changeemail-newemail": "Nowa e-mejlowa adresa:",
        "sig_tip": "Twoja signatura z časowym kołkom",
        "hr_tip": "Wodoruna linija (zrědka wužiwać!)",
        "summary": "Zjeće:",
-       "subject": "Tema/Nadpismo:",
+       "subject": "Tema:",
        "minoredit": "Snadna změna",
        "watchthis": "Stronu wobkedźbować",
        "savearticle": "Stronu składować",
        "anonpreviewwarning": "''Njejsy přizjewjeny. Składowanje přenošuje twoju IP-adresu do wobdźěłowanskeje historije tuteje strony.''",
        "missingsummary": "'''Kedźbu:''' Njejsy žane zjeće zapodał. Jeli hišće raz na \"{{int:savearticle}}\" kliknješ, budźe so twoja změna bjez njeho składować.",
        "missingcommenttext": "Prošu zapodaj komentar.",
-       "missingcommentheader": "'''Kedźbu:''' Njejsy temu/nadpis za tutón komentar podał. Jeli na „{{int:savearticle}}” kliknješ, składuje so twoja změna bjez temy/nadpisa.",
+       "missingcommentheader": "<strong>Kedźbu:</strong> Njejsy temu za tutón komentar podał. Jeli na „{{int:savearticle}}” kliknješ, składuje so twoja změna bjez temy.",
        "summary-preview": "Přehlad zjeća:",
-       "subject-preview": "Přehlad temy/napisma:",
+       "subject-preview": "Přehlad temy:",
        "blockedtitle": "Wužiwar je zablokowany",
        "blockedtext": "'''Twoje wužiwarske mjeno bu zablokowane abo twoja IP-adresa bu zablokowana.'''\n\nBlokowar je $1.\nPodata přičina je ''$2''.\n\n* Spočatk blokowanja: $8\n* Kónc blokowanja: $6\n* Zablokowany wužiwar: $7\n\nMóžeš $1 abo druheho [[{{MediaWiki:Grouppage-sysop}}|administratora]] kontaktować, zo by wo blokowanju diskutował.\nNjemóžeš funkciju 'Tutomu wužiwarjej e-mejlować' wužiwać, chibazo sy płaćiwu e-mejlowu adresu w swojich [[Special:Preferences|kontowych nastajenjach]] podał a njebu přećiwo jeje wužiwanju zablokowany.\nTwoja tuchwilna IP-adresa je $3 a blokowanski ID je #$5. Prošu podaj wšě horjeka naspomnjene podrobnosće w swojich naprašowanjach.",
        "autoblockedtext": "Twoja IP-adresa bu awtomatisce blokowana, dokelž ju druhi wužiwar wužiwaše, kiž bu wot $1 zablokowany.\nPřičina blokowanja bě:\n\n:''$2''\n\n* Započatk blokowanja: $8\n* Kónc blokowanja: $6\n* Zablokowany wužiwar: $7\n\nMóžeš $1 abo jednoho z druhich [[{{MediaWiki:Grouppage-sysop}}|administratorow]] kontaktować, zo by blokowanje diskutował.\n\nWobkedźbuj, zo njemóžeš funkciju \"Wužiwarjej mejlku pósłać\" wužiwać, jeli nimaš płaćiwu e-mejlowu adresu, kotraž je w twojich [[Special:Preferences|wužiwarskich nastajenjach]] zregistrowana a njebi blokowany ju wužiwać.\n\nTwój aktualna adresa IP je $3 a ID blokowanja je #$5.\nProšu podaj wšě horjeka naspomnjene podrobnosće w naprašowanjach, kotrež činiš.",
        "accmailtext": "Připadnje spłodźene hesło za [[User talk:$1|$1]] bu na $2 pósłane. Daj so na stronje ''[[Special:ChangePassword|hesło změnić]]'' při přizjewjenju změnić.",
        "newarticle": "(Nowy)",
        "newarticletext": "Sy wotkaz k stronje slědował, kotraž hišće njeeksistuje. Zo by stronu wutworił, wupjelń slědowace tekstowe polo (hlej [$1 stronu pomocy] za dalše informacije). Jeli sy zmylnje tu, klikń prosće na tłóčatko <b>Wróćo</b> we swojim wobhladowaku.",
-       "anontalkpagetext": "---- ''To je diskusijna strona za anonymneho wužiwarja, kiž hišće konto wutworił njeje abo je njewužiwa. Dyrbimy tohodla numerisku IP-adresu wužiwać, zo bychmy jeho/ju identifikowali. Tajka IP-adresa hodźi so wot wjacorych wužiwarjow zhromadnje wužiwać. Jeli sy anonymny wužiwar a měniš, zo buchu irelewantne komentary k tebi pósłane, [[Special:CreateAccount|wutwor prošu konto]] abo [[Special:UserLogin|přizjew so]], zo by přichodnu šmjatańcu z anonymnymi wužiwarjemi wobešoł.''",
-       "noarticletext": "Tuchwilu tuta strona žadyn tekst njewobsahuje. Móžeš [[Special:Search/{{PAGENAME}}|tutón titul strony na druhich stronach pytać]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} wotpowědne protokole pytać] abo [{{fullurl:{{FULLPAGENAME}}|action=edit}} tutu stronu wobdźěłać]</span>.",
+       "anontalkpagetext": "---- \n<em>To je diskusijna strona za anonymneho wužiwarja, kiž hišće konto wutworił njeje abo je njewužiwa.</em>\nDyrbimy tohodla numerisku IP-adresu wužiwać, zo bychmy jeho/ju identifikowali.\nTajka IP-adresa hodźi so wot wjacorych wužiwarjow zhromadnje wužiwać. Jeli sy anonymny wužiwar a měniš, zo buchu irelewantne komentary k tebi pósłane, [[Special:CreateAccount|wutwor prošu konto]] abo [[Special:UserLogin|přizjew so]], zo by přichodnu šmjatańcu z anonymnymi wužiwarjemi wobešoł.",
+       "noarticletext": "Tuchwilu tuta strona žadyn tekst njewobsahuje. Móžeš [[Special:Search/{{PAGENAME}}|tutón titul strony na druhich stronach pytać]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} wotpowědne protokole pytać] abo [{{fullurl:{{FULLPAGENAME}}|action=edit}} tutu stronu wutworić]</span>.",
        "noarticletext-nopermission": "Tuchwilu žadyn tekst na tutej stronje njeje.\nMóžeš [[Special:Search/{{PAGENAME}}|tutón titul strony]] na druhich stronach pytać abo <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pytaj wotpowědne protokole]</span>, ale nimaš prawo, strou wutworić.",
        "missing-revision": "Wersija #$1 strony z mjenom \"{{FULLPAGENAME}}\" njeeksistuje.\n\nPřičina je zwjetša zestarjeny wotkaz w stawiznach k stronje, kotraž je so zhašała.\nPodrobnosće móžeš w  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokolu wušmórnjenjow] namakać.",
        "userpage-userdoesnotexist": "Wužiwarske konto „$1“ njeje zregistrowane. Prošu pruwuj, hač chceš tutu stronu woprawdźe wutworić/wobdźěłać.",
        "userpage-userdoesnotexist-view": "Wužiwarske konto \"$1\" njeje zregistrowane.",
        "blocked-notice-logextract": "Tutón wužiwar je tuchwilu zablokowany. Najnowši protokolowy zapisk so deleka jako referenca podawa:",
-       "clearyourcache": "'''Kedźbu: Po składowanju dyrbiš snano pufrowak swojeho wobhladowaka wuprózdnić, zo by změny widźał.''' \n* '''Firefox/Safari:''' Tłóč na ''Umsch'' kliknjo na ''Znowa'' abo tłóč ''Strg-F5'' abo ''Strg-R'' (''⌘-R'' na Macintosh);\n* '''Google Chrome:''' Tłóč na ''Strg-Umsch-R'' (''⌘-Umsch-R'' na Mac)\n* '''Internet Explorer:''' Dźěrź ''Strg'' tłóčeny kliknjo na ''Znowa,'' abo tłóč ''Strg-F5''.\n* '''Opera:''' Wuprózdń pufrowak w ''Extras → Einstellungen'';",
+       "clearyourcache": "<strong>Kedźbu:</strong> Po składowanju dyrbiš snano pufrowak swojeho wobhladowaka wuprózdnić, zo by změny widźał.\n* <strong>Firefox/Safari:</strong> Dźerž tastu <em>Umsch</em> tłóčenu a klikń na <em>Znowa</em> abo tłóč pak <em>Strg-F5</em> abo <em>Strg-R</em> (<em>⌘-R</em> na Mac);\n* <strong>Google Chrome:</strong> Tłóč na <em>Strg-Umsch-R</em> (<em>⌘-Umsch-R</em> na Mac)\n* <strong>Internet Explorer:</strong> Dźěrź tastu <em>Strg</em> tłóčen a klikń na <em>Znowa</em> abo tłóč <em>Strg-F5</em>.\n* <strong>Opera:</strong> Dźi k <em>Menü → Einstellungen</em> (<em>Opera → Einstellungen</em> na Mac) a potom k <em>Datenschutz & Sicherheit → Browserdaten löschen → Gespeicherte Bilder und Dateien</em>.",
        "usercssyoucanpreview": "'''Pokiw:''' Wužij tłóčku '{{int:showpreview}}', zo by swój nowy css do składowanja testował.",
        "userjsyoucanpreview": "'''Pokiw:''' Wužij tłóčatko \"{{int:showpreview}}\", zo by swój nowy JavaScript do składowanja testował.",
        "usercsspreview": "'''Wobkedźbujće, zo sej jenož přehlad swojeho wužiwarskeho CSS wobhladuješ. Hišće njeje składowany!'''",
        "revdelete-unsuppress": "Wobmjezowanja za wobnowjene wersije zběhnyć",
        "revdelete-log": "Přičina:",
        "revdelete-submit": "Na {{PLURAL:$1|wubranu wersiju|wubranej wersiji|wubrane wersije|wubrane wersije}} nałožować",
-       "revdelete-success": "'''Widźomnosć wersije bu wuspěšnje zaktualizowana.'''",
+       "revdelete-success": "Widźomnosć wersije je so zaktualizowała.",
        "revdelete-failure": "'''Wersijowa widźomnosć njeda so aktualizować:'''\n$1",
-       "logdelete-success": "Widźomnosć zapiska bu wuspěšnje změnjena.",
+       "logdelete-success": "Widźomnosć protokola je so změniła.",
        "logdelete-failure": "'''Protokolowa widźomnosć njeda so nastajić:'''\n$1",
        "revdel-restore": "Widźomnosć změnić",
        "pagehist": "Stawizny strony",
        "mergehistory-go": "Zjednoćujomne změny pokazać",
        "mergehistory-submit": "Wersije zjednoćić",
        "mergehistory-empty": "Njehodźa so žane wersije zjednoćeć.",
-       "mergehistory-done": "$3 {{PLURAL:$3|wersija|wersiji|wersije|wersijow}} wot $1 wuspěšnje z [[:$2]] {{PLURAL:$3|zjednoćena|zjednoćenej|zjednoćene|zjednoćene}}.",
+       "mergehistory-done": "$3 {{PLURAL:$3|wersija|wersiji|wersije|wersijow}} wot $1 z [[:$2]] {{PLURAL:$3|zjednoćena|zjednoćenej|zjednoćene}}.",
        "mergehistory-fail": "Njeje móžno zjednócenje stawiznow přewjesć, prošu přepruwuj stronu a časowe parametry.",
        "mergehistory-no-source": "Žórłowa strona $1 njeeksistuje.",
        "mergehistory-no-destination": "Cilowa strona $1 njeeksistuje.",
        "prefs-watchlist-token": "Marka wobkedźbowankow:",
        "prefs-misc": "Wšelake nastajenja",
        "prefs-resetpass": "Hesło změnić",
-       "prefs-changeemail": "E-mejl změnić",
+       "prefs-changeemail": "E-mejlowu adresu změnić abo wotstronić",
        "prefs-setemail": "E-mejlowu adresu postajić",
        "prefs-email": "E-mejlowe opcije",
        "prefs-rendering": "Napohlad",
        "rows": "Rjadki:",
        "columns": "Stołpiki:",
        "searchresultshead": "Pytać",
-       "stub-threshold": "Wotkazowe formatowanje <a href=\"#\" class=\"stub\">małych stronow</a> (w bajtach):",
+       "stub-threshold": "Wotkazowe formatowanje małych stronow ($1):",
        "stub-threshold-disabled": "Znjemóžnjeny",
        "recentchangesdays": "Ličba dnjow w lisćinje aktualnych změnow:",
        "recentchangesdays-max": "(Maksimalnje $1 {{PLURAL:$1|dźeń|dnjej|dny|dnjow}})",
        "userrights": "Zrjadowanje wužiwarskich prawow",
        "userrights-lookup-user": "Wužiwarske skupiny zrjadować",
        "userrights-user-editname": "Wužiwarske mjeno:",
-       "editusergroup": "Wužiwarske skupiny wobdźěłać",
-       "editinguser": "Změni wužiwarske prawa wužiwarja '''[[User:$1|$1]]''' $2",
+       "editusergroup": "{{GENDER:$1|Wužiwarske}} skupiny wobdźěłać",
+       "editinguser": "Změni wužiwarske prawa {{GENDER:$1|wužiwarja|wužiwarki}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Wužiwarske skupiny wobdźěłać",
-       "saveusergroups": "Wužiwarske skupiny składować",
+       "saveusergroups": "{{GENDER:$1|Wužiwarske}} skupiny składować",
        "userrights-groupsmember": "Čłon wot:",
        "userrights-groupsmember-auto": "Implicitny čłon wot:",
        "userrights-groups-help": "Móžeš skupiny změnić, w kotrychž wužiwar je.\n* Markěrowany kašćik woznamjenja, zo wužiwar je w tej skupinje.\n* Njemarkěrowany kašćik woznamjenja, zo wužiwar w tej skupinje njeje.\n* \"*\" podawa, zo njemóžeš skupinu wotstronić, tak ruče kaž sy ju přidał abo nawopak.",
        "userrights-changeable-col": "Skupiny, kotrež móžeš změnić",
        "userrights-unchangeable-col": "Skupiny, kotrež njemóžeš změnić",
        "userrights-conflict": "Konflikt změnow wužiwarskich prawow! Prošu přepruwuj a wobkruć swoje změny.",
-       "userrights-removed-self": "Sy swoje prawa wuspěšnje wotstronił. Tohodla nimaš hižo přistup na tutu stronu měć.",
+       "userrights-removed-self": "Sy swoje prawa wotstronił. Tohodla nimaš hižo přistup na tutu stronu měć.",
        "group": "Skupina:",
        "group-user": "wužiwarjo",
        "group-autoconfirmed": "Awtomatisce potwjerdźeni wužiwarjo",
        "group-bot": "Boty",
        "group-sysop": "Administratorojo",
        "group-bureaucrat": "Běrokraća",
-       "group-suppress": "dohladowarjo",
+       "group-suppress": "Potłóčowarjo",
        "group-all": "(wšě)",
        "group-user-member": "{{GENDER:$1|wužiwar|wužiwarka}}",
        "group-autoconfirmed-member": "{{GENDER:$1|awtomatisce potwjerdźeny wužiwar|awtomatisce potwjerdźena wužiwarka}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrator|administratorka}}",
        "group-bureaucrat-member": "{{GENDER:$1|běrokrat|běrokratka}}",
-       "group-suppress-member": "{{GENDER:$1|dohladowar|dohladowarka}}",
+       "group-suppress-member": "{{GENDER:$1|potłóčowar|potłóčowarka}}",
        "grouppage-user": "{{ns:project}}:Wužiwarjo",
        "grouppage-autoconfirmed": "{{ns:project}}:Awtomatisce potwjerdźeni wužiwarjo",
        "grouppage-bot": "{{ns:project}}:Boćiki",
        "grouppage-sysop": "{{ns:project}}:Administratorojo",
        "grouppage-bureaucrat": "{{ns:project}}:Běrokraća",
-       "grouppage-suppress": "{{ns:project}}:Dohladowanje",
+       "grouppage-suppress": "{{ns:project}}:Potłóčowarjo",
        "right-read": "Strony čitać",
        "right-edit": "Strony wobdźěłać",
        "right-createpage": "Strony wutworić (kotrež diskusijne strony njejsu)",
        "right-override-export-depth": "Strony inkluziwnje wotkazanych stronow hač do hłubokosće 5 eksportować",
        "right-sendemail": "Druhim wužiwarjam e-mejl pósłać",
        "right-passwordreset": "E-mejlki za wróćostajenje hesłow sej wobhladać",
-       "right-managechangetags": "[[Special:Tags|markěrowanja]] wutworić a z datoweje banki zhašeć",
+       "right-managechangetags": "[[Special:Tags|Markěrowanja]] wutworić a z(nje)móžnić",
        "right-applychangetags": "[[Special:Tags|Markěrowanja]] hromadźe ze změnami nałožować",
        "newuserlogpage": "Protokol nowych wužiwarjow",
        "newuserlogpagetext": "To je protokol wutworjenja nowych wužiwarskich kontow.",
        "rightslogtext": "To je protokol změnow wužiwarskich prawow.",
        "action-read": "tutu stronu čitać",
        "action-edit": "tutu stronu wobdźěłać",
-       "action-createpage": "strony wutworić",
-       "action-createtalk": "diskusijne strony wutworić",
+       "action-createpage": "tutu stronu wutworić",
+       "action-createtalk": "tutu diskusijnu stronu wutworić",
        "action-createaccount": "wužiwarske konto załožić",
        "action-history": "historiju tuteje strony pokazać",
        "action-minoredit": "tutu změnu jako snadnu markěrować",
        "action-viewmyprivateinfo": "twoje priwatne informacije sej wobhladać",
        "action-editmyprivateinfo": "twoje priwatne informacije wobdźěłać",
        "action-editcontentmodel": "wobsahowy model strony wobdźěłać",
-       "action-managechangetags": "markěrowanja wutworić a z datoweje banki zhašeć",
+       "action-managechangetags": "markěrowanja wutworić a z(nje)móžnić",
        "action-applychangetags": "markěrowanja hromadźe z wašimi změnami nałožować",
        "nchanges": "$1 {{PLURAL:$1|změna|změnje|změny|změnow}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|wot poslednjeho wopyta}}",
        "boteditletter": "B",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|wobkedźbowacy wužiwar|wobkedźbowacaj wužiwarjej|wobkedźbowacy wužiwarjo|wobkedźbowacych wužiwarjow}}]",
        "rc_categories": "Jenož kategorije (dźělene z \"|\")",
-       "rc_categories_any": "wšě",
+       "rc_categories_any": "Někajka z wubranych",
        "rc-change-size": "$1 {{PLURAL:$1|bajt|bajtaj|bajty|bajtow}}",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajtaj|bajty|bajtow}} po změnje",
        "newsectionsummary": "Nowy wotrězk: /* $1 */",
        "backend-fail-read": "Dataja $1 njeda so čitać",
        "backend-fail-create": "Dataja $1 njeda so pisać.",
        "backend-fail-maxsize": "Dataja $1 njeda so pisać, dokelž je wjetša hač {{PLURAL:$2|jedyn bajt|$2 bajtaj|$2 bajty|$2 bajtow}}.",
-       "backend-fail-readonly": "Składowanski backend \"$1\" da so tuchwilu jenož čitać. Přičina je była: \"$2\"",
+       "backend-fail-readonly": "Składowanski backend \"$1\" da so tuchwilu jenož čitać. Přičina je: <em>$2</em>",
        "backend-fail-synced": "Dataja \"$1\" je znutřka interneho składowanskeho backenda w inkonsistentnym stawje",
        "backend-fail-connect": "Zwisk z datajowym składowanskim backendom \"$1\" móžno njeje.",
        "backend-fail-internal": "W składowanskim backendźe \"$1\" je njeznaty zmylk wustupił.",
        "uploadstash-summary": "Tuta strona zmóžnja přistup k datajam, kotrež su nahrate (abo so nahrawaja), ale hišće njejsu do wikija wozjejwene. Tute dataje  za nikoho widźomne njejsu, jenož za wužiwarja, kiž je je nahrał.",
        "uploadstash-clear": "Schowane nahrate dataje zhašeć",
        "uploadstash-nofiles": "Nimaš žane schowane nahrate dataje.",
-       "uploadstash-badtoken": "Wuwjedźenje teje akcije je so njeporadźiło, snano dokelž twoje wobdźěłowanske daty su spadnjene. Spytaj hišće raz.",
-       "uploadstash-errclear": "Wotstronjenje datajow je so njeporadźiło.",
+       "uploadstash-badtoken": "Wuwjedźenje teje akcije njeje so poradźiło, snano dokelž twoje wobdźěłowanske daty su spadnjene. Spytaj prošu hišće raz.",
+       "uploadstash-errclear": "Wotstronjenje datajow njeje so poradźiło.",
        "uploadstash-refresh": "Lisćinu datajow aktualizować",
        "invalid-chunk-offset": "Njepłaćiwy startowy dypk",
        "img-auth-accessdenied": "Přistup wotpokazany",
        "nopagetext": "Cilowa strona, kotruž sće podał, njeeksistuje.",
        "pager-newer-n": "{{PLURAL:$1|nowši 1|nowšej $1|nowše $1|nowšich $1}}",
        "pager-older-n": "{{PLURAL:$1|starši 1|staršej $1|starše $1|staršich $1}}",
-       "suppress": "Dohladowanje",
+       "suppress": "Potłóčować",
        "querypage-disabled": "Tuta specialna strona je z wukonowych přičinow znjemóžnjena.",
        "apihelp": "API-pomoc",
        "apihelp-no-such-module": "Modul \"$1\" njeje so namakał.",
        "apisandbox-intro": "Wužij tutu stronu, zo by z '''websłužbu Mediawiki API''' eksperimentował.\nHlej [https://www.mediawiki.org/wiki/API:Main_page API-dokumentaciju] za dalše podrobnosće za wužiwanje API. Přikład: [https://www.mediawiki.org/wiki/API#A_simple_example Wobsah hłowneje strony wotwołać]. Wubjer akciju, zo by dalše přikłady widźał.\n\nDźiwaj na to, zo, hačrunjež to je hrajkanišćo, akcije, kotrež na tutej stronje přewjedźeš, móhli wiki změnić.",
        "apisandbox-submit": "Naprašowanje přewjesć",
        "apisandbox-reset": "Wuprózdnić",
-       "apisandbox-examples": "Přikład",
-       "apisandbox-results": "Wuslědk",
+       "apisandbox-examples": "Přikłady",
+       "apisandbox-results": "Wuslědki",
        "apisandbox-request-url-label": "URL naprašowanja:",
-       "apisandbox-request-time": "Naprašowanski čas: $1",
+       "apisandbox-request-time": "Traće naprašowanja: {{PLURAL:$1|$1 milisekunda|$1 milisekundźe|$1 milisekundy|$1 milisekundow}}",
        "booksources": "Pytanje po ISBN",
        "booksources-search-legend": "Žórła za knihi pytać",
        "booksources-search": "Pytać",
        "booksources-text": "To je lisćina wotkazow k druhim sydłam, kotrež nowe a trjebane knihi předawaja. Tam móžeš tež dalše informacije wo knihach dóstać, kotrež pytaš:",
        "booksources-invalid-isbn": "Podate ISBN-čisło njezda so płaćiwe być; přepruwuj za zmylkami, z tym zo z orginialneho žórła kopěruješ.",
        "specialloguserlabel": "Wukonjer:",
-       "speciallogtitlelabel": "Cil (titul abo wužiwar):",
+       "speciallogtitlelabel": "Cil (titul abo {{ns:user}}:wužiwarske mjeno za wužiwarja):",
        "log": "Protokole",
        "all-logs-page": "Wšě zjawne protokole",
        "alllogstext": "Kombinowane zwobraznjenje wšěch k dispozicij stejacych protokolow w {{GRAMMAR:lokatiw|{{SITENAME}}}}. Móžeš napohlad wobmjezować, wuběrajo typ protokola, wužiwarske mjeno (dźiwajo na wulkopisanje) abo potrjechu stronu (tež dźiwajo na wulkopisanje).",
        "wlheader-showupdated": "Strony, kotrež su so po twojim poslednim wopyće změnili, so '''tučne''' pokazuja.",
        "wlnote": "Deleka {{PLURAL:$1|je poslednja změna|stej poslednjej <strong>$1</strong> změnje|su poslednje <strong>$1</strong> změny|je poslednich <strong>$1</strong> změnow}} za {{PLURAL:$2|poslednju hodźinu|poslednje <strong>$2</strong> hodźinje|poslednje <strong>$2</strong> hodźiny|poslednich <strong>$2</strong> hodźin}}, staw : $3, $4.",
        "wlshowlast": "Změny zańdźenych $1 hodźin, $2 dnjow, pokazać",
-       "wlshowtime": "Pokazaj změny zašłych",
+       "wlshowtime": "Perioda, kotraž ma so pokazać:",
        "watchlist-options": "Opcije wobkedźbowankow",
        "watching": "Wobkedźbuju…",
        "unwatching": "Njewobkedźbuju…",
        "deletepage": "Stronu zhašeć",
        "confirm": "Wobkrućić",
        "excontent": "wobsah běše: '$1'",
-       "excontentauthor": "wobsah bě: '$1' (a jenički wobdźěłowar bě '[[Special:Contributions/$2|$2]]')",
+       "excontentauthor": "wobsah bě: „$1“, a jenički wobdźěłar bě „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|diskusija]])",
        "exbeforeblank": "wobsah do wuprózdnjenja běše: '$1'",
        "delete-confirm": "„$1“ wušmórnyć",
        "delete-legend": "Wušmórnyć",
        "delete-toobig": "Tuta strona ma z wjace hač $1 {{PLURAL:$1|wersiju|wersijomaj|wersijemi|wersijemi}} wulke wobdźěłanske stawizny. Wušmórnjenje tajkich stronow bu wobmjezowane, zo by připadne přetorhnjenje {{SITENAME}} wobešło.",
        "delete-warning-toobig": "Tuta strona ma z wjace hač $1 {{PLURAL:$1|wersiju|wersijomaj|wersijemi|wersijemi}} wulke wobdźěłanske stawizny. Wušmórnjenje móže operacije datoweje banki {{SITENAME}} přetorhnyć; pokročuj z kedźbliwosću.",
        "deleteprotected": "Njemóžeš tutu stronu zhašeć, dokelž je so škitała.",
-       "deleting-backlinks-warning": "'''Warnowanje:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Druhe strony]] wotkazuja k stronje abo strona je druhdźe zapřijata, kotruž chceš zhašeć.",
+       "deleting-backlinks-warning": "<strong>Warnowanje:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Druhe strony]] wotkazuja k stronje abo strona je druhdźe zapřijata, kotruž chceš zhašeć.",
        "rollback": "Změny cofnyć",
        "rollbacklink": "Cofnyć",
        "rollbacklinkcount": "$1 {{PLURAL:$1|změnu|změnje|změny|změnow}} cofnyć",
        "protect-locked-blocked": "Njemóžeš škit strony změnič, dokelž twoje konto je zablokowane. Tu widźiš aktualne škitne nastajenja za stronu'''„$1“:'''",
        "protect-locked-dblock": "Datowa banka je zawrjena, tohodla njemóžeš škit strony změnić. Tu widźiš aktualne škitne nastajenja za stronu'''„$1“:'''",
        "protect-locked-access": "Nimaš trěbne prawa, zo by škit strony změnił. Tu widźiš aktualne škitne nastajenja za stronu'''„$1“:'''",
-       "protect-cascadeon": "Tuta strona je tuchwilu škitana, dokelž je w {{PLURAL:$1|slědowacej stronje|slědowacych stronach}} zapřijata, {{PLURAL:$1|kotraž je|kotrež su}} přez kaskadowu opciju {{PLURAL:$1|škitana|škitane}}. Změny na škitnym schodźenku tuteje strony njebudu kaskadowy škit wobwliwować.",
+       "protect-cascadeon": "Tuta strona je tuchwilu škitana, dokelž je w {{PLURAL:$1|slědowacej stronje|slědowacymaj stronomaj|slědowacych stronach}} zapřijata, {{PLURAL:$1|kotraž je|kotrejž stej|kotrež su}} přez kaskadowu opciju {{PLURAL:$1|škitana|škitanej|škitane}}. Změny na škitnym schodźenku tuteje strony njebudu kaskadowy škit wobwliwować.",
        "protect-default": "Wšěm wužiwarjam dowolić",
        "protect-fallback": "Jenož wužiwarjow z prawom \"$1\" dowolić",
        "protect-level-autoconfirmed": "Jenož awtomatisce wobkrućenym wužiwarjam dowolić",
        "undeletepagetext": "{{PLURAL:$1|Slědowaca strona bu wušmórnjena, ale je|Slědowacej $1 stronje buštej wušmórnjenej, ale stej|Slědowace $1 strony buchu wušmórnjene, ale su|Slědowacych $1 bu wušmórnjene, ale je}} hišće w archiwje a {{PLURAL:$1|da so|datej so|dadźa so|da so}} wobnowić.\nArchiw da so periodisce wuprózdnić.",
        "undelete-fieldset-title": "Wersije wobnowić",
        "undeleteextrahelp": "Zo by wšě stawizny strony wobnowił, wostaj prošu wšě kontrolowe kašćiki njewubrane a klikń na '''''{{int:undeletebtn}}'''''.\nZo by selektiwne wobnowjenje přewjedł, wubjer kašćiki, kotrež wersijam wotpowěduja, kotrež maja so wobnowić, a klikń na '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|wersija|wersiji|wersije|wersijow}} {{PLURAL:$1|archiwowana|archiwowanej|archiwowane|archiwowane}}",
+       "undeleterevisions": "$1 {{PLURAL:$1|wersija|wersiji|wersije|wersijow}} {{PLURAL:$1|zhašana|zhašanej|zhašane|zhašanych}}",
        "undeletehistory": "Jeli tutu stronu wobnowiš, so wšě (tež prjedy wušmórnjene) wersije zaso do stawiznow wobnowja. Jeli bu po wušmórnjenju nowa strona ze samsnym mjenom wutworjena, budu so wobnowjene wersije w prjedawšich stawiznach jewić.",
        "undeleterevdel": "Wobnowjenje so njepřewjedźe, jeli je najwyša strona docpěta abo datajowa wersija budźe so zdźěla wušmórnje.\nW tutym padźe dyrbiš najnowšu wušmórnjenu wersiju znjemóžnić abo pokazać.",
        "undeletehistorynoadmin": "Strona bu wušmórnjena. Přičina za wušmórnjenje so deleka w zjeću pokazuje, zhromadnje z podrobnosćemi wužiwarjow, kotřiž běchu tutu stronu do zničenja wobdźěłali. Tuchwilny wobsah strony je jenož administratoram přistupny.",
        "contributions": "Přinoški {{GENDER:$1|wužiwarja|wužiwarki}}",
        "contributions-title": "Wužiwarske přinoški wot „$1“",
        "mycontris": "Přinoški",
+       "anoncontribs": "Přinoški",
        "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Wužiwarske konto \"$1\" njeje zregistrowane.",
        "nocontribs": "Žane změny, kotrež podatym kriterijam wotpowěduja.",
        "whatlinkshere-next": "{{PLURAL:$1|přichodny|přichodnej|přichodne|přichodne $1}}",
        "whatlinkshere-links": "← wotkazy",
        "whatlinkshere-hideredirs": "Daleposrědkowanja $1",
-       "whatlinkshere-hidetrans": "Zapřijeća $1",
+       "whatlinkshere-hidetrans": "Transkluzije $1",
        "whatlinkshere-hidelinks": "Wotkazy $1",
        "whatlinkshere-hideimages": "Datajowe wotkazy $1",
        "whatlinkshere-filters": "Filtry",
        "cant-move-to-user-page": "Nimaš prawo stronu do wužiwarskeje strony přesunyć (z wuwzaćom do wužiwarskeje podstrony).",
        "cant-move-category-page": "Nimaš prawo, zo by kategorijowe strony přesunył.",
        "cant-move-to-category-page": "Nimaš prawo, stronu do kategorijoweje strony přesunyć.",
-       "newtitle": "pod nowe hesło",
+       "newtitle": "Nowy titul:",
        "move-watch": "Stronu wobkedźbować",
        "movepagebtn": "Stronu přesunyć",
        "pagemovedsub": "Přesunjenje wuspěšne",
        "javascripttest": "JavaScriptowy test",
        "javascripttest-pagetext-unknownaction": "Njeznata akcija \"$1\"",
        "javascripttest-qunit-intro": "Hlej [$1 testowansku dokumentaciju] na mediawiki.org.",
-       "tooltip-pt-userpage": "Twoja wužiwarska strona",
+       "tooltip-pt-userpage": "{{GENDER:|Twoja wužiwarska}} strona",
        "tooltip-pt-anonuserpage": "Wužiwarska strona IP-adresy, z kotrejž tuchwilu dźěłaš",
-       "tooltip-pt-mytalk": "Twoja diskusijna strona",
+       "tooltip-pt-mytalk": "{{GENDER:|Twoja}} diskusijna strona",
        "tooltip-pt-anontalk": "Diskusija wo změnach z tuteje IP-adresy",
-       "tooltip-pt-preferences": "moje nastajenja",
+       "tooltip-pt-preferences": "{{GENDER:|Twoje}} nastajenja",
        "tooltip-pt-watchlist": "lisćina stronow, kotrež wobkedźbuješ",
-       "tooltip-pt-mycontris": "Lisćina twojich přinoškow",
+       "tooltip-pt-mycontris": "Lisćina {{GENDER:|twojich}} přinoškow",
        "tooltip-pt-login": "Móžeš so woměrje přizjewić, to pak zawjazowace njeje.",
        "tooltip-pt-logout": "so wotzjewić",
        "tooltip-pt-createaccount": "Pozbudźujemy će, konto załožić a so přizjewić; njeje wšak nuznje trěbne",
        "tooltip-t-recentchangeslinked": "aktualne změny w stronach, na kotrež tuta strona wotkazuje",
        "tooltip-feed-rss": "RSS-feed za tutu stronu",
        "tooltip-feed-atom": "Atom-feed za tutu stronu",
-       "tooltip-t-contributions": "přinoški tutoho wužiwarja wobhladać",
-       "tooltip-t-emailuser": "wužiwarjej mejlku pósłać",
+       "tooltip-t-contributions": "Lisćina přinoškow {{GENDER:$1|tutoho wužiwarja|tuteje wužiwarki}}",
+       "tooltip-t-emailuser": "{{GENDER:$1|Tutomu wužiwarjej|Tutej wužiwarce}} mejlku pósłać",
        "tooltip-t-info": "Dalše informacije wo tutej stronje",
        "tooltip-t-upload": "Dataje nahrać",
        "tooltip-t-specialpages": "lisćina wšěch specialnych stronow",
        "lastmodifiedatby": "Strona bu dnja $1 w $2 hodź. wot $3 změnjena.",
        "othercontribs": "Bazěruje na dźěle wužiwarja $1.",
        "others": "druhich",
-       "siteusers": " {{PLURAL:$2|wužiwarja|wužiwarjeju|wužiwarjow|wužiwarjow}} $1 na {{GRAMMAR:lokatiw|{{SITENAME}}}}",
+       "siteusers": " {{PLURAL:$2|{{GENDER:$1|wužiwarja|wužiwarki}}|wužiwarjow|wužiwarkow}} $1 na {{GRAMMAR:lokatiw|{{SITENAME}}}}",
        "anonusers": " {{PLURAL:$2|anonymny wužiwar|anonymnaj wužiwarjej|anonymni wužiwarjo|anonymnych wužiwarjow}} $1 na {{GRAMMAR:lokatiw|{{SITENAME}}}}",
        "creditspage": "Dźak awtoram",
        "nocredits": "Za tutu stronu žane informacije wo zasłužbach njejsu.",
        "scarytranscludefailed-httpstatus": "[Wotwołanje předłohi za $1 je so njeporadźiło: HTTP $2]",
        "scarytranscludetoolong": "[URL je předołhi]",
        "deletedwhileediting": "'''Kedźbu''': Tuta strona bu wušmórnjena, po tym zo sy započał ju wobdźěłać!",
-       "confirmrecreate": "Wužiwar [[User:$1|$1]] ([[User talk:$1|diskusija]]) je stronu wušmórnył, po tym zo sy započał ju wobdźěłać. Přičina:\n: ''$2''\nProšu potwjerdź, zo chceš tutu stronu woprawdźe znowa wutworić.",
-       "confirmrecreate-noreason": "Wužiwar [[User:$1|$1]] ([[User talk:$1|diskusija]]) je tutu stronu zhašał, po tym zo sće wobdźěłanje započał. Prošu wobkruć, zo woprawdźe chceš tutu stronu znowa wutworić.",
+       "confirmrecreate": "{{GENDER:$1|Wužiwar|Wužiwarka}} [[User:$1|$1]] ([[User talk:$1|diskusija]]) je stronu {{GENDER:$1|wušmórnył|wušmórnyła}}, po tym zo sy započał ju wobdźěłać. Přičina:\n: <em>$2</em>\nProšu potwjerdź, zo chceš tutu stronu woprawdźe znowa wutworić.",
+       "confirmrecreate-noreason": "{{GENDER:$1|Wužiwar|Wužiwarka}} [[User:$1|$1]] ([[User talk:$1|diskusija]]) je tutu stronu {{GENDER:$1|zhašał|zhašała}}, po tym zo sće wobdźěłowanje započał. Prošu wobkruć, zo woprawdźe chceš tutu stronu znowa wutworić.",
        "recreate": "Znowa wutworić",
        "confirm_purge_button": "W porjadku",
        "confirm-purge-top": "Pufrowak strony wuprózdnić?",
        "watchlistedit-raw-done": "Twoje wobkedźbowanki buchu składowane.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 zapisk bu dodaty|$1 zapiskaj buštej dodatej|$1 zapiski buchu dodate|$1 zapiskow buchu dodate}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 zapisk bu wotstronjeny|$1 zapiskaj buštej wotstronjenej|$1 zapiski buchu wotstronjene|$1 zapiskow buchu wotstronjene}}:",
-       "watchlistedit-clear-title": "Wotstronjene wobkedźbowanki",
+       "watchlistedit-clear-title": "Wobkedźbowanki zhašeć",
        "watchlistedit-clear-legend": "Wobkedźbowanki wotstronić",
        "watchlistedit-clear-explain": "Wšě titule budu so z twojich wobkedźbowankow wotstronjeć",
        "watchlistedit-clear-titles": "Titule:",
        "version-libraries": "Instalowane biblioteki",
        "version-libraries-library": "Biblioteka",
        "version-libraries-version": "Wersija",
-       "redirect": "Po datajowym mjenje, wužiwarju, stronje abo wersijowym ID dale sposrědkować",
+       "redirect": "Na dataju, wužiwarja, stronu abo wersiju abo protokolowy ID dale sposrědkować",
        "redirect-summary": "Tuta specialna strona so do dataje (datajowe mjeno je podate), strony (wersijowy ID abo ID strony je podaty) abo wužiwarskeje strony (numeriski wužiwarski ID je podaty) dale sposrědkuje. Wužiće:\n[[{{#Special:Redirect}}/file/Přikład.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] abo [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Los",
        "redirect-lookup": "Pytać:",
        "tags-deactivate-submit": "Znjemóžnić",
        "tags-edit-revision-selected": "{{PLURAL:$1|Wubrana wersija|Wubranej wersiji|Wubrane wersije}} wot [[:$2]]:",
        "tags-edit-logentry-selected": "{{PLURAL:$1|Wubrany protokolowy podawk|Wubranej protokolowej podawkaj|Wubrane protokolowe podawki}}",
-       "tags-edit-existing-tags-none": "\"Žadyn\"",
+       "tags-edit-existing-tags-none": "<em>Žadyn</em>",
        "tags-edit-reason": "Přičina:",
        "tags-edit-revision-submit": "Změny na {{PLURAL:$1|tutu wersiju|$1 wersiji|$1 wersije|$1 wersijow}} nałožić",
        "tags-edit-logentry-submit": "Změny na {{PLURAL:$1|tutón protokolowy zapisk|$1 protokolowej zapiskaj|$1 protokolowe zapiski|$1 protokolowych zapiskow}}",
-       "tags-edit-success": "Změny su so wuspěšnje nałožili.",
+       "tags-edit-success": "Změny su so nałožili.",
        "tags-edit-failure": "Změny njehodźa so nałožować:\n$1",
        "tags-edit-nooldid-title": "Njepłaćiwa cilowa wersija",
        "comparepages": "Strony přirunać",
        "logentry-newusers-create2": "$1 je wužiwarske konto $3 {{GENDER:$2|załožił|załožiła}}",
        "logentry-newusers-byemail": "$1 je wužiwarske konto $3 {{GENDER:$2|załožił|załožiła}} a hesło je so přez e-mejl pósłało.",
        "logentry-newusers-autocreate": "Wužiwarske konto $1 je so awtomatisce {{GENDER:$2|załožiło}}",
-       "logentry-rights-rights": "$1 je skupinske čłonstwo za $3 z $4 do $5 {{GENDER:$2|změnił|změniła}}",
+       "logentry-rights-rights": "$1 je skupinske čłonstwo za {{GENDER:$6|$3}} z $4 do $5 {{GENDER:$2|změnił|změniła}}",
        "logentry-rights-rights-legacy": "$1 je skupinske čłonstwo za $3 {{GENDER:$2|změnił|změniła}}",
        "logentry-rights-autopromote": "$1 je so awtomatisce wot $4 do $5 {{GENDER:$2|přirjadował|přirjadowała}}",
        "logentry-upload-upload": "$1 je $3 {{GENDER:$2|nahrał|nahrała}}",
        "api-error-badaccess-groups": "Nimaš prawo dataje do tutoho wikija nahrać.",
        "api-error-badtoken": "Nutřkowny zmylk: Wopačny token.",
        "api-error-copyuploaddisabled": "Nahrawanje přez URL je na tutym serwerje znjemóžnjene.",
-       "api-error-duplicate": "{{PLURAL:$1|Je|Stej|Su|Je}} hižo {{PLURAL:$1|druha dataja|druhej dataji|druhe dataje|druhich datajow}} ze samsnym wobsahom na sydle",
+       "api-error-duplicate": "{{PLURAL:$1|Je|Stej|Su}} hižo {{PLURAL:$1|druha dataja|druhej dataji|druhe dataje}} ze samsnym wobsahom na sydle.",
        "api-error-duplicate-archive": "{{PLURAL:$1|Bě druha dataja|Běštej druhej dataji|Běchu druhe dataje|Bě druhich datajow}} hižo na websydle ze samsnym wobsahom, ale {{PLURAL:$1|je so zhašała|stej so zhašałoj|su so zhašeli|je so zhašało}}.",
        "api-error-empty-file": "Dataja, kotruž sy nahrał, je prózdna.",
        "api-error-emptypage": "Wutworjenje nowych, prózdnych stronow njeje dowolene.",
        "expand_templates_generate_xml": "Analyzowy štom XML pokazać",
        "expand_templates_generate_rawhtml": "Hruby HTML pokazać",
        "expand_templates_preview": "Přehlad",
-       "pagelanguage": "Selektor rěče strony",
+       "pagelanguage": "Rěč strony změnić",
        "pagelang-name": "Strona",
        "pagelang-language": "Rěč",
        "pagelang-use-default": "Standardnu rěč wužiwać",
        "special-characters-title-minus": "minusowe znamješko",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-TT",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
-       "api-error-blacklisted": "Prošu wubjer druhi, wuprajiwy titul.",
        "randomrootpage": "Připadna korjenjowa strona"
 }
index 977546c..2bbaebe 100644 (file)
        "december-date": "December $1",
        "period-am": "de.",
        "period-pm": "du.",
-       "pagecategories": "{{PLURAL:$1|Kategória|Kategóriák}}",
+       "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",
        "createacct-another-realname-tip": "A valódi nevet nem kötelező megadni, de ha úgy döntesz, hogy megadod, azzal leszel feltüntetve a munkád szerzőjeként.",
        "pt-login": "Bejelentkezés",
        "pt-login-button": "Bejelentkezés",
+       "pt-login-continue-button": "Bejelentkezés folytatása",
        "pt-createaccount": "Fiók létrehozása",
        "pt-userlogout": "Kijelentkezés",
        "php-mail-error-unknown": "Ismeretlen hiba a PHP mail() függvényében",
        "passwordreset-emailsentusername": "Ha ehhez a felhasználónévhez tartozik e-mail cím, akkor egy jelszó-visszaállító levelet küld a rendszer.",
        "passwordreset-emailsent-capture": "Az alább látható jelszó-visszaállító e-mail lett elküldve.",
        "passwordreset-emailerror-capture": "A jelszó-visszaállító e-mail generálása megtörtént, mint az alább látszik, de elküldése a {{GENDER:$2|szerkesztőnek}} nem sikerült: $1",
+       "passwordreset-invalideamil": "Érvénytelen e-mail cím",
        "changeemail": "E-mail cím megváltoztatása vagy eltávolítása",
        "changeemail-header": "Töltsd ki ezt az űrlapot az e-mail-címed megváltoztatásához. Ha nem szeretnél semmilyen e-mail-címet kapcsolni a fiókodhoz, hagyd üresen az új e-mail-cím mezőjét az űrlap elküldésekor.",
        "changeemail-passwordrequired": "Meg kell adnod a jelszavadat ennek a változtatásnak a végrehajtásához.",
        "minoredit": "Apró változtatás",
        "watchthis": "A lap figyelése",
        "savearticle": "Lap mentése",
+       "publishpage": "Lap mentése",
        "preview": "Előnézet",
        "showpreview": "Előnézet megtekintése",
        "showdiff": "Változtatások megtekintése",
        "content-model-css": "CSS",
        "content-json-empty-object": "Üres objektum",
        "content-json-empty-array": "Üres tömb",
+       "deprecated-self-close-category": "Érvénytelen önzáró HTML-címkéket használó lapok",
        "duplicate-args-warning": "<strong>Figyelmeztetés:</strong> A(z) [[:$1]] lap dupla értékkel hívja meg a(z) [[:$2]] sablont („$3” paraméter). Csak az utolsó érték lesz felhasználva.",
        "duplicate-args-category": "Dupla paramétermegadást tartalmazó lapok",
        "duplicate-args-category-desc": "Az oldal olyan sablon hívásokat tartalmaz, amely ugyanazt a paramétert használja, például <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "right-managechangetags": "[[Special:Tags|címkék]] létrehozása és törlése az adatbázisban",
        "right-applychangetags": "[[Special:Tags|címkék]] alkalmazása a változakra",
        "right-changetags": "egyedi lapváltozatokon és naplóbejegyzéseken tetszőleges [[Special:Tags|címkék]] hozzáadása és törlése",
+       "right-deletechangetags": "[[Special:Tags|Címkék]] törlése az adatbázisból",
        "grant-generic": "„$1” jogosultságcsomag",
        "grant-group-page-interaction": "interakció lapokkal",
        "grant-group-file-interaction": "interakció médiával",
        "action-managechangetags": "adatbázis címkék létrehozása és törlése",
        "action-applychangetags": "változtatások címkézése",
        "action-changetags": "egyedi változtatások és napló bejegyzések tetszőleges címkével való ellátása és törlése",
+       "action-deletechangetags": "címkék törlése az adatbáziból",
        "nchanges": "$1 változtatás",
        "enhancedrc-since-last-visit": "$1 az utolsó látogatás óta",
        "enhancedrc-history": "történet",
        "sp-contributions-username": "IP-cím vagy felhasználónév:",
        "sp-contributions-toponly": "Csak a jelenleg utolsónak számító változtatásokat mutassa",
        "sp-contributions-newonly": "Csak az új oldalt létrehozó szerkesztéseket mutassa",
+       "sp-contributions-hideminor": "Apró szerkesztések elrejtése",
        "sp-contributions-submit": "Keresés",
        "whatlinkshere": "Mi hivatkozik erre",
        "whatlinkshere-title": "A(z) „$1” lapra hivatkozó lapok",
        "lockdbsuccesstext": "Az adatbázist zárolták.\n<br />A karbantartás befejezése után ne feledd el [[Special:UnlockDB|kinyitni]].",
        "unlockdbsuccesstext": "Az adatbázis kinyitása kész.",
        "lockfilenotwritable": "Az adatbázist zároló fájl nem írható. Az adatbázis zárolásához vagy kinyitásához ennek a webkiszolgáló által írhatónak kell lennie.",
+       "databaselocked": "Az adatbázis már le van zárva.",
        "databasenotlocked": "Az adatbázis nincs lezárva.",
        "lockedbyandtime": "($1 zárta le $2 $3-kor)",
        "move-page": "$1 átnevezése",
        "tooltip-ca-nstab-category": "A kategória megtekintése",
        "tooltip-minoredit": "A szerkesztés megjelölése apróként",
        "tooltip-save": "A változtatásaid elmentése",
+       "tooltip-publish": "Változtatásaid közzététele",
        "tooltip-preview": "Mielőtt elmentenéd a lapot, ellenőrizd, biztosan úgy néz-e ki, ahogy szeretnéd!",
        "tooltip-diff": "Nézd meg, milyen változtatásokat végeztél eddig a szövegen",
        "tooltip-compareselectedversions": "A két kiválasztott változat közötti eltérések megjelenítése",
        "confirm-watch-top": "Hozzá szeretnéd adni a lapot a figyelőlistádhoz?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "El szeretnéd távolítani a lapot a figyelőlistádról?",
+       "confirm-rollback-button": "OK",
+       "confirm-rollback-top": "Visszavonod a változtatásokat?",
        "ellipsis": "…",
        "quotation-marks": "„$1”",
        "imgmultipageprev": "← előző oldal",
        "searchsuggest-containing": "tartalmazza…",
        "api-error-badaccess-groups": "Nincs jogod fájlokat feltölteni erre a wikire.",
        "api-error-badtoken": "Belső hiba: hibás token.",
+       "api-error-blocked": "Letiltották a szerkesztési jogosultságodat.",
        "api-error-copyuploaddisabled": "Az URL-címes feltöltés nem engedélyezett ezen a kiszolgálón.",
        "api-error-duplicate": "Már van {{PLURAL:$1|egy|néhány}} másik fájl az oldalon ugyanilyen tartalommal.",
        "api-error-duplicate-archive": "Az oldalon {{PLURAL:$1|szerepelt|szerepeltek}} más {{PLURAL:$1|fájl|fájlok}} is ugyanezzel a tartalommal, de törölve {{PLURAL:$1|lett|lettek}}.",
        "mw-widgets-dateinput-placeholder-month": "ÉÉÉÉ-HH",
        "mw-widgets-titleinput-description-new-page": "a lap még nem létezik",
        "mw-widgets-titleinput-description-redirect": "átirányítás ide: $1",
-       "api-error-blacklisted": "Válasszon egy másik, leíró címet.",
        "sessionprovider-generic": "$1-munkamenetek",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sütialapú munkamenetek",
        "sessionprovider-nocookies": "A sütik le lehetnek tiltva. Engedélyezd a sütiket, és próbáld meg újra!",
        "randomrootpage": "Véletlen lap a gyökérből",
+       "log-action-filter-block": "Blokk típusa:",
        "log-action-filter-delete": "Törlés típusa:",
        "log-action-filter-import": "Importálás típusa:",
+       "log-action-filter-move": "Átnevezés típusa:",
+       "log-action-filter-patrol": "Járőrözés típusa:",
+       "log-action-filter-protect": "Lapvédelem típusa:",
        "log-action-filter-all": "Mind",
        "log-action-filter-block-block": "Blokk",
        "log-action-filter-block-reblock": "Blokk módosítása",
        "log-action-filter-block-unblock": "Blokk feloldása",
+       "log-action-filter-delete-delete": "Laptörlés",
+       "log-action-filter-delete-restore": "Visszaállítás",
+       "log-action-filter-delete-event": "Naplótörlés",
        "log-action-filter-newusers-autocreate": "Automatikus létrehozás",
        "log-action-filter-protect-protect": "Lapvédelem",
        "log-action-filter-protect-unprotect": "Védelem feloldása",
-       "log-action-filter-upload-upload": "Új feltöltés"
+       "log-action-filter-upload-upload": "Új feltöltés",
+       "authprovider-resetpass-skip-label": "Kihagy",
+       "cannotauth-not-allowed-title": "Engedély megtagadva",
+       "credentialsform-account": "Fiók neve:"
 }
index 336b8de..2920310 100644 (file)
        "minoredit": "Isto es un modification minor",
        "watchthis": "Observar iste pagina",
        "savearticle": "Publicar pagina",
+       "savechanges": "Salveguardar modificationes",
        "publishpage": "Publicar pagina",
+       "publishchanges": "Publicar modificationes",
        "preview": "Previsualisation",
        "showpreview": "Monstrar previsualisation",
        "showdiff": "Detaliar modificationes",
        "content-model-css": "CSS",
        "content-json-empty-object": "Objecto vacue",
        "content-json-empty-array": "Array vacue",
+       "deprecated-self-close-category": "Paginas que usa etiquettas HTML auto-claudite non valide",
+       "deprecated-self-close-category-desc": "Le pagina contine etiquettas HTML auto-claudite non valide, como <code>&lt;b/></code> o <code>&lt;span/></code>. Le comportamento de istes cambiara proximemente pro esser in accordo con le specification HTML5, dunque lor uso in wikitexto es obsolete.",
        "duplicate-args-warning": "<strong>Attention:</strong> [[:$1]] appella [[:$2]] con plure valores pro le parametro \"$3\". Solmente le ultime valor fornite essera usate.",
        "duplicate-args-category": "Paginas que usa parametros duplicate in appellos de patrono",
        "duplicate-args-category-desc": "Le pagina contine appellos de patrono que usa duplicatos de parametros, como per exemplo <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "rightslogtext": "Isto es un registro de cambios in derectos de usator.",
        "action-read": "leger iste pagina",
        "action-edit": "modificar iste pagina",
-       "action-createpage": "crear paginas",
-       "action-createtalk": "crear paginas de discussion",
+       "action-createpage": "crear iste pagina",
+       "action-createtalk": "crear iste pagina de discussion",
        "action-createaccount": "crear iste conto de usator",
        "action-autocreateaccount": "crear automaticamente iste conto de usator externe",
        "action-history": "vider le historia de iste pagina",
        "upload-http-error": "Un error HTTP occurreva: $1",
        "upload-copy-upload-invalid-domain": "Le incargamento de copias non es disponibile ab iste dominio.",
        "upload-foreign-cant-upload": "Iste wiki non es configurate pro incargar files al repositorio de files externe demandate.",
+       "upload-foreign-cant-load-config": "Impossibile cargar le configuration pro le incargamento de files al repositorio de files externe.",
+       "upload-dialog-disabled": "Le incargamento de files con iste dialogo es disactivate in iste wiki.",
        "upload-dialog-title": "Incargar file",
        "upload-dialog-button-cancel": "Cancellar",
        "upload-dialog-button-done": "Facite",
        "sp-contributions-username": "Adresse IP o nomine de usator:",
        "sp-contributions-toponly": "Monstrar solmente le versiones recente",
        "sp-contributions-newonly": "Monstrar solmente le modificationes que es creationes de pagina",
+       "sp-contributions-hideminor": "Celar modificationes minor",
        "sp-contributions-submit": "Cercar",
        "whatlinkshere": "Paginas ligate a iste",
        "whatlinkshere-title": "Paginas con ligamines verso $1",
        "confirm-watch-top": "Adder iste pagina a tu observatorio?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Remover iste pagina de tu observatorio?",
+       "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Reverter le modificationes a iste pagina?",
        "quotation-marks": "“$1”",
        "imgmultipageprev": "← precedente pagina",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "pagina non existe ancora",
        "mw-widgets-titleinput-description-redirect": "redirection a $1",
-       "api-error-blacklisted": "Per favor elige un altere titulo, plus descriptive.",
        "sessionmanager-tie": "Impossibile combinar plure typos de authentication de requesta: $1.",
        "sessionprovider-generic": "sessiones $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sessiones basate sur cookies",
        "log-action-filter-newusers": "Typo de creation de conto:",
        "log-action-filter-patrol": "Typo de patrulia:",
        "log-action-filter-protect": "Typo de protection:",
-       "log-action-filter-rights": "Typo de cambio de derecto",
-       "log-action-filter-suppress": "Typo de suppression",
+       "log-action-filter-rights": "Typo de cambio de derecto:",
+       "log-action-filter-suppress": "Typo de suppression:",
        "log-action-filter-upload": "Typo de incargamento:",
        "log-action-filter-all": "Toto",
        "log-action-filter-block-block": "Blocar",
        "linkaccounts-success-text": "Le conto ha essite ligate.",
        "linkaccounts-submit": "Ligar contos",
        "unlinkaccounts": "Disligar contos",
-       "unlinkaccounts-success": "Le conto ha essite disligate."
+       "unlinkaccounts-success": "Le conto ha essite disligate.",
+       "authenticationdatachange-ignored": "Le cambiamento del datos de authentication non ha succedite. Pote esser que nulle fornitor ha essite configurate?"
 }
index db46511..53a910d 100644 (file)
        "allarticles": "Omni li articules",
        "allpagessubmit": "Applicar",
        "categories": "Categories",
-       "special-categories-sort-count": "Sorte per contar",
-       "special-categories-sort-abc": "Sorte alfabeticmen",
        "linksearch": "Catenunes extern",
        "linksearch-ns": "Spacie de nómine:",
        "linksearch-line": "$1 es ligat de $2",
index 857d097..d735991 100644 (file)
@@ -11,7 +11,8 @@
                        "Shirayuki",
                        "ElizaMag",
                        "Adam-Yourist",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Tusholi"
                ]
        },
        "tog-underline": "ТIахьожаярга кIала така хьакхар:",
        "imagepage": "Файла оагIон бIаргтоха",
        "mediawikipage": "Хьахьокха хоам бара оагIув",
        "templatepage": "Лера оагIон бIаргтоха",
-       "viewhelppage": "Ð\93Ó\80о Ñ\85Ñ\8cаэцар",
+       "viewhelppage": "Ð\9dовкÑ\8aоÑ\81Ñ\82ал эцар",
        "categorypage": "Категорен оагIон бIаргтоха",
        "viewtalkpage": "Дувца оттадара бIаргтоха",
        "otherlanguages": "Кхыча меттаех",
        "poolcounter-usage-error": "Пайда эцара гIалат: $1",
        "aboutsite": "{{grammar:genitive|{{SITENAME}}}} лаьца дар",
        "aboutpage": "Project:Сурт оттадар",
-       "copyright": "$1 чулоацамаца тIакхоачаш да.",
+       "copyright": "Чудара тIакхоачилга $1 лицензе бокъонца да, нагахьа кхыдар белгалдаь деце.",
        "copyrightpage": "{{ns:project}}:Автора бокъонаш",
        "currentevents": "ХӀанзара хинна хIамаш",
        "currentevents-url": "Project:ХӀанзара хинна хIамаш",
        "disclaimers": "Бехктокхам тIацаэцар",
        "disclaimerpage": "Project:Бехктокхам тIацаэцар",
        "edithelp": "Хувцам бара новкъостал",
-       "helppage-top-gethelp": "Ð\93Ó\80о",
+       "helppage-top-gethelp": "Ð\9dовкÑ\8a\81Ñ\82ал",
        "mainpage": "Керттера оагӀув",
        "mainpage-description": "Керттера оагӀув",
        "policy-url": "Project:Бокъонаш",
        "privacypage": "Project:КъайлагIара хIамай политика",
        "badaccess": "ТIакхоачилга гӀалат",
        "badaccess-group0": "Оаш дIадийха хинна ардам кхоачашде йиш яц шун.",
-       "badaccess-groups": "Дахта кхоачашдар {{PLURAL:$2|1=тоабачара|тоабашкара}} $1 дакъалаьцархой мара де бокъо яц.",
+       "badaccess-groups": "ДIадийха ардам кхоачашде могаш ба алхха доакъашхой {{PLURAL:$2|1=тоабан «$1»|укх тоабаш чура: $1}}",
        "versionrequired": "Эшаш я $1 версех йола MediaWiki",
        "versionrequiredtext": "Укх оагIонца болх бергболаш $1 версех йола MediaWiki эша. Хьажа [[Special:Version|програмни Iалашдарах бола хоамага]].",
        "ok": "Мега",
        "retrievedfrom": "Хьаст — «$1»",
-       "youhavenewmessages": "Оаш $1 ($2) дӀайийцад",
-       "youhavenewmessagesmulti": "Ð\9eаÑ\88 $1Ñ\87Ñ\83 ÐºÐµÑ\80да Ñ\85оамаÑ\88 Ð´Ó\80айийÑ\86ад",
+       "youhavenewmessages": "{{PLURAL:$3|Хьога денад}} $1 ($2).",
+       "youhavenewmessagesmulti": "Ð¥Ñ\8cога ÐºÑ\85аÑ\8cÑ\87ад ÐºÐµÑ\80да Ñ\85оамаÑ\88 $1 Ñ\87Ñ\83",
        "editsection": "нийсде",
        "editold": "хувца",
-       "viewsourceold": "xьайоагӀа къайлорг тӀа бӀаргтасса",
+       "viewsourceold": "Хьажа дIадолалу ко́дага",
        "editlink": "хувца",
        "viewsourcelink": "Хьажа дIадолалу ко́дага",
        "editsectionhint": "Дáкъа хувца: $1",
        "toc": "Чудар",
        "showtoc": "хьахьокха",
-       "hidetoc": "къайладаккха",
-       "collapsible-collapse": "чудерзаде",
-       "collapsible-expand": "хьадоаржаде",
-       "confirmable-yes": "Xа",
+       "hidetoc": "хьулде",
+       "collapsible-collapse": "дIахьулде",
+       "collapsible-expand": "доаржаде",
+       "confirmable-yes": "XӀа-а",
        "confirmable-no": "A",
-       "thisisdeleted": "$1 бӀаргтасса е юхаметтаоттаде?",
-       "viewdeleted": "$1 бӀаргтасса?",
-       "restorelink": "{{PLURAL:$1|1=д|адaьккха хувцам|$1 д|адaьккха хувцамаш}}",
-       "feedlinks": "ЦÑ\83 тайпара:",
-       "site-rss-feed": "$1 RSS мугӀ",
+       "thisisdeleted": "БIаргтоха е юхаметтаоттае $1?",
+       "viewdeleted": "Хьажа $1?",
+       "restorelink": "{{PLURAL:$1|1=дIадaьккха нийсдар|$1 дIадaьккха нийсдараш}}",
+       "feedlinks": "УкÑ\85 тайпара:",
+       "site-rss-feed": "$1 — RSS-мугI",
        "site-atom-feed": "$1 — Atom-мугI",
-       "page-rss-feed": "\"$1\" RSS мугӀ",
+       "page-rss-feed": "$1 — RSS-мугI",
        "page-atom-feed": "«$1» — Atom-мугI",
        "red-link-title": "$1 (укх тайпара оагӀув яц)",
        "nstab-main": "Статья",
        "nstab-user": "Доакъашхо",
-       "nstab-media": "Медифаг",
+       "nstab-media": "Мультимедиа",
        "nstab-special": "ГIулакха оагӀув",
        "nstab-project": "Проектах лаьца",
        "nstab-image": "Файл",
-       "nstab-mediawiki": "Хоам",
+       "nstab-mediawiki": "Хоамбар",
        "nstab-template": "Ло",
-       "nstab-help": "Ð\93Ó\80о",
+       "nstab-help": "Ð\9dовкÑ\8aоÑ\81Ñ\82ал",
        "nstab-category": "Категори",
        "mainpage-nstab": "Керттера",
-       "nosuchaction": "ЦÑ\83 Ñ\82айпаÑ\80а Ð´Ñ\83лаÑ\80Ñ\85Iам Ð±ац",
-       "nosuchspecialpage": "Изза мо гӀон оагӀув яц",
+       "nosuchaction": "ЦÑ\83 Ñ\82айпаÑ\80а Ð°Ñ\80дам Ð´ац",
+       "nosuchspecialpage": "Изза мо гIулакха оагӀув яц",
        "error": "ГӀалат",
-       "databaseerror-query": "Дехар: $1",
-       "databaseerror-function": "Ð\91елÑ\85ма|ан: $1",
-       "databaseerror-error": "Г|алат: $1",
-       "missing-article": "Ð\9aоÑ\80аде Ð´ÐµÐ·Ð°Ñ\88 Ñ\85инна Ð¾Ð°Ð³Ó\80Ñ\83вни Ñ\8fздам ÐºÐ¾Ñ\80адаÑ\8cдаÑ\86 Â«$1» $2.\n\nÐ\98з Ð¼Ð¾ Ð³Ó\80алаÑ\82 Ð½Ð¸Ð¹Ñ\81алÑ\83Ñ\88 Ñ\85Ñ\83ла, Ñ\81аг Ñ\82иÑ\88Ñ\8aенна Ó\80инкаÑ\86а, Ð´|адаÑ\8cккÑ\85а Ð´Ð¾Ð»Ð° Ð¾Ð°Ð³Ó\80Ñ\83вни Ñ\85Ñ\83вÑ\86а Ð¸Ñ\81каÑ\80а Ñ\82Ó\80а Ñ\87Ñ\83вала Ð³Ó\80еÑ\80Ñ\82аÑ\87а.\n\nÐ\9dаггаÑ\85Ñ\8c Ñ\81анна Ð¸Ð· Ð¸Ñ\88Ñ\82Ñ\82а Ð´ÐµÑ\86e, Ñ\88оана Ð³Ó\80оÑ\80Ñ\81а Ó\80алаÑ\88 Ð´ÐµÑ\87а Ð³Ó\80алаÑ\82 ÐºÐ¾Ñ\80аÑ\8fÑ\8c Ñ\85ила Ð¼ÐµÐ³Ð°.\nÐ\94еÑ\85аÑ\80 Ð´Ð°, [[Special:ListUsers/sysop|мазакÑ\83лгалÑ\85оÑ\87оа]] Ñ\85оам Ð±Ðµ, URL Ñ\85Ñ\8cаÑ\85Ñ\8cокÑ\85аÑ\88.",
-       "missingarticle-rev": "(бÓ\80аÑ\80гоагÓ\80Ñ\83в № $1)",
-       "missingarticle-diff": "(башх: $1, $2)",
+       "databaseerror-query": "ДIадехар: $1",
+       "databaseerror-function": "ФÑ\83нкÑ\86и: $1",
+       "databaseerror-error": "ГIалат: $1",
+       "missing-article": "Ð\94аÑ\80ий Ð³Ñ\83ллам Ñ\87Ñ\83 Ð´IайийÑ\85а Ñ\82екÑ\81Ñ\82 Ñ\8fÑ\86 Ñ\83кÑ\85 Ð¾Ð°Ð³Iон Â«$1» Ñ\87Ñ\83Ñ\80а $2 ÐºÐ¾Ñ\80адаÑ\80 Ð´ÐµÐ·Ð°Ñ\88 Ñ\85инна.\n\nÐ\98з Ð¼Ð¾ Ð³IалаÑ\82 Ð½Ð¸Ð¹Ñ\81алÑ\83Ñ\88 Ñ\85Ñ\83л Ñ\82иÑ\88Ñ\8aенна Ñ\82IаÑ\85Ñ\8cожаÑ\8fÑ\80га Ð³Iолла Ð´IадаÑ\8cккÑ\85а Ð¾Ð°Ð³Ó\80он Ñ\85Ñ\83вÑ\86ама Ð¸Ñ\81Ñ\82оÑ\80и Ñ\82Ó\80а Ð´ÐµÑ\85Ñ\8cавала Ð³Ó\80еÑ\80Ñ\82аÑ\87а.\n\nÐ\9dагаÑ\85Ñ\8cа Ñ\81анна Ð¸Ð· Ð¸Ñ\88Ñ\82Ñ\82а Ð´ÐµÑ\86e, Ñ\88оана Ð¿Ñ\80огÑ\80аммни Ó\80алаÑ\88даÑ\80 Ñ\87Ñ\83 Ð³IалаÑ\82 ÐºÐ¾Ñ\80аÑ\8fÑ\8c Ñ\85ила Ð¼ÐµÐ³Ð°.\nÐ\94еÑ\85аÑ\80 Ð´Ð°, Ñ\86Ñ\83 Ð³IÑ\83лакÑ\85а Ñ\85оам Ð±Ðµ Ñ\86Ñ\85Ñ\8cа [[Special:ListUsers/sysop|мазаÑ\83Ñ\80Ñ\85алдеÑ\80Ñ\87Ñ\83нга]], Ñ\83кÑ\85азаÑ\80 URL Ð±ÐµÐ»Ð³Ð°Ð»Ñ\8fÑ\8cккÑ\85а.",
+       "missingarticle-rev": "(веÑ\80Ñ\81и № $1)",
+       "missingarticle-diff": "(башхало: $1, $2)",
        "internalerror": "Чура гӀалат",
        "internalerror_info": "Чура гӀалат: $1",
-       "cannotdelete-title": "Ð\9eагIÑ\83в Ð´IаÑ\8fккÑ\85а Ð¹Ð¸Ñ\88 Ñ\8fÑ\86 \"$1\"",
+       "cannotdelete-title": "Ð\9cегаÑ\88 Ñ\8fÑ\86 Ð´IаÑ\8fккÑ\85а Ð¾Ð°Ð³IÑ\83в \"$1\"",
        "badtitle": "Мегаш йоаца цӀи",
        "badtitletext": "Езаш йола оагӀон цӀи нийса яц, яьсса я, е харцахь йоалаяй меттий юкъера цIи е интервики цӀи. Иштта, цӀера юкъе оттаде мегаш доаца хьаракаш нийсаденна хила мегаш да.",
        "viewsource": "Хьажар",
-       "actionthrottled": "Сихален овзамал",
-       "protectedpagetext": "Ер оаг|ув къайла я хувцамаш дергдоацаш е кхы дола х|амдараш.",
-       "virus-unknownscanner": "довзаÑ\88доаÑ\86а Ð¼Ð°Ð·Ð°Ñ\83ндоÑ\85Ñ\8cалÑ\83Ñ\80г:",
-       "welcomeuser": "Ð\9cаÑ\8cÑ\80Ñ\88а Ð´Ð¾Ð°Ð³|алд, $1!",
-       "yourname": "Ð\94акÑ\8aалаÑ\8cÑ\86аÑ\80Ñ\85оÑ\87Ñ\83нна Ñ\86Ó\80и:",
+       "actionthrottled": "Сухалах доазув дар",
+       "protectedpagetext": "Ер оагIув лораяь я цу тIа хувцамаш е кхы дола ардамаш дергдоацаш.",
+       "virus-unknownscanner": "йовзанза Ð°Ð½Ñ\82ивиÑ\80Ñ\83Ñ\81:",
+       "welcomeuser": "Ð\9cаÑ\8cÑ\80Ñ\88а Ð²Ð¾Ð°Ð³Iалва, Ð´Ð¾Ð°ÐºÑ\8aаÑ\88Ñ\85о $1!",
+       "yourname": "Ð\94агаÑ\80а Ð¹Ð¾Ð°Ð·Ð¾Ð½ Ñ\86Iи:",
        "userlogin-yourname": "Доакъашхочун цӀи",
        "userlogin-yourname-ph": "Iочуязъе хьай учёта яздара (доакъашхочун) цӀи",
-       "createacct-another-username-ph": "Чуйоалае доакъашхочун цӀи",
-       "yourpassword": "КъайладIоагӀа:",
+       "createacct-another-username-ph": "Iочуязъе доакъашхочун цӀи",
+       "yourpassword": "КъайладIоагIа:",
        "userlogin-yourpassword": "Пароль",
        "userlogin-yourpassword-ph": "Iочуязъе хьа пароль",
        "createacct-yourpassword-ph": "Iочуязъе пароль",
-       "yourpasswordagain": "Ð\9aÑ\8aайладIоагÓ\80а Ñ\8eÑ\85а Ó\80оÑ\8fзаде:",
+       "yourpasswordagain": "ЮÑ\85аÑ\8fзде ÐºÑ\8aайладIоагIа:",
        "createacct-yourpasswordagain": "Бакъйе пароль",
        "createacct-yourpasswordagain-ph": "Кхы цхьаькхаза Iочуязъе пароль",
-       "remembermypassword": "(укх $1 {{PLURAL:$1|1=ден|деношкахь}}) мара са чувалара/чуялара дагалоаца дезаш дац",
+       "remembermypassword": "ДагайоагIаш хилийта са дагара йоазув укх компьютер тӀа (цхьан $1 {{PLURAL:$1|дийнахь}})",
        "userlogin-remembermypassword": "Система чу виса",
-       "yourdomainname": "ШÑ\83н Ñ\86Ó\80еноагÓ\80Ñ\83в:",
+       "yourdomainname": "Ð¥Ñ\8cа Ð½Ð°Ð½Ð°-Ñ\86Iа:",
        "login": "Чувала/яла",
-       "nav-login-createaccount": "ЦÓ\80и Ñ\8fÑ\8cккÑ\85а/Ший oагÓ\80Ñ\83в ÐµÐ»Ð°",
-       "userlogin": "ЦÓ\80и Ñ\8fÑ\8cккÑ\85а/Ð\9eагÓ\80Ñ\83в ÐµÐ»Ð°",
-       "userloginnocreate": "ЧÑ\83вала/Ñ\8fла",
+       "nav-login-createaccount": "ШоаÑ\88 Ð´Ð¾Ð²Ð·Ð¸Ð¹Ñ\82аÑ\80 / Ð\94агаÑ\80а Ð¹Ð¾Ð°Ð·Ñ\83в ÐºÑ\85оллаÑ\80",
+       "userlogin": "ШоаÑ\88 Ð´Ð¾Ð²Ð·Ð¸Ð¹Ñ\82аÑ\80 Ðµ Ð´Ð°Ð³Ð°Ñ\80а Ð¹Ð¾Ð°Ð·Ñ\83в ÐºÑ\85оллаÑ\80",
+       "userloginnocreate": "ШоаÑ\88 Ð´Ð¾Ð²Ð·Ð¸Ð¹Ñ\82а",
        "logout": "Аравала/яла",
        "userlogout": "Аравала/яла",
-       "notloggedin": "Оаш шоай цӀи хьааьннадац",
+       "notloggedin": "Оаш шоаш довзийтадац системан",
        "userlogin-noaccount": "Доакъашхочун учета яздар дице хьа?",
        "userlogin-joinproject": "ДIахоттале {{SITENAME}}аца",
-       "nologin": "Ð\9bеламе Ð´IаÑ\8fздаÑ\80 Ð´Ð°Ñ\86? '''$1'''.",
+       "nologin": "Ð\94агаÑ\80а Ð¹Ð¾Ð°Ð·Ñ\83в Ð¹Ð¸Ñ\86е Ñ\85Ñ\8cога? $1.",
        "nologinlink": "Дагара йоазув хьакхолла",
        "createaccount": "Дагара йоазув хьакхолла",
-       "gotaccount": "Укхаза дӀаязабенна дий шо? '''$1'''.",
+       "gotaccount": "Укхаза тхьовре дӀаяьзденна дий шо? $1.",
        "gotaccountlink": "Чувала/яла",
-       "userlogin-resetlink": "Чувала/яла цӀии дIоагӀаи дийцаденнадий?",
+       "userlogin-resetlink": "Чувалара/ялара дараш дицданнадий шоана?",
        "userlogin-resetpassword-link": "ТIеракхосс хьа пароль?",
        "userlogin-helplink2": "Система чуваларах новкъостал",
        "userlogin-createanother": "Кхыдола дагара йоазув хьакхолла",
        "createacct-emailoptional": "Электронни почта адрес (ца яздича мегаш да)",
        "createacct-email-ph": "Iочуязде хьа электронни почта адрес",
-       "createaccountmail": "Ð\9aÑ\8aайладIоагIа Ð´-Ñ\85оамнеÑ\86 Ñ\85Ñ\8cадайÑ\82а",
+       "createaccountmail": "Ð\9fайда Ñ\8dÑ\86а Ñ\86а Ñ\85овÑ\88 Ð½Ð¸Ð¹Ñ\81денна ÐºÑ\8aайладIоагIа, Ð¸Ñ\88Ñ\82Ñ\82а Ñ\85Ñ\8cадайÑ\82а Ð¸Ð· Ð±ÐµÐ»Ð³Ð°Ð»Ð´Ð°Ñ\8c Ñ\8dлекÑ\82Ñ\80онни Ð¿Ð¾Ñ\87Ñ\82а Ð°Ð´Ñ\80еÑ\81а Ñ\82Ó\80а.",
        "createaccountreason": "Бахьан:",
        "createacct-reason": "Бахьан",
        "createacct-submit": "Хьакхолла учета яздар",
        "createacct-benefit-body1": "{{PLURAL:$1|нийсдар|нийсдараш}}",
        "createacct-benefit-body2": "{{PLURAL:$1|статья|статьяш}}",
        "createacct-benefit-body3": "{{PLURAL:$1|доакъашхо|доакъашхой}} тӀеххьара хан",
-       "badretype": "Оаша яьккха дIоагIий цIераш шоайл таралуш яц.",
-       "loginerror": "Ð\94акÑ\8aалаÑ\8cÑ\86аÑ\80Ñ\85оÑ\87Ñ\83н Ñ\86Iи Ð½Ð¸Ð¹Ñ\81а Ñ\8fÑ\86",
-       "mailmypassword": "Керда къайлад|оаг|а эца",
-       "mailerror": "Хоам Ð´IабоÑ\85Ñ\8cийÑ\82аÑ\88 Ð³IалаÑ\82 Ð´Ð°Ñ\8cннад: $1",
-       "emailconfirmlink": "Ð\94оаÑ\80жален Ñ\85оамни Ñ\85Ñ\8cожадоÑ\80г Ð´IаÑ\87IоагIаде",
+       "badretype": "Оаша Iочуяьздаь къайладIоагIий цIераш цхьантара яц.",
+       "loginerror": "Ð\94оакÑ\8aаÑ\88Ñ\85о Ð²Ð¾Ð²Ð·Ð°Ñ\80а Ð³IалаÑ\82",
+       "mailmypassword": "КъайладIоагIа тIеракхоссар",
+       "mailerror": "Ð\9aаÑ\8cÑ\85аÑ\82 Ð´IадоÑ\85Ñ\8cиййÑ\82аÑ\88 Ð³Ó\80алаÑ\82 Ñ\85илаÑ\80: $1",
+       "emailconfirmlink": "Ð\91акÑ\8aде Ñ\85Ñ\8cа Ñ\8dлекÑ\82Ñ\80онни Ð¿Ð¾Ñ\88Ñ\82а Ð°Ð´Ñ\80еÑ\81",
        "loginlanguagelabel": "Мотт: $1",
        "pt-login": "Чувала/яла",
        "pt-login-button": "Чувала/яла",
        "changepassword": "КъайладIоaгIа дIахувцар",
        "oldpassword": "Къаьна къайладIоагӀа:",
        "newpassword": "Керда къайладIоагӀа:",
-       "retypenew": "Керда къайладIоагӀа юха Ӏоязаде:",
+       "retypenew": "Юхаязде керда къайладIоагӀа:",
+       "botpasswords-label-appid": "Бóта цӀи:",
+       "botpasswords-label-create": "Хьакхолла",
+       "botpasswords-label-update": "Кердадаккха",
+       "botpasswords-label-cancel": "Эшац",
+       "botpasswords-label-delete": "ДIадаккха",
+       "botpasswords-label-resetpassword": "Пароль тIеракхоссар",
        "resetpass-submit-loggedin": "КъайладIоагӀа дӀахувца",
-       "resetpass-submit-cancel": "ЮÑ\85авал/Ñ\8fлa",
+       "resetpass-submit-cancel": "ЭÑ\88аÑ\86",
        "passwordreset": "Пароль тIеракхоссар",
-       "passwordreset-username": "Дакъалаьцархочунна цӀи:",
-       "passwordreset-email": "Д-хоамни моттиг:",
+       "passwordreset-username": "Доакъашхочун цӀи:",
+       "passwordreset-domain": "Домен:",
+       "passwordreset-email": "Электронни почта адрес:",
+       "resettokens-tokens": "Токенаш:",
        "bold_sample": "Сома йоазон текст",
        "bold_tip": "Сома йоазон текст",
        "italic_sample": "Сиха йоазон текст",
        "sig_tip": "Хьа кулгаяздар а, хӀанзара ха а",
        "hr_tip": "ПхьорагIен така (цох пайда эцар тIехдаьнна кастта ма де)",
        "summary": "Хувцамий сурт оттадар",
-       "subject": "Ð\91Ó\80агал/коÑ\80Ñ\82але:",
+       "subject": "Тема/даÑ\8cкÑ\8aа Ñ\86Iи:",
        "minoredit": "ЗӀамига хувцам",
        "watchthis": "Зем бе укх оагӀон",
        "savearticle": "ОагӀув дIаязъе",
-       "preview": "Хьалхе бӀаргтассар",
+       "preview": "Хьалххе бIаргтохар",
        "showpreview": "Хьалххе бIаргтохар",
        "showdiff": "Даь дола хувцамаш",
        "anoneditwarning": "<strong>Теркам бе!</strong> Хьо автор хинна система чуваьннавац. Нагахьа санна Iа моллагIа хувцам бой, Хьа IP-адрес дийла массанен бIаргагуш хургда. Нагахьа санна Хьо <strong>[$1 хьачувоале]</strong> е <strong>[$2 дагара йоазув хьакхолле]</strong>, нийсдараш (хувцамаш) бувзам болаш хургда Хьа доакъашхой цIерца, иштта кхыдола толажагIи гIойленагIи дола дикаьш хургда Хьона.",
-       "summary-preview": "Ð\9bоаÑ\86ам Ð±а:",
-       "subject-preview": "Ð\9aоÑ\80Ñ\82але Ñ\85Ñ\83Ñ\80гÑ\8cÑ\8f:",
-       "blockedtitle": "Ð\94акÑ\8aалаÑ\8cÑ\86аÑ\80Ñ\85о Ñ\87Ó\80ега Ð±ÐµÐ»Ð° Ð²Ð°/Ñ\8f",
-       "blockednoreason": "баÑ\85Ñ\8cан Ð´Ð¾Ð°Ñ\86аÑ\88 Ð´Ð°",
-       "loginreqlink": "чувала/яла",
-       "loginreqpagetext": "Ð\9aÑ\85Ñ\8bйола Ð¾Ð°Ð³Ó\80Ñ\83внаÑ\88ка Ñ\85Ñ\8cожаÑ\80гдолаÑ\88, Ð¾Ð°Ñ\88 $1 Ð´Ðµ Ð´ÐµÐ·Ð°.",
+       "summary-preview": "СÑ\83Ñ\80Ñ\82 Ð¾Ñ\82Ñ\82адаÑ\80 Ñ\85Ñ\83Ñ\80гда:",
+       "subject-preview": "Ð\94аÑ\8cкÑ\8aа Ñ\86Iи Ñ\85Ñ\83Ñ\80гÑ\8cÑ\8f Ð¸Ñ\88Ñ\82Ñ\82а:",
+       "blockedtitle": "Ð\94оакÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ñ\87Iега Ñ\82еÑ\85аб",
+       "blockednoreason": "баÑ\85Ñ\8cан Ð±ÐµÐ»Ð³Ð°Ð»Ð´Ð°Ñ\8cккÑ\85а Ð´Ð°Ñ\86",
+       "loginreqlink": "довзийта",
+       "loginreqpagetext": "Ð\9eаÑ\88 Ñ\88оаÑ\88 $1 Ð´ÐµÐ·Ð° ÐºÑ\85Ñ\8bйола Ð¾Ð°Ð³IонаÑ\88ка Ñ\85Ñ\8cожаÑ\80гдолаÑ\88.",
        "accmailtitle": "КъайладIоагӀа дӀадахьийтад",
        "newarticle": "(Kерда)",
        "newarticletext": "Шо тIахьожаяргаца дехьадаьннад йоаца оагӀон тӀа.\nИз хьакхолларгьйолаш кӀалхагӀа доала корачу текст Iочуязде (нагахьа санна кхетаде хала дале [$1 новкъосталара оагӀонга] хьажа).\nЦа ховш укхаза нийсденнадале, шоай браузера '''Юха''' (назад) тоIаер тӀа пӀелг тоӀабе.",
        "noarticletext": "ХIанза укх оагӀон тӀа текст яц.\nШун аьттув ба [[Special:Search/{{PAGENAME}}|цу тайпара цӀи хьоаяр кораде]] кхыйола оагIонаш тIа, иштта\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тара дола тептарий дIаяздаьраш], е\n'''[{{fullurl:{{FULLPAGENAME}}|action=edit}} изза мо цӀи йолаш оагӀув хьакхолла]'''</span>.",
        "noarticletext-nopermission": "ХIанз укх оагӀон тӀа текст яц.\nШун аьттув ба [[Special:Search/{{PAGENAME}}|цу тайпара цӀи белгалъяр хьалаха]] кхыйола оагIонаш тIа, иштта\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тара дола тептарай дIаяздаьраш].</span> Ер оагӀув хьакхолла Хьа бокъо яц.",
-       "note": "'''Ð¥Ó\80амоалар:'''",
-       "previewnote": "'''Ð¥Ñ\8cалÑ\85е Ð±|аÑ\80гÑ\82аÑ\81Ñ\81ам Ð¼Ð°Ñ\80а Ð±Ð°Ñ\86.'''\nЯздам ÐºÑ\85Ñ\8b яздаь дац!",
+       "note": "'''Ð\91елгалдоаÑ\85ар:'''",
+       "previewnote": "'''ТеÑ\80кам Ð±Ðµ, ÐµÑ\80 Ñ\85Ñ\8cалÑ\85Ñ\85е Ð±IаÑ\80гÑ\82оÑ\85аÑ\80 Ð¼Ð°Ñ\80а Ð±Ð°Ñ\86.'''\nÐ¥Ñ\8cа Ñ\85Ñ\83вÑ\86амаÑ\88 Ñ\85Iанза Ð° Ð´Iаяздаь дац!",
        "editing": "Хувцам: $1",
        "creating": "«$1» оагIув хьакхоллар",
        "editingsection": "Хувцам: $1 (оагӀон дáкъа)",
-       "editingcomment": "Ð\93Ó\80алаÑ\82нийÑ\81даÑ\80 $1 (кеÑ\80да Ð´ÐµÐºÑ\8aам)",
-       "editconflict": "Ð\93Ó\80алаÑ\82нийÑ\81даÑ\80а ÐºÑ\8aовÑ\81ам: $1",
-       "yourtext": "Ð¥Ñ\8cа Ñ\8fздам",
-       "copyrightwarning": "Теркам бе, $2 ($1 хьажа) бокъонаца лорадеш, тӀахьежама кӀала уллаш, оаш мел чуяккхаш дола хоамаш, яздамаш долга.\nНаггахь санна шоай яздамаш пурам доацаш мала волашву саго хувца е кхы дола моттиге яздердолаш, безам беци, укхаз Ӏочуцаяздеча, дикаьгӀа да.<br />\nОаш дош лу, даь дола хувцама да волга/йолга, е оаш пурам долаш Ӏочуяздеш да кхычера меттигара шоай яздамаш/хоамаш.\n'''Яздархой бокъоца лорадеш дола хӀамаш, цара пурам доацаш, Ӏочумаязаде!'''",
+       "editingcomment": "Ð¥Ñ\83вÑ\86ам: $1 (оагÓ\80он ÐºÐµÑ\80да Ð´Ã¡ÐºÑ\8aа)",
+       "editconflict": "Ð¥Ñ\83вÑ\86ама Ð²IаÑ\88дÑ\83Ñ\85Ñ\8cалÑ\8aоÑ\82Ñ\82ам: $1",
+       "yourtext": "Ð¥Ñ\8cа Ñ\82екÑ\81Ñ\82",
+       "copyrightwarning": "Теркам бе, статьяй текста деррига хувцамаш а, тIатохараш а укх лицензи $2 хьалашца (условия) лоархIаш да (хь. $1).\nНагахь санна Шоай тексташ Шун пурам доацаш лоIаме даржийта а, моллагIа волча саго хувца йиш йолаш хилийта а Шун безам беце, уж укхаз (Википейде) ма язде.<br />\nИштта, Оаш бакъду Шоай тIатохама Шо автораш хилар, е из кеп яьккха укхаз хьачудаккхар лоIаме чудар долча хьаста (источник) тIара.\n'''АВТОРСКИ БОКЪОНАШЦА ЛОРАДЕШ ДОЛА МАТЕРИАЛАШ УКХАЗ ЧУ МА ДАХА!'''",
        "templatesused": "Укх оагIон тIа {{PLURAL:$1|1=пайда эца ло|пайда эца лераш}}:",
-       "templatesusedpreview": "Ð¥Ñ\8cалÑ\85е Ð±Ó\80аÑ\80гÑ\82аÑ\81Ñ\81ама Ð¾Ð°Ð³Ó\80Ñ\83в Ñ\82Ó\80а Ð»ÐµÐ»Ð°Ð´ÐµÑ\88 Ð´Ð¾Ð»Ð° {{PLURAL:$1|1=Ð\9aÑ\83Ñ\86кеп|Ð\9aÑ\83Ñ\86кепаш}}:",
+       "templatesusedpreview": "Ð\91IаÑ\80гÑ\82оÑ\85аÑ\80а Ñ\80аже {{PLURAL:$1|1=пайда Ñ\8dÑ\86аÑ\88 Ð»Ð¾|пайда Ñ\8dÑ\86аÑ\88 Ð»ÐµÑ\80аш}}:",
        "template-protected": "(лорадаь да)",
        "template-semiprotected": "(цхьа долча даькъе гIо оттадаь да)",
        "hiddencategories": "Ер оагIув {{PLURAL:$1|$1 къайла категориех|1=цаI къайла категорех}} я:",
        "permissionserrorstext-withaction": "Ер $2 де Хьа бокъо яц {{PLURAL:$1|1=из бахьан долаш|из бахьанаш долаш}}:",
-       "recreate-moveddeleted-warn": "'''Ð\97ем Ð±Ðµ! Ð¨Ð¾ Ñ\85Ñ\8cалÑ\85Ñ\85е Ð´IайоаккÑ\85аÑ\88 Ñ\85инна Ð¾Ð°Ð³Ó\80Ñ\83в Ñ\85Ñ\8cае Ð³Ó\80еÑ\80Ñ\82а.'''\n\nÐ¥Ñ\8cажа, Ð±Ð¾ÐºÑ\8aонÑ\86аÑ\85Ñ\8c ÐµÐ·Ð°Ñ\88 Ð¹Ð¾Ð»Ð³Ð°.\nÐ\9aÓ\80алÑ\85агIа Ñ\83кÑ\85 Ð¾Ð°Ð³Ó\80Ñ\83ви Ð´Ó\80адаккÑ\85ами Ñ\86Ó\80и Ñ\85Ñ\83вÑ\86ами Ñ\82епÑ\82аÑ\80аÑ\88 Ñ\85Ñ\8cекÑ\85а Ð´Ð°.",
+       "recreate-moveddeleted-warn": "'''ТеÑ\80кам Ð±Ðµ. Ð¥Ñ\8cо Ñ\8eÑ\85акÑ\85олла Ð³Ó\80еÑ\80Ñ\82а Ñ\85Ñ\8cалÑ\85а Ð´IаÑ\8fÑ\8cккÑ\85а Ñ\85инна Ð¾Ð°Ð³Ó\80Ñ\83в.'''\n\nÐ\94IаÑ\82аÑ\85ка, Ð±Ð¾ÐºÐºÑ\8aонÑ\86а Ñ\8dÑ\88ий Ñ\85Ñ\8cона Ð¸Ð· Ð¾Ð°Ð³IÑ\83в Ñ\8eÑ\85акÑ\85олла.\nÐ\9aÓ\80алÑ\85агIа Ñ\85Ñ\8cекÑ\85а Ð´Ð° Ñ\83кÑ\85 Ð¾Ð°Ð³Ó\80он Ð´Ó\80адаккÑ\85аÑ\80и Ñ\86Ó\80и Ñ\85Ñ\83вÑ\86аÑ\80и Ñ\82епÑ\82аÑ\80аÑ\88.",
        "moveddeleted-notice": "Ер оагӀув дӀаяккха хиннай.\nНовкъостала, кӀалха хьахьекха да дӀадаккхама а хувцама а тептарашкара дIаяздаьраш.",
-       "log-fulllog": "Ð\94еÑ\80Ñ\80ига Ñ\82апÑ\82аÑ\80а Ð±Ó\80аÑ\80гÑ\82аÑ\81Ñ\81а",
-       "edit-conflict": "Ð¥Ñ\83вÑ\86амий ÐºÑ\8aовÑ\81ам.",
-       "post-expand-template-inclusion-warning": "Зембаккхам: жамIан чIабалаш чулоаца дустам геттара доккха да.\nЦхьадола чIабалаш чулоацалургдац.",
-       "post-expand-template-inclusion-category": "ЧÑ\83лоаÑ\86а Ñ\87Iабала Ð¼ÐµÐ³Ð°Ñ\88 Ð´Ð¾Ð»Ð° Ð´Ñ\83Ñ\81Ñ\82ам Ð´Ñ\83кÑ\85алена Ñ\82Ó\80еÑ\85Ñ\8cайоала Ð¾Ð°Ð³Ó\80Ñ\83внаш",
-       "post-expand-template-argument-warning": "Зем бе! Ер оагӀув цаӀ куцкепа |аьлдош мара чулоацац, юхадастара сел доккха дустам йолаш.\nЦу тайпара |аьлдешаш ӀокӀаладаькха да.",
-       "post-expand-template-argument-category": "Ð\9aÑ\83Ñ\86кепий Ñ\82еÑ\80камза |аÑ\8cлдеÑ\88аÑ\88 Ñ\87Ñ\83лоаÑ\86а Ð¾Ð°Ð³Ó\80Ñ\83внаш",
+       "log-fulllog": "Ð\91IаÑ\80гÑ\82оÑ\85а Ñ\82апÑ\82аÑ\80ага Ð±IаÑ\80Ñ\87Ñ\87а",
+       "edit-conflict": "Ð¥Ñ\83вÑ\86ама Ð²IаÑ\88дÑ\83Ñ\85Ñ\8cалÑ\8aоÑ\82Ñ\82ам.",
+       "post-expand-template-inclusion-warning": "<strong>Хьалхдаккхар:</strong> юкъебаьккха лерий жамIа боарам сов боккха ба. Цхьаццабола лераш хьалсага хургбац.",
+       "post-expand-template-inclusion-category": "Ший Ñ\87Ñ\83лоаÑ\86аÑ\87а Ð»ÐµÑ\80ий Ð¼ÐµÐ³Ð°Ñ\88 Ð±Ð¾Ð»Ð° Ð±Ð¾Ð°Ñ\80ам Ñ\81овбаÑ\8cнна Ð¹Ð¾Ð»Ð° Ð¾Ð°Ð³Ó\80онаш",
+       "post-expand-template-argument-warning": "'''Теркам бе:''' укх оагIон чу даржар сов доккха дола белгало (аргумент) йолаш тешаме цаI ло ба.\nЦу тайпара белгалонаш гучадаьккха дац.",
+       "post-expand-template-argument-category": "Ð\9bеÑ\80ий Ñ\82еÑ\80кал Ñ\8fÑ\8c Ð¹Ð¾Ð°Ñ\86а Ð±ÐµÐ»Ð³Ð°Ð»Ð¾Ð½Ð°Ñ\88 (аÑ\80гÑ\83менÑ\82аÑ\88) Ñ\87Ñ\83лоаÑ\86аÑ\88 Ð¾Ð°Ð³Ó\80онаш",
        "viewpagelogs": "Укх оагӀон тептараш хьахьокха",
        "currentrev-asof": "тӀеххьара верси $1",
        "revisionasof": "Верси $1",
        "cur": "хӀанза.",
        "next": "тӀехь.",
        "last": "хьалха.",
-       "page_first": "Ñ\85Ñ\8cалÑ\85аÑ\80а",
+       "page_first": "Ñ\86Ñ\85Ñ\8cоаллагIа",
        "page_last": "тӀехьара",
-       "histlegend": "Ð\9aÑ\85еÑ\82ам: (Ñ\85Ó\80анз.) = Ñ\85Ó\80анза Ð¹Ð¾Ð»Ð°Ñ\87Ñ\83нна Ð±Ó\80аÑ\80гоагÓ\80Ñ\83вни Ñ\85Ñ\8cакÑ\8aоаÑ\81Ñ\82ам Ð±Ð°; (Ñ\85Ñ\8cалÑ\85.) = Ñ\85Ñ\8cалÑ\85а Ñ\85иннаÑ\87Ñ\83нна Ð±Ó\80аÑ\80гоагÓ\80Ñ\83вни Ñ\85Ñ\8cакÑ\8aоаÑ\81Ñ\82ам Ð±Ð°; '''зÓ\80''' = Ð·Ó\80амига Ñ\85Ñ\8cаÑ\85Ñ\83вÑ\86ам Ð±Ð°.",
-       "history-fieldset-title": "Исторе бӀаргтасса",
-       "history-show-deleted": "Ð\94Ó\80адаÑ\8cккÑ\85аÑ\80аÑ\88 Ð¼Ð°Ñ\80а",
-       "histfirst": "къаьнараш",
-       "histlast": "кердараш",
-       "historyempty": "(даьсса)",
+       "histlegend": "Ð\92еÑ\80Ñ\81ий Ñ\85оÑ\80жам: Ð±ÐµÐ»Ð³Ð°Ð»Ñ\8aе Ñ\88Ñ\83н Ð²IаÑ\88и Ð¹Ð¸Ñ\81Ñ\82а Ð±ÐµÐ·Ð°Ð¼ Ð±Ð¾Ð»Ð° Ð¾Ð°Ð³Iон Ð²ÐµÑ\80Ñ\81еÑ\88, Ñ\82IаккÑ\85а Ñ\82оIае '''{{int:compare-submit}}'''.<br />\nÐ\9aÑ\85еÑ\82аваÑ\80: '''({{int:cur}})''' â\80\94 ÐºÐ°Ñ\80аÑ\80а Ð²ÐµÑ\80Ñ\81еÑ\86а Ð´Ð¾Ð»Ð° Ð±Ð°Ñ\88Ñ\85алонаÑ\88; '''({{int:last}})''' â\80\94 Ñ\85Ñ\8cалÑ\85а Ð¹Ð¾Ð°Ð³IаÑ\88 Ð²ÐµÑ\80Ñ\81еÑ\86а Ð´Ð¾Ð»Ð° Ð±Ð°Ñ\88Ñ\85алонаÑ\88; '''{{int:minoreditletter}}''' â\80\94 Ð·Iамига Ñ\85Ñ\83вÑ\86амаÑ\88.",
+       "history-fieldset-title": "Исторена бIаргтоха",
+       "history-show-deleted": "Ð\90лÑ\85Ñ\85а Ð´Ó\80адаÑ\8cккÑ\85аÑ\80аÑ\88",
+       "histfirst": "эггара къаьнагIа",
+       "histlast": "эггара кердагIа",
+       "historyempty": "(яьсса)",
        "history-feed-title": "Хувцамий истори",
-       "history-feed-description": "Укх оагӀуви вики тӀа хувцамий истори",
-       "history-feed-item-nocomment": "$1гӀара $2гӀачу",
+       "history-feed-description": "Укх оагӀон Википейде дола хувцамий истори",
+       "history-feed-item-nocomment": "$1 → укх хан $2",
        "rev-delundel": "хьахьокха/къайлаяккха",
        "rev-showdeleted": "хьахьокха",
-       "revdelete-show-file-submit": "XӀаа",
+       "revdelete-show-file-submit": "XӀа-а",
        "revdelete-radio-set": "Къайла",
        "revdelete-radio-unset": "Гуш йола",
        "revdelete-log": "Бахьан",
-       "revdel-restore": "Ð\9aÑ\83Ñ\81Ñ\82гойÑ\82ам хувца",
-       "pagehist": "ОагӀува истори",
-       "deletedhist": "ДӀадаккхамий истори",
+       "revdel-restore": "Ð\9aÑ\83Ñ\86 хувца",
+       "pagehist": "ОагIон истори",
+       "deletedhist": "ДӀадаккхарий истори",
        "revdelete-reasonotherlist": "Кхыдола бахьан",
-       "mergehistory-list": "ВIашагIатоха хувцамий истори",
-       "mergehistory-go": "Ð\92IаÑ\88агIаÑ\82оÑ\85а Ñ\85Ñ\83вÑ\86амаÑ\88 Ñ\85Ñ\8cаÑ\85Ñ\8cокÑ\85а",
-       "mergehistory-submit": "Ð¥Ñ\83вÑ\86амаÑ\88 Ð²IаÑ\88агIаÑ\82оÑ\85а",
-       "mergehistory-empty": "Ð\92IаÑ\88агIаÑ\82оÑ\85аÑ\80а Ñ\85Ñ\83вÑ\86амаÑ\88 ÐºÐ¾Ñ\80аÑ\8fÑ\8c Ñ\8fÑ\86.",
+       "mergehistory-list": "ВIашагIхотталуш дола нийсдарий истори",
+       "mergehistory-go": "Ð¥Ñ\8cаÑ\85Ñ\8cокÑ\85а Ð²IаÑ\88агIÑ\85оÑ\82Ñ\82алÑ\83Ñ\88 Ð´Ð¾Ð»Ð° Ð½Ð¸Ð¹Ñ\81даÑ\80аÑ\88",
+       "mergehistory-submit": "Ð\92IаÑ\88агIÑ\85оÑ\82Ñ\82а Ð½Ð¸Ð¹Ñ\81даÑ\80аÑ\88",
+       "mergehistory-empty": "Ð\9aоÑ\80адинзаÑ\80 Ð½Ð¸Ð¹Ñ\81даÑ\80аÑ\88 Ð²IаÑ\88агIÑ\85оÑ\82Ñ\82адеÑ\80глолаÑ\88.",
        "mergehistory-reason": "Бахьан:",
-       "revertmerge": "Декъа",
+       "revertmerge": "Дéкъа",
        "history-title": "\"$1\" — хувцамай истори",
        "difference-title": "$1 — версешта юкъе йола башхало",
        "lineno": "МугI $1:",
-       "compareselectedversions": "Ð¥Ñ\8cаÑ\80жа Ð´Ð¾Ñ\80жамаÑ\88а Ñ\82аÑ\80она Ñ\82Iа Ñ\85Ñ\8cажа",
+       "compareselectedversions": "Ð\92IаÑ\88и Ð¹Ð¸Ñ\81Ñ\82а Ñ\85еÑ\80жа Ð²ÐµÑ\80Ñ\81еÑ\88",
        "editundo": "юхадаккха",
        "diff-multi-sameuser": "({{PLURAL:$1|цхьа юкъ хулаш йола верси|$1 юкъ хулаш йола версеш}} гуш яц цу доакъашхочун)",
        "searchresults": "Лахар чакхдоалаш корадаьр",
        "searchresults-title": "«$1» лахар",
-       "notextmatches": "ОагIувнаша яздамий вIашагIакхетараш дац",
+       "notextmatches": "ОагIонай тексташта юкъе цхьатара хилар дац",
        "prevn": "{{PLURAL:$1|1=хьалхайогIар|хьалхайогIараш}} $1",
        "nextn": "{{PLURAL:$1|1=тIехьайоагIар|тIехьайоагIараш}} $1",
        "prevn-title": "{{PLURAL:$1|1=$1 хьалхара йоазув|$1 хьалхара йоазувнаш}}",
        "nextn-title": "{{PLURAL:$1|ТIадоагIа $1 яздар|ТIадоагIа $1 яздараш}}",
        "shown-title": "Гойта $1 {{PLURAL:$1|яздаьр|яздаьраш}} укх оáгIон тIа",
        "viewprevnext": "ДIахьажа ($1 {{int:pipe-separator}} $2) ($3)",
-       "searchmenu-exists": "'''УкÑ\85 Ð¼Ð°Ñ\81Ñ\81а-Ñ\85Ñ\8cаÑ\85Ñ\8cоадайÑ\82амаÑ\87 ÐµÑ\80 Ð¾Ð°Ð³|Ñ\83в \"[[:$1]]\" Ñ\8f'''",
+       "searchmenu-exists": "'''УкÑ\85 Ð²Ð¸ÐºÐ¸ Ñ\87Ñ\83 Ð¹Ð¾Ð»Ð°Ñ\88 Ñ\8f Ð¾Ð°Ð³Ó\80Ñ\83в Â«[[:$1]]»'''",
        "searchmenu-new": "<strong>Хьакхолла оагIув «[[:$1]]» укх вики-проекте!</strong>\n{{PLURAL:$2|0=|Иштта хьажа Iайха лийха оагIонга.|Иштта хьажа хьай лахара хьахиннарашка.}}",
        "searchprofile-articles": "Кертера оагIонаш",
        "searchprofile-images": "Мультимедиа",
        "search-redirect": "(дIа-сахьожадар $1 тIара)",
        "search-section": "(дáкъа «$1»)",
        "search-suggest": "Хьона эшар ер хила мега: $1",
-       "search-interwiki-caption": "Гаргалон хьахьоадайтамаш",
-       "search-interwiki-default": "$1 хьахиннараш:",
-       "search-interwiki-more": "(кха)",
-       "search-relatedarticle": "шоайл дола",
-       "searchrelated": "гаÑ\80гаÑ\80а",
+       "search-interwiki-caption": "Гаргара проекташ",
+       "search-interwiki-default": "Хьахиннараш укхазар $1:",
+       "search-interwiki-more": "(кхы а)",
+       "search-relatedarticle": "ВIашагIдувзаденна",
+       "searchrelated": "вIаÑ\88агIдÑ\83взаденна",
        "searchall": "деррига",
        "search-showingresults": "{{PLURAL:$4|Кораяьй <strong>$1</strong> — цхьа оагӀув|Из дош корадаьд <strong>$3</strong> оагӀонашка, царех гойта $2 оагӀув}}",
        "search-nonefound": "Хьа дехар дара вIаши нийса доагIаш дар корадаьдац.",
-       "powersearch-legend": " Доккха тахкар",
-       "powersearch-ns": " ЦIерий аренашкахь лахар",
+       "powersearch-legend": "Шердаь лахар",
+       "powersearch-ns": "ЦIерий аренашкахь лахар:",
        "powersearch-toggleall": "Деррига",
        "powersearch-togglenone": "Цхьаккха",
-       "preferences": "Ð\9eÑ\82Ñ\82амаш",
+       "preferences": "Ð\93IиÑ\80Ñ\81 Ñ\82оаÑ\8fÑ\80аш",
        "mypreferences": "ГIирсаш",
-       "prefs-skin": "Ð\91Iагала ÐºÑ\83Ñ\86",
-       "skin-preview": "Ð¥Ñ\8cажа",
-       "prefs-personal": "Ð¥Ñ\8cа Ñ\85Ñ\8cай Ð´Ð°Ð»Ð°Ð¼",
-       "prefs-rc": "Керда хувцамаш",
+       "prefs-skin": "ТIеÑ\80а ÐºÐ¸Ð¹Ñ\87даÑ\80а Ñ\82ема",
+       "skin-preview": "Ð¥Ñ\8cалÑ\85Ñ\85е Ð±IаÑ\80гÑ\82оÑ\85аÑ\80",
+       "prefs-personal": "Ð\94оакÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ð´Ð°Ñ\80аÑ\88",
+       "prefs-rc": "Керда нийсдараш",
        "prefs-watchlist": "Зем бара хьаязъяьр",
-       "prefs-watchlist-days": "Ден дукхал",
-       "prefs-resetpass": "Ð\9aÑ\8aайладIоагIа Ñ\85Ñ\83вÑ\86а",
-       "prefs-rendering": "ТIеÑ\80а Ð±IаÑ\81а",
-       "saveprefs": "Дита",
-       "prefs-editing": "Ð\93IалаÑ\82нийÑ\81даÑ\80",
+       "prefs-watchlist-days": "Дéной дукхал:",
+       "prefs-resetpass": "Ð¥Ñ\83вÑ\86а ÐºÑ\8aайладIоагIа",
+       "prefs-rendering": "ТIеÑ\80а ÐºÑ\83Ñ\86",
+       "saveprefs": "ДIаязде",
+       "prefs-editing": "Ð¥Ñ\83вÑ\86ам",
        "searchresultshead": "Лахаp",
-       "timezonelegend": "СаÑ\85Ñ\8cаÑ\82и Ñ\8eкÑ\8a:",
-       "localtime": "Ð\92ола/Ð\99ола Ð¼Ð¾Ñ\82Ñ\82иги ха:",
-       "timezoneregion-africa": "Ð\90Ñ\8cпÑ\80ик",
-       "timezoneregion-america": "Iаьмрик",
-       "timezoneregion-antarctica": "ЭнÑ\82аÑ\80Ñ\86иÑ\82",
-       "timezoneregion-arctic": "ЭÑ\80Ñ\86иÑ\82",
-       "timezoneregion-asia": "Iаьзик",
-       "timezoneregion-atlantic": "Iаьтланта форд",
-       "timezoneregion-australia": "УÑ\81Ñ\82Ñ\80алик",
-       "timezoneregion-europe": "Ð\90Ñ\8cÑ\80оп",
-       "timezoneregion-indian": "Ð¥Iинда Ñ\84оÑ\80д",
-       "timezoneregion-pacific": "Тийна форд",
+       "timezonelegend": "СаÑ\85Ñ\8cаÑ\82а Ð¾Ð°Ñ\81а:",
+       "localtime": "Ð\9cоÑ\82Ñ\82ига ха:",
+       "timezoneregion-africa": "Ð\90Ñ\84Ñ\80ика",
+       "timezoneregion-america": "Америка",
+       "timezoneregion-antarctica": "Ð\90нÑ\82аÑ\80кÑ\82ика",
+       "timezoneregion-arctic": "Ð\90Ñ\80кÑ\82ика",
+       "timezoneregion-asia": "Ази",
+       "timezoneregion-atlantic": "Малхбузера океан",
+       "timezoneregion-australia": "Ð\90Ñ\81Ñ\82Ñ\80али",
+       "timezoneregion-europe": "Ð\95вÑ\80опа",
+       "timezoneregion-indian": "Ð¥Iиндий Ð¾ÐºÐµÐ°Ð½",
+       "timezoneregion-pacific": "Тийна океан",
        "prefs-searchoptions": "Лахар",
        "prefs-namespaces": "ЦIерий аренаш",
-       "prefs-files": "Ð\9fаÑ\8cлаш",
-       "youremail": "Ð\94\85оамни:",
-       "username": "{{GENDER:$1|Ð\94оакÑ\8aоÑ\88Ñ\85оÑ\87Ñ\83н Ñ\86|и}}:",
-       "yourrealname": "ШÑ\83н цIи:",
+       "prefs-files": "Файлаш",
+       "youremail": "ЭлекÑ\82Ñ\80онни Ð¿Ð¾Ñ\87Ñ\82а:",
+       "username": "{{GENDER:$1|Ð\94оакÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ñ\86Ó\80и}}:",
+       "yourrealname": "Ð\91окÑ\8aонÑ\86а Ð¹Ð¾Ð»Ð° цIи:",
        "yourlanguage": "Мотт:",
-       "gender-male": "Массаоаг|онаш нийсaеш ва из",
-       "gender-female": "Массаоаг|онаш нийсаеш я из",
-       "email": "Д-хоамни",
-       "prefs-help-email": "Д-хоамни моттиг ала эшаш дац, амма новкъа даца, наггахь санна къайладIоагIа шоана дийцалой, цу тIа хьатIадайтаргда.",
-       "prefs-help-email-others": "Кхыбола дакъалаьцархоша шоаца бувзам я йийшхургья шун оагIува тIа гIолла, д-хоамни хьаела ца езаш.",
-       "prefs-signature": "Кулгяздар",
-       "userrights-user-editname": "Дакъалаьцархочунна цIи Iоязаде",
-       "editusergroup": "Дакъалаьцархочунна тоабаш хувца",
-       "saveusergroups": "Дакъалаьцархочунна тоабаш дита",
-       "userrights-groupsmember": "Тоабий дакъалаьцархо:",
+       "gender-male": "ВикиоагIонаш нийсaеш ва из",
+       "gender-female": "ВикиоагIонаш нийсaеш я из",
+       "email": "Email",
+       "prefs-help-email": "Электронни почта адрес оттаде параз дац, амма из эшаш хургда, нагахьа санна хьона хьа къайладIоагIа дицлой.",
+       "prefs-help-email-others": "Иштта цунца кхыболча доакъашхошта аьттув хургба шоаца бувзам бе а, шун оагIон тIа е шун дувца оттадара оагIон тIа йола тIахьожаяргаца.\nШун электронни почта адрес цхьаннена гуш хургъяц.",
+       "prefs-signature": "Кулг яздар",
+       "prefs-preview": "Хьалххе бIаргтохар",
+       "userrights-user-editname": "Iочуязъе доакъашхочун цӀи:",
+       "editusergroup": "Хувца {{GENDER:$1|доакъашхочун}} тоабаш",
+       "saveusergroups": "ДIаязъе {{GENDER:$1|доакъашхочун}} тоабаш",
+       "userrights-groupsmember": "Дакъа лоаца тоабаш чу:",
        "userrights-reason": "Бахьан:",
        "userrights-changeable-col": "Оаш хувца мегаш йола тоабаш",
-       "userrights-unchangeable-col": "Ð\9eаÑ\88 Ñ\85Ñ\83вÑ\86а Ð¼ÐµÐ³Ð°ш йоаца тоабаш",
-       "group": "Тоаб:",
-       "group-user": "Ð\94акÑ\8aалаÑ\8cÑ\86аÑ\80хой",
-       "group-bot": "Бташ",
-       "group-sysop": "Ð\9cазакÑ\83лгалÑ\85ой",
+       "userrights-unchangeable-col": "Ð¥Ñ\8cа Ñ\85Ñ\83вÑ\86а Ð¹Ð¸ш йоаца тоабаш",
+       "group": "Тоаба:",
+       "group-user": "Ð\94оакÑ\8aаÑ\88хой",
+       "group-bot": "Бóташ",
+       "group-sysop": "Ð\90дминиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80аÑ\88",
        "group-all": "(деррига)",
-       "group-user-member": "{{GENDER:$1|дакÑ\8aалаÑ\8cÑ\86аÑ\80Ñ\85о|дакÑ\8aалаÑ\8cÑ\86аÑ\80хо}}",
-       "group-bot-member": "{{GENDER:$1|бт}}",
-       "group-sysop-member": "{{GENDER:$1|мазакÑ\83лгалÑ\85о}}",
-       "grouppage-user": "{{ns:project}}:Ð\94акÑ\8aалаÑ\8cÑ\86аÑ\80хой",
-       "grouppage-bot": "{{ns:project}}:Бташ",
-       "grouppage-sysop": "{{ns:project}}:Ð\9cазакÑ\83лгалÑ\85ой",
-       "right-read": "Ð\9eагIÑ\83внаÑ\88 Ð´ÐµÑ\88а",
-       "right-edit": "Ð\9eагIÑ\83внаÑ\88 Ñ\85Ñ\83вÑ\86а",
-       "right-createtalk": "дувцама оагIувний хьакхоллам",
-       "right-move": "Ð\9eагIÑ\83вний Ñ\86Iи Ñ\85Ñ\83вÑ\86а",
-       "right-movefile": "Паьлий цIи хувца",
+       "group-user-member": "{{GENDER:$1|доакÑ\8aаÑ\88хо}}",
+       "group-bot-member": "{{GENDER:$1|бот}}",
+       "group-sysop-member": "{{GENDER:$1|админиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80}}",
+       "grouppage-user": "{{ns:project}}:Ð\94оакÑ\8aаÑ\88хой",
+       "grouppage-bot": "{{ns:project}}:Боташ",
+       "grouppage-sysop": "{{ns:project}}:Ð\90дминиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80аÑ\88",
+       "right-read": "оагÓ\80онаÑ\88ка Ñ\85Ñ\8cажаÑ\80",
+       "right-edit": "оагÓ\80онаÑ\88 Ð½Ð¸Ð¹Ñ\81Ñ\8aÑ\8fÑ\80",
+       "right-createtalk": "дувца оттадара оагӀонаш кхоллар",
+       "right-move": "оагIонай Ñ\86IеÑ\80аÑ\88 Ñ\85Ñ\83вÑ\86аÑ\80",
+       "right-movefile": "файлай цӀераш хувцар",
        "right-writeapi": "ДIаяздара лаьрххIа API пайда эцар",
        "newuserlogpage": "Доакъашхой дIаязбаь таптар",
-       "rightslog": "Ð\94акÑ\8aалаÑ\8cÑ\86аÑ\80Ñ\85оÑ\87Ñ\83нна Ð±Ð¾ÐºÑ\8aона Ñ\82ептар",
-       "action-read": "УкÑ\85 Ð¾Ð°Ð³IÑ\83ви Ð´ÐµÑ\88ам",
-       "action-edit": "Ð\95Ñ\80 Ð¾Ð°Ð³IÑ\83в Ñ\85Ñ\83вÑ\86а",
-       "nchanges": "$1 {{PLURAL:$1|1=хувцам|хувцамаш}}",
+       "rightslog": "Ð\94оакÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ð±Ð¾ÐºÑ\8aоний Ñ\82éптар",
+       "action-read": "еÑ\80 Ð¾Ð°Ð³Ó\80Ñ\83в Ã©Ñ\88аÑ\80",
+       "action-edit": "еÑ\80 Ð¾Ð°Ð³IÑ\83в Ñ\85Ñ\83вÑ\86аÑ\80",
+       "nchanges": "$1 {{PLURAL:$1|хувцам}}",
        "enhancedrc-history": "истори",
        "recentchanges": "Керда хувцамаш",
        "recentchanges-legend": "Керда хувцамий гIирсаш тоаяраш",
        "recentchanges-summary": "КIалхагIа ханашца нийсдаь дIаяьздаь да {{grammar:genitive|{{SITENAME}}}}  оагIонай тIеххьара хувцамаш.",
-       "recentchanges-feed-description": "УкÑ\85 Ð»Ð°Ñ\80амÑ\86а Ñ\82IеÑ\85Ñ\8cаÑ\80а Ð¼Ð°Ñ\81Ñ\81аÑ\85Ñ\83вÑ\86амаÑ\88Ñ\82 Ñ\82еÑ\80кам Ð±Ðµ.",
+       "recentchanges-feed-description": "Ð¥Ñ\8céжа Ñ\83кÑ\85 Ð¿Ð¾Ñ\82оке Ð²Ð¸ÐºÐ¸ Ñ\87Ñ\83 Ñ\82IеÑ\85Ñ\8cаÑ\80а Ñ\85Ñ\83вÑ\86амаÑ\88ка.",
        "recentchanges-label-newpage": "Укх хувцамаца керда оагIув кхелла хиннай",
        "recentchanges-label-minor": "Ер зIамига хувцам ба",
        "recentchanges-label-bot": "Ер хувцам ботаца баь ба",
        "rcshowhideanons": "$1 цIияккханза доакъашхой",
        "rcshowhideanons-show": "Хьахьокха",
        "rcshowhideanons-hide": "Къайлабаха",
-       "rcshowhidepatr": "$1 теркам даь хувцамаш",
+       "rcshowhidepatr": "$1 техка хувцамаш",
+       "rcshowhidepatr-show": "Хьахьокха",
+       "rcshowhidepatr-hide": "Къайладаккха",
        "rcshowhidemine": "$1 хьа нийсдараш",
        "rcshowhidemine-show": "Хьахьокха",
        "rcshowhidemine-hide": "Къайладаккха",
        "minoreditletter": "зI",
        "newpageletter": "К",
        "boteditletter": "б",
-       "rc_categories_any": "МоллагIа а",
+       "rc_categories_any": "МоллагIа яр хержа йолчарна юкъера",
        "rc-change-size-new": "Хувцам баьнначул тӀехьагIа бола боарам: $1 {{PLURAL:$1|байт}}",
-       "rc-enhanced-expand": "Ð\9cа Ð´Ð°Ñ\80Ñ\80а Ñ\87Ñ\83лоаÑ\86амаÑ\88 Ñ\85Ñ\8cаÑ\85Ñ\8cокÑ\85а (JavaScriptаÑ\86а)",
-       "rc-enhanced-hide": "Ð\9cа Ð´Ð°Ñ\80Ñ\80а Ñ\87Ñ\83лоаÑ\86амаÑ\88 ÐºÑ\8aайладаккÑ\85а",
+       "rc-enhanced-expand": "Ð¥Ñ\8cаÑ\85Ñ\8cокÑ\85а Ð¼Ð° Ð´Ð°Ñ\80Ñ\80а",
+       "rc-enhanced-hide": "Ð\9aÑ\8aайладаккÑ\85а Ð¼Ð° Ð´Ð°Ñ\80Ñ\80а Ð´Ð°Ñ\80",
        "recentchangeslinked": "ВIашагIдувзаденна нийсдараш",
-       "recentchangeslinked-feed": "Ð\93аÑ\80галон Ñ\85Ñ\83вÑ\86амаш",
+       "recentchangeslinked-feed": "Ð\92IаÑ\88агIдÑ\83взаденна Ð½Ð¸Ð¹Ñ\81даÑ\80аш",
        "recentchangeslinked-toolbox": "ВIашагIдувзаденна хувцамаш",
        "recentchangeslinked-title": "$1ца вIашидувзаденна хувцамаш",
        "recentchangeslinked-summary": "Белгалаяь йола оагIув тIахьожавеш (е белгалаяь йола категорен юкъейоагIаш) йолча оагIонашта даь хувцамаш да ераш.\n[[Special:Watchlist|Хьа зем бара хьаязъяьра]] юкъейоагIаш оагIонаш '''белгалаяьй'''.",
        "recentchangeslinked-page": "ОагIон цIи",
        "recentchangeslinked-to": "Вешта, белгаляьккха оагIон тIахьожавеш дола оагIонашта даь хувцамаш хьахьокха.",
        "upload": "Файл чуяккха",
-       "uploadbtn": "Ð\9fаÑ\8cл Ñ\87Ñ\83Ñ\8fÑ\8cккха",
-       "uploadlogpage": "Чуяьккхамий тептар",
+       "uploadbtn": "Файл Ñ\87Ñ\83Ñ\8fккха",
+       "uploadlogpage": "Чуяьккхарий тептар",
        "filedesc": "Лоаца йоазонца сурт оттадар",
-       "fileuploadsummary": "Лоаца лоацам:",
-       "license": "ЦIийÑ\8fздаÑ\80",
+       "fileuploadsummary": "Лоаца сурт оттадар:",
+       "license": "Ð\9bиÑ\86ензи Ñ\8fлаÑ\80:",
        "license-header": "Лицензировани",
        "imgfile": "файл",
-       "listfiles": "Ð\9fаÑ\8cлий Ð´Ð°Ð³Ð°Ñ\80Ñ\87е",
-       "listfiles_date": "Ð\94енÑ\85а",
-       "listfiles_name": "Ð\9fаÑ\8cла Ñ\86Iи",
-       "listfiles_user": "Ð\94акÑ\8aалаÑ\8cÑ\86аÑ\80хо",
-       "listfiles_size": "Ð\94Ñ\83Ñ\81Ñ\82ам",
-       "listfiles_description": "Ð\9bоаÑ\86ам",
-       "listfiles_count": "Ð\94оÑ\80жамаÑ\88",
+       "listfiles": "Файлай Ñ\85Ñ\8cаÑ\8fзÑ\8aÑ\8fÑ\8cÑ\80",
+       "listfiles_date": "ТаÑ\8cÑ\80аÑ\85Ñ\8c",
+       "listfiles_name": "Файла Ñ\86Ó\80и",
+       "listfiles_user": "Ð\94оакÑ\8aаÑ\88хо",
+       "listfiles_size": "Ð\91оаÑ\80ам",
+       "listfiles_description": "Ð\99оазонÑ\86а Ñ\81Ñ\83Ñ\80Ñ\82 Ð¾Ñ\82Ñ\82адаÑ\80",
+       "listfiles_count": "Ð\92еÑ\80Ñ\81и",
        "file-anchor-link": "Файл",
        "filehist": "Файла истори",
        "filehist-help": "Таьрахь/ха тIа тоIабе цу хан файл мишта хиннай хьожаpгдолаш",
        "filehist-thumbtext": "ЗIамига сурт укх версин $1",
        "filehist-user": "Доакъашхо",
        "filehist-dimensions": "Файла боарам",
-       "filehist-filesize": "Ð\9fаÑ\8cла Ñ\8eÑ\81Ñ\82аÑ\80ал",
+       "filehist-filesize": "Файла Ð±Ð¾Ð°Ñ\80ам",
        "filehist-comment": "Белгалдаккхар",
        "imagelinks": "Файлах пайда эцар",
        "linkstoimage": "{{PLURAL:$1|1=ТIехьайоагIача $1 оагIо тIахьожаву|ТIехьайоагIача $1 оагIонаш тIахьожаву}} укх файла тIа:",
        "nolinkstoimage": "Укх файла тIахьожавеш йола оагIонаш яц.",
-       "sharedupload": "Ер паьла $1чера я, кхыча хьахьоадайтамча хьахайраде йийшайолаш я.",
+       "sharedupload": "Ер файл $1 чура я, из пайда эцаш лелае мегаш я кхыйола проекташ чу.",
        "sharedupload-desc-here": "Ер файл $1 чура я, иштта кхыйола проекташ чу пайда эца аьттув болаш я.\nЦун [$2 сурт оттадара оагIон] хоам кIалхахь хьабоалабаьб.",
-       "uploadnewversion-linktext": "УкÑ\85 Ð¿Ð°Ñ\8cлий ÐºÐµÑ\80да Ð±IаÑ\81а Ñ\87Ñ\83Ñ\8fÑ\8cккÑ\85а",
+       "uploadnewversion-linktext": "ЧÑ\83Ñ\8fккÑ\85а Ñ\83кÑ\85 Ñ\84айла ÐºÐµÑ\80да Ð²ÐµÑ\80Ñ\81и",
        "upload-disallowed-here": "Хьа бокъо яц ер файл юха дӀаязъе.",
        "filerevert-comment": "Бахьан:",
        "filedelete-comment": "Бахьан:",
-       "filedelete-submit": "ДIадаккха",
+       "filedelete-submit": "ДӀаяккха",
        "filedelete-reason-otherlist": "Кхыдола бахьан",
-       "download": "хьачуяьккха",
-       "unwatchedpages": "ТеÑ\80камза Ð¾Ð°Ð³IÑ\83внаш",
+       "download": "хьачуяккха",
+       "unwatchedpages": "ЦÑ\85Ñ\8cанне Ð° Ð·ÐµÐ¼ Ð±ÐµÑ\88 Ð¹Ð¾Ð°Ñ\86а Ð¾Ð°Ð³Iонаш",
        "randompage": "Ца ховш нийсъенна статья",
-       "statistics": "Ð\94агаÑ\80а ÐºÑ\83Ñ\86",
+       "statistics": "СÑ\82аÑ\82иÑ\81Ñ\82ика",
        "statistics-articles": "Статьяш",
        "statistics-pages": "ОагIонаш",
-       "brokenredirects-edit": "хувца",
-       "brokenredirects-delete": "дIадаккха",
+       "brokenredirects-edit": "нийсъе",
+       "brokenredirects-delete": "дӀаяккха",
        "withoutinterwiki-submit": "Хьахьокха",
        "nbytes": "$1 {{PLURAL:$1|байт}}",
        "nmembers": "$1 {{PLURAL:$1|объект}}",
-       "prefixindex": "Ð\9eагIÑ\83внаÑ\88ий Ñ\85Ñ\8cалÑ\85еÑ\80а Ñ\86Iи Ñ\85Ñ\8cагойÑ\82аÑ\80",
-       "shortpages": "Лоаца оагIувнаш",
-       "longpages": "Ð\94оккÑ\85ий Ð¾Ð°Ð³IÑ\83внаш",
+       "prefixindex": "Ð¥Ñ\8cокÑ\85аÑ\80 Ð¾Ð°Ð³Iонай Ñ\86IеÑ\80а Ð´ÐµÑ\88Ñ\85Ñ\8cалÑ\85еÑ\85",
+       "shortpages": "Лоаца оагIонаш",
+       "longpages": "Ð\99IаÑ\8cÑ\85а Ð¾Ð°Ð³Iонаш",
        "protectedpages-page": "ОагIув",
-       "usercreated": "{{GENDER:$3|Чуваьннав|Чуяьннай}} $1  $2",
+       "usercreated": "{{GENDER:$3|система чу дӀаязвеннав|система чу дӀаязъяннай}} $1 $2",
        "newpages": "Керда оагIонаш",
        "move": "ЦIи хувца",
-       "movethispage": "УкÑ\85 Ð¾Ð°Ð³IÑ\83ва Ñ\86Iи Ñ\85Ñ\83вÑ\86а",
+       "movethispage": "ЦIи Ñ\85Ñ\83вÑ\86а Ñ\83кÑ\85 Ð¾Ð°Ð³Iон",
        "pager-newer-n": "{{PLURAL:$1|кердагIа дара|кердагIа дараш|кердагIа долачаьрахь}} $1",
        "pager-older-n": "{{PLURAL:$1|къаьнара дара|къаьнара дараш|къаьнара долaчарех}} $1",
        "booksources": "Джейнай хьасташ (источники)",
        "booksources-search-legend": "Джейнах лаьца хоам лахар",
        "booksources-search": "Хьалáха",
        "log": "Тептараш",
-       "allpages": "Еррига оагIувнаш",
-       "prevpage": "($1) хьалхара оагIув",
-       "allpagesfrom": "ЦÑ\83 Ñ\82айпаÑ\80а Ñ\8eвлаж Ð¹Ð¾Ð»Ð° Ð¾Ð°Ð³IÑ\83внаÑ\88 Ð±ÐµÐ»Ð³Ð°Ð» Ðµ:",
-       "allpagesto": "УкÑ\85 Ð¾Ð°Ð³IÑ\83внаÑ\88 Ñ\82Iа Ð±IаÑ\80га Ð´Ð¸Ñ\82а:",
+       "allpages": "Еррига оагIонаш",
+       "prevpage": "Хьалха йоагIа оагIув ($1)",
+       "allpagesfrom": "Ð\93Ñ\83Ñ\87аÑ\8fккÑ\85а Ð¾Ð°Ð³IонаÑ\88 Ð¹Ð¾Ð»Ð°Ð»Ñ\83Ñ\88 Ð¹Ð¾Ð»Ð° Ñ\83кÑ\85оÑ\85:",
+       "allpagesto": "Ð\90Ñ\80аÑ\8fккÑ\85аÑ\80 Ñ\81оÑ\86адé Ñ\83кÑ\85 Ñ\82Ó\80а:",
        "allarticles": "Еррига оагIонаш",
        "allpagessubmit": "Кхоачашде",
        "categories": "Категореш",
-       "linksearch": "Т|еÑ\80а|инкаш лахар",
+       "linksearch": "Ð\90Ñ\80аÑ\85Ñ\8cаÑ\80а Ñ\82IаÑ\85Ñ\8cожаÑ\8fÑ\80гаш лахар",
        "linksearch-ns": "ЦIерий аренаш:",
        "linksearch-ok": "Хьалáха",
-       "linksearch-line": "$1 тIа Iинк $2 юкъера",
-       "listgrouprights-members": "(тоабий дагарче)",
+       "linksearch-line": "$2 — тIахьожаярг укхаз $1",
+       "listgrouprights-members": "(доакъашхой хьаязъяьр)",
        "listgrouprights-namespaceprotection-namespace": "ЦIерий аре",
-       "emailuser": "Ð\94акÑ\8aалаÑ\8cÑ\86аÑ\80Ñ\85оÑ\87оа Ð´-Ñ\85оамни:",
+       "emailuser": "Ð\94оакÑ\8aаÑ\88Ñ\85оÑ\87оа ÐºÐ°Ñ\8cÑ\85аÑ\82",
        "watchlist": "Зем бара хьаязъяьр",
        "mywatchlist": "Зем бара хьаязъяьр",
-       "watchlistfor2": "$1 $2 царна",
-       "addedwatchtext": "\"[[:$1]]\" оагIув, шун [[Special:Watchlist|теркама дагаршкахь]] чуяккха я. \nТехьара мел йола укх оагIувни хувцамаш цу дагаршкахь хоам беш хургья. Вешта [[Special:RecentChanges|керда хувцама дагаршкаехь]] сома къоалмаца хьакъоастлуш хургья.",
-       "removedwatchtext": "\"[[:$1]]\" оагIув, шун [[Special:Watchlist|теркама дарагчера]] дIаяккха хиннай.",
+       "watchlistfor2": "Цунна $1 $2",
+       "addedwatchtext": "Статья «[[:$1]]» а, цун дувца оттадара оагIув а тIатехай хьа [[Special:Watchlist|зем бара хьаязъяьра]].",
+       "removedwatchtext": "Статья «[[:$1]]» а, иштта цун дувца оттадара оагIув а дIаяьккхай хьа [[Special:Watchlist|зем бара хьаязъяьр]] чура.",
        "watch": "Зем бе",
-       "watchthispage": "УкÑ\85 Ð¾Ð°Ð³IÑ\83ва Ñ\82еÑ\80кам Ð±Ðµ",
-       "unwatch": "Ð\9bоÑ\80а Ð¼Ð° Ð´Ðµ",
+       "watchthispage": "Ð\97ем Ð±Ðµ Ñ\83кÑ\85 Ð¾Ð°Ð³Ó\80он",
+       "unwatch": "Ð\9cа Ð±Ðµ Ð·ÐµÐ¼",
        "notanarticle": "Статья яц",
-       "watchlist-details": "ШÑ\83н Ñ\82еÑ\80кама Ð´Ð°Ð³Ð°Ñ\80Ñ\87енгаÑ\85Ñ\8c Ð¹Ð¾Ð»Ð°  $1 {{PLURAL:$1|1=оагIÑ\83в|оагIÑ\83внаÑ\88}}, Ð´Ñ\83вÑ\86ама Ð¾Ð°Ð³IÑ\83внаш ца лоархIаш.",
-       "wlshowlast": "ТlеÑ\85Ñ\8cаÑ\80а $1 Ñ\81аÑ\85Ñ\8cаÑ\82аÑ\88 $2 Ð´ÐµÐ½Ð¾Ñ\88  Ñ\85Ñ\8cаÑ\85Ñ\8cокÑ\85а",
-       "watchlist-options": "Зем баккха дагарена хувцамаш",
-       "watching": "ТоÑ\85кам Ð±ÐµÑ\87а Ð¾Ð°Ð³IÑ\83в Ñ\82Iа Ñ\82IадаккÑ\85а",
-       "unwatching": "ТоÑ\85кам Ð±ÐµÑ\87а Ð¾Ð°Ð³IÑ\83в Ñ\82IеÑ\80а Ð´IадаккÑ\85а",
-       "deletepage": "Ð\9eагIÑ\83в Ð´IаÑ\8fÑ\8cккÑ\85а",
-       "confirmdeletetext": "Ð\9eаÑ\88 Ð¾Ð°Ð³IÑ\83вни (е Ñ\81Ñ\83Ñ\80Ñ\82и) Ð±Ð°Ñ\80Ñ\87а Ð´IадаккÑ\85аÑ\80 Ñ\85Ñ\8cайийÑ\85ай ÐºÑ\85а ÐµÑ\80Ñ\80ига Ñ\85Ñ\83вÑ\86амий Ð¸Ñ\81Ñ\82оÑ\80и Ð´Ð¾Ð»Ð°Ð¼Ð° ÐºÐ¾Ð²Ñ\87еÑ\80а. \nÐ\94еÑ\85аÑ\80 Ð´Ð°, Ð¶Ð¾Ð¿ Ð´Ð°Ð»Ð°, Ñ\88оай Ð¸Ð· Ð±Ð¾ÐºÑ\8aонÑ\86аÑ\85Ñ\8c Ð´Ðµ Ð±ÐµÐ·Ð°Ð¼ Ð±Ð¾Ð»Ð°Ñ\88 Ð´Ð°, Ñ\88оай Ð´Ð°Ñ\8cÑ\87оаÑ\85Ñ\8c Ñ\85Ñ\83Ñ\80гдолÑ\87оаÑ\85Ñ\8c ÐºÑ\85еÑ\82аÑ\88 Ð´Ð¾Ð»Ð³Ð°, [[{{MediaWiki:Policy-url}}]] Ð´ÐµÐºÑ\8aамаÑ\87Ñ\83 IоÑ\8fзадаÑ\8c Ð´Ð¾Ð»Ð° Ð°Ð´Ð°Ñ\82аÑ\88 Ñ\86а Ð¸Ð· Ð´ÐµÑ\88 долга.",
-       "actioncomplete": "Ð\94Ñ\83лаÑ\80Ñ\85Iам Ð±Ð°Ñ\8cб",
-       "actionfailed": "Ð\9eÑ\82Ñ\82ам даьдац",
-       "deletedtext": "\"$1\" дIаяьккха хиннай.\nТIехьара дIадаьккха дагарчена хьожаргволаш/хьожаргьйолаш, $2 хьажа.",
+       "watchlist-details": "Ð¥Ñ\8cа Ð·ÐµÐ¼ Ð±Ð°Ñ\80а Ñ\85Ñ\8cаÑ\8fзÑ\8aÑ\8fÑ\8cÑ\80 Ñ\87Ñ\83 $1 {{PLURAL:$1|оагIÑ\83в}} Ñ\8f, Ð´Ñ\83вÑ\86а Ð¾Ñ\82Ñ\82адаÑ\80а Ð¾Ð°Ð³Iонаш ца лоархIаш.",
+       "wlshowlast": "Ð¥Ñ\8cаÑ\85Ñ\8cокÑ\85а Ñ\82IеÑ\85Ñ\8cаÑ\80а $1 Ñ\81аÑ\85Ñ\8cаÑ\82аÑ\85 $2 Ð´Ð¸Ð¹Ð½Ð°Ñ\85Ñ\8c",
+       "watchlist-options": "Зем бара хьаязъяьра тоадараш",
+       "watching": "Ð\97ем Ð±Ð°Ñ\80а Ñ\85Ñ\8cаÑ\8fзÑ\8aÑ\8fÑ\8cÑ\80 Ñ\87Ñ\83 Ñ\82IаÑ\82оÑ\85аÑ\80",
+       "unwatching": "Ð\97ем Ð±Ð°Ñ\80а Ñ\85Ñ\8cаÑ\8fзÑ\8aÑ\8fÑ\8cÑ\80 Ñ\87Ñ\83Ñ\80а Ð´IадаккÑ\85аÑ\80",
+       "deletepage": "Ð\94IаÑ\8fккÑ\85а Ð¾Ð°Ð³IÑ\83в",
+       "confirmdeletetext": "Ð\9eаÑ\88 Ð´IадийÑ\85ад Ð±IаÑ\80Ñ\87Ñ\87а Ð´IадаккÑ\85аÑ\80 Ð¾Ð°Ð³Iон Ð° (е Ñ\81Ñ\83Ñ\80Ñ\82а), Ñ\86Ñ\83н Ð´ÐµÑ\80Ñ\80ига Ñ\85Ñ\83вÑ\86аÑ\80а Ð¸Ñ\81Ñ\82оÑ\80и Ð°. '''Ð\94еÑ\85аÑ\80 Ð´Ð°''', Ð±Ð°ÐºÑ\8aде Ñ\88оай Ð¸Ð· Ð±Ð¾ÐºÑ\8aонÑ\86а Ð´Ðµ Ð±ÐµÐ·Ð°Ð¼ Ð±Ð¾Ð»Ð°Ñ\88 Ð´Ð¾Ð»Ð³Ð° Ð°, Ð¸Ð· Ð´Ð¸Ñ\87а Ñ\85Ñ\83Ñ\80гдаÑ\80 ÐºÑ\85еÑ\82аÑ\88 Ð´Ð¾Ð»Ð³Ð° Ð°, Ð¸Ð· Ð´Ð°Ñ\80 Ñ\83кÑ\85 [[{{MediaWiki:Policy-url}}|бокÑ\8aонаÑ\88Ñ\86а]] долга.",
+       "actioncomplete": "Ð\90Ñ\80дам ÐºÑ\85оаÑ\87аÑ\88даÑ\8cд",
+       "actionfailed": "Ð\90Ñ\80дам ÐºÑ\85оаÑ\87аÑ\88даьдац",
+       "deletedtext": "«$1» дIаяьккхай.\nХьажа $2 тIехьара дIадаккхарий хьаязъяьрга бIаргтохаргболаш.",
        "dellogpage": "ДIадаккхарай тептар",
        "deletecomment": "Бахьан:",
        "deleteotherreason": "Кхыдола бахьан/тIатохар:",
        "rollbacklink": "юхаяккха",
        "rollbacklinkcount": "юхататта $1 {{PLURAL:$1|нийсдар}}",
        "protectlogpage": "ГIон тептар",
-       "protectedarticle": "\"[[$1]]\" оагIув лорам деж я",
-       "modifiedarticleprotection": "\"[[$1]]\" оагIувни лорама лагIа хувцаяьннай",
+       "protectedarticle": "Лораяьй оагӀув «[[$1]]»",
+       "modifiedarticleprotection": "Лорадара лагIа хийцад оагIон «[[$1]]»",
        "protectcomment": "Бахьан:",
-       "protectexpiry": "Ð\9aÑ\85оаÑ\87алÑ\83Ñ\88 Ð»Ð°Ñ\82Ñ\82а:",
-       "protect_expiry_invalid": "ЧакÑ\85абоала Ð»Ð¾Ñ\80ама Ñ\85аÑ\80Ñ\86а ха",
-       "protect_expiry_old": "ЧакÑ\85айоала Ñ\85а - Ñ\8fÑ\85а Ð·Ð°Ð¼Ð° Ñ\8f.",
-       "protect-text": "'''$1''' укхаз шоана шоай оагIув лорамлагIа хувца a бIаргтасса a йийш хургья.",
-       "protect-locked-access": "ШÑ\83н Ð»Ð°Ñ\80Ñ\85Iама Ð¹Ð¾Ð°Ð·Ñ\83ви Ð½Ð¸Ð´Ð·Ð° ÐºÑ\85оаÑ\87аÑ\88 Ð±Ð°Ñ\86 Ð¾Ð°Ð³IÑ\83вни Ð»Ð¾Ñ\80ама Ð»Ð°Ð³Iа Ñ\85Ñ\83вÑ\86а. '''$1''' Ð¾Ð°Ð³IÑ\83вни Ð´IаоÑ\82Ñ\82амаш:",
+       "protectexpiry": "ЧакÑ\85доала:",
+       "protect_expiry_invalid": "Ð\9bоÑ\80адаÑ\80 Ñ\87акÑ\85адоала Ñ\85аÑ\80Ñ\86аÑ\85Ñ\8cа ха",
+       "protect_expiry_old": "ЧакÑ\85адалаÑ\80а Ñ\85а â\80\94 Ð´Ð°Ñ\85áÑ\80 Ð´Ð°.",
+       "protect-text": "Хьа йиш я оагIон '''$1''' лорадара лагIа бIаргтоха a, хувца a .",
+       "protect-locked-access": "Ð¥Ñ\8cа Ð´Ð°Ð³Ð°Ñ\80а Ð¹Ð¾Ð°Ð·Ð¾Ð½Ð³Ð° Ñ\82оÑ\8aал Ð±Ð¾ÐºÑ\8aо Ñ\8fÑ\86 Ð¾Ð°Ð³Iон Ð»Ð¾Ñ\80адаÑ\80а Ð»Ð°Ð³Iа Ñ\85Ñ\83вÑ\86а. '''$1''' Ð¾Ð°Ð³Iон ÐºÐ°Ñ\80аÑ\80а Ð¾Ñ\82Ñ\82адаÑ\80аш:",
        "protect-cascadeon": "{{PLURAL:$1|1=КIалхахь хьагойташ йола оагIувчу|КIалхахь хьагойташ йола оагIувнашчу}} ер оагIув чуяккха халарахь, лорам Iоттая я, хурхала лорам Iоттая я. Укх оагIувни лорама лагIа хувца йийш йолаш я, амма хурхала лорам хувцлургдац.",
-       "protect-default": "Ð\9bоÑ\80амза",
-       "protect-fallback": "\"$1\" пурам эша",
-       "protect-level-autoconfirmed": "Ð\9aеÑ\80да Ð°, Ð´Ð°ÐºÑ\8aалаÑ\8cÑ\86абоаÑ\86аÑ\87аÑ\8cÑ\80аÑ\85Ñ\8c Ð° Ð»Ð¾Ñ\80аде",
-       "protect-level-sysop": "Ð\9cазакÑ\83лгалÑ\85о Ð¼Ð°Ñ\80а Ñ\87Ñ\83вала Ð±Ð¾ÐºÑ\8aо Ñ\8fÑ\86",
-       "protect-summary-cascade": "хурхала",
-       "protect-expiring": "чакхайоала $1 (UTC)",
-       "protect-cascade": "УкÑ\85 Ð¾Ð°Ð³IÑ\83ваÑ\87 Ñ\87Ñ\83Ñ\8fÑ\8cккÑ\85а Ð¾Ð°Ð³IÑ\83ваÑ\88 Ð»Ð¾Ñ\80ае (Ñ\85Ñ\83Ñ\80Ñ\85ала Ð»Ð¾Ñ\80ам)",
-       "protect-cantedit": "ШÑ\83н Ñ\83кÑ\85 Ð¾Ð°Ð³IÑ\83вни Ð»Ð¾Ñ\80ама Ð»Ð°Ð³Iа Ñ\85Ñ\83вÑ\86а Ð¼ÐµÐ³Ð°Ñ\88 Ð´Ð°Ñ\86, Ð³IалаÑ\82нийÑ\81даÑ\80а Ñ\88Ñ\83н Ð±Ð¾ÐºÑ\8aо Ð¹Ð¾Ð°Ñ\86андаÑ\8c.",
+       "protect-default": "Ð\9bоÑ\80адаÑ\80 Ð´Ð¾Ð°Ñ\86аÑ\88",
+       "protect-fallback": "Могадаьд алхха ше «$1» волача доакъашхошта",
+       "protect-level-autoconfirmed": "Ð\9cогадаÑ\8cд Ð°Ð»Ñ\85Ñ\85а Ñ\88е-Ñ\88е ÐºÑ\8aоабалбаÑ\8c Ñ\85инна Ð´Ð¾Ð°ÐºÑ\8aаÑ\88Ñ\85оÑ\88Ñ\82а",
+       "protect-level-sysop": "Ð\9cогадаÑ\8cд Ð°Ð»Ñ\85Ñ\85а Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80аÑ\88Ñ\82а",
+       "protect-summary-cascade": "каскадни",
+       "protect-expiring": "чакхъйоала $1 (UTC)",
+       "protect-cascade": "Ð\9bоÑ\80ае Ñ\83кÑ\85 Ð¾Ð°Ð³Iон Ñ\87Ñ\83Ñ\8fÑ\8cккÑ\85а Ð¾Ð°Ð³IонаÑ\88 (каÑ\81кадни Ð»Ð¾Ñ\80адаÑ\80)",
+       "protect-cantedit": "Ð¥Ñ\8cа Ñ\85Ñ\83вÑ\86а Ð¹Ð¸Ñ\88 Ñ\8fÑ\86 Ñ\83кÑ\85 Ð¾Ð°Ð³Iон Ð»Ð¾Ñ\80адаÑ\80а Ð»Ð°Ð³Iа, Ñ\86Ñ\83н Ñ\85Ñ\83вÑ\86ам Ð±Ðµ Ñ\85Ñ\8cа Ð±Ð¾ÐºÑ\8aо Ñ\86а Ñ\85илаÑ\80аÑ\85.",
        "restriction-type": "Бокъонаш:",
-       "restriction-level": "ЧÑ\83воала лагIа:",
-       "restriction-edit": "Ð\93IалаÑ\82нийÑ\81даÑ\80",
+       "restriction-level": "ТIакÑ\85оаÑ\87илга лагIа:",
+       "restriction-edit": "Ð¥Ñ\83вÑ\86ам",
        "restriction-move": "ЦIи хувцаp",
        "restriction-create": "Хьакхоллар",
-       "restriction-upload": "ЧÑ\83даккÑ\85ар",
-       "undeletelink": "Ð\91IаÑ\80гÑ\82аÑ\81Ñ\81а/Ñ\8eÑ\85амеÑ\82Ñ\82аоÑ\82Ñ\82аде",
+       "restriction-upload": "Ð\94оÑ\82Ñ\82ар",
+       "undeletelink": "бIаÑ\80гÑ\82оÑ\85а/Ñ\8eÑ\85адаккÑ\85а",
        "undeleteviewlink": "хьажа",
        "undelete-search-submit": "Хьалáха",
        "namespace": "ЦIерий аренаш:",
        "tooltip-namespace_association": "Оттае ер белгало, иштта хержа цIерий ареца вIашагIъювзаенна дувца оттадара цIерий аре (е кхыяр) юкъейоаккхаргйолаш",
        "blanknamespace": "(Кертера)",
        "contributions": "{{GENDER:$1|Доакъашхочун}} къахьегам",
-       "contributions-title": "$1 дакъалаьцархочунна къахьегам",
+       "contributions-title": "{{GENDER:$1|Доакъашхочун}} $1 къахьегам",
        "mycontris": "Са къахьегам",
        "anoncontribs": "Къахьегам",
-       "contribsub2": "{{GENDER:$3|$1}} ($2) баь болх",
-       "uctop": "(xIанзара)",
+       "contribsub2": "Къахьегам {{GENDER:$3|$1}} ($2)",
+       "uctop": "(карара)",
        "month": "Укх бетт (кхы хьалхагIа)",
        "year": "Укх шер (кхы хьалхагIа):",
-       "sp-contributions-newbies": "Ð\9aеÑ\80да Ð´Ð°Ñ\8fзÑ\8cÑ\8f Ð¹Ð¾Ð°Ð·Ð¾Ð½Ð°Ñ\87еÑ\80а Ð¼Ð°Ñ\80а Ð±Ð°Ñ\8c Ð±Ð¾Ð»Ð° ÐºÑ\8aаÑ\85Ñ\8cегам Ð¼Ð° Ñ\85Ñ\8cокÑ\85а",
-       "sp-contributions-blocklog": "чIегаш",
-       "sp-contributions-uploads": "чуяьккхамаш",
+       "sp-contributions-newbies": "Ð¥Ñ\8cаÑ\85Ñ\8cокÑ\85а Ð°Ð»Ñ\85Ñ\85а ÐºÐµÑ\80да Ð´Ð°Ð³Ð°Ñ\80а Ð¹Ð¾Ð°Ð·Ð¾Ð½Ð°Ñ\88Ñ\86а Ð±Ð°Ñ\8c Ð±Ð¾Ð»Ð° ÐºÑ\8aаÑ\85Ñ\8cегам",
+       "sp-contributions-blocklog": "чIега тохараш",
+       "sp-contributions-uploads": "чуяьккхараш",
        "sp-contributions-logs": "тептараш",
-       "sp-contributions-talk": "дувцам",
+       "sp-contributions-talk": "дувца оттадар",
        "sp-contributions-search": "Къахьегама лахар",
-       "sp-contributions-username": "IP-моÑ\82Ñ\82иг Ðµ Ñ\86Iи:",
-       "sp-contributions-toponly": "ТIеÑ\85Ñ\8cаÑ\80а Ð´Ð¾Ñ\80жамаÑ\88 Ð»Ð¾Ð°Ñ\80Ñ\85аÑ\88 Ð´Ð¾Ð»Ð° Ñ\85Ñ\83вÑ\86амаÑ\88 Ð¼Ð°Ñ\80а Ð¼Ð° Ñ\85Ñ\8cокÑ\85а",
+       "sp-contributions-username": "IP-адÑ\80еÑ\81 Ðµ Ð´Ð¾Ð°ÐºÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ñ\86Ó\80и:",
+       "sp-contributions-toponly": "Ð\93ойÑ\82а Ð°Ð»Ñ\85Ñ\85а Ñ\82IеÑ\85Ñ\8cаÑ\80а Ð²ÐµÑ\80Ñ\81еÑ\88 Ñ\81анна Ð»Ð¾Ð°Ñ\80Ñ\85IаÑ\88 Ð´Ð¾Ð»Ð° Ð½Ð¸Ð¹Ñ\81даÑ\80аÑ\88",
        "sp-contributions-submit": "Хьалáха",
        "whatlinkshere": "ТIахьожаяргаш укхаза",
        "whatlinkshere-title": "\"$1а\" тIахьожавеш йола оагIонаш",
        "whatlinkshere-page": "ОагIув:",
        "linkshere": "ТIехьайоагIа оагIонаш тIахьожаву «'''[[:$1]]'''»:",
-       "nolinkshere": "'''[[:$1]]''' оагIув тIа, кхыдола оагIувашкара Iинкаш йоацаш я",
+       "nolinkshere": "ОагIона '''[[:$1]]''' кхыйола оагIонашкара тIахьожаяргаш йоацаш я.",
        "isredirect": "оагIув-дIа-сахьожадар",
        "istemplate": "юкъейоалаяр",
        "isimage": "Файлови тIахьожаярг",
        "whatlinkshere-hideredirs": "$1 дIа-сахьожадараш",
        "whatlinkshere-hidetrans": "$1 юкъейоалаяраш",
        "whatlinkshere-hidelinks": "$1 тIахьожаяргаш",
-       "whatlinkshere-hideimages": "$1 Ñ\81Ñ\83Ñ\80Ñ\82Iинкаш",
+       "whatlinkshere-hideimages": "$1 Ñ\84айлай Ñ\82IаÑ\85Ñ\8cожаÑ\8fÑ\80гаш",
        "whatlinkshere-filters": "Фильтраш",
-       "blockip": "УкÑ\85 {{GENDER:$1|доакÑ\8aоÑ\88Ñ\85оÑ\87оа}} Ñ\87|ега Ð±Ð¾Ð»Ð°",
-       "ipboptions": "2 Ñ\81аÑ\85Ñ\8cаÑ\82:2 hours,1 Ð´Ð¸:1 day,3 Ð´Ð¸:3 days,1 ÐºIиÑ\80а:1 week,2 ÐºIиÑ\80а:2 weeks,1 Ð±Ñ\83Ñ\82Ñ\82:1 month,3 Ð±Ñ\83Ñ\82Ñ\82:3 months,6 Ð±Ñ\83Ñ\82Ñ\82:6 months,1 Ñ\88Ñ\83:1 year,Ñ\81иÑ\85а Ñ\86а Ð»Ñ\83Ñ\88:infinite",
-       "ipblocklist": "ЧIега бела дакъалаьцархой",
+       "blockip": "ЧIега Ñ\82оÑ\85а {{GENDER:$1|доакÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н}}",
+       "ipboptions": "2 Ñ\81аÑ\85Ñ\8cаÑ\82:2 hours,1 Ð´Ð¸:1 day,3 Ð´Ð¸:3 days,1 ÐºIиÑ\80а:1 week,2 ÐºIиÑ\80а:2 weeks,1 Ð±Ñ\83Ñ\82Ñ\82:1 month,3 Ð±Ñ\83Ñ\82Ñ\82:3 months,6 Ð±Ñ\83Ñ\82Ñ\82:6 months,1 Ñ\88Ñ\83:1 year,Ñ\85оадаÑ\8fÑ\8c Ñ\85а Ð¹Ð¾Ð°Ñ\86а:infinite",
+       "ipblocklist": "ЧIега теха доакъашхой",
        "ipblocklist-submit": "Хьалáха",
        "blocklink": "чIегa тоха",
        "unblocklink": "чIега баста",
-       "change-blocklink": "ЧIегатохар хувца",
+       "change-blocklink": "ЧIега тохар хувца",
        "contribslink": "къахьегам",
-       "blocklogpage": "ЧIегаш тoха таптар",
-       "blocklogentry": "[[$1]] чIега белаб,  $2 $3 ха ялалца",
-       "unblocklogentry": "$1 юха яста я",
-       "block-log-flags-nocreate": "Ð\9bаÑ\80Ñ\85Iамий Ð´Ð°Ð³Ð°Ñ\80Ñ\87ена Ñ\86Iи Ñ\8fÑ\8cккÑ\85аÑ\80 Ð¿Ñ\83Ñ\80ам Ñ\8fнза Ñ\8f.",
-       "move-page-legend": "ОагIува цIи хувца",
+       "blocklogpage": "ЧIегаш тoхара таптар",
+       "blocklogentry": "укхан [[$1]] чIега техаб $2 чакхдалалца $3",
+       "unblocklogentry": "чIега баьстаб $1",
+       "block-log-flags-nocreate": "дагаÑ\80а Ð¹Ð¾Ð°Ð·Ð¾Ð½Ð°Ñ\88 ÐºÑ\85оллаÑ\80 Ð¿Ñ\83Ñ\80ам Ð´ÐµÐ½Ð½Ð°Ð´Ð°Ñ\86",
+       "move-page-legend": "ОагIон цIи хувцар",
        "movepagetext": "КIалхара кепаца болхабеча, оаш оагIувни цIи хувцаргья, цунна хувцамий тептар кхыйола меттиге дIачудоаккхаш.\nКIаьнара цIерахь керда цIерий дIачудаккхам хургда.\nКIаьнара цIера тIа даь дола дIачудаккхамаш, шун ший лоIамахь кердадаккха йийш хургья.\nИз оаш ца дой, дехар да, [[Special:DoubleRedirects|шолха]] кхы [[Special:BrokenRedirects|вIашагIаяккха дIачудаккхамий]] кардоламахь хьажа.\nОаш жоп лу, шоай чуяккха йола Iинкаш, даим болхбеш хургдолга.\n\nЗем бахка, оагIувни цIи хувцалургьяц, изза мо цIи йолаш оагIув хилача. \nЙолаш йола оагIув хувца йийш яц, амма хийца йола оагIув юха хьахувца йийш я. \n\n'''Хоамхайтар'''\n\nЦIи хувцар, йовзаш йола оагIувнаший, доккха а цаьхха а хувцамшка дIатIадала мегаш да.\nДехар да, оаш дIахо болх белаьхь, хургдола хIама кхеташ долга, кхеталаш.",
        "movepagetalktext": "ТIатеха дувцама оагIув, ший лоIамахь цIи хувлургья, '''ер дага а доацар, доаца:'''\n\n*Изза мо цIи йолаш яьсса дувцама оагIув я е\n*Оаш кIалхахь белгало даьдац.\n\nИз иштта дале, кулги новкъосталца оагIувнаш вIашагIатоха  е дIадехьаяккха деза шун.",
-       "newtitle": "Керда цIи",
-       "move-watch": "Ер оагIув теркама дагаршкахь чуяккха",
-       "movepagebtn": "ОагIува цIи хувца",
-       "pagemovedsub": "ОагIув керд цIи тилла я",
-       "movepage-moved": "'''\"$1\" оагув \"$2\" хьийца я'''",
-       "articleexists": "Изза мо цIи йола оагIув, йолаш я е оаш тила цIи мегаш яц.\nДехар да, кхыйола цIи хьаржа.",
-       "movetalk": "Ð\9cаIан Ñ\87Ñ\83лоаÑ\86а Ð´Ñ\83вÑ\86ама Ð¾Ð°Ð³IÑ\83вни Ñ\86Iи Ñ\85Ñ\83вÑ\86а",
+       "newtitle": "Керда цIи:",
+       "move-watch": "Ер оагIув зем бара хьаязъяьра юкъеяьккха",
+       "movepagebtn": "ОагIон цIи хувца",
+       "pagemovedsub": "ОагIон керда цIи тиллай",
+       "movepage-moved": "'''«$1» оагIон ер «$2» цIи тиллай'''",
+       "articleexists": "Изза мо цIи йола оагIув тхьовре йолаш я е оаш тилла цIи мегаш яц.\nДехар да, кхыйола цIи харжа.",
+       "movetalk": "ЦIи Ñ\85Ñ\83вÑ\86а Ð´Ñ\83вÑ\86а Ð¾Ñ\82Ñ\82адаÑ\80а Ð¾Ð°Ð³Iон а",
        "movelogpage": "ЦIи хувцара тептар",
-       "movereason": "Бахьан",
-       "revertmove": "юхаяьккха",
+       "movereason": "Бахьан:",
+       "revertmove": "юха",
        "export": "ОагIонай экспорт",
-       "allmessagesname": "ЦIи",
-       "allmessagesdefault": "СаÑ\82ийна Ñ\83лла Ñ\8fздам",
-       "allmessages-filter-all": "Ð\94еÑ\80Ñ\80игаÑ\88",
+       "allmessagesname": "Хоам",
+       "allmessagesdefault": "Ð\9cаÑ\81Ñ\81аза Ð¹Ð¾Ð»Ð° Ñ\82екÑ\81Ñ\82",
+       "allmessages-filter-all": "Ð\95Ñ\80Ñ\80ига",
        "allmessages-language": "Мотт:",
-       "allmessages-filter-submit": "Дехьа гӀо",
+       "allmessages-filter-submit": "Дехьавала",
        "thumbnail-more": "Хьадоаккхаде",
-       "thumbnail_error": "ЗIамигасуртанчий кхеллама гIалат: $1",
-       "import-upload-filename": "Ð\9fаÑ\8cлаÑ\86Iи:",
+       "thumbnail_error": "ЗIамига сурт кхоллара гIалат: $1",
+       "import-upload-filename": "Файла Ñ\86Ó\80и:",
        "tooltip-pt-userpage": "{{GENDER:|Хьа}} доакъашхочун оагIув",
        "tooltip-pt-mytalk": "{{GENDER:|Хьа}} дувца оттадара оагIув",
        "tooltip-pt-preferences": "{{GENDER:|Хьа гIирсаш}}",
        "tooltip-ca-addsection": "Керда дáкъа хьаде",
        "tooltip-ca-viewsource": "Ер оагIув хувцамбарах гIо теха (лорая) я, амма цунна дIадолалу текстага хьажа а, из тIерхьаязъе а бокъо я.",
        "tooltip-ca-history": "Укх оагIон даь хувцамаш тIа дола тептар",
-       "tooltip-ca-protect": "Eр оагIув лорае",
-       "tooltip-ca-delete": "Ð\95Ñ\80 Ð¾Ð°Ð³IÑ\83в Ð´IаÑ\8fÑ\8cкÑ\85а",
+       "tooltip-ca-protect": "Лорае ер оагIув хувцамаш дергдоацаш",
+       "tooltip-ca-delete": "Ð\94Ó\80аÑ\8fккÑ\85а ÐµÑ\80 Ð¾Ð°Ð³Ó\80Ñ\83в",
        "tooltip-ca-move": "Укх оагIон цIи хувца",
        "tooltip-ca-watch": "ТIатоха ер оагIув хьа зем бара хьаязъяьра",
-       "tooltip-ca-unwatch": "Ð\95Ñ\80 Ð¾Ð°Ð³IÑ\83в Ñ\82еÑ\80кам Ð±ÐµÑ\87а ÐºÐ°Ñ\8cÑ\85аÑ\82а Ñ\82IаÑ\80а Ð´IаÑ\8fÑ\8cкÑ\85а",
+       "tooltip-ca-unwatch": "Ð\94IаÑ\8fккÑ\85а ÐµÑ\80 Ð¾Ð°Ð³IÑ\83в Ñ\88оай Ð·ÐµÐ¼ Ð±Ð°Ñ\80а Ñ\85Ñ\8cаÑ\8fзÑ\8aÑ\8fÑ\8cÑ\80 Ñ\82IаÑ\80а",
        "tooltip-search": "Хьалáха {{grammar:prepositional|{{SITENAME}}}} чу",
        "tooltip-search-go": "Изза мо цӀи йолаш оагӀон тӀa дехьавала",
        "tooltip-search-fulltext": "Изза мо текст йолаш оагӀонаш лаха",
        "tooltip-n-help": "Новкъостал лаха мегаш йола моттиг",
        "tooltip-t-whatlinkshere": "Укхаза тIахьожавеш йола оагIонаш",
        "tooltip-t-recentchangeslinked": "Укх оагIо тIахьожавеш йолча оагIонай тIеххьара хувцамаш",
-       "tooltip-feed-rss": "Укх оагIувна RSSчу гойтар",
+       "tooltip-feed-rss": "RSS чу гойтар укх оагIон",
        "tooltip-feed-atom": "Укх оагIонна лаьрххIа Atom чу трансляци яр",
        "tooltip-t-contributions": "{{GENDER:$1|Укх доакъашхочо хийца}} йола оагIонаш",
-       "tooltip-t-emailuser": "УкÑ\85 Ð´Ð°ÐºÑ\8aалаÑ\8cÑ\86аÑ\80Ñ\85оÑ\87оа Ð·IÑ\8b Ñ\8fÑ\85Ñ\8cийÑ\82а",
+       "tooltip-t-emailuser": "Ð\94IаÑ\85Ñ\8cийÑ\82а ÐºÐ°Ñ\8cÑ\85аÑ\82 {{GENDER:$1|Ñ\83кÑ\85 Ð´Ð¾Ð°ÐºÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н}}",
        "tooltip-t-upload": "Файлаш чуяккха",
        "tooltip-t-specialpages": "ГIулакха оагIонаш",
        "tooltip-t-print": "Укх оагIон зарба тохара верси",
        "tooltip-ca-nstab-project": "Проектан оагIув",
        "tooltip-ca-nstab-image": "Файла оагӀув",
        "tooltip-ca-nstab-template": "Лера оагIув",
-       "tooltip-ca-nstab-help": "Ð\93Ó\80он оагIув",
+       "tooltip-ca-nstab-help": "Ð\9dовкÑ\8aоÑ\81Ñ\82ала оагIув",
        "tooltip-ca-nstab-category": "Категорен оагӀув",
-       "tooltip-minoredit": "Ð\95Ñ\80 Ñ\85Ñ\83вÑ\86аÑ\80 Ð±Ð°Ñ\88Ñ\85а Ð´Ð¾Ð°Ñ\86а санна белгалде",
+       "tooltip-minoredit": "Ð\95Ñ\80 Ñ\85Ñ\83вÑ\86аÑ\80 ÐºIезига Ð´Ð°Ñ\80 санна белгалде",
        "tooltip-save": "Хьа хувцамаш лорадеш дIаязде",
        "tooltip-preview": "Дехар да, оагӀув лораешь дIаязъелехь из мишта я тахка хьалххе бIаргтохарах пайда эцаш!",
        "tooltip-diff": "ДIадолалу текстаца даь хувцамаш хьахьокха",
-       "tooltip-compareselectedversions": "Укх оагIувни шин доржамаш тIа юкъера хувцамаш зе.",
-       "tooltip-watch": "Ð\95Ñ\80 Ð¾Ð°Ð³IÑ\83в Ñ\82еÑ\80кам Ð±ÐµÑ\87а ÐºÐ°Ñ\8cÑ\85аÑ\82а Ñ\82Iа Ñ\8fÑ\8cкÑ\85а",
+       "tooltip-compareselectedversions": "Укх оагIон хержа шин версешта юкъе йола башхалога хьажа.",
+       "tooltip-watch": "ТIаÑ\82оÑ\85а ÐµÑ\80 Ð¾Ð°Ð³IÑ\83в Ñ\85Ñ\8cа Ð·ÐµÐ¼ Ð±Ð°Ñ\80а Ñ\85Ñ\8cаÑ\8fзÑ\8aÑ\8fÑ\8cÑ\80а",
        "tooltip-rollback": "Цкъа пIелг тоIабе дIадаккха тIехьара редакторас даь хувцамаш",
        "tooltip-undo": "Даь хувцар дIадаьккха, хьалххе бIаргтохар хьахьокха, дIадаккхара бахьан Iочуязде аьттув болаш.",
        "tooltip-summary": "Лоаца сурт оттадар Iочуязде",
        "show-big-image-preview": "Боарам хьалххе бIаргтохач хан: $1.",
        "show-big-image-other": "{{PLURAL:$2|1=Кхыбола тIера боарам|Кхыбола тIера боарам}}: $1.",
        "show-big-image-size": "$1 × $2 пиксель",
-       "noimages": "СÑ\83Ñ\80Ñ\82\88 Ð±IаÑ\80гагÑ\83Ñ\88 Ð´Ð°Ñ\86.",
+       "noimages": "Суртaш дац.",
        "ilsubmit": "Хьалáха",
-       "bad_image_list": "Ð\91Ñ\83Ñ\81Ñ\82ам Ñ\86Ñ\83 Ñ\82айпаÑ\80а Ñ\85ила Ð±ÐµÐ·Ð°:\n\nÐ\94агаÑ\80лен Ñ\85Ñ\8cаÑ\80акÑ\8aаÑ\88 Ð¼Ð°Ñ\80а Ð»Ð¾Ð°Ñ\80Ñ\85|аÑ\88 Ñ\85Ñ\83Ñ\80гÑ\8cÑ\8fÑ\86 (Ñ\83кÑ\85 Ñ\82амагIалгаÑ\86a * Ð´Ñ\83влаÑ\88дÑ\83 Ð¼Ñ\83гIаÑ\80аÑ\88).\nÐ\9cÑ\83гIаÑ\80ен Ñ\85Ñ\8cалÑ\85аÑ\80а Iинк, Ñ\81Ñ\83Ñ\80Ñ\82 IоÑ\82Ñ\82ае Ð¿Ñ\83Ñ\80ам Ð´Ð¾Ð°Ñ\86а Iинка, Ñ\85ила ÐµÐ·Ð°. \nЦÑ\83 Ð¼Ñ\83гIаÑ\80а Ñ\82IеÑ\85Ñ\8cайоагIа IинкаÑ\88, Ð°Ñ\80адаккÑ\85аÑ\80 Ð¼Ð¾ Ð»Ð¾Ð°Ñ\80Ñ\85|аÑ\88 Ñ\85Ñ\83Ñ\80гÑ\8cÑ\8f, Ð²ÐµÑ\88Ñ\82а Ð°Ñ\8cлÑ\87а, Ð¹Ð¾Ð°Ð·Ñ\83ваÑ\88ка Ñ\87Ñ\83IоÑ\82Ñ\82аде Ð¼ÐµÐ³Ð°Ñ\88 Ð´Ð¾Ð»Ð° Ñ\81Ñ\83Ñ\80Ñ\82 Ñ\81анна Ð»Ð°Ñ\80Ñ\85|а Ð¼ÐµÐ³а.",
+       "bad_image_list": "ФоÑ\80маÑ\82 Ñ\85ила ÐµÐ·Ð° Ð¸Ñ\88Ñ\82Ñ\82а:\n\nÐ\9bоаÑ\80Ñ\85IаÑ\88 Ñ\85Ñ\83Ñ\80гда Ð°Ð»Ñ\85Ñ\85а Ñ\85Ñ\8cаÑ\8fзÑ\8aÑ\8fÑ\8cÑ\80а Ñ\8dлеменÑ\82аÑ\88 (Ñ\83кÑ\85 * Ð±ÐµÑ\85кама Ð±ÐµÐ»Ð³Ð°Ð»Ð¾Ð½Ð°Ñ\86а Ð´Ð¾Ð»Ð°Ð»Ñ\83Ñ\88 Ð´Ð¾Ð»Ð° Ð¼Ð¾Ð³IаÑ\80аÑ\88).\nÐ\9cогIаÑ\80а Ñ\86Ñ\85Ñ\8cоаллагIа Ñ\82IаÑ\85Ñ\8cожаÑ\8fÑ\80г Ñ\87Ñ\83оÑ\82Ñ\82аде Ð¼ÐµÐ³Ð°Ñ\88 Ð´Ð¾Ð°Ñ\86а Ñ\81Ñ\83Ñ\80Ñ\82а Ñ\82IаÑ\85Ñ\8cожавеÑ\88 Ñ\85ила ÐµÐ·Ð°.\nЦÑ\83 Ð¼Ð¾Ð³IаÑ\80а Ñ\82IеÑ\85Ñ\8cайоагIа Ñ\82IаÑ\85Ñ\8cожаÑ\8fÑ\80гаÑ\88 Ð»Ð¾Ð°Ñ\80Ñ\85IаÑ\88 Ñ\85Ñ\83Ñ\80гÑ\8cÑ\8f Ñ\8dÑ\80гамаÑ\88 (иÑ\81клÑ\8eÑ\87ениÑ\8f) Ñ\81анна, Ð²ÐµÑ\88Ñ\82а Ð°Ñ\8cлÑ\87а, Ñ\81Ñ\83Ñ\80Ñ\82 Ñ\87Ñ\83оÑ\82Ñ\82аде Ð¼ÐµÐ³Ð°Ñ\88 Ð¹Ð¾Ð»Ð° Ñ\81Ñ\82аÑ\82Ñ\8cÑ\8fÑ\88 Ñ\81анна.",
        "metadata": "Мета-дараш",
        "metadata-help": "Файло кхыдола дараш чулоаца, цифровой суртдоакхарго е сканеро тIатохаш дола. Нагахьа файл чуякхачул тIехьа хийца хинна дале, цхьаццайола параметраш хIанзара сурта тIара йоацаш хила мегаш я.",
-       "metadata-expand": "Ð\9aÑ\85Ñ\8bдола Ñ\85IамаÑ\88 Ñ\85Ñ\8cаÑ\85Ñ\8cокÑ\85а",
-       "metadata-collapse": "Ð\9aÑ\85Ñ\8bдола Ñ\85IамаÑ\88 ÐºÑ\8aайладаккÑ\85а",
+       "metadata-expand": "Ð¥Ñ\8cаÑ\85Ñ\8cокÑ\85а ÐºÑ\85Ñ\8bдола Ð´Ð°Ñ\80аÑ\88",
+       "metadata-collapse": "Ð\9aÑ\8aайладаккÑ\85а ÐºÑ\85Ñ\8bдола Ð´Ð°Ñ\80аÑ\88",
        "metadata-fields": "Укх хьаяьзъяра чу дагaрадаь суртий метахоамий йистош, хьахьекха хургда сурта оагIон тIа, хьоарчадаь метахоамий ильг долаш. Юхедиса йистош къайла хургда.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "Шерал",
        "exif-imagelength": "Лакхал",
        "exif-make": "Камера кийчъяь арахийцар",
        "exif-model": "Камера модель",
        "exif-software": "Программни Iалашдар",
-       "exif-artist": "ЯздаÑ\80Ñ\85о",
+       "exif-artist": "Ð\90вÑ\82оÑ\80",
        "exif-exifversion": "Верси Exif",
        "exif-colorspace": "Бесай мотт",
        "exif-pixelxdimension": "Сурта шорал",
        "exif-pixelydimension": "Сурта лакхал",
        "exif-datetimeoriginal": "Оригинальни таьрахьи хаи",
        "exif-datetimedigitized": "Оцифровк яь таьрахь а, ха а",
-       "exif-writer": "Яздама Ð´Ð°",
+       "exif-writer": "ТекÑ\81Ñ\82а Ð°Ð²Ñ\82оÑ\80",
        "exif-languagecode": "Мотт",
-       "exif-iimcategory": "ЦаÑ\82ег",
+       "exif-iimcategory": "Ð\9aаÑ\82егоÑ\80и",
        "exif-orientation-1": "гIаьхьа",
-       "exif-scenecapturetype-1": "ЛаьттабIаса",
-       "exif-scenecapturetype-2": "Сурт",
-       "exif-iimcategory-edu": "Дешар",
-       "exif-iimcategory-evn": "Ð\90Ñ\80ен Ð±Ñ\83не",
-       "exif-iimcategory-hth": "Ð\9cогаÑ\80",
-       "exif-iimcategory-hum": "Ð\90дамий Ð¸Ñ\81каÑ\80аш",
-       "exif-iimcategory-rel": "Дини тешари",
-       "exif-iimcategory-sci": "Iилмаи кулгболхи",
-       "exif-iimcategory-soi": "Сагий хаттараш",
-       "exif-iimcategory-spo": "Ð\9dидзоамал",
-       "exif-iimcategory-war": "ТIемаш, кховсамаши латтараши",
+       "exif-scenecapturetype-1": "Ландшафт",
+       "exif-scenecapturetype-2": "Сага сурт",
+       "exif-iimcategory-edu": "Дешарца Iомадар",
+       "exif-iimcategory-evn": "Ð\93онаÑ\85Ñ\8cе",
+       "exif-iimcategory-hth": "УнаÑ\85Ñ\86Iано",
+       "exif-iimcategory-hum": "ЧIоагIа Ð´Ð¸ÐºÐ° Ð¸Ñ\81Ñ\82оÑ\80еш",
+       "exif-iimcategory-rel": "Ди а, тешар а",
+       "exif-iimcategory-sci": "Ӏилма а, техника а",
+       "exif-iimcategory-soi": "СоÑ\86иалÑ\8cни хаттараш",
+       "exif-iimcategory-spo": "СпоÑ\80Ñ\82",
+       "exif-iimcategory-war": "ТIемáш, вIашдухьалъóттамаш, кéгараш",
        "exif-iimcategory-wea": "Хаоттам",
        "namespacesall": "деррига",
        "monthsall": "деррига",
-       "confirm_purge_button": "Ð¥Iаа",
-       "imgmultigo": "Дехьа гӀо!",
-       "imgmultigoto": "$1 оагIув тIа дехьавала",
+       "confirm_purge_button": "Ð\9cега",
+       "imgmultigo": "Дехьавала!",
+       "imgmultigoto": "$1 оагIон тIа дехьавала",
        "table_pager_limit_submit": "Кхоачашде",
-       "watchlisttools-view": "Ð\94агаÑ\80Ñ\87еÑ\80а Ð¾Ð°Ð³IÑ\83внаÑ\88 Ñ\82Iа хувцамаш",
-       "watchlisttools-edit": "Ð\94агаÑ\80Ñ\87е Ñ\85Ñ\8cажа/Ñ\85Ñ\83вÑ\86а",
-       "watchlisttools-raw": "Яздам Ð¼Ð¾ хувца",
+       "watchlisttools-view": "Ð¥Ñ\8cаÑ\8fзÑ\8aÑ\8fÑ\8cÑ\80 Ñ\87Ñ\83Ñ\80а Ð¾Ð°Ð³IонаÑ\88 Ñ\82Iа Ð´Ð¾Ð»а хувцамаш",
+       "watchlisttools-edit": "Ð¥Ñ\8cажа Ð° Ñ\85Ñ\83вÑ\86а Ð° Ñ\85Ñ\8cаÑ\8fзÑ\8aÑ\8fÑ\8cÑ\80",
+       "watchlisttools-raw": "Ð\9cаÑ\81Ñ\81аза Ð¹Ð¾Ð»Ð° Ñ\82екÑ\81Ñ\82 Ñ\81анна хувца",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|дувца оттадар]])",
-       "duplicate-defaultsort": "Ð\97ем Ð±Ðµ. Ð¡Ð°Ñ\82ийна Ð´Iа-Ñ\85Ñ\8cа Ñ\85Ñ\8cоÑ\80жама Ð´Ð¾Ð°Ð³I \"$2\" Ñ\85Ñ\8cалÑ\85аÑ\80а Ñ\81аÑ\82ийна Ð´Iа-Ñ\85Ñ\8cа Ñ\85Ñ\8cоÑ\80жама Ð´Ð¾Ð°Ð³I \"$1\" Ñ\85Ñ\8cаÑ\85Ñ\8cоÑ\80жа.",
-       "version": "Ð\94оÑ\80жам",
+       "duplicate-defaultsort": "ТеÑ\80кам. Ð\94олÑ\87а Ñ\82айпаÑ\80а Ð´IанийÑ\81даÑ\80а Ð´IоагIа Â«$2» Ñ\8eÑ\85акÑ\8aоаÑ\81Ñ\82адÑ\83 Ð´Ð¾Ð»Ñ\87а Ñ\82айпаÑ\80а Ð´IанийÑ\81даÑ\80а Ñ\85Ñ\8cалÑ\85а Ñ\85инна Ð´IоагIа Â«$1».",
+       "version": "Ð\92еÑ\80Ñ\81и",
        "version-specialpages": "ГIулакха оагӀонаш",
        "version-version": "($1)",
-       "version-software-version": "Ð\94оÑ\80жам",
-       "fileduplicatesearch-filename": "Ð\9fаÑ\8cлаÑ\86Iи:",
+       "version-software-version": "Ð\92еÑ\80Ñ\81и",
+       "fileduplicatesearch-filename": "Файла Ñ\86Ó\80и:",
        "fileduplicatesearch-submit": "Хьалáха",
        "specialpages": "ЛаьрххIа йола оагIонаш",
-       "specialpages-group-users": "Ð\94акÑ\8aалаÑ\8cÑ\86аÑ\80Ñ\85ой, Ñ\86аÑ\80а Ð±Ð¾ÐºÑ\8aо",
-       "specialpages-group-pages": "ОагIувний дагарченаш",
-       "specialpages-group-pagetools": "ОагIувнаша гIирсаш",
-       "external_image_whitelist": "#Ð\95Ñ\80 Ð¼Ñ\83гI Ñ\88ий Ð´Ð¾Ð»Ð°Ñ\88 Ñ\82айпаÑ\80а Ð´Ð¸Ñ\82а<pre>\n#Ð\9aаÑ\81Ñ\82-каÑ\81Ñ\82а Ð¾Ð°Ð»Ð°Ð¼Ð°Ñ\88 Ñ\83кÑ\85аза Ð´IаÑ\8fзаде(Ñ\8eкÑ\8aе Ð´Ð¾Ð»Ð° Ð´Ð°ÐºÑ\8aа //)\n#аÑ\80аÑ\80а Ñ\81Ñ\83Ñ\80Ñ\82ий URLÑ\86а Ð´IанийÑ\81алÑ\83Ñ\80гда Ñ\83Ñ\88.\n#Ð\9fайдан Ð´Ð¾Ð»Ð°, Ñ\81Ñ\83Ñ\80Ñ\82аÑ\88 Ð¼Ð¾ Ñ\85Ñ\8cаÑ\85Ñ\8cекÑ\85а Ñ\85Ñ\83Ñ\80гÑ\8cÑ\8f, Ð´Ð°Ñ\85IодаÑ\80аÑ\88, Ñ\81Ñ\83Ñ\80Ñ\82а Ñ\82Iа IинкаÑ\88 Ð¼Ð¾ Ñ\85Ñ\83pгÑ\8cÑ\8f Ñ\85Ñ\8cаÑ\85Ñ\8cекÑ\85а.\n#УкÑ\85 # Ñ\82амагIалгаÑ\86а Ð´IадÑ\83влаÑ\88 Ð´Ð¾Ð»Ð° Ð¼Ñ\83гIанаÑ\88, Ð¾Ð°Ð»Ð°Ð¼ Ð¼Ð¾ Ð»Ð¾Ð°Ñ\80Ñ\85аÑ\88 Ð´Ð°.\n#Ð\9cÑ\83гIанаÑ\88 Ñ\8fздaÑ\82акÑ\85а ÐºÐ°Ñ\8cда Ð´Ð°\n\n#Ð\9aаÑ\81Ñ\82-каÑ\81Ñ\82а Ð¾Ð°Ð»Ð°Ð¼Ð°Ñ\88 Ñ\83кÑ\85 Ð¼Ñ\83гIа Ð»Ð°ÐºÑ\85е Ð´IаÑ\8fзаде. Ð\98з Ð¼Ñ\83гI Ñ\88ий Ð´Ð¾Ð»Ð°Ñ\88 Ñ\82айпаÑ\80а Ð´ита</pre>",
+       "specialpages-group-users": "Ð\94оакÑ\8aаÑ\88Ñ\85ойи Ð±Ð¾ÐºÑ\8aонаÑ\88и",
+       "specialpages-group-pages": "ОагIонай хьаязъяьраш",
+       "specialpages-group-pagetools": "ОагIонашта дола гIирсаш",
+       "external_image_whitelist": "#Ð\95Ñ\80 Ð¼Ñ\83гI Ñ\88ий Ð±Ð¾Ð»Ñ\87а Ñ\82айпаÑ\80а Ð±Ð¸Ñ\82а<pre>\n#УкÑ\85аз Ð¾Ñ\82Ñ\82аде ÐºÐ°Ñ\81Ñ\82Ñ\82а Ð´Ñ\83влаÑ\87а Ð²Ñ\8bÑ\80ажений Ñ\84Ñ\80агменÑ\82аÑ\88 (// Ñ\8eкÑ\8aе Ð´Ð¾Ð»Ð° Ð´Ð°ÐºÑ\8aа)\n#аÑ\80аÑ\85Ñ\8cаÑ\80а Ñ\81Ñ\83Ñ\80Ñ\82ий URL Ð°Ð´Ñ\80еÑ\81аÑ\88Ñ\86а Ð´IанийÑ\81алÑ\83Ñ\80гда Ñ\83Ñ\88.\n#Ð\9cегаÑ\80гдола Ñ\81Ñ\83Ñ\80Ñ\82аÑ\88 Ñ\81анна Ñ\85Ñ\8cаÑ\85Ñ\8cекÑ\85а Ñ\85Ñ\83Ñ\80гда, Ð´IаÑ\85одаÑ\80аÑ\88, Ñ\81Ñ\83Ñ\80Ñ\82аÑ\88Ñ\82а Ñ\82IаÑ\85Ñ\8cожаÑ\8fÑ\80гаÑ\88 Ñ\81анна Ñ\85Ñ\8cаÑ\85Ñ\8cекÑ\85а Ñ\85Ñ\83Ñ\80гда.\n#УкÑ\85анÑ\86а # Ð´Ð¾Ð»Ð°Ð»Ñ\83Ñ\88 Ð´Ð¾Ð»Ð° Ð¼Ð¾Ð³IаÑ\80аÑ\88 Ð°Ð»Ð°Ñ\80аÑ\88 Ñ\81анна Ð»Ð¾Ð°Ñ\80Ñ\85IаÑ\88 Ð´Ð°.\n#Ð\9cогIаÑ\80аÑ\88 Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86а ÐºIаÑ\8cда Ð´Ð°Ñ\86\n\n#УкÑ\85 Ð¼Ð¾Ð³IаÑ\80а Ð»Ð°ÐºÑ\85е Ð¾Ñ\82Ñ\82аде ÐºÐ°Ñ\81Ñ\82Ñ\82а Ð´Ñ\83влаÑ\87а Ð²Ñ\8bÑ\80ажений Ñ\84Ñ\80агменÑ\82аÑ\88. Ð\95Ñ\80 Ð¼Ñ\83гI Ñ\88ий Ð±Ð¾Ð»Ñ\87а Ñ\82айпаÑ\80а Ð±ита</pre>",
        "tag-filter": "[[Special:Tags|Белгалонай]] фильтр:",
-       "tag-filter-submit": "ЦIенÑ\8aе",
+       "tag-filter-submit": "Ð\9bиÑ\82Ñ\82а",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|1=Белгало|Белгалонаш}}]]: $2)",
-       "tags-title": "Ð\99оазонаш",
-       "tags-tag": "Ð\99оазон Ñ\86Iи",
-       "tags-hitcount-header": "Ð\91елгалаÑ\8fÑ\8c Ñ\85Ñ\83вÑ\86амаш",
-       "tags-edit": "хувца",
+       "tags-title": "Ð\91елгалонаш",
+       "tags-tag": "Ð\91елгалон Ñ\86Ó\80и",
+       "tags-hitcount-header": "Ð\91елгалдаÑ\8c Ð½Ð¸Ð¹Ñ\81даÑ\80аш",
+       "tags-edit": "нийсде",
        "tags-hitcount": "$1 {{PLURAL:$1|1=хувцам|хувцамаш}}",
        "tags-create-submit": "Хьакхолла",
        "compare-page1": "ЦхьоаллагIа оагIув",
        "compare-page2": "ШоллагIа оагӀув",
-       "compare-rev1": "1. Доржам",
-       "compare-rev2": "2. Доржам",
+       "compare-rev1": "ЦхьоаллагIа верси",
+       "compare-rev2": "ШоллагӀа верси",
        "htmlform-submit": "ДIадахьийта",
        "htmlform-reset": "Хувцамаш юхадаккха",
-       "htmlform-selectorother-other": "Ð\9aÑ\85Ñ\8bдола",
+       "htmlform-selectorother-other": "Ð\9aÑ\85Ñ\8bдаÑ\80",
        "logentry-delete-delete": "$1 {{GENDER:$2|дIаяккхай}} оагIув $3",
        "logentry-move-move": "$1 {{GENDER:$2|цӀи хийцай}} $3 → $4",
        "logentry-newusers-create": "{{GENDER:$2|Доакъашхочо хьакхеллад}} дагара йоазув $1",
        "logentry-upload-upload": "$1 {{GENDER:$2|чуяьккхай}} $3",
-       "rightsnone": "(а)",
-       "revdelete-summary": "хувцамий лоацам",
+       "rightsnone": "(яц)",
+       "revdelete-summary": "хувцамий сурт оттадар",
        "searchsuggest-search": "Лахар",
+       "expand_templates_preview": "Хьалххе бIаргтохар",
        "pagelang-name": "ОагIув",
-       "special-characters-group-latin": "Ð\9bаÑ\8cÑ\82мий",
-       "special-characters-group-greek": "Ð\94желÑ\82ий",
-       "special-characters-group-cyrillic": "ЦÑ\8bÑ\80илиÑ\86ий",
-       "special-characters-group-arabic": "Ӏарбий",
-       "special-characters-group-persian": "Фаьранзий",
+       "special-characters-group-latin": "Ð\9bаÑ\82иной",
+       "special-characters-group-greek": "Эллиной",
+       "special-characters-group-cyrillic": "Ð\9aиÑ\80иллиÑ\86а",
+       "special-characters-group-arabic": "Iарбий",
+       "special-characters-group-persian": "Фаьрсий",
        "special-characters-group-hebrew": "Жугтий"
 }
index 7a8e57a..8048a84 100644 (file)
        "rightslogtext": "Þetta er skrá yfir breytingar á réttindum notenda.",
        "action-read": "lesa þessa síðu",
        "action-edit": "breyta þessari síðu",
-       "action-createpage": "skapa síður",
-       "action-createtalk": "skapa spjallsíður",
+       "action-createpage": "skapa þessa síðu",
+       "action-createtalk": "skapa þessa spjallsíðu",
        "action-createaccount": "skapa þennan notandaaðgang",
        "action-autocreateaccount": "búa sjálfvirkt til þennan ytri notandaaðgang",
        "action-history": "skoða breytingaskrá þessarar síðu",
        "mw-widgets-dateinput-placeholder-month": "ÁÁÁÁ-MM",
        "mw-widgets-titleinput-description-new-page": "síðan er ekki enn til",
        "mw-widgets-titleinput-description-redirect": "tilvísun á $1",
-       "api-error-blacklisted": "Veldu annan lýsandi titil",
        "sessionmanager-tie": "Get ekki sameinað margar gerðir auðkenningarbeiðna: $1.",
        "sessionprovider-generic": "$1 setur",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "setur með vefkökum",
index 8cc1985..0ecc963 100644 (file)
@@ -98,7 +98,8 @@
                        "Mpiva",
                        "Urielejh",
                        "Matma Rex",
-                       "Matteocng"
+                       "Matteocng",
+                       "Einreiher"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "viewyourtext": "È possibile visualizzare e copiare il codice sorgente delle <strong>tue modifiche</strong> a questa pagina.",
        "protectedinterface": "Questa pagina contiene un elemento che fa parte dell'interfaccia utente del software di questo sito ed è protetta per evitare possibili abusi.\nPer aggiungere o modificare le traduzioni valide su tutti i wiki, usa [https://translatewiki.net/ translatewiki.net], il progetto di localizzazione di MediaWiki.",
        "editinginterface": "<strong>Attenzione:</strong> il testo di questa pagina fa parte dell'interfaccia utente del software di questo sito. Tutte le modifiche apportate a questa pagina si riflettono sui messaggi visualizzati per tutti gli utenti su questo wiki.",
-       "translateinterface": "Per aggiungere o modificare le traduzioni valide su tutti i wiki, usa [https://translatewiki.net/ translatewiki.net], il progetto MediaWiki per la localizzazione.",
+       "translateinterface": "Per aggiungere o modificare le traduzioni valide su tutti i wiki, usa [https://translatewiki.net/ translatewiki.net], il progetto di localizzazione MediaWiki.",
        "cascadeprotected": "Su questa pagina non è possibile effettuare modifiche perché è inclusa {{PLURAL:$1|nella pagina indicata di seguito, che è stata protetta|nelle pagine indicate di seguito, che sono state protette}} selezionando la protezione \"ricorsiva\":\n$2",
        "namespaceprotected": "Non si dispone dei permessi necessari per modificare le pagine del namespace '''$1'''.",
        "customcssprotected": "Non si dispone dei permessi necessari alla modifica di questa pagina CSS, in quanto contiene le impostazioni personali di un altro utente.",
        "minoredit": "Questa è una modifica minore",
        "watchthis": "Aggiungi agli osservati speciali",
        "savearticle": "Salva la pagina",
+       "savechanges": "Salva le modifiche",
        "publishpage": "Pubblica pagina",
+       "publishchanges": "Pubblica modifiche",
        "preview": "Anteprima",
        "showpreview": "Visualizza anteprima",
        "showdiff": "Mostra modifiche",
        "previewnote": "'''Ricorda che questa è solo un'anteprima.'''\nLe tue modifiche NON sono ancora state salvate!",
        "continue-editing": "Vai all'area di modifica",
        "previewconflict": "L'anteprima corrisponde al testo presente nella casella di modifica superiore e rappresenta la pagina come apparirà se si sceglie di salvarla in questo momento.",
-       "session_fail_preview": "Spiacenti! Non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione.\n\nPotresti essere stato disconnesso. <strong>Verifica che sei ancora collegato e riprova</strong>.\nSe il problema persiste, si può tentare di [[Special:UserLogout|scollegarsi]] ed effettuare un nuovo accesso, e controllare che il tuo browser accetti i cookie da questo sito.",
-       "session_fail_preview_html": "Spiacenti! Non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione.\n\n<em>Poiché {{SITENAME}} ha dell'HTML grezzo attivato e c'è stata una perdita dei dati della sessione, l'anteprima è nascosta come precauzione contro gli attacchi JavaScript.</em>\n\n<strong>Se si tratta di un normale tentativo d'anteprima, riprova.</strong> \nSe il problema persiste, si può tentare di [[Special:UserLogout|scollegarsi]] ed effettuare un nuovo accesso, e controllare che il tuo browser accetti i cookie da questo sito.",
+       "session_fail_preview": "Spiacenti. Non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione.\n\nPotresti essere stato disconnesso. <strong>Verifica di essere ancora collegato e riprova</strong>.\nSe il problema persiste, puoi provare a [[Special:UserLogout|scollegarti]] ed effettuare un nuovo l'accesso, controllando che il tuo browser accetti i cookie da questo sito.",
+       "session_fail_preview_html": "Spiacenti. Non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione.\n\n<em>Siccome {{SITENAME}} ha dell'HTML grezzo attivato e c'è stata una perdita dei dati della sessione, l'anteprima è nascosta come precauzione contro gli attacchi JavaScript.</em>\n\n<strong>Se si tratta di un normale tentativo d'anteprima, riprova.</strong> \nSe il problema persiste, puoi provare a [[Special:UserLogout|scollegarti]] ed effettuare un nuovo l'accesso, controllando che il tuo browser accetti i cookie da questo sito.",
        "token_suffix_mismatch": "'''La modifica non è stata salvata perché il client ha mostrato di gestire in modo errato i caratteri di punteggiatura nel token associato alla stessa. Per evitare una possibile corruzione del testo della pagina, è stata rifiutata l'intera modifica. Questa situazione può verificarsi, talvolta, quando vengono usati alcuni servizi di proxy anonimi via web che presentano dei bug.'''",
        "edit_form_incomplete": "'''Alcune parti del modulo di modifica non hanno raggiunto il server; controllare che le modifiche siano intatte e riprovare.'''",
        "editing": "Modifica di $1",
        "content-model-css": "CSS",
        "content-json-empty-object": "Oggetto vuoto",
        "content-json-empty-array": "Array vuoto",
+       "deprecated-self-close-category": "Pagine che utilizzano tag HTML auto-chiusi non validi",
+       "deprecated-self-close-category-desc": "La pagina contiene tag HTML auto-chiusi non validi, come <code>&lt;b/></code> o <code>&lt;span/></code>. Il comportamento di questi presto cambierà per essere coerente con le specifiche HTML5, per questo il loro uso nel wikitesto è deprecato.",
        "duplicate-args-warning": "<strong>Avvertenza:</strong> [[:$1]] chiama [[:$2]] con più di un valore per il parametro \"$3\". Verrà utilizzato solo l'ultimo valore fornito.",
        "duplicate-args-category": "Pagine contenenti chiamate a template con parametri duplicati",
        "duplicate-args-category-desc": "La pagina contiene chiamate a template che utilizzano argomenti duplicati, come ad esempio <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "rightslogtext": "Di seguito sono elencate le modifiche ai diritti assegnati agli utenti.",
        "action-read": "leggere questa pagina",
        "action-edit": "modificare questa pagina",
-       "action-createpage": "creare pagine",
-       "action-createtalk": "creare pagine di discussione",
+       "action-createpage": "creare questa pagina",
+       "action-createtalk": "creare questa pagina di discussione",
        "action-createaccount": "effettuare questa registrazione",
        "action-autocreateaccount": "creare automaticamente questa utenza esterna",
        "action-history": "vedere la cronologia di questa pagina",
        "upload-http-error": "Si è verificato un errore HTTP: $1",
        "upload-copy-upload-invalid-domain": "Non è consentito il caricamento di copie da questo dominio.",
        "upload-foreign-cant-upload": "Questo wiki non è configurato per caricare i file nel repository di file esterno richiesto.",
+       "upload-dialog-disabled": "Il caricamento di file tramite questa finestra di dialogo è disabilitato in questo wiki.",
        "upload-dialog-title": "Carica file",
        "upload-dialog-button-cancel": "Annulla",
        "upload-dialog-button-done": "Fatto",
        "apisandbox": "Pagina di prova API",
        "apisandbox-jsonly": "È richiesto JavaScript per utilizzare la sandbox API.",
        "apisandbox-api-disabled": "Le funzionalità API sono disabilitate su questo sito.",
-       "apisandbox-intro": "Utilizza questa pagina per sperimentare con le <strong>API web service MediaWiki</strong>.\nPer ulteriori dettagli di utilizzo delle API, fai riferimento alla [[mw:API:Main page|documentazione API]]. Esempio: [https://www.mediawiki.org/wiki/API#A_simple_example ottenere il contenuto della pagina principale]. Seleziona un'azione per vedere altri esempi.\n\nNota che, anche se questa è una pagina per le prove, le azioni che esegui qui potrebbero modificare il wiki.",
+       "apisandbox-intro": "Utilizza questa pagina per fare pratica con le <strong>API web service MediaWiki</strong>.\nPer ulteriori dettagli di utilizzo delle API, fai riferimento alla [[mw:API:Main page|documentazione API]]. Esempio: [https://www.mediawiki.org/wiki/API#A_simple_example ottenere il contenuto della pagina principale]. Seleziona un'azione per vedere altri esempi.\n\nNota che, anche se questa è una pagina per le prove, le azioni che esegui qui potrebbero modificare il wiki.",
        "apisandbox-fullscreen": "Espandi pannello",
        "apisandbox-fullscreen-tooltip": "Espandi il pannello sandbox per riempire la finestra del browser.",
        "apisandbox-unfullscreen": "Mostra la pagina",
        "sp-contributions-username": "Indirizzo IP o nome utente:",
        "sp-contributions-toponly": "Mostra solo i contributi che sono le ultime versioni per la pagina",
        "sp-contributions-newonly": "Visualizza solo le modifiche che sono creazioni di pagina",
+       "sp-contributions-hideminor": "Nascondi le modifiche minori",
        "sp-contributions-submit": "Ricerca",
        "whatlinkshere": "Puntano qui",
        "whatlinkshere-title": "Pagine che puntano a \"$1\"",
        "allmessagesname": "Nome",
        "allmessagesdefault": "Testo predefinito",
        "allmessagescurrent": "Testo attuale",
-       "allmessagestext": "Questa è la lista di tutti i messaggi di sistema disponibili nel namespace MediaWiki.\nVisitare [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] e [https://translatewiki.net translatewiki.net] se si desidera contribuire alla localizzazione generica di MediaWiki.",
+       "allmessagestext": "Questa è la lista di tutti i messaggi di sistema disponibili nel namespace MediaWiki.\nVisita [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] e [https://translatewiki.net translatewiki.net] se vuoi contribuire alla localizzazione generica di MediaWiki.",
        "allmessagesnotsupportedDB": "Non è possibile utilizzare questa pagina perché il flag '''$wgUseDatabaseMessages''' non è attivo.",
        "allmessages-filter-legend": "Filtro",
        "allmessages-filter": "Filtra per stato di modifica:",
        "import-nonewrevisions": "Nessuna versione importata (erano già tutte presenti, o saltate a causa di errori)",
        "xml-error-string": "$1 a riga $2, colonna $3 (byte $4): $5",
        "import-upload": "Carica dati XML",
-       "import-token-mismatch": "I dati relativi alla sessione sono andati persi. Riprovare.\n\nPotresti essere stato disconnesso. <strong>Verifica che sei ancora collegato e riprova</strong>.\nSe il problema persiste, si può tentare di [[Special:UserLogout|scollegarsi]] ed effettuare un nuovo accesso, e controllare che il tuo browser accetti i cookie da questo sito.",
+       "import-token-mismatch": "I dati relativi alla sessione sono andati persi. Riprovare.\n\nPotresti essere stato disconnesso. <strong>Verifica di essere ancora collegato e riprova</strong>.\nSe il problema persiste, puoi provare a [[Special:UserLogout|scollegarti]] ed effettuare un nuovo l'accesso, controllando che il tuo browser accetti i cookie da questo sito.",
        "import-invalid-interwiki": "Impossibile importare dal progetto wiki indicato.",
        "import-error-edit": "La pagina \"$1\" non è stata importata poiché non sei autorizzato a modificarla.",
        "import-error-create": "La pagina \"$1\" non è stata importata poiché non sei autorizzato a crearla.",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Elimina questa pagina dalla tua lista degli osservati speciali?",
        "confirm-rollback-button": "OK",
-       "confirm-rollback-top": "Ripristinare le modifiche a questa pagina?",
+       "confirm-rollback-top": "Ripristinare le modifiche di questa pagina?",
        "percent": "$1&#160;%",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "← pagina precedente",
        "htmlform-float-invalid": "Il valore specificato non è un numero.",
        "htmlform-int-toolow": "Il valore specificato è inferiore al minimo di $1",
        "htmlform-int-toohigh": "Il valore specificato è superiore al massimo di $1",
-       "htmlform-required": "Questo valore è obligatorio.",
+       "htmlform-required": "Questo valore è obbligatorio.",
        "htmlform-submit": "Invia",
        "htmlform-reset": "Annulla modifiche",
        "htmlform-selectorother-other": "Altro",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "questa pagina non esiste ancora",
        "mw-widgets-titleinput-description-redirect": "reindirizzamento a $1",
-       "api-error-blacklisted": "Per favore scegli un titolo diverso e descrittivo.",
        "sessionmanager-tie": "Non è possibile combinare più tipi di richieste di autenticazione: $1.",
        "sessionprovider-generic": "sessioni $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sessioni basate su cookie",
        "log-action-filter-newusers": "Tipo di creazione utenza:",
        "log-action-filter-patrol": "Tipo di verifica:",
        "log-action-filter-protect": "Tipo di protezione:",
-       "log-action-filter-rights": "Tipo di modifica diritti",
-       "log-action-filter-suppress": "Tipo di soppressione",
+       "log-action-filter-rights": "Tipo di modifica diritti:",
+       "log-action-filter-suppress": "Tipo di soppressione:",
        "log-action-filter-upload": "Tipo di caricamento:",
        "log-action-filter-all": "Tutto",
        "log-action-filter-block-block": "Blocco",
index 5eefbd9..37ad555 100644 (file)
@@ -77,9 +77,9 @@
        "tog-underline": "リンクの下線:",
        "tog-hideminor": "最近の更新に細部の編集を表示しない",
        "tog-hidepatrolled": "最近の更新に巡回済みの編集を表示しない",
-       "tog-newpageshidepatrolled": "新しいページの一覧に巡回済みのページを表示しない",
+       "tog-newpageshidepatrolled": "新しいページの一覧に巡回済みのページを表示しない",
        "tog-hidecategorization": "ページのカテゴリ追加・除去を表示しない",
-       "tog-extendwatchlist": "ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\82\92æ\8b¡å¼µã\81\97ã\80\81æ\9c\80æ\96°ã\81®ã\82\82ã\81®ã\81 ã\81\91ã\81§ã\81¯ã\81ªã\81\8fã\81\99ã\81¹ã\81¦ã\81®å¤\89æ\9b´ã\82\92表示",
+       "tog-extendwatchlist": "ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\82\92æ\8b¡å¼µã\81\97ã\81¦æ\9c\80æ\96°ã\81®å¤\89æ\9b´ä»¥å¤\96ã\82\82ã\81\99ã\81¹ã\81¦表示",
        "tog-usenewrc": "最近の更新とウォッチリストで、複数の変更をページごとにまとめる",
        "tog-numberheadings": "見出しに番号を自動的に振る",
        "tog-showtoolbar": "編集用のツールバーを表示",
        "tog-ccmeonemails": "他の利用者に送信したメールの控えを自分にも送信",
        "tog-diffonly": "差分の下にページ内容を表示しない",
        "tog-showhiddencats": "隠しカテゴリを表示",
-       "tog-norollbackdiff": "ロールバック後の差分を表示しない",
+       "tog-norollbackdiff": "巻き戻し後の差分を表示しない",
        "tog-useeditwarning": "変更を保存せずに編集画面から離れようとしたら警告",
        "tog-prefershttps": "ログインする際、常に安全な接続を使用する",
        "underline-always": "常に付ける",
        "category_header": "カテゴリ「$1」にあるページ",
        "subcategories": "下位カテゴリ",
        "category-media-header": "カテゴリ「$1」にあるメディア",
-       "category-empty": "<em>このカテゴリには現在、ページやメディアが何もありません。</em>",
+       "category-empty": "<em>現在このカテゴリには、ページまたはメディアがありません。</em>",
        "hidden-categories": "{{PLURAL:$1|隠しカテゴリ}}",
        "hidden-category-category": "隠しカテゴリ",
        "category-subcat-count": "{{PLURAL:$2|このカテゴリには以下の下位カテゴリのみが含まれています。|このカテゴリには下位カテゴリ $2 件が含まれており、そのうち以下の{{PLURAL:$1| $1 件}}を表示しています。}}",
        "password-change-forbidden": "このウィキではパスワードを変更できません。",
        "externaldberror": "認証データベースでエラーが発生したか、または外部アカウントの更新が許可されていません。",
        "login": "ログイン",
+       "login-security": "あなたが同一人であることを確認します",
        "nav-login-createaccount": "ログインまたはアカウント作成",
        "userlogin": "ログインまたはアカウント作成",
        "userloginnocreate": "ログイン",
        "userlogin-resetpassword-link": "パスワードをお忘れですか?",
        "userlogin-helplink2": "ログインについてのヘルプ",
        "userlogin-loggedin": "{{GENDER:$1|$1}} として既にログインしています。\n別の利用者としてログインするには下のフォームを使用してください。",
+       "userlogin-reauth": "あなたが {{GENDER:$1|$1}} であることを確認するために、再度ログインする必要があります。",
        "userlogin-createanother": "別アカウントを作成",
        "createacct-emailrequired": "メールアドレス",
        "createacct-emailoptional": "メールアドレス (省略可能)",
        "createaccountreason": "理由:",
        "createacct-reason": "理由",
        "createacct-reason-ph": "アカウントを作成する理由",
+       "createacct-reason-help": "アカウント作成記録に表示されるメッセージ",
        "createacct-submit": "アカウントを作成",
        "createacct-another-submit": "アカウントを作成",
+       "createacct-continue-submit": "アカウント作成を続行",
+       "createacct-another-continue-submit": "アカウント作成を続行",
        "createacct-benefit-heading": "{{SITENAME}}は、あなたのような人々が創っています。",
        "createacct-benefit-body1": "{{PLURAL:$1|編集}}",
        "createacct-benefit-body2": "{{PLURAL:$1|ページ}}",
        "nocookieslogin": "{{SITENAME}}ではログインに Cookie を使用します。\nCookie を無効にしているようです。\nCookie を有効にしてから、もう一度試してください。",
        "nocookiesfornew": "発信元を確認できなかったため、アカウントは作成されませんでした。\nCookieを有効にしていることを確認して、このページを再読込してもう一度試してください。",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
+       "createacct-loginerror": "アカウントは正常に作成されましたが、自動的にログインすることができませんでした。[[Special:UserLogin|手動でログイン]]をしてください。",
        "noname": "有効な利用者名が指定されていません。",
        "loginsuccesstitle": "ログイン済み",
        "loginsuccess": "<strong>{{SITENAME}}に「$1」としてログインしました。</strong>",
        "createacct-another-realname-tip": "本名は省略できます。\n入力すると、その利用者の著作物の帰属表示に使われます。",
        "pt-login": "ログイン",
        "pt-login-button": "ログイン",
+       "pt-login-continue-button": "ログインを続行",
        "pt-createaccount": "アカウント作成",
        "pt-userlogout": "ログアウト",
        "php-mail-error-unknown": "PHPのmail()関数での不明なエラーです。",
        "botpasswords-invalid-name": "指定された利用者名には、ボット用パスワードの区切りである「$1」 が含まれていません。",
        "botpasswords-not-exist": "利用者「$1」はボット「$2」のパスワードを所持していません。",
        "resetpass_forbidden": "パスワードは変更できません",
+       "resetpass_forbidden-reason": "パスワードは変更できません: $1",
        "resetpass-no-info": "このページに直接アクセスするためにはログインしている必要があります。",
        "resetpass-submit-loggedin": "パスワードを変更",
        "resetpass-submit-cancel": "中止",
        "passwordreset-emailsentusername": "この利用者名に関連付けられたメールアドレスがある場合は、パスワードリセットのメールが送信されます。",
        "passwordreset-emailsent-capture": "下記の内容の、パスワード再設定メールをお送りしました。",
        "passwordreset-emailerror-capture": "以下の内容のパスワード再設定メールを生成しましたが、{{GENDER:$2|利用者}}への送信に失敗しました: $1",
-       "changeemail": "メールアドレスを変更または除去",
+       "passwordreset-emailsent-capture2": "パスワードリセットの{{PLURAL:$1|メール}}が送信されました。{{PLURAL:$1|利用者名とパスワード|利用者名とパスワードの一覧}}は以下のとおりです。",
+       "passwordreset-emailerror-capture2": "{{GENDER:$2|利用者}}へのメール送信に失敗しました: $1{{PLURAL:$3|利用者名とパスワード|利用者名とパスワードの一覧}}は以下のとおりです。",
+       "passwordreset-ignored": "パスワードのリセットが処理されませんでした。プロバイダーが設定されていない可能性があります。",
+       "passwordreset-invalideamil": "無効なメールアドレスです",
+       "changeemail": "メールアドレスの変更または除去",
        "changeemail-header": "あなたのメールアドレスを変更するには、このフォームを完成させます。もし、あなたのアカウントから任意のメールアドレスの関連付けを削除したい場合は、フォームの送信時に、新しいメールアドレスを空白のままにします。",
        "changeemail-passwordrequired": "この変更を確認するためにパスワードを入力する必要があります。",
        "changeemail-no-info": "このページに直接アクセスするためにはログインしている必要があります。",
        "minoredit": "細部の編集",
        "watchthis": "このページをウォッチ",
        "savearticle": "ページを保存",
+       "savechanges": "変更を保存",
        "publishpage": "ページを公開",
+       "publishchanges": "変更を公開",
        "preview": "プレビュー",
        "showpreview": "プレビューを表示",
        "showdiff": "差分を表示",
        "right-managechangetags": "[[Special:Tags|タグ]]の作成、有効化および無効化",
        "right-applychangetags": "自分の編集に[[Special:Tags|タグ]]を適用する",
        "right-changetags": "個々の版と記録項目の任意の[[Special:Tags|タグ]]の追加と削除",
+       "right-deletechangetags": "データベースから[[Special:Tags|タグ]]を削除します",
        "grant-group-email": "メールの送信",
        "grant-group-customization": "カスタマイズと個人設定",
        "grant-group-other": "その他の活動",
        "rightslogtext": "以下は利用者権限の変更記録です。",
        "action-read": "このページの閲覧",
        "action-edit": "このページの編集",
-       "action-createpage": "ページの作成",
-       "action-createtalk": "議論ページの作成",
+       "action-createpage": "ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®ä½\9cæ\88\90",
+       "action-createtalk": "この議論ページの作成",
        "action-createaccount": "この利用者アカウントの作成",
        "action-autocreateaccount": "この外部利用者アカウントを自動的に作成",
        "action-history": "このページの履歴の閲覧",
        "action-managechangetags": "タグの作成、有効化および無効化",
        "action-applychangetags": "自分の編集にタグを適用する",
        "action-changetags": "個々の版および記録項目への任意のタグの追加と除去",
+       "action-deletechangetags": "データベースからタグの削除",
        "nchanges": "$1 {{PLURAL:$1|回の変更}}",
        "enhancedrc-since-last-visit": "最終閲覧以降 $1 {{PLURAL:$1|件}}",
        "enhancedrc-history": "履歴",
        "upload-too-many-redirects": "そのURLに含まれるリダイレクトが多すぎます",
        "upload-http-error": "HTTP エラー発生: $1",
        "upload-copy-upload-invalid-domain": "このドメインからのアップロードは許可されていません。",
+       "upload-foreign-cant-upload": "このウィキでは、要求された外部ファイルリポジトリにファイルをアップロードできるように設定されていません。",
+       "upload-foreign-cant-load-config": "外部ファイルリポジトリへのファイルアップロードに使用される設定の読み込みに失敗しました。",
+       "upload-dialog-disabled": "このウィキでは、このダイアログを使用するファイルのアップロードが無効にされています。",
        "upload-dialog-title": "ファイルをアップロード",
        "upload-dialog-button-cancel": "中止",
        "upload-dialog-button-done": "完了",
        "uploadstash-badtoken": "操作を実行できませんでした。編集するための認証の期限切れが原因である可能性があります。再度試してください。",
        "uploadstash-errclear": "ファイルの消去に失敗しました。",
        "uploadstash-refresh": "ファイルの一覧を更新",
+       "uploadstash-thumbnail": "サムネイルを表示",
        "invalid-chunk-offset": "無効なチャンクオフセット",
        "img-auth-accessdenied": "アクセスが拒否されました",
        "img-auth-nopathinfo": "PATH_INFO が見つかりません。\nサーバーが、この情報を渡すように構成されていません。\nCGI ベースであるため、img_auth に対応できない可能性もあります。\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization をご覧ください。",
        "apisandbox-dynamic-parameters-add-placeholder": "引数名",
        "apisandbox-dynamic-error-exists": "引数名 \"$1\" は既に存在しています。",
        "apisandbox-deprecated-parameters": "廃止予定の引数",
+       "apisandbox-fetch-token": "トークンを自動入力します",
        "apisandbox-submit-invalid-fields-title": "いくつかの欄が不正です。",
        "apisandbox-submit-invalid-fields-message": "印が付いている欄を訂正し、再試行してください。",
        "apisandbox-results": "結果",
        "trackingcategories-msg": "追跡用カテゴリ",
        "trackingcategories-name": "メッセージ名",
        "trackingcategories-desc": "カテゴリに入る基準",
+       "restricted-displaytitle-ignored": "ページ名の表示が無視されているページ",
+       "restricted-displaytitle-ignored-desc": "実際のページ名と等価でないために <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> が無視されているページ。",
        "noindex-category-desc": "このページは <code><nowiki>__NOINDEX__</nowiki></code> というマジックワードを含んでおり、その印が有効になっている名前空間にあるため、ロボットによる収集の対象になりません。",
        "index-category-desc": "このページは <code><nowiki>__INDEX__</nowiki></code> というマジックワードを含んでおり、その印が有効になっている名前空間にあるため、通常と異なり、ロボットによる収集の対象になります。",
        "post-expand-template-inclusion-category-desc": "テンプレートを展開したあとのページ サイズが <code>$wgMaxArticleSize</code> よりも大きいため、一部のテンプレートが展開されなかった",
        "changecontentmodel-submit": "変更",
        "changecontentmodel-success-title": "コンテンツ・モデルは変更されました",
        "changecontentmodel-success-text": "[[:$1]]のコンテンツ・タイプは変更されました。",
-       "changecontentmodel-cannot-convert": "[[:$1]]上のコンテントは$2の型には変換できません。",
+       "changecontentmodel-cannot-convert": "[[:$1]]のコンテンツは$2の型には変換できません。",
        "changecontentmodel-nodirectediting": "$1 コンテンツ・モデルは、ダイレクト編集をサポートしていません。",
+       "changecontentmodel-emptymodels-text": "[[:$1]]のコンテンツはどの型にも変換できません。",
        "log-name-contentmodel": "コンテンツ・モデル変更記録",
        "log-description-contentmodel": "ページのコンテンツ・モデルに関連する出来事",
+       "logentry-contentmodel-new": "$1 が ページ $3 を既定でないコンテンツ・モデル「$5」で{{GENDER:$2|作成しました}}。",
        "logentry-contentmodel-change": "$1 がページ $3 のコンテンツ・モデルを \"$4\" から \"$5\" に{{GENDER:$2|変更しました}}",
        "logentry-contentmodel-change-revertlink": "差し戻し",
        "logentry-contentmodel-change-revert": "差し戻し",
        "sp-contributions-username": "IPアドレスまたは利用者名:",
        "sp-contributions-toponly": "最新版の編集のみを表示",
        "sp-contributions-newonly": "ページ作成を伴う編集のみを表示",
+       "sp-contributions-hideminor": "細部の編集を表示しない",
        "sp-contributions-submit": "検索",
        "whatlinkshere": "リンク元",
        "whatlinkshere-title": "「$1」へリンクしているページ",
        "exif-compression-6": "JPEG (旧式)",
        "exif-copyrighted-true": "著作権あり",
        "exif-copyrighted-false": "著作権情報未設定",
+       "exif-photometricinterpretation-0": "黒と白 (白が0)",
        "exif-photometricinterpretation-1": "黒と白(黒が0)",
+       "exif-photometricinterpretation-9": "CIE L*a*b* (ICC エンコード)",
+       "exif-photometricinterpretation-10": "CIE L*a*b* (ITU エンコード)",
+       "exif-photometricinterpretation-32803": "カラーフィルター配列",
+       "exif-photometricinterpretation-34892": "リニア RAW",
        "exif-unknowndate": "不明な日付",
        "exif-orientation-1": "通常",
        "exif-orientation-2": "左右反転",
        "exif-orientation-8": "時計回りに90°回転",
        "exif-planarconfiguration-1": "点順次フォーマット",
        "exif-planarconfiguration-2": "面順次フォーマット",
+       "exif-xyresolution-i": "$1dpi",
+       "exif-xyresolution-c": "$1dpc",
        "exif-colorspace-65535": "その他",
        "exif-componentsconfiguration-0": "存在しない",
        "exif-exposureprogram-0": "未定義",
        "confirmemail_body_set": "誰か (おそらくあなた) が IP アドレス $1 から\n{{SITENAME}} のアカウント「$2」のメールアドレスをこのアドレスに設定しました。\n\nこのアカウントが本当にあなたのものであれば、以下のリンクをブラウザーで開いて、\n{{SITENAME}} のメール機能を有効にしてください。\n\n$3\n\nあなたのアカウントではない場合は、\n以下のリンクをブラウザーで開いて、メールアドレスの確認をキャンセルしてください:\n\n$5\n\nこの確認コードは $4 に期限切れになります。",
        "confirmemail_invalidated": "メールアドレスの確認が中止されました",
        "invalidateemail": "メールアドレスの確認中止",
+       "notificationemail_subject_changed": "{{SITENAME}} に登録されたメールアドレスが変更されました",
+       "notificationemail_subject_removed": "{{SITENAME}} に登録されたメールアドレスが除去されました",
        "notificationemail_body_changed": "誰か (おそらくあなた) が、IP アドレス $1 から、\n{{SITENAME}} のアカウント「$2」のメールアドレスを \"$3\" に変更しました。\n\n変更した覚えがない場合、サイトの管理者に直ちに連絡してください。",
+       "notificationemail_body_removed": "誰か (おそらくあなた) が、IP アドレス $1 から、\n{{SITENAME}} のアカウント「$2」のメールアドレスを除去しました。\n\n変更した覚えがない場合、サイトの管理者に直ちに連絡してください。",
        "scarytranscludedisabled": "[ウィキ間の参照読み込みは無効になっています]",
        "scarytranscludefailed": "[$1に対してテンプレートの取得に失敗しました]",
        "scarytranscludefailed-httpstatus": "[$1に対してテンプレートの取得に失敗しました: HTTP $2]",
        "confirmrecreate": "あなたが編集を開始した後、[[User:$1|$1]] ([[User talk:$1|トーク]]) がこのページを以下の理由で{{GENDER:$1|削除しました}}:\n: <em>$2</em>\nこのままこのページを本当に再作成していいか確認してください。",
        "confirmrecreate-noreason": "あなたが編集を開始した後、[[User:$1|$1]] ([[User talk:$1|トーク]]) がこのページを{{GENDER:$1|削除しました}}。このページを本当に再作成していいかご確認ください。",
        "recreate": "再作成する",
+       "unit-pixel": "ピクセル",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "このページのキャッシュを破棄しますか?",
        "confirm-purge-bottom": "ページをパージすると、キャッシュが破棄され、強制的に最新版が表示されます。",
        "autoredircomment": "[[$1]]への転送ページ",
        "autosumm-new": "ページの作成:「$1」",
        "autosumm-newblank": "空白のページを作成しました",
-       "size-bytes": "$1バイト",
+       "size-bytes": "$1{{PLURAL:$1|バイト}}",
        "size-kilobytes": "$1キロバイト",
        "size-megabytes": "$1メガバイト",
        "size-gigabytes": "$1ギガバイト",
        "size-exabytes": "$1 EB",
        "size-zetabytes": "$1 ZB",
        "size-yottabytes": "$1 YB",
+       "size-pixel": "$1{{PLURAL:$1|ピクセル}}",
+       "size-kilopixel": "$1キロピクセル",
+       "size-megapixel": "$1メガピクセル",
+       "size-gigapixel": "$1ギガピクセル",
+       "size-terapixel": "$1テラピクセル",
+       "size-petapixel": "$1ペタピクセル",
+       "size-exapixel": "$1エクサピクセル",
+       "size-zetapixel": "$1ゼタピクセル",
+       "size-yottapixel": "$1ヨタピクセル",
+       "bitrate-bits": "$1bps",
+       "bitrate-kilobits": "$1kbps",
+       "bitrate-megabits": "$1Mbps",
+       "bitrate-gigabits": "$1Gbps",
+       "bitrate-terabits": "$1Tbps",
+       "bitrate-petabits": "$1Pbps",
+       "bitrate-exabits": "$1Ebps",
+       "bitrate-zetabits": "$1Zbps",
+       "bitrate-yottabits": "$1Ybps",
        "lag-warn-normal": "この一覧には $1 {{PLURAL:$1|秒}}前以降の変更内容が表示されていないおそれがあります。",
        "lag-warn-high": "データベースサーバーの大幅な遅延のため、この一覧には $1 {{PLURAL:$1|秒}}前以降の変更内容が表示されていないおそれがあります。",
        "watchlistedit-normal-title": "ウォッチリストの編集",
        "timezone-local": "ローカル",
        "duplicate-defaultsort": "<strong>警告:</strong> 既定のソートキー「$2」が、その前に書かれている既定のソートキー「$1」を上書きしています。",
        "duplicate-displaytitle": "<strong>警告:</strong> DISPLAYTITLE「$2」が、その前に書かれているDISPLAYTITLE「$1」を上書きしています。",
+       "restricted-displaytitle": "<strong>警告:</strong> 実際のページ名と同じではないため、「$1」の表示名は無視されました。",
        "invalid-indicator-name": "<strong>エラー:</strong> ページ・ステータス・インディケーターの <code>name</code> 属性は空であってはいけません。",
        "version": "バージョン情報",
        "version-extensions": "インストール済み拡張機能",
        "tags-deactivate-not-allowed": "タグ「$1」は無効化できません。",
        "tags-deactivate-submit": "無効化",
        "tags-apply-no-permission": "あなたには変更と同時に変更タグを適応する権限がありません。",
+       "tags-apply-blocked": "ブロックされているため、変更タグの変更を適用できません。",
        "tags-apply-not-allowed-one": "タグ \"$1\" の手動適用は認められていません。",
        "tags-apply-not-allowed-multi": "以下の {{PLURAL:$2|タグ}} は手動適用が認められていません: $1",
        "tags-update-no-permission": "あなたには個々の版または記録項目のタグの追加または除去を行う権限がありません。",
+       "tags-update-blocked": "ブロックされているため、変更タグを追加または除去できません。",
        "tags-update-add-not-allowed-one": "タグ \"$1\" の手動追加は認められていません。",
        "tags-update-add-not-allowed-multi": "以下の {{PLURAL:$2|タグ}} は手動追加が認められていません: $1",
        "tags-update-remove-not-allowed-one": "タグ \"$1\" の除去は認められていません。",
        "sqlite-no-fts": "$1 (全文検索なし)",
        "logentry-delete-delete": "$1 がページ「$3」を{{GENDER:$2|削除しました}}",
        "logentry-delete-restore": "$1 がページ「$3」を{{GENDER:$2|復元しました}}",
-       "logentry-delete-event": "$1 が$3の{{PLURAL:$5|記録項目$5件}}の閲覧レベルを{{GENDER:$2|変更しました}}: $4",
-       "logentry-delete-revision": "$1 がページ「$3」の{{PLURAL:$5|$5版}}の閲覧レベルを{{GENDER:$2|変更しました}}: $4",
-       "logentry-delete-event-legacy": "$1 が「$3」の記録項目の閲覧レベルを{{GENDER:$2|変更しました}}",
+       "logentry-delete-event": "$1 が $3 の{{PLURAL:$5|記録項目|記録項目$5件}}の閲覧レベルを{{GENDER:$2|変更しました}}: $4",
+       "logentry-delete-revision": "$1 がページ「$3」の{{PLURAL:$5|版|$5件の版}}の閲覧レベルを{{GENDER:$2|変更しました}}: $4",
+       "logentry-delete-event-legacy": "$1 が $3 の記録項目の閲覧レベルを{{GENDER:$2|変更しました}}",
        "logentry-delete-revision-legacy": "$1 がページ「$3」の版の閲覧レベルを{{GENDER:$2|変更しました}}",
-       "logentry-suppress-delete": "$1 がページ「$3」を{{GENDER:$2|隠蔽しました}}",
-       "logentry-suppress-event": "$1 が$3の{{PLURAL:$5|記録項目$5件}}の閲覧レベルを見えない形で{{GENDER:$2|変更しました}}: $4",
-       "logentry-suppress-revision": "$1 がページ「$3」の{{PLURAL:$5|$5版}}の閲覧レベルを見えない形で{{GENDER:$2|変更しました}}: $4",
-       "logentry-suppress-event-legacy": "$1 が$3で記録項目の閲覧レベルを見えない形で{{GENDER:$2|変更しました}}",
+       "logentry-suppress-delete": "$1 がページ「$3」を{{GENDER:$2|秘匿しました}}",
+       "logentry-suppress-event": "$1 が $3 の{{PLURAL:$5|記録項目|$5件の記録項目}}の閲覧レベルを見えない形で{{GENDER:$2|変更しました}}: $4",
+       "logentry-suppress-revision": "$1 がページ「$3」の{{PLURAL:$5|版|$5件の版}}の閲覧レベルを見えない形で{{GENDER:$2|変更しました}}: $4",
+       "logentry-suppress-event-legacy": "$1 が $3 の記録項目の閲覧レベルを見えない形で{{GENDER:$2|変更しました}}",
        "logentry-suppress-revision-legacy": "$1 がページ「$3」の版の閲覧レベルを見えない形で{{GENDER:$2|変更しました}}",
        "revdelete-content-hid": "本文の不可視化",
        "revdelete-summary-hid": "編集要約の不可視化",
        "logentry-move-move_redir-noredirect": "$1 がページ「$3」をリダイレクトの「$4」に、リダイレクトを残さずに{{GENDER:$2|移動しました}}",
        "logentry-patrol-patrol": "$1 がページ「$3」の版 $4 を巡回済みと{{GENDER:$2|しました}}",
        "logentry-patrol-patrol-auto": "$1 が自動的にページ「$3」の版 $4 を巡回済みと{{GENDER:$2|しました}}",
-       "logentry-newusers-newusers": "利用者アカウント $1 が{{GENDER:$2|作成されました}}",
+       "logentry-newusers-newusers": "$1 によって利用者アカウントが{{GENDER:$2|作成されました}}",
        "logentry-newusers-create": "利用者アカウント $1 が{{GENDER:$2|作成されました}}",
        "logentry-newusers-create2": "利用者アカウント $3 が $1 により{{GENDER:$2|作成されました}}",
        "logentry-newusers-byemail": "利用者アカウント $3 が $1 によって{{GENDER:$2|作成され}}、そのパスワードがメールで送信されました",
        "logentry-tag-update-add-logentry": "$1 がページ $3 の記録項目 $5 に{{PLURAL:$7|タグ}} $6 を{{GENDER:$2|追加しました}}",
        "logentry-tag-update-remove-revision": "$1 がページ $3 の版 $4 から{{PLURAL:$9|タグ}} $8 を{{GENDER:$2|除去しました}}",
        "logentry-tag-update-remove-logentry": "$1 がページ $3 の記録項目 $5 から{{PLURAL:$9|タグ}} $8 を{{GENDER:$2|除去しました}}",
-       "logentry-tag-update-revision": "$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\81®ç\89\88 $4 ã\81§ã\81®ã\82¿ã\82°ã\82\92{{GENDER:$2|æ\9b´æ\96°ã\81\97ã\81¾ã\81\97ã\81\9f}} ($6 ã\81\8c{{PLURAL:$7|追å\8a }}ã\80\81$8 ã\81\8c{{PLURAL:$9|削除}})",
+       "logentry-tag-update-revision": "$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\81®ç\89\88 $4 ã\81®ã\82¿ã\82°ã\82\92{{GENDER:$2|æ\9b´æ\96°ã\81\97ã\81¾ã\81\97ã\81\9f}} ($6 ã\82\92{{PLURAL:$7|追å\8a }}ã\80\81$8 ã\82\92{{PLURAL:$9|削除}})",
        "logentry-tag-update-logentry": "$1 がページ「$3」の記録項目 $5 のタグを{{GENDER:$2|更新しました}} ($6 を{{PLURAL:$7|追加}}、$8 を{{PLURAL:$9|削除}})",
        "rightsnone": "(なし)",
        "revdelete-summary": "編集内容の要約",
        "feedback-useragent": "ユーザーエージェント:",
        "searchsuggest-search": "検索",
        "searchsuggest-containing": "この語句を全文検索",
+       "api-error-autoblocked": "あなたの IP アドレスは、過去にブロックされた利用者によって使用されていたため、自動的にブロックされました。",
        "api-error-badaccess-groups": "このウィキへのファイルのアップロードが許可されていません。",
        "api-error-badtoken": "内部エラー: トークンが正しくありません。",
+       "api-error-blocked": "あなたは編集ブロックされています。",
        "api-error-copyuploaddisabled": "URLによるアップロードはこのサーバーでは無効になっています。",
        "api-error-duplicate": "当ウェブサイト上には、既に同じ内容の{{PLURAL:$1|他のファイルが|他のファイルがいくつか}}存在しています。",
        "api-error-duplicate-archive": "サイト上に同じ内容の{{PLURAL:$1|別のファイルが|他のファイルがいくつか}}既にありましたが、{{PLURAL:$1|それは|それらは}}削除されました。",
        "api-error-nomodule": "内部エラー: アップロードを処理するモジュールが設定されていません。",
        "api-error-ok-but-empty": "内部エラー: サーバーからの応答がありません。",
        "api-error-overwrite": "既存のファイルへの上書きは許可されていません。",
+       "api-error-ratelimited": "あなたは短時間の間に、このウィキで許容されている数より多くのファイルをアップロードしようとしています。\n数分後にもう一度お試しください。",
        "api-error-stashfailed": "内部エラー: サーバーは一時ファイルを格納できませんでした。",
        "api-error-publishfailed": "内部エラー: サーバーは一時ファイルを発行できませんでした。",
        "api-error-stasherror": "ファイルを未公開アップロードする際にエラーが発生しました。",
        "api-error-unknownerror": "不明なエラー:「$1」",
        "api-error-uploaddisabled": "このウィキではアップロードは無効になっています。",
        "api-error-verification-error": "このファイルは壊れているか、間違った拡張子になっています。",
+       "api-error-was-deleted": "この名前のファイルは、以前にアップロードされており、その後削除されています。",
        "duration-seconds": "$1 {{PLURAL:$1|秒}}",
        "duration-minutes": "$1 {{PLURAL:$1|分}}",
        "duration-hours": "$1 {{PLURAL:$1|時間}}",
        "mw-widgets-dateinput-no-date": "選択されたデータ無し",
        "mw-widgets-titleinput-description-new-page": "ページは存在しません",
        "mw-widgets-titleinput-description-redirect": "$1 へのリダイレクト",
-       "api-error-blacklisted": "他の、説明的なタイトルをお選びください。",
+       "sessionmanager-tie": "複数の要求の認証方法を組み合わせることはできません: $1。",
        "sessionprovider-generic": "$1 セッション",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "クッキーベースのセッション",
+       "sessionprovider-nocookies": "クッキーが無効になっている可能性があります。クッキーが有効になっていることを確認し、もう一度お試しください。",
        "randomrootpage": "おまかせルートページ",
        "log-action-filter-block": "ブロックの種類",
        "log-action-filter-delete": "削除の種類:",
        "log-action-filter-newusers": "アカウント作成の種類:",
        "log-action-filter-patrol": "巡回の種類:",
        "log-action-filter-protect": "保護の種類:",
+       "log-action-filter-suppress": "秘匿の種類:",
        "log-action-filter-upload": "アップロードの種類",
        "log-action-filter-all": "すべて",
        "log-action-filter-block-block": "ブロック",
        "log-action-filter-protect-modify": "保護設定の変更",
        "log-action-filter-protect-unprotect": "保護解除",
        "log-action-filter-protect-move_prot": "保護設定の移動",
+       "log-action-filter-rights-rights": "手動変更",
+       "log-action-filter-rights-autopromote": "自動変更",
        "log-action-filter-suppress-event": "記録の秘匿",
        "log-action-filter-suppress-revision": "版の秘匿",
        "log-action-filter-suppress-delete": "ページの秘匿",
        "log-action-filter-upload-upload": "新規アップロード",
        "log-action-filter-upload-overwrite": "再アップロード",
+       "authmanager-authn-not-in-progress": "認証が行われていない、またはセッションデータが失われました。最初からやり直してください。",
+       "authmanager-authn-no-primary": "指定された証明情報を認証できませんでした。",
+       "authmanager-authn-no-local-user": "指定された証明情報は、このウィキのどの利用者にも関連付けられていません。",
+       "authmanager-authn-no-local-user-link": "指定された証明情報は有効ですが、このウィキのどの利用者にも関連付けられていません。別の方法でログインするか、新しくアカウントを作成し、オプションからそのアカウントに以前の証明情報を関連付けることができます。",
        "authmanager-authn-autocreate-failed": "ローカルアカウントの自動作成が失敗しました: $1",
+       "authmanager-change-not-supported": "一切利用されないであろう情報のため、指定された証明情報を変更することはできません。",
+       "authmanager-create-disabled": "アカウントの作成は禁止されています。",
+       "authmanager-create-from-login": "アカウントを作成するには、以下の入力欄に記入してください。",
+       "authmanager-create-not-in-progress": "アカウントの作成が行われていない、またはセッションデータが失われました。最初からやり直してください。",
+       "authmanager-create-no-primary": "指定された証明情報は、アカウントの作成に使用できませんでした。",
+       "authmanager-link-no-primary": "指定された証明情報は、アカウントの関連付けに使用できませんでした。",
+       "authmanager-link-not-in-progress": "アカウントの関連付けが行われていない、またはセッションデータが失われました。最初からやり直してください。",
+       "authmanager-authplugin-setpass-failed-title": "パスワードの変更に失敗しました",
+       "authmanager-authplugin-setpass-failed-message": "パスワードの変更は、認証プラグインによって拒否されました。",
+       "authmanager-authplugin-create-fail": "アカウントの作成は、認証プラグインによって拒否されました。",
+       "authmanager-authplugin-setpass-denied": "パスワードの変更は、認証プラグインによって許可されていません。",
        "authmanager-authplugin-setpass-bad-domain": "無効なドメインです。",
+       "authmanager-autocreate-noperm": "自動アカウント作成は許可されていません。",
+       "authmanager-autocreate-exception": "自動アカウント作成は、以前のエラーにより一時的に無効になっています。",
        "authmanager-userdoesnotexist": "利用者アカウント「$1」は登録されていません。",
+       "authmanager-userlogin-remembermypassword-help": "パスワードはセッションの長さよりも長いため、忘れないようにしてください。",
+       "authmanager-username-help": "認証用の利用者名。",
+       "authmanager-password-help": "認証用のパスワード。",
+       "authmanager-domain-help": "外部認証用のドメイン。",
+       "authmanager-retype-help": "パスワードの再確認。",
        "authmanager-email-label": "メールアドレス",
-       "authmanager-email-help": "メールアドレス"
+       "authmanager-email-help": "メールアドレス",
+       "authmanager-realname-label": "本名",
+       "authmanager-realname-help": "利用者の本名",
+       "authmanager-provider-password": "パスワードベースの認証",
+       "authmanager-provider-password-domain": "パスワードおよびドメインベースの認証",
+       "authmanager-provider-temporarypassword": "仮パスワード",
+       "authprovider-confirmlink-message": "最近のログイン試行に基づいて、以下のアカウントはあなたのウィキのアカウントに関連付けできます。関連付けることで、各々のアカウントを経由してログインすることを可能にします。関連付けるアカウントを選択してください。",
+       "authprovider-confirmlink-request-label": "関連付けるアカウント",
+       "authprovider-confirmlink-success-line": "$1: 関連付けが完了しました。",
+       "authprovider-confirmlink-failed": "アカウントの関連付けは完了されませんでした: $1",
+       "authprovider-confirmlink-ok-help": "関連付けのエラーメッセージが表示された後に続行します。",
+       "authprovider-resetpass-skip-label": "スキップ",
+       "authprovider-resetpass-skip-help": "パスワードのリセットをスキップします。",
+       "authform-nosession-login": "認証に成功しましたが、お使いのブラウザでログイン情報を記憶することはできません。\n\n$1",
+       "authform-nosession-signup": "アカウントは作成されましたが、お使いのブラウザでログイン情報を記憶することはできません。\n\n$1",
+       "authform-newtoken": "トークンがありません。$1",
+       "authform-notoken": "トークンがありません",
+       "authform-wrongtoken": "不正なトークンです",
+       "specialpage-securitylevel-not-allowed-title": "許可されていません",
+       "specialpage-securitylevel-not-allowed": "申し訳ありませんが、あなたが同一人であるか確認できないため、このページを使用することはできません。",
+       "authpage-cannot-login": "ログインを開始できません。",
+       "authpage-cannot-login-continue": "ログインを続行できません。セッションがタイムアウトした可能性が高いです。",
+       "authpage-cannot-create": "アカウントの作成を開始できません。",
+       "authpage-cannot-create-continue": "アカウントの作成を続行できません。セッションがタイムアウトした可能性が高いです。",
+       "authpage-cannot-link": "アカウントの関連付けを開始できません。",
+       "authpage-cannot-link-continue": "アカウントの関連付けを続行できません。セッションがタイムアウトした可能性が高いです。",
+       "cannotauth-not-allowed-title": "アクセスが拒否されました",
+       "cannotauth-not-allowed": "あなたはこのページの使用を許可されていません",
+       "changecredentials": "証明情報の変更",
+       "changecredentials-submit": "証明情報の変更",
+       "changecredentials-invalidsubpage": "「$1」は証明方法として有効なものではありません。",
+       "changecredentials-success": "証明情報が変更されました。",
+       "removecredentials": "証明情報の除去",
+       "removecredentials-submit": "証明情報を除去",
+       "removecredentials-invalidsubpage": "「$1」は証明方法として有効なものではありません。",
+       "removecredentials-success": "証明情報が除去されました。",
+       "credentialsform-provider": "証明方法:",
+       "credentialsform-account": "アカウント名:",
+       "cannotlink-no-provider-title": "関連付け可能なアカウントがありません",
+       "cannotlink-no-provider": "関連付け可能なアカウントがありません。",
+       "linkaccounts": "アカウントの関連付け",
+       "linkaccounts-success-text": "アカウントが関連付けられました。",
+       "linkaccounts-submit": "アカウントを関連付ける",
+       "unlinkaccounts": "アカウントの関連付け解除",
+       "unlinkaccounts-success": "アカウントの関連付けが解除されました。",
+       "authenticationdatachange-ignored": "認証データの変更は処理されませんでした。プロバイダーが設定されていない可能性があります。"
 }
index 11238d7..38a261f 100644 (file)
        "watchlisttools-view": "Vyuu rilivant chienjdem",
        "watchlisttools-edit": "Vyuu ahn edit wachlis",
        "watchlisttools-raw": "Edit raa wachlis",
-       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskoshan]])‎",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|taak]])‎",
        "specialpages": "Peshal piej",
        "tag-filter": "[[Special:Tags|Tag]] filta:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
index ee7bd50..516949e 100644 (file)
        "faq": "Pitakon Kerep",
        "faqpage": "Project:Pitakon Kerep",
        "actions": "Tumindak",
-       "namespaces": "Lowah aran",
+       "namespaces": "Jagat aran",
        "variants": "Parian",
        "navigation-heading": "Menu napigasi",
        "errorpagetitle": "Cacad",
        "toc": "Isi",
        "showtoc": "tuduhaké",
        "hidetoc": "dhelikaké",
-       "collapsible-collapse": "Neb",
-       "collapsible-expand": "Wenga",
+       "collapsible-collapse": "tutup",
+       "collapsible-expand": "bukak",
        "confirmable-confirm": "{{GENDER:$1|Sampéyan}} yakin?",
        "confirmable-yes": "Iya",
        "confirmable-no": "Ora",
-       "thisisdeleted": "Mirsani utawa mbalèkaké $1?",
+       "thisisdeleted": "Ndeleng utawa mbalèkaké $1?",
        "viewdeleted": "Deleng $1?",
-       "restorelink": "$1 {{PLURAL:$1|suntingan|suntingan}} sing wis kabusak",
+       "restorelink": "$1 {{PLURAL:$1|besutan}} sing wis dibusak",
        "feedlinks": "Asupan:",
        "feed-invalid": "Tipe permintaan asupan ora bener.",
        "feed-unavailable": "Umpan sindikasi (''syndication feeds'') ora kasedyakaké",
        "databaseerror-error": "Cacad: $1",
        "laggedslavemode": "Pènget: Kaca iki mbokmenawa isiné dudu pangowahan pungkasan.",
        "readonly": "Umpak data kagembok",
-       "enterlockreason": "Lebokna alesan panguncèn, kalebu uga prakiran kapan kunci bakal dibuka",
+       "enterlockreason": "Isi alesan ngreksa, kalebu rencana kapan pareksané bakal dibukak",
        "readonlytext": "Juru administrasi sistem sing ngunci iku medhar mangkéné: $1",
        "missing-article": "Basis data ora bisa nemokaké tèks kaca sing kuduné ana, yaiku \"$1\" $2.\nBab iki bisasané disebabaké déning pranala daluwarsa menyang revisi sadurungé kaca sing wis dibusak.\nYèn dudu iki panyebabé, panjenengan manawa bisa nemokaké kasalahan (''bug'') jroning piranti alus (''software''). Mangga dilapuraké bab iki menyang [[Special:ListUsers/sysop|administrator]], kanthi nyebutaké alamat URL sing dituju",
        "missingarticle-rev": "(owahan#: $1)",
        "viewyourtext": "Sampéyan bisa ndeleng lan nyalin sumbering <strong>besutaning sampéyan</strong> ing kaca iki.",
        "protectedinterface": "Kaca iki isiné tèks antarmuka sing dienggo software lan wis dikunci kanggo menghindari kasalahan.",
        "editinginterface": "'''Pènget:''' Panjenengan nyunting kaca sing dianggo nyedyakaké tèks antarmuka kanggo piranti alus.\nPangowahan kaca iki bakal awèh pangaruh marang tampilan antarmuka panganggo kanggoné panganggo liya.\nKanggo terjemahan, mangga nganggo [https://translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], proyèk lokalisasi MediaWiki.",
+       "translateinterface": "Kanggo nambah utawa ngowah pertalan kanggo kabèh wiki, mangga anggoa [https://translatewiki.net/ translatewiki.net] minangka proyèk palokaling MediaWiki.",
        "cascadeprotected": "Kaca iki wis direksa saka panyuntingan amerga disertakaké ing {{PLURAL:$1|kaca|kaca-kaca}} ngisor iki sing wis direksa mawa opsi \"runtun\" diaktifaké:\n$2",
        "namespaceprotected": "Panjenengan ora kagungan idin kanggo nyunting kaca ing bilik nama '''$1'''.",
        "customcssprotected": "Sampéyan ora dililakaké nyunting kaca CSS iki amarga kaisi pangaturan pribadi saka panganggo liya.",
        "createacct-reason-ph": "Kenapa sampeyan nggawe akun liyane",
        "createacct-submit": "Gawé akun sampéyan",
        "createacct-another-submit": "Gawé akun",
+       "createacct-continue-submit": "Banjuraké gawé akun",
+       "createacct-another-continue-submit": "Banjuraké gawé akun",
        "createacct-benefit-heading": "{{SITENAME}} digawé déning wong-wong kaya déné sampéyan.",
        "createacct-benefit-body1": "{{PLURAL:$1|besutan}}",
        "createacct-benefit-body2": "{{PLURAL:$1|kaca}}",
        "nocookiesnew": "Rékening utawa akun panganggo panjenengan wis digawé, nanging panjenengan durung mlebu log. {{SITENAME}} nggunakaké ''cookies'' kanggo  log panganggo. ''Cookies'' ing panjlajah wèb panjengengan dipatèni. Mangga diaktifaké lan mlebu log manèh mawa jeneng panganggo lan tembung sandhi panjenengan.",
        "nocookieslogin": "{{SITENAME}} nggunakaké ''cookies'' kanggo log panganggoné. ''Cookies'' ing panjlajah wèb panjenengan dipatèni. Mangga ngaktifaké manèh lan coba manèh.",
        "nocookiesfornew": "Akun panganggo ora digawé amarga sumberé ora bisa dipesthèkaké.\nPesthèkaké sampéyan wis ngurubaké kuki, banjur balèni ngamot kaca iki lan njajal manèh.",
+       "createacct-loginerror": "Akuné wis kasil digawe nanging sampéyan ora bisa mlebu otomatis. Mangga [[Special:UserLogin|mlebua manual]].",
        "noname": "Asma panganggo sing panjenengan pilih ora sah.",
        "loginsuccesstitle": "Kasil mlebu",
        "loginsuccess": "'''Panjenengan saiki mlebu ing {{SITENAME}} kanthi asma \"$1\".'''",
        "createacct-another-realname-tip": "Jeneng asli ora kudu dilebokake.\n\nYen sampeyan milih nglebokake jeneng asli, jeneng kuwi bakal dinggo ngwenehi atribusi kanggo karya-karyane.",
        "pt-login": "Mlebu",
        "pt-login-button": "Mlebu",
+       "pt-login-continue-button": "Banjuraké mlebu",
        "pt-createaccount": "Gawé akun",
        "pt-userlogout": "Metu",
        "php-mail-error-unknown": "Kasalahan ora dingertèni nèng piguna mail() PHP.",
        "anoneditwarning": "<strong>Penget:</strong> Panjenengan boten mlebet log. Alamat IP Panjenengan badhe katingal dening publik manawi Panjenengan ngayahi ewah-ewahan. Manawi Panjenengan  <strong>[$1 mlebet log]</strong> utawai <strong>[$2 damel akun]</strong>, suntingan Panjenengan badhe kaatribusekaken dhumateng  nama pangangge Panjenengan, lan rupi-rupi  kauntungan sanesipun.",
        "anonpreviewwarning": "''Sampéyan durung mlebu log. Nyimpen bakal nyathet alamat IP Sampéyan nèng riwayat sunting kaca iki.''",
        "missingsummary": "'''Pènget:''' Panjenengan ora nglebokaké ringkesan panyuntingan. Menawa panjenengan mencèt tombol Simpen manèh, suntingan panjenengan bakal kasimpen tanpa ringkesan panyuntingan.",
-       "missingcommenttext": "Tulung lebokna komentar ing ngisor iki.",
+       "missingcommenttext": "Mangga isi tanggapan ing ngisor iki.",
        "missingcommentheader": "'''Pangéling:''' Sampéyan durung nyadhiyakaké judhul/jejer kanggo tanggepan iki.\nYèn Sampéyan klik \"{{int:savearticle}}\" manèh, suntingan Sampéyan bakal kasimpen tanpa kuwi.",
        "summary-preview": "Pratuduh tingkesan:",
        "subject-preview": "Prawuryaning jejer:",
        "parser-unstrip-loop-warning": "Unstrip loop detected",
        "parser-unstrip-recursion-limit": "Unstrip recursion limit exceeded ($1)",
        "converter-manual-rule-error": "Kasalahan kadètèk nèng aturan pangubahan basa manual",
-       "undo-success": "Suntingan iki bisa dibatalaké. Tulung priksa prabandhingan ing ngisor iki kanggo mesthèkaké yèn prakara iki pancèn sing bener panjenengan pèngin lakoni, banjur simpenen pangowahan iku kanggo ngrampungaké pambatalan suntingan.",
+       "undo-success": "Besutan iki kena diwurungaké.\nTiliki bandhingan ngisor iki saperlu mesthèkaké yèn bener iki sing arep kolakoni, nuli simpen owahan ngisor iki kanggo ngiyai yèn besutané diwurungaké.",
        "undo-failure": "Suntingan iki ora bisa dibatalakén amerga ana konflik panyuntingan antara.",
-       "undo-norev": "Suntingan iki ora bisa dibatalaké amerga ora ana utawa wis dibusak.",
-       "undo-summary": "Balèkaké owahan $1 déning [[Special:Contributions/$2|$2]] ([[User talk:$2|rembugan]])",
+       "undo-norev": "Besutan iki ora bisa diwurungaké amarga wis ora ana utawa wis dibusak.",
+       "undo-summary": "Mbalèkaké owahan $1 déning [[Special:Contributions/$2|$2]] ([[User talk:$2|rembugan]])",
        "undo-summary-username-hidden": "Batalna revisi $1 saking panganggo kang didhelikake",
        "cantcreateaccounttitle": "Akun ora bisa digawé",
        "cantcreateaccount-text": "Saka alamat IP iki ('''$1''') ora diparengaké nggawé akun utawa rékening. Sing mblokir utawa ora marengaké iku [[User:$3|$3]].\n\nAlesané miturut $3 yaiku ''$2''",
        "last": "sadurung",
        "page_first": "kapisan",
        "page_last": "pungkasan",
-       "histlegend": "Pilihen rong tombol radhio banjur pencèten tombol ''bandhingna'' kanggo mbandhingaké versi. Klik sawijining tanggal kanggo ndeleng versi kaca ing tanggal iku.<br />(skr) = prabédan karo vèrsi saiki, (akir) = prabédan karo vèrsi sadurungé, '''s''' = suntingan sithik, '''b''' = suntingan bot, → = suntingan bagian, ← = ringkesan otomatis",
+       "histlegend": "Kanggo mbandhingaké: tandhani kothak radhio révisi-révisi sing arep dibandhingaké lan pencèt ''Enter'' utawa tombol sing ana ing ngisor.<br />\nLegéndha: <strong>({{int:cur}})</strong> = béda karo révisi pungkasan, <strong>({{int:last}})</strong> = béda karo révisi sadurungé, <strong>{{int:minoreditletter}}</strong> = besutan cilik.",
        "history-fieldset-title": "Luru sujarah",
        "history-show-deleted": "Namung sing dibusak",
        "histfirst": "suwé dhéwé",
        "notextmatches": "Ora ana tèks kaca sing cocog",
        "prevn": "{{PLURAL:$1|$1}} sadurungé",
        "nextn": "{{PLURAL:$1|$1}} sabanjuré",
+       "prev-page": "kaca sadurungé",
+       "next-page": "kaca sabanjuré",
        "prevn-title": "$1 {{PLURAL:$1|asil|asil}} sadurungé",
        "nextn-title": "$1 {{PLURAL:$1|asil|asil}} sabanjuré",
        "shown-title": "Tuduhaké $1 {{PLURAL:$1|kasil|kasil}} saben kaca",
        "searchprofile-articles-tooltip": "Golèkan ing $1",
        "searchprofile-images-tooltip": "Golèk barkas",
        "searchprofile-everything-tooltip": "Golèk kabèh isi (kalebu kaca guneman)",
-       "searchprofile-advanced-tooltip": "Golèk ing lowah jeneng tinamtu",
+       "searchprofile-advanced-tooltip": "Golèk ing jagat 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 subkatégori|$2 subkatégori}}, {{PLURAL:$3|1 berkas|$3 berkas}})",
        "search-redirect": "(pangalihan $1)",
        "search-section": "(pérangan $1)",
+       "search-category": "(kategori $1)",
+       "search-file-match": "(cocog karo isi barkas)",
        "search-suggest": "Apa karepé sampéyan: $1",
+       "search-rewritten": "Tuduhaké kasilé $1, nanging golèkaké $2.",
        "search-interwiki-caption": "Proyèk-proyèk sababon",
-       "search-interwiki-default": "Pituwas $1:",
+       "search-interwiki-default": "Wohing panggolèk $1:",
        "search-interwiki-more": "(luwih akèh)",
        "search-relatedarticle": "Magepokan",
        "searchrelated": "magepokan",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Prabédan",
        "prefs-help-prefershttps": "Pamiji iki bakal lumaku mentas sampeyan mbalèni mlebu.",
-       "prefs-tabs-navigation-hint": "Tip: Sampeyan isa nganggo dapat menggunakan tombol panah kiwa lan tengen kanggo navigasi tab-tab ing daftar tab.",
+       "prefs-tabs-navigation-hint": "Saran: Sampeyan bisa nganggo tombol jemparing kiwa lan tengen saperlu navigasi tab-tab ing pratélan tab.",
        "userrights": "Manajemen hak panganggo",
        "userrights-lookup-user": "Ngatur kelompok panganggo",
-       "userrights-user-editname": "Lebokna jeneng panganggo:",
+       "userrights-user-editname": "Isi jeneng panganggo:",
        "editusergroup": "Besut golongan {{GENDER:$1|panganggo}}",
        "editinguser": "Ngganti hak panganggo '''[[User:$1|$1]]''' $2",
        "userrights-editusergroup": "Besut golongan panganggo",
        "right-override-export-depth": "Èkspor kaca klebu kaca kagandhèng nganti tataran/''depth'' 5",
        "right-sendemail": "Ngirim layang listrik (e-mail) menyang panganggo liya",
        "right-passwordreset": "Delok layang èlèktronik panyetèlulangan tembung sandhi",
+       "grant-group-email": "Kirim layang élèktronik",
+       "grant-createaccount": "Gawé akun",
+       "grant-createeditmovepage": "Gawé, besut, lan lih kaca",
+       "grant-delete": "Busak kaca, owahan, lan isian cathetan",
        "newuserlogpage": "Cathetan panganggo anyar",
        "newuserlogpagetext": "Ing ngisor iki kapacak log pandaftaran panganggo anyar.",
        "rightslog": "Log pangowahan hak aksès",
        "recentchanges-legend-heading": "<strong>Legendha:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (uga deleng [[Special:NewPages|pratélaning kaca-kaca anyar]])",
        "recentchanges-legend-plusminus": "(''±123'')",
+       "recentchanges-submit": "Tuduhaké",
        "rcnotefrom": "Ing ngisor iki owah-owahan wiwit <strong>$2</strong> (kapacak nganti <strong>$1</strong> owah-owahan).",
        "rclistfrom": "Tuduhaké owah-owahan anyar kawit $2, $3",
        "rcshowhideminor": "$1 besutan cilik",
        "rcshowhidebots-show": "Tuduhaké",
        "rcshowhidebots-hide": "Dhelikaké",
        "rcshowhideliu": "$1 panganggo karégister",
+       "rcshowhideliu-show": "Tuduhaké",
        "rcshowhideliu-hide": "Dhelikaké",
        "rcshowhideanons": "$1 panganggo anonim",
        "rcshowhideanons-show": "Tuduhaké",
        "rcshowhideanons-hide": "Dhelikaké",
        "rcshowhidepatr": "$1 besutan awasan",
+       "rcshowhidepatr-show": "Tuduhaké",
+       "rcshowhidepatr-hide": "Dhelikaké",
        "rcshowhidemine": "$1 besutanku",
        "rcshowhidemine-show": "Tuduhaké",
        "rcshowhidemine-hide": "Dhelikaké",
+       "rcshowhidecategorization": "$1 kategorisasi kaca",
+       "rcshowhidecategorization-show": "Tuduhaké",
+       "rcshowhidecategorization-hide": "Dhelikaké",
        "rclinks": "Tuduhaké $1 owahan kawit $2 dina kapungkur.<br />$3",
        "diff": "béd",
        "hist": "saj",
        "rc_categories": "Watesana nganti kategori (dipisah karo \"|\")",
        "rc_categories_any": "Apa waé",
        "rc-change-size-new": "$1 {{PLURAL:$1|bét|bét}} sabubaré diowah",
-       "newsectionsummary": "/* $1 */ bagéyan anyar",
+       "newsectionsummary": "/* $1 */ pérangan anyar",
        "rc-enhanced-expand": "Tuduhaké princèn",
        "rc-enhanced-hide": "Dhelikaké princèn",
        "rc-old-title": "kawitané digawé minangka \"$1\"",
        "upload-too-many-redirects": "URL ngandhut kakèhan pengalihan",
        "upload-http-error": "Ana kasalahan HTTP: $1",
        "upload-copy-upload-invalid-domain": "Unggahan salinan ora sumadhiya nèng domain iki.",
+       "upload-dialog-title": "Unggah barkas",
+       "upload-dialog-button-cancel": "Wurung",
+       "upload-dialog-button-done": "Rampung",
+       "upload-dialog-button-save": "Simpen",
+       "upload-dialog-button-upload": "Unggah",
+       "upload-form-label-infoform-title": "Rerincèn",
+       "upload-form-label-infoform-name": "Jeneng",
+       "upload-form-label-usage-filename": "Jeneng barkas",
+       "upload-form-label-own-work": "Iki karyaku dhéwé",
+       "upload-form-label-infoform-categories": "Kategori",
+       "upload-form-label-infoform-date": "Tanggal",
        "backend-fail-stream": "Ora bisa milikaké berkas \"$1\".",
        "backend-fail-backup": "Ora bisa nyadangaké berkas \"$1\".",
        "backend-fail-notexists": "Berkas $1 ora ana.",
        "mostrevisions": "Kaca mawa pangowahan sing akèh dhéwé",
        "prefixindex": "Kabèh kaca mawa ater-ater",
        "prefixindex-namespace": "Kabèh kaca mawa ater-ater (bilik jeneng $1)",
+       "prefixindex-submit": "Tuduhaké",
        "prefixindex-strip": "Busak ater-ater saka pratélan",
        "shortpages": "Kaca cendhak",
        "longpages": "Kaca dawa",
        "protectedpages-cascade": "Amung kaca rineksan kang runtut",
        "protectedpages-noredirect": "Dhelikna alihan",
        "protectedpagesempty": "Saat ini tidak ada halaman yang sedang dilindungi.",
+       "protectedpages-page": "Kaca",
+       "protectedpages-expiry": "Kadaluwarsa",
+       "protectedpages-reason": "Alesan",
        "protectedtitles": "Irah-irahan sing direksa",
        "protectedtitlesempty": "Ora ana irah-irahan utawa judhul sing direksa karo paramèter-paramèter iki.",
        "listusers": "Daftar panganggo",
        "wlheader-showupdated": "Kaca-kaca sing wis owah wiwit ditiliki panjenengan kaping pungkasan, dituduhaké mawa '''aksara kandel'''",
        "wlnote": "Ngisor iki {{PLURAL:$1|owahan pungkasan|'''$1''' owahan pungkasan}} {{PLURAL:$2|jam|'''$2''' jam}} kapungkur, per $3, $4.",
        "wlshowlast": "Tuduhna $1 jam $2 dina  pungkasan",
+       "wlshowhidecategorization": "kategorisasi kaca",
        "watchlist-options": "Pilihaning pawawangan",
        "watching": "Ngawasi...",
        "unwatching": "Ngilangi pangawasan...",
        "undelete-error-long": "Ana kaluputan nalika mbatalaké pambusakan berkas:\n\n$1",
        "undelete-show-file-confirm": "Apa panjenengan yakin arep mirsani révisi berkas \"<nowiki>$1</nowiki>\" sing wis kabusak ing $2 jam $3?",
        "undelete-show-file-submit": "Ya",
-       "namespace": "Lowah aran:",
+       "namespace": "Jagat aran:",
        "invert": "Balèkaké pilihan",
        "tooltip-invert": "Centhang kothak iki kanggo ndhelikaké owahan saka kaca-kaca nèng njero bilik jeneng kapilih (lan bilik jeneng kakait yèn dicenthang)",
-       "namespace_association": "Lowah aran magepokan",
+       "namespace_association": "Jagat aran magepokan",
        "tooltip-namespace_association": "Centhang kothak iki kanggo nglebokaké uga bilik jeneng gumenan utawa subyèk sing kakait karo bilik jeneng kapilih",
        "blanknamespace": "(Pokok)",
        "contributions": "Sumbangan {{GENDER:$1|panganggo}}",
        "contribsub2": "Kanggo {{GENDER:$3|$1}} ($2)",
        "nocontribs": "Ora ditemokaké owah-owahan sing cocog karo kritéria kasebut iku.",
        "uctop": "(saiki)",
-       "month": "Wiwit wulan (lan sadurungé):",
+       "month": "Saka wulan (lan sadurungé):",
        "year": "Wiwit taun (lan sadurungé):",
        "sp-contributions-newbies": "Namung panganggo-panganggo anyar",
        "sp-contributions-newbies-sub": "Kanggo panganggo anyar",
        "lockbtn": "Kunci basis data",
        "unlockbtn": "Buka kunci basis data",
        "locknoconfirm": "Panjenengan ora mènèhi tandha cèk ing kothak konfirmasi.",
-       "lockdbsuccesssub": "Bisa kasil ngunci basis data",
-       "unlockdbsuccesssub": "Bisa kasil buka kunci basis data",
+       "lockdbsuccesssub": "Kasil ngunci sasana dhatah",
+       "unlockdbsuccesssub": "Kasil mbukak kunci sasana dhatah",
        "lockdbsuccesstext": "Basis data wis dikunci.\n<br />Pastèkna panjenengan [[Special:UnlockDB|mbuka kunciné]] sawisé pangopènan bubar.",
        "unlockdbsuccesstext": "Kunci basis data wis dibuka.",
        "lockfilenotwritable": "Berkas kunci basis data ora bisa ditulis. Kanggo ngunci utawa mbuka basis data, berkas iki kudu ditulis déning server wèb.",
        "newtitle": "Sesirah anyar:",
        "move-watch": "Awasna kaca iki",
        "movepagebtn": "Ngalih kaca",
-       "pagemovedsub": "Bisa kasil dipindhahaké",
-       "movepage-moved": "'''\"$1\" dipindhahaké menyang \"$2\".'''",
+       "pagemovedsub": "Kasil dilih",
+       "movepage-moved": "<strong>\"$1\" wis dilih nyang \"$2\"</strong>",
        "movepage-moved-redirect": "Kaca pengalihan wis kacipta.",
        "movepage-moved-noredirect": "Kanggo gawé pengalihan wis ditahan.",
        "articleexists": "Satunggalipun kaca kanthi asma punika sampun wonten, utawi asma ingkang panjenengan pendhet mboten leres. Sumangga nyobi asma sanèsipun.",
        "immobile-source-namespace": "Ora bisa mindhahaké kaca jroning bilik jeneng \"$1\"",
        "immobile-target-namespace": "Ora bisa mindhahaké kaca menyang bilik jeneng \"$1\"",
        "immobile-target-namespace-iw": "Pranala interwiki dudu target sing sah kanggo pamindhahan kaca.",
-       "immobile-source-page": "Kaca iki ora bisa dipindhahaké.",
+       "immobile-source-page": "Kaca iki ora bisa dilih-lih.",
        "immobile-target-page": "Ora bisa mindhahaké menyang irah-irahan tujuan kasebut.",
-       "bad-target-model": "Halaman yang dituju menggunakan model isi yang berbeda. Tidak dapat mengonversi $1 ke $2.",
+       "bad-target-model": "Tujuan sing diarepaké nganggo gagrag isi sing béda. Ora bisa ngganti $1 dadi $2.",
        "imagenocrossnamespace": "Ora bisa mindhahaké gambar menyang bilik nama non-gambar",
        "nonfile-cannot-move-to-file": "Ora bisa mindhahaké non-berkas nèng bilik jeneng berkas",
        "imagetypemismatch": "Èkstènsi anyar berkas ora cocog karo jenisé",
        "import-error-interwiki": "Kaca \"$1\" ora diimpor amarga jenengé dicadhangaké kango pranala njaba (interwiki).",
        "import-error-special": "Kaca \"$1\" ora diimpor amarga kuwi kalebu nèng bilik jeneng kusus sing ora nglilakaké anané kaca.",
        "import-error-invalid": "Kaca \"$1\" ora diimpor amarga jenengé ora sah.",
-       "import-error-unserialize": "Revisi $2 dari halaman \"$1\" tidak dapat di-''unserialized''. Revisi tersebut dilaporkan menggunakan model konten $3 diserialisasi sebagai $4.",
+       "import-error-unserialize": "Revisi $2 saka kaca \"$1\" ora bisa diurutaké. Revisi iku dilapuraké murih nganggo gagrag isi $3 sing diurutaké minangka $4.",
        "import-options-wrong": "{{PLURAL:$2|Opsi|Opsi}} salah: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Halaman turunan yang diberikan adalah judul yang salah.",
        "import-rootpage-nosubpage": "Ruang nama \"$1\" di halaman turunan tidak mengizinkan subhalaman.",
        "pageinfo-recent-edits": "Cacahé suntingan saiki (ing $1 kapungkur)",
        "pageinfo-recent-authors": "Cacahé panganggit sing bédha-bédha saiki",
        "pageinfo-magic-words": "{{PLURAL:$1|Tembung|Tembung}} mujarab ($1)",
-       "pageinfo-hidden-categories": "{{PLURAL:$1|Katégori|Katégori}} kadhelikaké ($1)",
+       "pageinfo-hidden-categories": "{{PLURAL:$1|Kategori}} ndhelik ($1)",
        "pageinfo-templates": "{{PLURAL:$1|Templat|Templat}} yang ditransklusi ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|Kaca|Kaca}} sing ditransklusi ing ($1)",
        "pageinfo-toolboxlink": "Katerangan kaca",
        "filedelete-current-unregistered": "Berkas sing dispésifikasi \"$1\" ora ana sajroning basis data.",
        "filedelete-archive-read-only": "Dirèktori arsip \"$1\" ora bisa ditulis déning server wèb.",
        "previousdiff": "← Besutan sadurungé",
-       "nextdiff": "Besutan luwih anyar →",
+       "nextdiff": "Besutan sawisé →",
        "mediawarning": "'''Pèngetan''': Jinis berkas iki mungkin isiné kodhé mbebayani.\nYèn dilakokaké, sistem Sampéyan bisa kaserang.",
        "imagemaxsize": "Wates ukuran gambar:<br />''(kanggo kaca dhèskripsi berkas)''",
        "thumbsize": "Ukuran gambar cilik (thumbnail):",
        "special-characters-group-thai": "Thailand",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
-       "api-error-blacklisted": "Mangga pilih judhul liya sing njelasaké",
        "randomrootpage": "Kaca dhasaran waton"
 }
index 1b648e4..8ec2e36 100644 (file)
        "minoredit": "მცირე რედაქტირება",
        "watchthis": "უთვალთვალე ამ გვერდს",
        "savearticle": "გვერდის შენახვა",
+       "savechanges": "ცვლილებების შენახვა",
        "publishpage": "გვერდის გამოქვეყნება",
+       "publishchanges": "ცვლილებების გამოქვეყნება",
        "preview": "წინასწარი გადახედვა",
        "showpreview": "წინასწარი გადახედვის ჩვენება",
        "showdiff": "ცვლილებების ჩვენება",
        "rcshowhidemine": "ჩემი რედაქტირების $1",
        "rcshowhidemine-show": "ჩვენება",
        "rcshowhidemine-hide": "დამალვა",
-       "rcshowhidecategorization": "$1 გვერდის კატეგორიზაცია",
+       "rcshowhidecategorization": "გვერდის კატეგორიზაციის $1",
        "rcshowhidecategorization-show": "ჩვენება",
        "rcshowhidecategorization-hide": "დამალვა",
        "rclinks": "ბოლო $1 ცვლილების ჩვენება უკანასკნელი $2 დღის მანძილზე<br />$3",
        "editcomment": "რედაქტირება განმარტებული იყო როგორც: <em>$1</em>.",
        "revertpage": "[[Special:Contributions/$2|$2]]-ის რედაქტირება გაუქმდა; აღდგა ბოლოს [[User:$1|$1]]-ის მიერ რედაქტირებული ვერსია",
        "revertpage-nouser": "მომხმარებლის (მომხმარებლის სახელი დამალულია) ცვლილებები დაბრუნებულია ვერსიაზე {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "á\83\92á\83\90á\83£á\83¥á\83\9bá\83\93á\83\90 á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\91á\83\90 $1; á\83\93á\83\90á\83\91á\83 á\83£á\83\9cá\83\94á\83\91ა ვერსიაზე $2.",
+       "rollback-success": "á\83\92á\83\90á\83£á\83¥á\83\9bá\83\93á\83\90 á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\91á\83\90 $1; á\83\93á\83\90á\83\91á\83 á\83£á\83\9cá\83\93ა ვერსიაზე $2.",
        "sessionfailure-title": "სეანსის შეცდომა",
        "sessionfailure": "ჩანს, რომ პრობლემაა თქვენი რეგისტრაციის სესიისათვის;\nეს მოქმედება შეჩერდა თქვენი სესიაში შემოჭრის თავიდან ასაცილებლად.\nგთხოვთ, დააწკაპუნოთ ღილაკს „უკან“ და თავიდან ჩართოთ გვერდი, რომლიდანაც შემოხვედით და სცადოთ განმეორებით.",
        "changecontentmodel": "გვერდის კონტენტური მოდელის შეცვლა",
        "mw-widgets-dateinput-placeholder-month": "წწწწ-თთ",
        "mw-widgets-titleinput-description-new-page": "გვერდი ჯერ არ არსებობს",
        "mw-widgets-titleinput-description-redirect": "გადამისამართება $1-ზე",
-       "api-error-blacklisted": "გთხოვთ, აირჩიეთ სხვა, აღწერილობითი სათაური.",
        "sessionmanager-tie": "შეუძლებელია მრავალი მოთხოვნის ავთენთიფიკაციის ტიპების გაერთიანება: $1.",
        "sessionprovider-generic": "$1 სესიები",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "cookie-სთან დაკავშირებული სესიები",
index e8d7ee9..b01984c 100644 (file)
        "history-show-deleted": "صرفی حذف شدہ",
        "histfirst": "قدیم ترین",
        "histlast": "تازہ ترین",
-       "historysize": "({{PLURAL:$1|1 بائٹ|$1 بائٹس}})",
+       "historysize": "({{PLURAL:$1|1 بائٹ|$1 بائٹ}})",
        "historyempty": "(خالی)",
        "history-feed-title": "تاریخچۂ نظرثانی",
        "history-feed-description": "ویکیپیڈیا ھیہ صفحو تاریخچۂ نظرثانی",
index 505d417..d80554d 100644 (file)
        "usermessage-summary": "Жүйе хабарламасы қалдырылуда.",
        "usermessage-editor": "Жүйе мессенжері",
        "watchlist": "Бақылау тізімі",
-       "mywatchlist": "Бақылау тізімі",
+       "mywatchlist": "Бақылау тізімім",
        "watchlistfor2": "$1 ($2) бақылау тізімі",
        "nowatchlist": "Бақылау тізіміңізде еш дана жоқ",
        "watchlistanontext": "Бақылау тізіміңіздегі даналарды қарау не өңдеу үшін кіріңіз.",
index 51a3e81..8177427 100644 (file)
@@ -77,9 +77,9 @@
        "tog-editondblclick": "더블 클릭으로 문서 편집하기",
        "tog-editsectiononrightclick": "제목을 오른쪽 클릭해서 문단 편집하기 활성화",
        "tog-watchcreations": "내가 만든 문서와 내가 올린 파일을 주시문서 목록에 추가",
-       "tog-watchdefault": "ë\82´ê°\80 í\8e¸ì§\91í\95\98ë\8a\94 문서와 파일을 주시문서 목록에 추가",
-       "tog-watchmoves": "ë\82´ê°\80 ì\9d´ë\8f\99í\95\98ë\8a\94 문서와 파일을 주시문서 목록에 추가",
-       "tog-watchdeletion": "ë\82´ê°\80 ì\82­ì \9cí\95\98ë\8a\94 문서와 파일을 주시문서 목록에 추가",
+       "tog-watchdefault": "ë\82´ê°\80 í\8e¸ì§\91í\95\9c 문서와 파일을 주시문서 목록에 추가",
+       "tog-watchmoves": "ë\82´ê°\80 ì\9d´ë\8f\99í\95\9c 문서와 파일을 주시문서 목록에 추가",
+       "tog-watchdeletion": "ë\82´ê°\80 ì\82­ì \9cí\95\9c 문서와 파일을 주시문서 목록에 추가",
        "tog-watchuploads": "내가 올린 파일을 주시문서 목록에 추가",
        "tog-watchrollback": "내가 되돌리기 기능을 사용한 문서를 주시문서 목록에 추가",
        "tog-minordefault": "모든 편집에 기본적으로 사소한 편집을 표시",
        "category_header": "\"$1\" 분류에 속하는 문서",
        "subcategories": "하위 분류",
        "category-media-header": "\"$1\" 분류에 속하는 미디어",
-       "category-empty": "이 분류에 속하는 문서나 자료가 없습니다.",
+       "category-empty": "<em>현재 이 분류에는 문서나 미디어가 하나도 없습니다.</em>",
        "hidden-categories": "{{PLURAL:$1|숨은 분류|숨은 분류}}",
        "hidden-category-category": "숨은 분류",
        "category-subcat-count": "{{PLURAL:$2|이 분류에는 하위 분류 1개만이 속해 있습니다.|다음은 이 분류에 속하는 {{PLURAL:$1|하위 분류}} $2개 가운데 $1개입니다.}}",
        "youhavenewmessagesmanyusers": "여러 사용자로부터의 $1가 있습니다. ($2)",
        "newmessageslinkplural": "{{PLURAL:$1|새 메시지|999=새 메시지}}",
        "newmessagesdifflinkplural": "마지막으로 {{PLURAL:$1|바뀐 내용|999=바뀐 내용}}",
-       "youhavenewmessagesmulti": "다른 사용자가 $1에 남긴 새 메시지가 있습니다",
+       "youhavenewmessagesmulti": "$1에 새 메시지가 있습니다",
        "editsection": "편집",
        "editold": "편집",
        "viewsourceold": "원본 보기",
        "databaseerror-query": "쿼리: $1",
        "databaseerror-function": "함수: $1",
        "databaseerror-error": "오류: $1",
-       "transaction-duration-limit-exceeded": "쓰기 시간($1)이 $2 초 제한을 초과하였으므로 이 트랜잭션은 중단되었습니다. 이는 높은 수준의 반복 지연을 피하기 위해서입니다.\n한번에 수많은 항목을 변경하려면, 작업을 여러 작은 단위로 나누어 시도하십시오.",
+       "transaction-duration-limit-exceeded": "쓰기 시간($1)이 $2 초 제한을 초과하였으므로 이 트랜잭션은 중단되었습니다. 이는 높은 수준의 반복 지연을 피하기 위해서입니다.\n한 번에 수많은 항목을 변경하려면, 작업을 여러 작은 단위로 나누어 시도하십시오.",
        "laggedslavemode": "<strong>경고:</strong> 문서가 최근에 바뀐 내용을 포함하지 않을 수도 있습니다.",
        "readonly": "데이터베이스 잠김",
        "enterlockreason": "데이터베이스를 잠그는 이유와 예상되는 기간을 적어 주세요.",
        "internalerror": "내부 오류",
        "internalerror_info": "내부 오류: $1",
        "internalerror-fatal-exception": "종류 \"$1\"에서 심각한 오류",
-       "filecopyerror": "\"$1\" 파일을 \"$2\"로 복사할 수 없습니다.",
-       "filerenameerror": "\"$1\" 파일을 \"$2\"로 옮길 수 없습니다.",
+       "filecopyerror": "\"$1\" 파일을 \"$2\"(으)로 복사할 수 없습니다.",
+       "filerenameerror": "\"$1\" 파일을 \"$2\"(으)로 이름을 바꿀 수 없습니다.",
        "filedeleteerror": "\"$1\" 파일을 삭제할 수 없습니다.",
        "directorycreateerror": "\"$1\" 디렉터리를 만들 수 없습니다.",
        "directoryreadonlyerror": "\"$1\" 디렉터리는 읽기 전용입니다.",
        "formerror": "오류: 양식을 제출할 수 없습니다.",
        "badarticleerror": "이 명령은 이 문서에서 수행할 수 없습니다.",
        "cannotdelete": "\"$1\" 문서나 파일을 삭제할 수 없습니다.\n이미 삭제되었을 수도 있습니다.",
-       "cannotdelete-title": "\"$1\" 문서를 삭제할 수 없습니다.",
+       "cannotdelete-title": "\"$1\" 문서를 삭제할 수 없습니다",
        "delete-hook-aborted": "훅이 삭제를 중단했습니다.\n아무런 설명도 주어지지 않았습니다.",
        "no-null-revision": "\"$1\" 문서에 대한 빈 판을 새로 만들 수 없습니다.",
        "badtitle": "잘못된 제목",
        "myprivateinfoprotected": "내 개인 정보를 편집할 권한이 없습니다.",
        "mypreferencesprotected": "내 환경 설정을 편집할 권한이 없습니다.",
        "ns-specialprotected": "특수 문서는 편집할 수 없습니다.",
-       "titleprotected": "[[User:$1|$1]] 사용자가 문서 만들기를 금지했습니다.\n이유는 다음과 같습니다. <em>$2</em>",
+       "titleprotected": "[[User:$1|$1]]님이 문서 만들기를 보호했습니다.\n이유는 다음과 같습니다. <em>$2</em>",
        "filereadonlyerror": "\"$2\" 파일 저장소가 읽기 전용이기 때문에 \"$1\" 파일을 바꿀 수 없습니다.\n\n파일 저장소를 잠근 시스템 관리자가 다음과 같은 설명을 남겼습니다: \"$3\".",
        "invalidtitle-knownnamespace": "제목 오류: \"$2\" 이름공간과 \"$3\" 텍스트",
        "invalidtitle-unknownnamespace": "제목 오류: 알 수 없는 $1 이름공간 번호와 \"$2\" 텍스트",
        "userlogin-resetpassword-link": "비밀번호를 잊으셨나요?",
        "userlogin-helplink2": "로그인에 대한 도움말",
        "userlogin-loggedin": "이미 {{GENDER:$1|$1}} 사용자로 로그인되어 있습니다.\n다른 사용자로 로그인하려면 아래의 양식을 사용하세요.",
-       "userlogin-reauth": "사용자가 $1임을 확인하려면 다시 로그인해야 합니다.",
+       "userlogin-reauth": "당신이 {{GENDER:$1|$1}}임을 검증하려면 다시 로그인해야 합니다.",
        "userlogin-createanother": "다른 계정 만들기",
        "createacct-emailrequired": "이메일 주소",
        "createacct-emailoptional": "이메일 주소 (선택 사항)",
        "password-login-forbidden": "이 사용자 계정 이름과 비밀번호는 사용할 수 없습니다.",
        "mailmypassword": "비밀번호 재설정",
        "passwordremindertitle": "{{SITENAME}}의 새 임시 비밀번호",
-       "passwordremindertext": "$1 IP 주소에서 누군가가 아마 자신이 {{SITENAME}} ($4)의 새 비밀번호를 요청했습니다.\n\"$2\" 사용자의 임시 비밀번호는 \"$3\"로 설정되었습니다. 이것이 자신이 의도한 바라면\n지금 로그인하여 새로운 비밀번호를 만드세요.\n임시 비밀번호는 {{PLURAL:$5|$5일}} 후에 만료됩니다.\n\n이 요청을 다른 사람이 했거나 이전 비밀번호를 기억해 내서 바꿀 필요가 없으면\n이 메시지를 무시하고 이전 비밀번호를 계속 사용할 수 있습니다.",
+       "passwordremindertext": "당신일 수도 있는 $1 IP 주소를 사용하는 사용자가 {{SITENAME}} ($4)의 새 비밀번호를 요청했습니다.\n\"$2\" 사용자의 임시 비밀번호는 \"$3\"로 설정되었습니다. 이것이 자신이 의도한 바라면\n지금 로그인하여 새로운 비밀번호를 만드세요.\n임시 비밀번호는 {{PLURAL:$5|1일|$5일}} 후에 만료됩니다.\n\n이 요청을 다른 사람이 했거나 이전 비밀번호를 기억해 내서 바꿀 필요가 없으면\n이 메시지를 무시하고 이전 비밀번호를 계속 사용할 수 있습니다.",
        "noemail": "\"$1\" 사용자는 이메일 주소를 등록하지 않았습니다.",
        "noemailcreate": "올바른 이메일 주소를 제공해야 합니다.",
        "passwordsent": "\"$1\" 계정의 새로운 비밀번호를 이메일로 보냈습니다.\n비밀번호를 받고 다시 로그인해 주세요.",
        "accountcreated": "계정이 만들어짐",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|토론]]) 사용자 계정이 만들어졌습니다.",
        "createaccount-title": "{{SITENAME}} 계정 만들기",
-       "createaccount-text": "ë\88\84êµ°ê°\80ê°\80 {{SITENAME}} ($4)ì\97\90ì\84\9c ì\82¬ì\9a©ì\9e\90 ì\9d´ë¦\84 \"$2\", ë¹\84ë°\80ë²\88í\98¸ \"$3\"ë¡\9c ë\8b¹ì\8b ì\9d\98 ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8cê°\80 ë\93±ë¡\9dë\90\9c ê³\84ì \95ì\9d\84 ë§\8cë\93¤ì\97\88ì\8aµë\8b\88ë\8b¤. \nì§\80ê¸\88 ë¡\9cê·¸ì\9d¸í\95\98ì\97¬ ë¹\84ë°\80ë²\88í\98¸ë¥¼ ë°\94꾸ì\8b­ì\8b\9cì\98¤.\n\nì\8b¤ì\88\98ë¡\9c ê³\84ì \95ì\9d\84 ì\9e\98못 ë§\8cë\93¤ì\97\88ë\8b¤ë©´ ì\9d´ ë©\94ì\8b\9cì§\80ë\8a\94 ë¬´ì\8b\9cí\95´ë\8f\84 ë\90©ë\8b\88ë\8b¤.",
+       "createaccount-text": "ë\88\84êµ°ê°\80ê°\80 {{SITENAME}} ($4)ì\97\90ì\84\9c ì\82¬ì\9a©ì\9e\90 ì\9d´ë¦\84 \"$2\", ë¹\84ë°\80ë²\88í\98¸ \"$3\"ë¡\9c ë\8b¹ì\8b ì\9d\98 ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8cê°\80 ë\93±ë¡\9dë\90\9c ê³\84ì \95ì\9d\84 ë§\8cë\93¤ì\97\88ì\8aµë\8b\88ë\8b¤. \nì§\80ê¸\88 ë¡\9cê·¸ì\9d¸í\95\98ì\97¬ ë¹\84ë°\80ë²\88í\98¸ë¥¼ ë°\94꾸ì\85\94ì\95¼ í\95©ë\8b\88ë\8b¤.\n\nì\8b¤ì\88\98ë¡\9c ê³\84ì \95ì\9d\84 ì\9e\98못 ë§\8cë\93¤ì\97\88ë\8b¤ë©´ ì\9d´ ë©\94ì\8b\9cì§\80ë\8a\94 ë¬´ì\8b\9cí\95´ë\8f\84 ë\90©ë\8b\88ë\8b¤.",
        "login-throttled": "최근 너무 많이 로그인을 시도했습니다.\n$1 뒤에 다시 시도하세요.",
        "login-abort-generic": "로그인에 실패했습니다 - 중지됨",
        "login-migrated-generic": "당신의 계정이 마이그레이션되었으며, 당신의 사용자 이름이 더 이상 이 위키에 존재하지 않습니다.",
        "botpasswords-updated-body": "사용자 \"$2\"의 \"$1\"라는 이름의 봇 비밀번호가 업데이트되었습니다.",
        "botpasswords-deleted-title": "봇 비밀번호 제거",
        "botpasswords-deleted-body": "사용자 \"$2\"의 \"$1\"라는 이름의 봇 비밀번호가 삭제되었습니다.",
-       "botpasswords-newpassword": "<strong>$1</strong> 계정의 비밀번호가 <strong>$2</strong>로 변경되었습니다. <em>잊어버리지 않도록 기록해두시기 바랍니다.</em>",
+       "botpasswords-newpassword": "<strong>$1</strong>님으로 로그인하기 위한 새 비밀번호가 <strong>$2</strong>입니다. <em>잊어버리지 않도록 기록해두시기 바랍니다.</em>",
        "botpasswords-no-provider": "'BotPasswordsSessionProvider'는 이용할 수 없습니다.",
        "botpasswords-restriction-failed": "봇 비밀번호 제한으로 인해 로그인할 수 없습니다.",
        "botpasswords-invalid-name": "지정된 사용자 이름은 봇 비밀번호 구분자(\"$1\")를 포함하고 있지 않습니다.",
        "passwordreset-capture-help": "이 상자에 체크하면 이메일이 발송된 즉시 임시 비밀번호가 담긴 이메일을 볼 수 있습니다.",
        "passwordreset-email": "이메일 주소:",
        "passwordreset-emailtitle": "{{SITENAME}} 계정에 대한 자세한 정보",
-       "passwordreset-emailtext-ip": "$1 IP 주소를 사용하는 누군가가 아마 자신이 {{SITENAME}} ($4)의 비밀번호 재설정을 요청하였습니다.\n이 이메일 주소와 연관된 {{PLURAL:$3|계정}}의 목록입니다:\n\n$2\n\n{{PLURAL:$3|이 임시 비밀번호}}는 {{PLURAL:$5|$5일}} 후에 만료됩니다.\n이 비밀번호로 로그인한 후 비밀번호를 바꾸십시오. 만약 당신이 아닌 다른 사람이 요청하였거나,\n원래의 비밀번호를 기억해냈다면, 이 메시지를 무시하고\n이전의 비밀번호를 계속 사용할 수 있습니다.",
+       "passwordreset-emailtext-ip": "당신일 수도 있는 $1 IP 주소를 사용하는 사용자가 {{SITENAME}} ($4)의 비밀번호 재설정을 요청하였습니다.\n이 이메일 주소와 연관된 사용자 {{PLURAL:$3|계정}}의 목록입니다:\n\n$2\n\n{{PLURAL:$3|이 임시 비밀번호}}는 {{PLURAL:$5|1일|$5일}} 후에 만료됩니다.\n이 비밀번호로 로그인한 후 비밀번호를 바꾸십시오. 만약 당신이 아닌 다른 사람이 요청하였거나,\n원래의 비밀번호를 기억해냈다면, 이 메시지를 무시하고\n이전의 비밀번호를 계속 사용할 수 있습니다.",
        "passwordreset-emailtext-user": "{{SITENAME}} ($4)의 사용자 $1이 비밀번호 재설정을 요청하였습니다.\n이 이메일 주소와 연관된 {{PLURAL:$3|계정}}의 목록입니다:\n\n$2\n\n{{PLURAL:$3|이 임시 비밀번호}}는 {{PLURAL:$5|$5일}} 후에 만료됩니다.\n이 비밀번호로 로그인한 후 비밀번호를 바꾸십시오. 만약 당신이 아닌 다른 사람이 요청하였거나,\n원래의 비밀번호를 기억해냈다면, 이 메시지를 무시하고\n이전의 비밀번호를 계속 사용할 수 있습니다.",
        "passwordreset-emailelement": "사용자 이름: \n$1\n\n임시 비밀번호: \n$2",
        "passwordreset-emailsentemail": "당신의 계정과 연결된 이메일 주소가 있다면, 비밀번호 재설정 메일이 전해질 것입니다.",
        "minoredit": "사소한 편집입니다",
        "watchthis": "이 문서 주시하기",
        "savearticle": "문서 저장",
+       "savechanges": "변경 사항 저장",
        "publishpage": "문서 게시",
+       "publishchanges": "변경 사항 게시",
        "preview": "미리 보기",
        "showpreview": "미리 보기",
        "showdiff": "차이 보기",
        "blankarticle": "<strong>경고:</strong> 만들려는 문서가 비어 있습니다.\n\"{{int:savearticle}}\"을 다시 클릭하면, 아무 내용 없이 문서가 만들어집니다.",
-       "anoneditwarning": "<strong>경고:</strong> 로그인을 하고 있지 않습니다. 편집을 하면 IP 주소가 공개적으로 보이게 됩니다. <strong>[$1 로그인]</strong>하거나 <strong>[$2 계정을 생성하면]</strong>, 편집 시에 사용자 이름이 표시되며 더불어 다른 혜택들도 누릴 수 있습니다.",
+       "anoneditwarning": "<strong>경고:</strong> 로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다. <strong>[$1 로그인]</strong>하거나 <strong>[$2 계정을 생성하면]</strong> 편집자가 사용자 이름으로 기록되고, 다른 장점도 있습니다.",
        "anonpreviewwarning": "<em>로그인하고 있지 않습니다. 문서를 저장하면 당신의 IP 주소가 문서의 편집 역사에 남게 됩니다.</em>",
        "missingsummary": "'''알림:''' 편집 요약을 적지 않았습니다.\n이대로 \"{{int:savearticle}}\"을 클릭하면 편집 요약 없이 저장됩니다.",
        "selfredirect": "<strong>경고:</strong> 자기 자신으로 문서를 넘겨주고 있습니다.\n넘겨줄 대상을 잘못 입력했거나, 잘못된 문서를 편집하고 있을 수 있습니다.\n\"{{int:savearticle}}\"을 입력하면, 넘겨주기 문서가 생성될 것입니다.",
        "previewerrortext": "변경사항을 미리보기하는 도중 오류가 발생했습니다.",
        "blockedtitle": "사용자가 차단됨",
        "blockedtext": "'''사용자 계정 또는 IP 주소가 차단되었습니다.'''\n\n차단한 사람은 $1입니다.\n차단한 이유는 다음과 같습니다: $2\n\n* 차단이 시작된 시간: $8\n* 차단이 끝나는 시간: $6\n* 차단된 사용자: $7\n\n$1 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대해 문의할 수 있습니다.\n[[Special:Preferences|계정 환경 설정]]에 올바른 이메일 주소가 있어야만 '이메일 보내기' 기능을 사용할 수 있습니다. 또 이메일 보내기 기능이 차단되어 있으면 이메일을 보낼 수 없습니다.\n현재 당신의 IP 주소는 $3이고, 차단 ID는 #$5입니다.\n문의할 때에 이 정보를 같이 알려주세요.",
-       "autoblockedtext": "당신의 IP 주소는 $1님이 차단한 사용자가 사용했던 IP이기 때문에 자동으로 차단되었습니다.\n차단된 이유는 다음과 같습니다:\n\n:$2\n\n* 차단이 시작된 시간: $8\n* 차단이 끝나는 시간: $6\n* 차단된 사용자: $7\n\n$1 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대해 문의할 수 있습니다.\n\n[[Special:Preferences|계정 환경 설정]]에 올바른 이메일 주소가 있어야만 \"이메일 보내기\" 기능을 사용할 수 있습니다. 또한 이메일 보내기 기능이 차단되어 있으면 이메일을 보낼 수 없습니다.\n\n현재 IP 주소는 $3이고, 차단 ID는 #$5입니다.\n문의할 때에 이 정보를 같이 알려주세요.",
+       "autoblockedtext": "당신의 IP 주소는 $1님이 차단한 사용자가 사용했던 IP이기 때문에 자동으로 차단되었습니다.\n차단된 이유는 다음과 같습니다:\n\n:$2\n\n* 차단이 시작된 시간: $8\n* 차단이 끝나는 시간: $6\n* 차단된 사용자: $7\n\n$1 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대해 문의할 수 있습니다.\n\n[[Special:Preferences|사용자 환경 설정]]에 올바른 이메일 주소가 있어야만 \"이메일 보내기\" 기능을 사용할 수 있습니다. 또한 이메일 보내기 기능이 차단되어 있으면 이메일을 보낼 수 없습니다.\n\n현재 IP 주소는 $3이고, 차단 ID는 #$5입니다.\n문의할 때에 이 정보를 같이 알려주세요.",
        "blockednoreason": "이유를 입력하지 않음",
        "whitelistedittext": "문서를 편집하기 전에 $1해야 합니다.",
        "confirmedittext": "문서를 고치려면 이메일 인증 절차가 필요합니다.\n[[Special:Preferences|사용자 환경 설정]]에서 이메일 주소를 입력하고 이메일 주소 인증을 해주시기 바랍니다.",
        "loginreqlink": "로그인",
        "loginreqpagetext": "다른 문서를 보기 위해서는 $1해야 합니다.",
        "accmailtitle": "비밀번호를 보냈습니다",
-       "accmailtext": "[[User talk:$1|$1]] 사용자의 비밀번호를 임의로 만들어 $2(으)로 보냈습니다. 로그인하고 나서 <em>[[Special:ChangePassword|비밀번호를 바꿀]]</em> 수 있습니다.",
+       "accmailtext": "[[User talk:$1|$1]]의 비밀번호를 임의로 만들어 $2(으)로 보냈습니다. 로그인하고 나서 <em>[[Special:ChangePassword|비밀번호를 바꿀]]</em> 수 있습니다.",
        "newarticle": "(새 문서)",
        "newarticletext": "아직 없는 문서의 링크를 따라왔습니다.\n새 문서를 만들려면 아래 상자에 내용을 입력하면 됩니다. (자세한 내용은 [$1 도움말 문서]를 참조하세요)\n만약 잘못 찾아왔다면, 브라우저의 '''뒤로''' 버튼을 눌러 주세요.",
        "anontalkpagetext": "----\n여기는 계정을 만들지 않았거나 사용하고 있지 않은 익명 사용자를 위한 토론 문서입니다.\n익명 사용자를 구별하기 위해서는 숫자로 된 IP 주소를 사용해야만 합니다.\nIP 주소는 여러 사용자가 공유할 수 있습니다.\n자신과 관계없는 의견이 자신에게 남겨져 있어 불쾌하다고 생각하는 익명 사용자는 [[Special:CreateAccount|계정을 만들고]] [[Special:UserLogin|로그인해서]] 나중에 다른 익명 사용자에게 줄 혼란을 줄일 수 있습니다.",
        "userpage-userdoesnotexist": "\"$1\" 사용자 계정은 등록되어 있지 않습니다.\n이 문서를 만들거나 편집하기 전에 계정이 존재하는지 확인해주세요.",
        "userpage-userdoesnotexist-view": "\"$1\" 사용자 계정은 등록되어 있지 않습니다.",
        "blocked-notice-logextract": "이 사용자는 현재 차단되어 있습니다.\n해당 사용자의 최근 차단 기록을 참조하십시오:",
-       "clearyourcache": "<strong>참고:</strong> 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다.\n* <strong>파이어폭스 / 사파리</strong>: <em>Shift</em> 키를 누르면서 새로 고침을 클릭하거나, <em>Ctrl-F5</em> 또는 <em>Ctrl-R</em> 을 입력 (Mac에서는 <em>⌘-R</em>)\n* <strong>구글 크롬</strong>: <em>Ctrl-Shift-R</em>키를 입력 (Mac에서는 <em>⌘-Shift-R</em>)\n* <strong>인터넷 익스플로러</strong>: <em>Ctrl</em> 키를 누르면서 새로 고침을 클릭하거나, <em>Ctrl-F5</em>를 입력.\n* <strong>오페라:</strong> <em>메뉴 → 설정</em>(맥의 경우 <em>오페라 → 환경 설정</em>)으로 이동한 다음 <em>개인 정보 보호 및 보안 → 검색 데이터 지우기 → 캐시한 이미지 및 파일</em>을 누름.",
+       "clearyourcache": "<strong>참고:</strong> 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다.\n* <strong>파이어폭스 / 사파리</strong>: <em>Shift</em> 키를 누르면서 새로 고침을 클릭하거나, <em>Ctrl-F5</em> 또는 <em>Ctrl-R</em>을 입력 (Mac에서는 <em>⌘-R</em>)\n* <strong>구글 크롬</strong>: <em>Ctrl-Shift-R</em>키를 입력 (Mac에서는 <em>⌘-Shift-R</em>)\n* <strong>인터넷 익스플로러</strong>: <em>Ctrl</em> 키를 누르면서 새로 고침을 클릭하거나, <em>Ctrl-F5</em>를 입력.\n* <strong>오페라:</strong> <em>메뉴 → 설정</em>(맥의 경우 <em>오페라 → 환경 설정</em>)으로 이동한 다음 <em>개인 정보 보호 및 보안 → 검색 데이터 지우기 → 캐시한 이미지 및 파일</em>을 누름.",
        "usercssyoucanpreview": "'''안내''': CSS 문서를 저장하기 전에 \"{{int:showpreview}}\" 기능을 통해 작동을 확인해주세요.",
        "userjsyoucanpreview": "'''안내''': 자바스크립트 문서를 저장하기 전에 \"{{int:showpreview}}\" 기능을 통해 작동을 확인해주세요.",
        "usercsspreview": "'''사용자 CSS의 미리 보기입니다.'''\n'''아직 저장하지 않았습니다!'''",
        "editingold": "<strong>경고: 이 문서의 오래된 판을 편집하고 있습니다.</strong>\n이것을 저장하면, 이 판 이후로 바뀐 모든 편집이 사라집니다.",
        "yourdiff": "차이",
        "copyrightwarning": "{{SITENAME}}에서의 모든 기여는 $2 라이선스로 배포된다는 점을 유의해 주세요 (자세한 내용에 대해서는 $1 문서를 읽어주세요).\n만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.<br />\n또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다.\n<strong>저작권이 있는 내용을 허가 없이 저장하지 마세요!</strong>",
-       "copyrightwarning2": "{{SITENAME}}에서의 모든 기여는 다른 사용자가 편집, 수정, 삭제할 수 있다는 점을 유의해 주세요.\n만약 여기에 동의하지 않는다면, 문서를 저장하지 말아 주세요.<br />\n또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다 (자세한 내용에 대해서는 $1 문서를 읽어 주세요).\n'''저작권이 있는 내용을 허가 없이 저장하지 마세요!'''",
+       "copyrightwarning2": "{{SITENAME}}에서의 모든 기여는 다른 기여자가 편집, 수정, 삭제할 수 있다는 점을 유의해 주세요.\n만약 여기에 동의하지 않는다면, 문서를 저장하지 말아 주세요.<br />\n또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다 (자세한 사항은 $1 문서를 보세요).\n<strong>저작권이 있는 내용을 허가 없이 저장하지 마세요!</strong>",
        "editpage-cannot-use-custom-model": "이 문서의 콘텐츠 모델은 변경될 수 없습니다.",
        "longpageerror": "'''오류: 문서의 크기가 {{PLURAL:$1|$1킬로바이트}}로 최대 크기인 {{PLURAL:$2|$2킬로바이트}}보다 큽니다.'''\n저장할 수 없습니다.",
        "readonlywarning": "<strong>경고: 데이터베이스가 관리를 위해 잠겨 있습니다. 따라서 문서를 편집한 내용을 지금 저장할 수 없습니다.</strong>\n편집 내용을 복사하여 붙여넣기 등을 사용하여 일단 다른 곳에 저장한 후, 나중에 다시 시도해 주세요.\n\n데이터베이스를 잠근 시스템 관리자가 남긴 설명은 다음과 같습니다: $1",
        "content-failed-to-parse": "$1 모델에 대한 $2 내용을 구문 분석하는 데 실패했습니다: $3",
        "invalid-content-data": "잘못된 내용 데이터입니다",
        "content-not-allowed-here": "\"$1\" 내용은 [[$2]] 문서예 허용하지 않습니다",
-       "editwarning-warning": "이 페이지에서 벗어나면 저장하지 않은 바뀜이 모두 사라집니다.\n로그인을 했다면, 환경 설정의 \"{{int:편집 상자}}\"에서 이 경고를 띄우지 않도록 설정할 수 있습니다.",
+       "editwarning-warning": "이 페이지에서 벗어나면 저장하지 않은 바뀜이 모두 사라집니다.\n로그인을 했다면, 환경 설정의 \"{{int:prefs-editing}}\"에서 이 경고를 띄우지 않도록 설정할 수 있습니다.",
        "editpage-notsupportedcontentformat-title": "지원하지 않는 내용 형식",
-       "editpage-notsupportedcontentformat-text": "내용 형식 $1(은)는 $2 내용 모델에서 지원하지 않습니다.",
+       "editpage-notsupportedcontentformat-text": "내용 형식 $1은(는) $2 내용 모델에서 지원하지 않습니다.",
        "content-model-wikitext": "위키텍스트",
        "content-model-text": "일반 텍스트",
        "content-model-javascript": "자바스크립트",
        "content-model-css": "CSS",
        "content-json-empty-object": "빈 오브젝트",
        "content-json-empty-array": "빈 배열",
+       "deprecated-self-close-category": "유효하지 않은, 스스로 닫는 HTML 태그를 사용하고 있는 문서",
+       "deprecated-self-close-category-desc": "이 문서는 <code>&lt;b/></code>나 <code>&lt;span/></code>와 같은 유효하지 않은, 스스로 닫는 HTML 태그를 포함하고 있습니다. 이 태그들의 동작은 곧 HTML5 사양과 일관되도록 변경될 예정이므로 위키텍스트에서 이것들을 사용하는 것은 권장되지 않습니다.",
        "duplicate-args-warning": "<strong>경고:</strong> [[:$1]] 문서는 [[:$2]]에 \"$3\" 변수를 하나보다 더 많이 입력했습니다. 마지막으로 주어진 값만이 유효합니다.",
        "duplicate-args-category": "중복된 인수를 사용한 틀의 호출을 포함한 문서",
        "duplicate-args-category-desc": "문서에 <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code>나 <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>와 같은, 인수를 중복하여 사용한 틀 호출을 포함합니다.",
        "undo-summary-username-hidden": "숨겨진 사용자가 $1 판을 되돌림",
        "cantcreateaccounttitle": "계정을 만들 수 없습니다",
        "cantcreateaccount-text": "현재 IP 주소('''$1''')는 [[User:$3|$3]] 사용자에 의해 계정 만들기가 차단되었습니다.\n\n차단 이유는 다음과 같습니다: $2",
-       "cantcreateaccount-range-text": "당신의 IP 주소(<strong>$4</strong>)가 속해 있는 <strong>$1</strong> 대역에서의 계정 생성을 [[User:$3|$3]] 사용자가 차단하였습니다.\n\n$3 사용자가 제시한 이유는 \"$2\"입니다.",
+       "cantcreateaccount-range-text": "당신의 IP 주소(<strong>$4</strong>)가 속해 있는 <strong>$1</strong> 대역에서의 계정 만들기를 [[User:$3|$3]]님이 차단했습니다.\n\n$3님이 제시한 이유는 \"$2\"입니다.",
        "viewpagelogs": "이 문서의 기록 보기",
        "nohistory": "이 문서는 편집 역사가 없습니다.",
        "currentrev": "최신판",
        "last": "이전",
        "page_first": "처음",
        "page_last": "마지막",
-       "histlegend": "비교하려는 판을 선택한 다음 엔터나 아래의 버튼을 누르세요.<br />\n설명: <strong>({{int:cur}})</strong> = 최신 판과 비교, <strong>({{int:last}})</strong> = 이전 판과 비교, <strong>{{int:minoreditletter}}</strong>= 사소한 편집",
+       "histlegend": "차이 선택: 비교하려는 판의 라디오 상자를 선택한 다음 엔터나 아래의 버튼을 누르세요.<br />\n설명: <strong>({{int:cur}})</strong> = 최신 판과 비교, <strong>({{int:last}})</strong> = 이전 판과 비교, <strong>{{int:minoreditletter}}</strong>= 사소한 편집",
        "history-fieldset-title": "역사 찾아보기",
        "history-show-deleted": "삭제된 것만",
        "histfirst": "오래됨",
        "mergehistory-comment": "[[:$1]] 문서를 [[:$2]] 문서로 합침: $3",
        "mergehistory-same-destination": "원본 문서 이름과 대상 문서 이름은 같을 수 없습니다",
        "mergehistory-reason": "이유:",
-       "mergelog": "합치기 기록",
+       "mergelog": "병합 기록",
        "revertmerge": "합치기 해제",
-       "mergelogpagetext": "다음은 한 문서의 역사를 다른 문서의 역사와 í\95©ì¹\9c ìµ\9cê·¼ ê¸°ë¡\9dì\9e\85ë\8b\88ë\8b¤.",
+       "mergelogpagetext": "다음은 한 문서의 역사를 다른 문서의 역사와 ë³\91í\95©í\95\9c ìµ\9cê·¼ ê¸°ë¡\9dì\9e\85ë\8b\88ë\8b¤.",
        "history-title": "\"$1\"의 편집 역사",
        "difference-title": "\"$1\"의 두 판 사이의 차이",
        "difference-title-multipage": "\"$1\" 문서와 \"$2\" 문서 사이의 차이",
        "prefs-changeemail": "이메일 주소를 바꾸거나 제거하기",
        "prefs-setemail": "이메일 주소 설정하기",
        "prefs-email": "이메일 설정",
-       "prefs-rendering": "문서 보이기 설정",
+       "prefs-rendering": "문서 보이기",
        "saveprefs": "저장",
        "restoreprefs": "(모든 부분에서) 모두 기본 설정으로 되돌리기",
-       "prefs-editing": "편집 상자",
+       "prefs-editing": "편집",
        "rows": "줄 수:",
        "columns": "열 수:",
        "searchresultshead": "검색",
        "gender-female": "위키 문서를 편집하는 여자입니다",
        "prefs-help-gender": "이 환경 설정은 선택 사항입니다.\n소프트웨어는 적절한 성별 문법을 사용하여 다른 사용자에게 당신을 언급하는 것을 해결하기 위해 사용됩니다.\n이 정보는 공개됩니다.",
        "email": "이메일",
-       "prefs-help-realname": "실명은 선택 사항입니다.\n실명을 입력하면 당신의 기여에 대한 저작자표시에 쓰이게 될 수 있습니다.",
+       "prefs-help-realname": "실명은 선택 사항입니다.\n실명을 입력하면 당신의 기여에 대한 저작자 표시에 쓰이게 될 수 있습니다.",
        "prefs-help-email": "이메일 주소 입력은 선택 사항입니다. 다만 비밀번호를 잊었을 때 비밀번호를 재설정하기 위해 필요합니다.",
-       "prefs-help-email-others": "자신의 문서나 토론 문서에 있는 이메일 보내기 링크로 다른 사용자가 연락할 수 있게 할 수도 있습니다.\n이 경우에도 이메일 주소는 다른 사용자가 연락할 때 공개되지 않습니다.",
+       "prefs-help-email-others": "자신의 사용자 문서나 토론 문서에 있는 이메일 보내기 링크로 다른 사용자가 연락할 수 있게 할 수도 있습니다.\n이 경우에도 이메일 주소는 다른 사용자가 연락할 때 공개되지 않습니다.",
        "prefs-help-email-required": "이메일 주소가 필요합니다.",
        "prefs-info": "기본 정보",
        "prefs-i18n": "언어 설정",
        "right-move-rootuserpages": "최상위 사용자 문서 이동",
        "right-move-categorypages": "분류 문서 이동",
        "right-movefile": "파일 이동",
-       "right-suppressredirect": "문ì\84\9c를 ì\98®ê¸¸ 때 원래 문서 이름으로 된 넘겨주기를 만들지 않기",
+       "right-suppressredirect": "문ì\84\9c를 ì\9d´ë\8f\99í\95  때 원래 문서 이름으로 된 넘겨주기를 만들지 않기",
        "right-upload": "파일 올리기",
        "right-reupload": "이미 존재하는 파일을 다시 올리기",
        "right-reupload-own": "자신이 이미 올린 파일 덮어쓰기",
        "rightslogtext": "사용자 권한 조정 기록입니다.",
        "action-read": "이 문서를 읽기",
        "action-edit": "문서 편집",
-       "action-createpage": "문서 만들기",
-       "action-createtalk": "토론 문서 만들기",
+       "action-createpage": "이 문서 만들기",
+       "action-createtalk": "이 토론 문서 만들기",
        "action-createaccount": "새 계정 만들기",
        "action-autocreateaccount": "자동으로 이 외부 사용자 계정 생성하기",
        "action-history": "이 문서의 역사 보기",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|새 문서 목록]]도 보세요)",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "보기",
-       "rcnotefrom": "아래는 <strong>$3, $4</strong>부터 시작하는 {{PLURAL:$5|바뀜이 있습니다}}. (최대 <strong>$1</strong>개가 보여집니다)",
+       "rcnotefrom": "아래는 <strong>$3, $4</strong>부터 시작하는 {{PLURAL:$5|바뀜이 있습니다}}. (최대 <strong>$1</strong>개가 표시됨)",
        "rclistfrom": "$3 $2부터 시작하는 새로 바뀐 문서 보기",
        "rcshowhideminor": "사소한 편집 $1",
        "rcshowhideminor-show": "보이기",
        "minlength1": "파일 이름은 적어도 1글자 이상이어야 합니다.",
        "illegalfilename": "파일 이름 \"$1\"에는 문서 제목에 허용되지 않는 글자가 포함되어 있습니다.\n이름을 바꾸어 다시 시도해 주세요.",
        "filename-toolong": "파일 이름은 240바이트를 넘을 수 없습니다.",
-       "badfilename": "파일 이름이 \"$1\"로 바뀌었습니다.",
+       "badfilename": "파일 이름이 \"$1\"(으)로 바뀌었습니다.",
        "filetype-mime-mismatch": "\".$1\" 파일 확장자와 이 파일의 MIME 형식($2)이 일치하지 않습니다.",
        "filetype-badmime": "\"$1\" MIME 형식을 가진 파일은 올릴 수 없습니다.",
-       "filetype-bad-ie-mime": "이 파일을 올릴 수 없습니다. Internet Explorer가 잠재적으로 위험한 파일 형식으로 판단하여 사용이 금지된 \"$1\"로 인식할 수 있습니다.",
+       "filetype-bad-ie-mime": "이 파일을 올릴 수 없습니다. Internet Explorer가 잠재적으로 위험한 파일 형식으로 판단하여 사용이 금지된 \"$1\"(으)로 인식할 수 있습니다.",
        "filetype-unwanted-type": "'''\".$1\"''' 확장자는 권장하지 않습니다.\n권장하는 {{PLURAL:$3|파일 확장자}}는 $2입니다.",
        "filetype-banned-type": "'''\".$1\"''' {{PLURAL:$4|형식의 파일은 올릴 수 없습니다}}.\n$2 {{PLURAL:$3|형식만 사용할 수 있습니다}}.",
        "filetype-missing": "파일에 확장자(\".jpg\" 등)가 없습니다.",
        "uploaddisabledtext": "파일 올리기 기능이 비활성화되어 있습니다.",
        "php-uploaddisabledtext": "PHP 파일 올리기가 비활성화되었습니다. 파일 올리기 설정을 확인하십시오.",
        "uploadscripted": "이 파일에는 HTML이나 다른 스크립트 코드가 포함되어 있어, 웹 브라우저에서 오류를 일으킬 수 있습니다.",
-       "upload-scripted-pi-callback": "XML 스타일시트 프로세싱 명령을 포함하는 파일은 업로드 할 수 없습니다.",
-       "uploaded-script-svg": "업로드 된 SVG 파일에서 스크립트로 만들 수 있는 \"$1\" 요소를 발견했습니다.",
-       "uploaded-hostile-svg": "업로드 된 SVG 파일의 스타일 요소에 안전하지 못한 CSS가 있습니다.",
+       "upload-scripted-pi-callback": "XML 스타일시트 처리 명령을 포함하는 파일은 업로드할 수 없습니다.",
+       "uploaded-script-svg": "업로드된 SVG 파일에서 스크립트로 만들 수 있는 \"$1\" 요소를 발견했습니다.",
+       "uploaded-hostile-svg": "업로드된 SVG 파일의 스타일 요소에 안전하지 않은 CSS가 있습니다.",
        "uploaded-event-handler-on-svg": "이벤트 핸들러 속성 <code>$1=\"$2\"</code> 설정은 SVG 파일에서 사용할 수 없습니다.",
        "uploaded-href-attribute-svg": "SVG 파일의 href 속성은 http:// 또는 https:// 대상의 링크만 허용되지만 <code>&lt;$1 $2=\"$3\"&gt;</code>를 발견했습니다.",
        "uploaded-href-unsafe-target-svg": "안전하지 않은 데이터를 가리키는 href를 발견했습니다: 업로드된 SVG 파일의 URI 대상 <code>&lt;$1 $2=\"$3\"&gt;</code>",
        "upload-http-error": "HTTP 오류 발생: $1",
        "upload-copy-upload-invalid-domain": "이 도메인에 속하지 않는 웹사이트의 파일을 올릴 수 없습니다.",
        "upload-foreign-cant-upload": "이 위키는 요청된 외부 파일 저장소에 파일을 업로드할 수 있도록 구성되어 있지 않습니다.",
+       "upload-foreign-cant-load-config": "외부 파일 저장소의 파일 업로드 구성을 불러오는데 실패했습니다.",
+       "upload-dialog-disabled": "이 대화창을 이용한 파일 올리기는 이 위키에서 비활성화되어 있습니다.",
        "upload-dialog-title": "파일 올리기",
        "upload-dialog-button-cancel": "취소",
        "upload-dialog-button-done": "완료",
        "backend-fail-notexists": "$1 파일이 존재하지 않습니다.",
        "backend-fail-hashes": "비교 해시값을 얻지 못했습니다.",
        "backend-fail-notsame": "\"$1\" 파일과 같은 이름을 가진 다른 파일이 존재합니다.",
-       "backend-fail-invalidpath": "\"$1\"(은)는 올바른 저장소 경로가 아닙니다.",
+       "backend-fail-invalidpath": "\"$1\"은(는) 올바른 저장소 경로가 아닙니다.",
        "backend-fail-delete": "\"$1\" 파일을 삭제할 수 없습니다.",
        "backend-fail-describe": "\"$1\" 파일에 대한 메타데이터를 바꿀 수 없습니다.",
        "backend-fail-alreadyexists": "\"$1\" 파일이 이미 존재합니다.",
        "uploadstash-thumbnail": "섬네일 보기",
        "invalid-chunk-offset": "청크 오프셋이 잘못되었습니다.",
        "img-auth-accessdenied": "접근이 거부됨",
-       "img-auth-nopathinfo": "PATH_INFO를 잃었습니다.\n서버가 이 정보를 받을 수 있도록 설정되어 있지 않습니다.\n이러한 경우는 서버가 CGI 기반이고 img_auth를 지원하지 않을 때 나타날 수 있습니다.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization 을 참조하십시오.",
+       "img-auth-nopathinfo": "PATH_INFO를 잃었습니다.\n서버가 이 정보를 받을 수 있도록 설정되어 있지 않습니다.\n이러한 경우는 서버가 CGI 기반이고 img_auth를 지원하지 않을 때 나타날 수 있습니다.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization을 참조하십시오.",
        "img-auth-notindir": "요청한 경로가 설정한 올리기 디렉터리에 없습니다.",
        "img-auth-badtitle": "\"$1\"에서 올바른 제목을 만들 수 없습니다.",
        "img-auth-nologinnWL": "로그인하지 않았으며 \"$1\" 파일은 화이트리스트에 존재하지 않습니다.",
        "img-auth-public": "img_auth.php는 개인 위키 파일을 바깥 사이트로 전송하는 기능입니다.\n이 기능은 기본적으로 공개적인 위키에서 사용하도록 설계되어 있습니다.\n보안적인 문제로 기본적으로 img_auth.php 기능은 비활성화되어 있습니다.",
        "img-auth-noread": "\"$1\" 파일을 볼 권한이 없습니다.",
        "http-invalid-url": "잘못된 URL: $1",
-       "http-invalid-scheme": "\"$1\"로 시작하는 URL은 지원되지 않습니다.",
+       "http-invalid-scheme": "\"$1\"(으)로 시작하는 URL은 지원되지 않습니다.",
        "http-request-error": "알 수 없는 오류로 HTTP 요청에 실패했습니다.",
        "http-read-error": "HTTP 읽기 오류입니다.",
        "http-timed-out": "HTTP 요청 시간 초과입니다.",
        "randompage": "임의 문서로",
        "randompage-nopages": "{{PLURAL:$2|다음}} 이름공간에는 문서가 없습니다: $1",
        "randomincategory": "분류 안의 임의 문서",
-       "randomincategory-invalidcategory": "\"$1\"(은)는 올바른 분류 이름이 아닙니다.",
+       "randomincategory-invalidcategory": "\"$1\"은(는) 올바른 분류 이름이 아닙니다.",
        "randomincategory-nopages": "[[:Category:$1]]에 문서가 없습니다.",
        "randomincategory-category": "분류:",
        "randomincategory-legend": "분류 안의 임의 문서",
        "unusedimages": "사용하지 않는 파일 목록",
        "wantedcategories": "필요한 분류 목록",
        "wantedpages": "필요한 문서 목록",
-       "wantedpages-summary": "다른 문서들에 링크는 걸려 있지만 존재하지 않는 문서들 중, 넘겨주기 문서를 제외한 목록입니다.\n존재하지 않는 문서로 넘겨주는 문서 목록을 보려면 [[{{#special:BrokenRedirects}}|the list of broken redirects]]를 참조하세요.",
+       "wantedpages-summary": "다른 문서들에 링크는 걸려 있지만 존재하지 않는 문서들 중, 넘겨주기 문서를 제외한 목록입니다. 존재하지 않는 문서로 넘겨주는 문서 목록을 보려면 [[{{#special:BrokenRedirects}}|끊긴 넘겨주기 목록]]을 참조하세요.",
        "wantedpages-badtitle": "문서 제목이 잘못되었습니다: $1",
        "wantedfiles": "필요한 파일 목록",
        "wantedfiletext-cat": "다음 파일은 쓰이고는 있지만 없는 파일입니다. 바깥 저장소에 있는 파일은 실제로는 있지만 여기 올라 있을 수 있습니다. 그런 오류는 <del>삭제선</del>이 그어질 것입니다. 또한 없는 파일을 포함하고 있는 문서는 [[:$1]]에 올라 있습니다.",
        "pager-newer-n": "{{PLURAL:$1|다음 1개|다음 $1개}}",
        "pager-older-n": "{{PLURAL:$1|이전 1개|이전 $1개}}",
        "suppress": "기록보호자",
-       "querypage-disabled": "이 특수 문서는 성능상의 이유로 비활성화되었습니다.",
+       "querypage-disabled": "이 특수 문서는 성능 상의 이유로 비활성화되었습니다.",
        "apihelp": "API 도움말",
        "apihelp-no-such-module": "\"$1\" 모듈을 찾을 수 없습니다.",
        "apisandbox": "API 실험실",
        "booksources-text": "아래의 목록은 새 책이나 중고 책을 판매하는 바깥 사이트로, 원하는 책의 정보를 얻을 수 있습니다.",
        "booksources-invalid-isbn": "입력한 ISBN이 올바르지 않은 것으로 보입니다. 원본과 대조해 문제가 있는지 확인해보세요.",
        "specialloguserlabel": "작업 수행자:",
-       "speciallogtitlelabel": "ë\8c\80ì\83\81 (ì \9c목 ë\98\90ë\8a\94 {{ns:user}}:ì\82¬ì\9a©ì\9e\90\9d´ë¦\84 ì\9c¼ë¡\9c ì\82¬ì\9a©ì\9e\90):",
+       "speciallogtitlelabel": "ë\8c\80ì\83\81 (ì\82¬ì\9a©ì\9e\90ê³\84ì \95ì\97\90 ë\8c\80í\95\9c ì \9c목 ë\98\90ë\8a\94 {{ns:user}}:ì\82¬ì\9a©ì\9e\90ì\9d´ë¦\84):",
        "log": "기록 목록",
        "logeventslist-submit": "보기",
        "all-logs-page": "모든 공개 기록",
        "linksearch-ns": "이름공간:",
        "linksearch-ok": "검색",
        "linksearch-text": "\"*.wikipedia.org\"와 같이 와일드 카드를 사용할 수 있습니다.\n적어도 \"*.org\"와 같이 최상위 도메인을 입력해야 합니다.<br />\n지원하는 {{PLURAL:$2|프로토콜}}: $1 (프로토콜을 지정하지 않을 때 기본값은 http://)",
-       "linksearch-line": "$2에서 $1 을 링크하고 있습니다.",
+       "linksearch-line": "$1가 $2에서 링크됩니다.",
        "linksearch-error": "와일드카드는 주소의 처음 부분에만 사용될 수 있습니다.",
        "listusersfrom": "다음으로 시작하는 사용자 보기:",
        "listusers-submit": "보기",
-       "listusers-noresult": "해당 사용자가 없습니다.",
+       "listusers-noresult": "사용자를 찾을 수 없습니다.",
        "listusers-blocked": "(차단됨)",
        "activeusers": "활동하는 사용자 목록",
        "activeusers-intro": "다음은 최근 $1{{PLURAL:$1|일}} 동안 활동한 사용자의 목록입니다.",
        "activeusers-from": "다음으로 시작하는 사용자를 보기:",
        "activeusers-hidebots": "봇을 숨기기",
        "activeusers-hidesysops": "관리자를 숨기기",
-       "activeusers-noresult": "사용자 없습니다.",
+       "activeusers-noresult": "사용자를 찾을 수 없습니다.",
        "activeusers-submit": "활동하고 있는 사용자 보이기",
        "listgrouprights": "사용자 권한 목록",
        "listgrouprights-summary": "다음은 이 위키에 있는 사용자 권한 그룹의 목록입니다.\n각각의 권한에 대해서는 [[{{MediaWiki:Listgrouprights-helppage}}|추가 정보]]를 참조하세요.",
        "listgrants-grant": "부여",
        "listgrants-rights": "권한",
        "trackingcategories": "추적용 분류",
-       "trackingcategories-summary": "이 페이지는 미디어위키 소프트웨어에 의해 자동으로 만들어지는 추적용 분류를 나열합니다. 그들의 이름은 {{ns:8}} 이름공간에 관련된 시스템 메시지를 바꾸어서 바꿀 수 있습니다.",
+       "trackingcategories-summary": "이 페이지는 미디어위키 소프트웨어에 의해 자동으로 만들어지는 추적용 분류를 나열합니다. 이들의 이름은 {{ns:8}} 이름공간의 관련 시스템 메시지들을 변경함으로써 바꿀 수 있습니다.",
        "trackingcategories-msg": "추적용 분류",
        "trackingcategories-name": "메시지 이름",
        "trackingcategories-desc": "분류 포함 기준",
        "post-expand-template-argument-category-desc": "틀 변수 (<code>{{{Foo}}}</code>와 같은, 중괄호가 세 개 있는 무언가)를 확장하고 나서 문서는 <code>$wgMaxArticleSize</code>보다 커집니다.",
        "expensive-parserfunction-category-desc": "문서에 (<code>#ifexist</code>와 같은) 느린 파서 함수가 너무 많이 쓰이고 있습니다. [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit]를 보세요.",
        "broken-file-category-desc": "문서에 깨진 파일 링크 (파일이 존재하지 않을 때 포함되는 링크)를 포함합니다.",
-       "hidden-category-category-desc": "기본적으로 문서에 분류 링크 상자가 보여지는 것에서 막기 위한, 분류의 문서 내용에 <code><nowiki>__HIDDENCAT__</nowiki></code>를 포함합니다.",
+       "hidden-category-category-desc": "분류의 본문에 <code><nowiki>__HIDDENCAT__</nowiki></code>를 포함하고 있으며, 기본적으로 문서의 분류 링크 상자에서 보이지 않게 합니다.",
        "trackingcategories-nodesc": "사용할 수 있는 설명이 없습니다.",
        "trackingcategories-disabled": "분류가 비활성화되어 있습니다",
        "mailnologin": "보낼 이메일 주소가 없음",
        "watcherrortext": "\"$1\" 문서에 대한 주시 여부를 바꾸는 중 오류가 발생했습니다.",
        "enotif_reset": "모든 문서를 방문한 것으로 표시하기",
        "enotif_impersonal_salutation": "{{SITENAME}} 사용자",
-       "enotif_subject_deleted": "{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|삭제했습니다}}",
-       "enotif_subject_created": "{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|만들었습니다}}",
-       "enotif_subject_moved": "{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|이동하였습니다}}",
-       "enotif_subject_restored": "{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|되살렸습니다}}",
-       "enotif_subject_changed": "{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|바꾸었습니다}}",
-       "enotif_body_intro_deleted": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|삭제했으며}} $3 에서 볼 수 있습니다.",
-       "enotif_body_intro_created": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|만들었으며}} 현재 판은 $3 에서 볼 수 있습니다.",
-       "enotif_body_intro_moved": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|이동하였으며}} 현재 판은 $3 에서 볼 수 있습니다.",
-       "enotif_body_intro_restored": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|되살렸으며}} 현재 판은 $3 에서 볼 수 있습니다.",
-       "enotif_body_intro_changed": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|바꾸었으며}} 현재 판은 $3 에서 볼 수 있습니다.",
-       "enotif_lastvisited": "마지막으로 방문한 뒤 생긴 모든 바뀜을 보려면 $1 을 보세요.",
-       "enotif_lastdiff": "이 바뀜을 보려면 $1 을 보세요.",
+       "enotif_subject_deleted": "{{SITENAME}} $1 문서를 $2님이 {{GENDER:$2|삭제했습니다}}",
+       "enotif_subject_created": "{{SITENAME}} $1 문서를 $2님이 {{GENDER:$2|만들었습니다}}",
+       "enotif_subject_moved": "{{SITENAME}} $1 문서를 $2님이 {{GENDER:$2|이동팼습니다}}",
+       "enotif_subject_restored": "{{SITENAME}} $1 문서를 $2님이 {{GENDER:$2|되살렸습니다}}",
+       "enotif_subject_changed": "{{SITENAME}} $1 문서를 $2님이 {{GENDER:$2|바꾸었습니다}}",
+       "enotif_body_intro_deleted": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2님이 {{GENDER:$2|삭제했으며}} $3 에서 볼 수 있습니다.",
+       "enotif_body_intro_created": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2님이 {{GENDER:$2|만들었으며}} 현재 판은 $3 에서 볼 수 있습니다.",
+       "enotif_body_intro_moved": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2님이 {{GENDER:$2|이동하였으며}} 현재 판은 $3 에서 볼 수 있습니다.",
+       "enotif_body_intro_restored": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2님이 {{GENDER:$2|되살렸으며}} 현재 판은 $3 에서 볼 수 있습니다.",
+       "enotif_body_intro_changed": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2님이 {{GENDER:$2|바꾸었으며}} 현재 판은 $3 에서 볼 수 있습니다.",
+       "enotif_lastvisited": "마지막으로 방문한 뒤 생긴 모든 바뀜을 보려면 $1을 보세요.",
+       "enotif_lastdiff": "이 바뀜을 보려면 $1을 보세요.",
        "enotif_anon_editor": "익명 사용자 $1",
-       "enotif_body": "$WATCHINGUSERNAME님,\n\n$PAGEINTRO $NEWPAGE\n\n편집 요약: $PAGESUMMARY $PAGEMINOREDIT\n\n다음을 통해 편집자와 대화를 할 수 있습니다:\n이메일: $PAGEEDITOR_EMAIL\n위키: $PAGEEDITOR_WIKI\n\n로그인한 상태에서 이 문서를 열기 전에는 다른 알림 이메일을 더 이상 보내지 않습니다. 모든 주시 문서의 알림 딱지를 초기화할 수도 있습니다.\n\n{{SITENAME}} 알림 시스템\n\n--\n이메일 알림 설정을 바꾸시려면 이곳을 방문해주세요:\n{{canonicalurl:{{#special:Preferences}}}}\n\n주시문서 설정을 바꾸려면 다음을 사용하세요:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n주시문서에서 이 문서를 지우려면 이곳을 방문해주세요:\n$UNWATCHURL\n\n도움을 얻거나 피드백 하기:\n$HELPPAGE",
+       "enotif_body": "$WATCHINGUSERNAME님,\n\n$PAGEINTRO $NEWPAGE\n\n편집 요약: $PAGESUMMARY $PAGEMINOREDIT\n\n다음을 통해 편집자와 대화를 할 수 있습니다:\n이메일: $PAGEEDITOR_EMAIL\n위키: $PAGEEDITOR_WIKI\n\n로그인한 상태에서 이 문서를 열기 전에는 다른 알림 이메일을 더 이상 보내지 않습니다. 모든 주시 문서의 알림 딱지를 초기화할 수도 있습니다.\n\n{{SITENAME}} 알림 시스템\n\n--\n이메일 알림 설정을 바꾸시려면 이곳을 방문해주세요:\n{{canonicalurl:{{#special:Preferences}}}}\n\n주시문서 설정을 바꾸려면 다음을 사용하세요:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n주시문서에서 이 문서를 지우려면 이곳을 방문해주세요:\n$UNWATCHURL\n\n피드백 및 추가 도움 얻기:\n$HELPPAGE",
        "created": "만들었",
        "changed": "바꾸었",
        "deletepage": "문서 삭제",
        "rollbacklinkcount-morethan": "{{PLURAL:$1|편집}} $1회 이상 되돌리기",
        "rollbackfailed": "되돌리기 실패",
        "rollback-missingparam": "요청에 필요한 변수가 존재하지 않습니다.",
-       "cantrollback": "í\8e¸ì§\91ì\9d\84 ë\90\98ë\8f\8c릴 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤.\n문ì\84\9c를 í\8e¸ì§\91í\95\9c ì\82¬ì\9a©자가 한 명뿐입니다.",
+       "cantrollback": "í\8e¸ì§\91ì\9d\84 ë\90\98ë\8f\8c릴 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤.\n문ì\84\9c를 í\8e¸ì§\91í\95\9c ì \80자가 한 명뿐입니다.",
        "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]]의 마지막 판으로 되돌림",
        "log-name-contentmodel": "콘텐츠 모델 변경 기록",
        "log-description-contentmodel": "페이지의 콘텐츠 모델과 관련된 행위",
        "logentry-contentmodel-new": "$1님이 비 기본값 \"$5\" 콘텐츠 모델을 사용해  $3 문서를 {{GENDER:$2|만들었습니다}}",
-       "logentry-contentmodel-change": "$1님이 $3 문서의 콘텐츠 모델을 \"$4\"에서 \"$5\"로 {{GENDER:$2|바꾸었습니다}}",
+       "logentry-contentmodel-change": "$1님이 $3 문서의 콘텐츠 모델을 \"$4\"에서 \"$5\"(으)로 {{GENDER:$2|바꾸었습니다}}",
        "logentry-contentmodel-change-revertlink": "되돌리기",
        "logentry-contentmodel-change-revert": "되돌리기",
        "protectlogpage": "문서 보호 기록",
        "protectlogtext": "아래의 목록은 문서 보호에 관한 바뀜에 대한 기록입니다.\n현재 보호된 문서의 목록에 대해서는 [[Special:ProtectedPages|보호된 문서 목록]]을 참조하세요.",
-       "protectedarticle": "사용자가 \"[[$1]]\" 문서를 보호했습니다",
-       "modifiedarticleprotection": "사용자가 \"[[$1]]\" 문서의 보호 설정을 바꿨습니다",
-       "unprotectedarticle": "사용자가 \"[[$1]]\" 문서를 보호 해제했습니다",
-       "movedarticleprotection": "사용자가 문서의 보호 설정을 \"[[$2]]\"에서 \"[[$1]]\"으로 변경했습니다",
+       "protectedarticle": "님이 \"[[$1]]\" 문서를 보호했습니다",
+       "modifiedarticleprotection": "님이 \"[[$1]]\" 문서의 보호 설정을 바꿨습니다",
+       "unprotectedarticle": "님이 \"[[$1]]\" 문서를 보호 해제했습니다",
+       "movedarticleprotection": "님이 문서의 보호 설정을 \"[[$2]]\"에서 \"[[$1]]\"(으)로 이동했습니다",
        "protect-title": "\"$1\" 보호하기",
        "protect-title-notallowed": "\"$1\" 문서의 보호 수준 보기",
-       "prot_1movedto2": "[[$1]] ë¬¸ì\84\9c를 [[$2]] ë¬¸ì\84\9cë¡\9c ì\98®ê¹\80",
+       "prot_1movedto2": "[[$1]] ë¬¸ì\84\9c를 [[$2]] ë¬¸ì\84\9cë¡\9c ì\9d´ë\8f\99í\95¨",
        "protect-badnamespace-title": "보호할 수 없는 이름공간",
        "protect-badnamespace-text": "이 이름공간에 있는 문서는 보호할 수 없습니다.",
        "protect-norestrictiontypes-text": "이 문서는 제한 유형을 사용할 수 없음으로 보호할 수 없습니다.",
        "sp-contributions-username": "IP 주소 또는 사용자 이름:",
        "sp-contributions-toponly": "최신판만 보기",
        "sp-contributions-newonly": "새 글인 기여만 보기",
+       "sp-contributions-hideminor": "사소한 편집 숨기기",
        "sp-contributions-submit": "검색",
        "sp-contributions-explain": "",
        "whatlinkshere": "여기를 가리키는 문서",
        "ipb-confirm": "차단 확인",
        "badipaddress": "잘못된 IP 주소",
        "blockipsuccesssub": "차단 완료",
-       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] 사용자가 차단되었습니다.<br />\n차단된 사용자 목록은 [[Special:BlockList|여기]]에서 볼 수 있습니다.",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]]님이 차단되었습니다.<br />\n차단된 사용자 목록은 [[Special:BlockList|여기]]에서 볼 수 있습니다.",
        "ipb-blockingself": "자기 자신을 차단하려고 합니다! 정말로 실행할까요?",
        "ipb-confirmhideuser": "사용자를 차단하면서 \"사용자 숨기기\" 설정을 선택했습니다. 모든 기록에서 이 사용자의 사용자 이름을 숨기게 됩니다. 정말로 계정을 숨기시겠습니까?",
        "ipb-confirmaction": "그것을 정말로 하기 원한다면 아래에 있는 \"{{int:ipb-confirm}}\" 부분에 체크하세요",
        "unblocked": "[[User:$1|$1]] 사용자의 차단을 해제했습니다.",
        "unblocked-range": "$1 대역이 차단 해제되었습니다.",
        "unblocked-id": "$1 차단이 해제되었습니다.",
-       "unblocked-ip": "[[Special:Contributions/$1|$1]] 사용자가 차단 해제되었습니다.",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]]님이 차단 해제되었습니다.",
        "blocklist": "차단된 사용자 목록",
        "ipblocklist": "차단된 사용자",
        "ipblocklist-legend": "차단된 사용자 찾기",
        "createaccountblock": "계정 만들기 금지됨",
        "emailblock": "이메일 차단됨",
        "blocklist-nousertalk": "자신의 토론 문서 편집 불가",
-       "ipblocklist-empty": "차단된 사용자가 없습니다.",
+       "ipblocklist-empty": "차단 목록이 비어 있습니다.",
        "ipblocklist-no-results": "요청한 IP 주소나 사용자는 차단되지 않았습니다.",
        "blocklink": "차단",
        "unblocklink": "차단 해제",
        "change-blocklink": "차단 설정 바꾸기",
        "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해당 사용자의 차단 기록은 다음과 같습니다:",
        "ipbnounblockself": "자기 스스로를 차단 해제할 수 없습니다.",
        "lockdb": "데이터베이스 잠그기",
        "unlockdb": "데이터베이스 잠금 해제",
-       "lockdbtext": "데이터베이스를 잠그면 모든 사용자의 편집, 환경 설정 바꾸기, 주시문서 편집 등 데이터베이스를 요구하는 모든 기능이 정지됩니다.\n정말로 잠가야 하는지를 다시 한번 확인해주세요. 관리 작업이 끝난 뒤에는 데이터베이스 잠금을 풀어야 합니다.",
-       "unlockdbtext": "데이터베이스를 잠금 해제하면 모든 사용자의 편집, 환경 설정 바꾸기, 주시문서 편집 등 데이터베이스를 요구하는 모든 기능이 복구됩니다.\n정말로 잠금을 해제하려는지를 다시 한번 확인해주세요.",
+       "lockdbtext": "데이터베이스를 잠그면 모든 사용자의 편집, 환경 설정 바꾸기, 주시문서 편집 등 데이터베이스에서 변경을 요구하는 모든 기능이 정지됩니다.\n정말로 잠가야 하는지 확인해 주세요. 관리 작업이 끝난 뒤에는 데이터베이스 잠금을 풀어야 합니다.",
+       "unlockdbtext": "데이터베이스를 잠금 해제하면 모든 사용자의 편집, 환경 설정 바꾸기, 주시문서 편집 등 데이터베이스에서 변경을 요구하는 모든 기능이 복구됩니다.\n정말로 잠금을 해제해야 하는지 확인해주세요.",
        "lockconfirm": "네, 데이터베이스를 잠급니다.",
        "unlockconfirm": "네, 데이터베이스를 잠금 해제합니다.",
        "lockbtn": "데이터베이스 잠그기",
        "lockfilenotwritable": "데이터베이스 잠금 파일에 쓰기 권한이 없습니다.\n데이터베이스를 잠그거나 잠금 해제하려면, 웹 서버에서 이 파일의 쓰기 권한을 설정해야 합니다.",
        "databaselocked": "데이터베이스가 이미 잠겨 있습니다.",
        "databasenotlocked": "데이터베이스가 잠겨 있지 않습니다.",
-       "lockedbyandtime": "({{GENDER:$1|$1}} 사용자가 $2 $3에 잠금)",
+       "lockedbyandtime": "({{GENDER:$1|$1}}님이 $2 $3에 잠금)",
        "move-page": "$1 이동",
        "move-page-legend": "문서 이동",
-       "movepagetext": "ì\95\84ë\9e\98 ì\96\91ì\8b\9dì\9d\84 ì±\84ì\9b\8c ë¬¸ì\84\9cì\9d\98 ì\9d´ë¦\84ì\9d\84 ë°\94꾸고 ëª¨ë\93  ì\97­ì\82¬ë¥¼ ì\83\88 ì\9d´ë¦\84ì\9c¼ë¡\9c ë\90\9c ë¬¸ì\84\9cë¡\9c ì\98®ê¸¸ 수 있습니다.\n원래의 문서는 새 문서로 넘겨주는 링크로만 남게 되고,\n원래 이름을 가리키는 넘겨주기는 자동으로 갱신됩니다.\n만약 이 설정을 선택하지 않았다면 [[Special:DoubleRedirects|이중 넘겨주기]]와 [[Special:BrokenRedirects|끊긴 넘겨주기]]를 확인해주세요.\n당신은 링크와 가리키는 대상이 서로 일치하도록 해야 할 책임이 있습니다.\n\n만약 이미 있는 문서의 이름을 새 이름으로 입력했을 때는 그 문서가 넘겨주기 문서이고 문서 역사가 없어야만 이동이 됩니다. 그렇지 않을 경우에는 이동되지 <strong>않습니다</strong>.\n이것은 실수로 이동한 문서를 되돌릴 수는 있지만, 이미 존재하는 문서 위에 덮어씌울 수는 없다는 것을 의미합니다.\n\n<strong>주의!</strong>\n자주 사용하는 문서를 이동하면 해결하기 어려운 문제를 일으킬 수도 있습니다.\n이동하기 전에 반드시 이 문서를 이동해도 문제가 없는지 확인해주세요.",
-       "movepagetext-noredirectfixer": "ì\95\84ë\9e\98 ì\96\91ì\8b\9dì\9d\84 ì±\84ì\9b\8c ë¬¸ì\84\9cì\9d\98 ì\9d´ë¦\84ì\9d\84 ë°\94꾸고 ëª¨ë\93  ì\97­ì\82¬ë¥¼ ì\83\88 ì\9d´ë¦\84ì\9c¼ë¡\9c ë\90\9c ë¬¸ì\84\9cë¡\9c ì\9d´ë\8f\99í\95  ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.\nì\9b\90ë\9e\98ì\9d\98 ë¬¸ì\84\9cë\8a\94 ì\83\88 ë¬¸ì\84\9cë¡\9c ë\84\98겨주ë\8a\94 ë§\81í\81¬ë¡\9cë§\8c ë\82¨ê²\8c ë\90©ë\8b\88ë\8b¤.\n[[Special:DoubleRedirects|ì\9d´ì¤\91 ë\84\98겨주기]]ì\99\80 [[Special:BrokenRedirects|ë\81\8a긴 ë\84\98겨주기]]를 í\99\95ì\9d¸í\95´ì£¼ì\84¸ì\9a\94.\në\8b¹ì\8b ì\9d\80 ë§\81í\81¬ì\99\80 ê°\80리í\82¤ë\8a\94 ë\8c\80ì\83\81ì\9d´ ì\84\9cë¡\9c ì\9d¼ì¹\98í\95\98ë\8f\84ë¡\9d í\95´ì\95¼ í\95  ì±\85ì\9e\84ì\9d´ ì\9e\88ì\8aµë\8b\88ë\8b¤.\n\në§\8cì\95½ ì\9d´ë¯¸ ì\9e\88ë\8a\94 ë¬¸ì\84\9cì\9d\98 ì\9d´ë¦\84ì\9d\84 ì\83\88 ì\9d´ë¦\84ì\9c¼ë¡\9c ì\9e\85ë ¥í\96\88ì\9d\84 ë\95\8cë\8a\94 ê·¸ ë¬¸ì\84\9cê°\80 ë\84\98겨주기 ë¬¸ì\84\9cì\9d´ê³  ë¬¸ì\84\9c ì\97­ì\82¬ê°\80 ì\97\86ì\96´ì\95¼ë§\8c ì\9d´ë\8f\99ì\9d´ ë\90©ë\8b\88ë\8b¤. ê·¸ë \87ì§\80 ì\95\8aì\9d\84 ê²½ì\9a°ì\97\90ë\8a\94 ì\9d´ë\8f\99ë\90\98ì§\80 <strong>ì\95\8aì\8aµë\8b\88ë\8b¤</strong>.\nì\9d´ê²\83ì\9d\80 ì\8b¤ì\88\98ë¡\9c ì\98®ê¸´ 문서를 되돌릴 수는 있지만, 이미 존재하는 문서 위에 덮어씌울 수는 없다는 것을 의미합니다.\n\n<strong>주의!</strong>\n자주 사용하는 문서를 이동하면 해결하기 어려운 문제를 일으킬 수도 있습니다.\n이동하기 전에 반드시 이 문서를 이동해도 문제가 없는지 확인해주세요.",
+       "movepagetext": "ì\95\84ë\9e\98 ì\96\91ì\8b\9dì\9d\84 ì±\84ì\9b\8c ë¬¸ì\84\9cì\9d\98 ì\9d´ë¦\84ì\9d\84 ë°\94꾸고 ëª¨ë\93  ì\97­ì\82¬ë¥¼ ì\83\88 ì\9d´ë¦\84ì\9c¼ë¡\9c ë\90\9c ë¬¸ì\84\9cë¡\9c ì\9d´ë\8f\99í\95  수 있습니다.\n원래의 문서는 새 문서로 넘겨주는 링크로만 남게 되고,\n원래 이름을 가리키는 넘겨주기는 자동으로 갱신됩니다.\n만약 이 설정을 선택하지 않았다면 [[Special:DoubleRedirects|이중 넘겨주기]]와 [[Special:BrokenRedirects|끊긴 넘겨주기]]를 확인해주세요.\n당신은 링크와 가리키는 대상이 서로 일치하도록 해야 할 책임이 있습니다.\n\n만약 이미 있는 문서의 이름을 새 이름으로 입력했을 때는 그 문서가 넘겨주기 문서이고 문서 역사가 없어야만 이동이 됩니다. 그렇지 않을 경우에는 이동되지 <strong>않습니다</strong>.\n이것은 실수로 이동한 문서를 되돌릴 수는 있지만, 이미 존재하는 문서 위에 덮어씌울 수는 없다는 것을 의미합니다.\n\n<strong>주의!</strong>\n자주 사용하는 문서를 이동하면 해결하기 어려운 문제를 일으킬 수도 있습니다.\n이동하기 전에 반드시 이 문서를 이동해도 문제가 없는지 확인해주세요.",
+       "movepagetext-noredirectfixer": "ì\95\84ë\9e\98 ì\96\91ì\8b\9dì\9d\84 ì±\84ì\9b\8c ë¬¸ì\84\9cì\9d\98 ì\9d´ë¦\84ì\9d\84 ë°\94꾸고 ëª¨ë\93  ì\97­ì\82¬ë¥¼ ì\83\88 ì\9d´ë¦\84ì\9c¼ë¡\9c ë\90\9c ë¬¸ì\84\9cë¡\9c ì\9d´ë\8f\99í\95  ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.\nì\9b\90ë\9e\98ì\9d\98 ë¬¸ì\84\9cë\8a\94 ì\83\88 ë¬¸ì\84\9cë¡\9c ë\84\98겨주ë\8a\94 ë§\81í\81¬ë¡\9cë§\8c ë\82¨ê²\8c ë\90©ë\8b\88ë\8b¤.\n[[Special:DoubleRedirects|ì\9d´ì¤\91 ë\84\98겨주기]]ì\99\80 [[Special:BrokenRedirects|ë\81\8a긴 ë\84\98겨주기]]를 í\99\95ì\9d¸í\95´ì£¼ì\84¸ì\9a\94.\në\8b¹ì\8b ì\9d\80 ë§\81í\81¬ì\99\80 ê°\80리í\82¤ë\8a\94 ë\8c\80ì\83\81ì\9d´ ì\84\9cë¡\9c ì\9d¼ì¹\98í\95\98ë\8f\84ë¡\9d í\95´ì\95¼ í\95  ì±\85ì\9e\84ì\9d´ ì\9e\88ì\8aµë\8b\88ë\8b¤.\n\në§\8cì\95½ ì\9d´ë¯¸ ì\9e\88ë\8a\94 ë¬¸ì\84\9cì\9d\98 ì\9d´ë¦\84ì\9d\84 ì\83\88 ì\9d´ë¦\84ì\9c¼ë¡\9c ì\9e\85ë ¥í\96\88ì\9d\84 ë\95\8cë\8a\94 ê·¸ ë¬¸ì\84\9cê°\80 ë\84\98겨주기 ë¬¸ì\84\9cì\9d´ê³  ë¬¸ì\84\9c ì\97­ì\82¬ê°\80 ì\97\86ì\96´ì\95¼ë§\8c ì\9d´ë\8f\99ì\9d´ ë\90©ë\8b\88ë\8b¤. ê·¸ë \87ì§\80 ì\95\8aì\9d\84 ê²½ì\9a°ì\97\90ë\8a\94 ì\9d´ë\8f\99ë\90\98ì§\80 <strong>ì\95\8aì\8aµë\8b\88ë\8b¤</strong>.\nì\9d´ê²\83ì\9d\80 ì\8b¤ì\88\98ë¡\9c ì\9d´ë\8f\99í\95\9c 문서를 되돌릴 수는 있지만, 이미 존재하는 문서 위에 덮어씌울 수는 없다는 것을 의미합니다.\n\n<strong>주의!</strong>\n자주 사용하는 문서를 이동하면 해결하기 어려운 문제를 일으킬 수도 있습니다.\n이동하기 전에 반드시 이 문서를 이동해도 문제가 없는지 확인해주세요.",
        "movepagetalktext": "이 칸에 체크하면, 딸린 토론 문서가 자동으로 이동됩니다. 다만 비어있지 않은 토론 문서가 있다면 이동되지 않습니다.\n\n이러한 경우에는 수동으로 이동하거나 합쳐야 합니다.",
        "moveuserpage-warning": "<strong>경고:</strong> 사용자 문서를 이동하려고 하고 있습니다. 사용자 문서만 이동되며 사용자 이름이 바뀌지 <strong>않는다</strong>는 점을 참고하세요.",
        "movecategorypage-warning": "<strong>경고:</strong> 분류 문서를 이동하려고 합니다. 해당 문서만 이동되고 옛 분류에 있는 문서는 새 분류 안에 다시 분류되지 <em>않음</em>을 참고하세요.",
        "movenologintext": "문서를 이동하려면 [[Special:UserLogin|로그인]]해야 합니다.",
-       "movenotallowed": "문ì\84\9c를 ì\98®ê¸¸ 권한이 없습니다.",
-       "movenotallowedfile": "í\8c\8cì\9d¼ì\9d\84 ì\98®ê¸¸ 권한이 없습니다.",
-       "cant-move-user-page": "ì\82¬ì\9a©ì\9e\90 ë¬¸ì\84\9c를 ì\98®ê¸¸ 권한이 없습니다 (하위 문서는 예외).",
-       "cant-move-to-user-page": "문ì\84\9c를 ì\82¬ì\9a©ì\9e\90 ë¬¸ì\84\9cë¡\9c ì\98®ê¸¸ 권한이 없습니다 (하위 문서는 예외).",
-       "cant-move-category-page": "ë¶\84ë¥\98 ë¬¸ì\84\9c를 ì\98®ê¸¸ 권한이 없습니다.",
-       "cant-move-to-category-page": "문ì\84\9c를 ë¶\84ë¥\98 ë¬¸ì\84\9cë¡\9c ì\98®ê¸¸ 권한이 없습니다.",
+       "movenotallowed": "문ì\84\9c를 ì\9d´ë\8f\99í\95  권한이 없습니다.",
+       "movenotallowedfile": "í\8c\8cì\9d¼ì\9d\84 ì\9d´ë\8f\99í\95  권한이 없습니다.",
+       "cant-move-user-page": "ì\82¬ì\9a©ì\9e\90 ë¬¸ì\84\9c를 ì\9d´ë\8f\99í\95  권한이 없습니다 (하위 문서는 예외).",
+       "cant-move-to-user-page": "문ì\84\9c를 ì\82¬ì\9a©ì\9e\90 ë¬¸ì\84\9cë¡\9c ì\9d´ë\8f\99í\95  권한이 없습니다 (하위 문서는 예외).",
+       "cant-move-category-page": "ë¶\84ë¥\98 ë¬¸ì\84\9c를 ì\9d´ë\8f\99í\95  권한이 없습니다.",
+       "cant-move-to-category-page": "문ì\84\9c를 ë¶\84ë¥\98 ë¬¸ì\84\9cë¡\9c ì\9d´ë\8f\99í\95  권한이 없습니다.",
        "newtitle": "새 제목:",
        "move-watch": "원래 문서와 대상 문서를 주시하기",
        "movepagebtn": "문서 이동",
        "movepage-moved-redirect": "넘겨주기 문서를 만들었습니다.",
        "movepage-moved-noredirect": "넘겨주기 문서를 남기지 않았습니다.",
        "articleexists": "문서가 이미 존재하거나 이름이 올바르지 않습니다.\n다른 이름을 선택하세요.",
-       "cantmove-titleprotected": "ì\83\88ë¡\9cì\9a´ ì \9c목ì\9c¼ë¡\9c ë¬¸ì\84\9c를 ë§\8cë\93\9cë\8a\94 ê²\83ì\9d´ ê¸\88ì§\80ë\90\98ì\96´ ì\9e\88ì\96´ ë¬¸ì\84\9c를 ì\98®ê¸¸ ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤",
+       "cantmove-titleprotected": "ì\83\88ë¡\9cì\9a´ ì \9c목ì\9c¼ë¡\9c ë¬¸ì\84\9c를 ë§\8cë\93\9cë\8a\94 ê²\83ì\9d´ ê¸\88ì§\80ë\90\98ì\96´ ì\9e\88ì\96´ ë¬¸ì\84\9c를 ì\9d´ë\8f\99í\95  ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤.",
        "movetalk": "딸린 토론 문서도 이동하기",
        "move-subpages": "하위 문서도 이동 ($1개까지)",
        "move-talk-subpages": "토론 문서의 하위 문서도 이동하기 ($1개까지)",
        "movepage-page-exists": "$1 문서가 이미 존재하므로 자동으로 덮어쓸 수 없습니다.",
        "movepage-page-moved": "\"$1\" 문서를 \"$2\" 문서로 이동했습니다.",
-       "movepage-page-unmoved": "$1 ë¬¸ì\84\9c를 $2 ë¬¸ì\84\9cë¡\9c ì\98®ê¸¸ 수 없습니다.",
+       "movepage-page-unmoved": "$1 ë¬¸ì\84\9c를 $2 ë¬¸ì\84\9cë¡\9c ì\9d´ë\8f\99í\95  수 없습니다.",
        "movepage-max-pages": "{{PLURAL:$1|문서}}를 최대 $1개 이동했으며 나머지 문서는 자동으로 이동하지 않습니다.",
        "movelogpage": "이동 기록",
-       "movelogpagetext": "ì\95\84ë\9e\98ë\8a\94 ì\98®ê²¨ì§\84 모든 문서의 목록입니다.",
+       "movelogpagetext": "ì\95\84ë\9e\98ë\8a\94 ì\9d´ë\8f\99ë\90\9c 모든 문서의 목록입니다.",
        "movesubpage": "{{PLURAL:$1|하위 문서}}",
        "movesubpagetext": "이 문서에는 다음 {{PLURAL:$1|하위 문서}} $1개가 있습니다.",
        "movenosubpage": "이 문서에는 하위 문서가 존재하지 않습니다.",
        "delete_and_move_text": "== 삭제 필요 ==\n이동하려는 제목으로 된 \"[[:$1]]\" 문서가 이미 존재합니다.\n삭제하고 이동할까요?",
        "delete_and_move_confirm": "네. 문서를 삭제합니다",
        "delete_and_move_reason": "\"[[$1]]\"에서 문서를 이동하기 위해 삭제함",
-       "selfmove": "ì\9b\90ë\9e\98 ì \9c목과 ì\9d´ë\8f\99í\95\98ë ¤ë\8a\94 ì \9c목ì\9d´ ê°\99ì\8aµë\8b\88ë\8b¤.\nê°\99ì\9d\80 ì \9c목ì\9c¼ë¡\9cë\8a\94 ë¬¸ì\84\9c룰 ì\98®ê¸¸ 수 없습니다.",
+       "selfmove": "ì\9b\90ë\9e\98 ì \9c목과 ì\9d´ë\8f\99í\95\98ë ¤ë\8a\94 ì \9c목ì\9d´ ê°\99ì\8aµë\8b\88ë\8b¤.\nê°\99ì\9d\80 ì \9c목ì\9c¼ë¡\9cë\8a\94 ë¬¸ì\84\9c룰 ì\9d´ë\8f\99í\95  수 없습니다.",
        "immobile-source-namespace": "\"$1\" 이름공간에 속한 문서는 이동시킬 수 없습니다.",
        "immobile-target-namespace": "\"$1\" 이름공간에 속한 문서는 이동시킬 수 없습니다.",
-       "immobile-target-namespace-iw": "ì\9d¸í\84°ì\9c\84í\82¤ ë§\81í\81¬ë¥¼ ë\84\98ì\96´ ë¬¸ì\84\9c를 ì\98®ê¸¸ 수 없습니다.",
-       "immobile-source-page": "ì\9d´ ë¬¸ì\84\9cë\8a\94 ì\98®ê¸¸ 수 없습니다.",
-       "immobile-target-page": "새 이름으로 옮길 수 없습니다.",
+       "immobile-target-namespace-iw": "ì\9d¸í\84°ì\9c\84í\82¤ ë§\81í\81¬ë¥¼ ë\84\98ì\96´ ë¬¸ì\84\9c를 ì\9d´ë\8f\99í\95  수 없습니다.",
+       "immobile-source-page": "ì\9d´ ë¬¸ì\84\9cë\8a\94 ì\9d´ë\8f\99í\95  수 없습니다.",
+       "immobile-target-page": "목표 제목으로 이동할 수 없습니다.",
        "bad-target-model": "원하는 대상은 다른 내용 모델을 사용합니다. $1에서 $2로 변환할 수 없습니다.",
-       "imagenocrossnamespace": "í\8c\8cì\9d¼ì\9d\84 í\8c\8cì\9d¼ì\9d´ ì\95\84ë\8b\8c ì\9d´ë¦\84ê³µê°\84ì\9c¼ë¡\9c ì\98®ê¸¸ 수 없습니다.",
-       "nonfile-cannot-move-to-file": "í\8c\8cì\9d¼ì\9d´ ì\95\84ë\8b\8c ë¬¸ì\84\9c를 í\8c\8cì\9d¼ ì\9d´ë¦\84ê³µê°\84ì\9c¼ë¡\9c ì\98®ê¸¸ 수 없습니다.",
+       "imagenocrossnamespace": "í\8c\8cì\9d¼ì\9d\84 í\8c\8cì\9d¼ì\9d´ ì\95\84ë\8b\8c ì\9d´ë¦\84ê³µê°\84ì\9c¼ë¡\9c ì\9d´ë\8f\99í\95  수 없습니다.",
+       "nonfile-cannot-move-to-file": "í\8c\8cì\9d¼ì\9d´ ì\95\84ë\8b\8c ë¬¸ì\84\9c를 í\8c\8cì\9d¼ ì\9d´ë¦\84ê³µê°\84ì\9c¼ë¡\9c ì\9d´ë\8f\99í\95  수 없습니다.",
        "imagetypemismatch": "새 파일의 확장자가 원래의 확장자와 일치하지 않습니다.",
        "imageinvalidfilename": "새 파일 이름이 잘못되었습니다.",
        "fix-double-redirects": "원래 제목을 가리키는 넘겨주기를 새로 고침",
-       "move-leave-redirect": "ì\98®ê¸´ 뒤 넘겨주기를 남기기",
+       "move-leave-redirect": "ì\9d´ë\8f\99í\95\9c 뒤 넘겨주기를 남기기",
        "protectedpagemovewarning": "<strong>경고:</strong> 이 문서는 관리자만 이동할 수 있도록 보호되어 있습니다.\n최근 기록을 참조를 위해 아래에 제공합니다:",
        "semiprotectedpagemovewarning": "<strong>참고:</strong> 이 문서는 등록된 사용자만이 이동할 수 있도록 보호되어 있습니다.\n최근 기록 내용이 참조를 위해 아래에 제공됩니다:",
        "move-over-sharedrepo": "== 파일이 존재함 ==\n[[:$1]] 파일이 공용 저장소에 있습니다. 이 이름으로 파일을 이동하면 공용의 파일을 덮어쓰게 될 것입니다.",
        "tooltip-pt-anontalk": "현재 사용하는 IP 주소에 대한 토론 문서",
        "tooltip-pt-preferences": "{{GENDER:|사용자}} 환경 설정",
        "tooltip-pt-watchlist": "주시문서에 대한 바뀜 목록",
-       "tooltip-pt-mycontris": "{{GENDER:|내}} 기여 목록",
+       "tooltip-pt-mycontris": "{{GENDER:|내}} 기여 목록",
        "tooltip-pt-anoncontribs": "이 IP 주소의 편집 목록",
        "tooltip-pt-login": "꼭 로그인해야 하는 것은 아니지만, 로그인을 권장합니다.",
        "tooltip-pt-logout": "로그아웃",
        "anonymous": "{{SITENAME}} 익명 {{PLURAL:$1|사용자}}",
        "siteuser": "{{SITENAME}} 사용자 $1",
        "anonuser": "{{SITENAME}} 익명 사용자 $1",
-       "lastmodifiedatby": "이 문서는 $3 사용자가 $1 $2에 마지막으로 바꾸었습니다.",
+       "lastmodifiedatby": "이 문서는 $3님이 $1 $2에 마지막으로 바꾸었습니다.",
        "othercontribs": "$1의 작업을 바탕으로 합니다.",
        "others": "기타",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|사용자}}}} $1",
        "spamprotectiontext": "스팸 필터가 문서 저장을 막았습니다.\n바깥 사이트로 연결하는 링크 중에 블랙리스트에 포함된 사이트가 있을 것입니다.",
        "spamprotectionmatch": "문제가 되는 부분은 다음과 같습니다: $1",
        "spambot_username": "미디어위키 스팸 정리",
-       "spam_reverting": "$1(을)를 포함하지 않는 최신 버전으로 되돌림",
+       "spam_reverting": "$1에 대한 링크를 포함하지 않는 최신 버전으로 되돌림",
        "spam_blanking": "모든 버전에 $1 링크를 포함하고 있어 차단함",
        "spam_deleting": "모든 버전에 $1 링크를 포함하고 있어 삭제함",
        "simpleantispam-label": "스팸 방지 검사입니다.\n이것을 입력하지 <strong>마세요</strong>!",
        "confirmemail_success": "이메일 주소가 인증되었습니다.\n이제 [[Special:UserLogin|로그인]]해서 위키를 사용하세요.",
        "confirmemail_loggedin": "이메일 주소가 인증되었습니다.",
        "confirmemail_subject": "{{SITENAME}} 이메일 주소 인증",
-       "confirmemail_body": "$1 IP 주소를 사용하는 사용자가\n{{SITENAME}}의 \"$2\" 계정에 이메일 인증 신청을 했습니다.\n\n이 계정이 당신의 계정이고 {{SITENAME}}에서 이메일 기능을 활성화하려면\n아래 주소를 열어서 이메일 인증을 해 주세요:\n\n$3\n\n당신의 계정이 아니라면,\n이메일 인증 신청을 취소하기 위해 아래의 주소를 열어주세요:\n\n$5\n\n인증 코드는 $4에 만료됩니다.",
-       "confirmemail_body_changed": "$1 IP 주소를 사용하는 사용자가\n{{SITENAME}}의 \"$2\" 계정의 이메일 주소를 바꾸었습니다.\n\n이 계정이 당신의 계정이고 {{SITENAME}}에서 이메일 기능을 활성화하려면\n아래 주소를 열어서 이메일 인증을 해 주세요:\n\n$3\n\n당신의 계정이 아니라면,\n이메일 인증 신청을 취소하기 위해 아래의 주소를 열어주세요:\n\n$5\n\n인증 코드는 $4에 만료됩니다.",
-       "confirmemail_body_set": "$1 IP 주소를 사용하는 사용자가\n{{SITENAME}}의 \"$2\" 계정의 이메일 주소를 지정하였습니다.\n\n이 계정이 당신의 계정이고 {{SITENAME}}에서 이메일 기능을\n활성화하려면 아래 주소를 열어서 이메일 인증을 해 주세요:\n\n$3\n\n당신의 계정이 아니라면,\n이메일 인증 신청을 취소하기 위해 아래의 주소를 열어주세요:\n\n$5\n\n인증 코드는 $4에 만료됩니다.",
+       "confirmemail_body": "당신일 수도 있는 $1 IP 주소를 사용하는 사용자가\n{{SITENAME}}의 \"$2\" 계정에 이메일 인증 신청을 했습니다.\n\n이 계정이 당신의 계정이고 {{SITENAME}}에서 이메일 기능을 활성화하려면\n아래 주소를 열어서 이메일 인증을 해 주세요:\n\n$3\n\n당신의 계정이 아니라면,\n이메일 인증 신청을 취소하기 위해 아래의 주소를 열어주세요:\n\n$5\n\n인증 코드는 $4에 만료됩니다.",
+       "confirmemail_body_changed": "당신일 수도 있는 $1 IP 주소를 사용하는 사용자가\n{{SITENAME}}의 \"$2\" 계정의 이메일 주소를 바꾸었습니다.\n\n이 계정이 당신의 계정이고 {{SITENAME}}에서 이메일 기능을 활성화하려면\n아래 주소를 열어서 이메일 인증을 해 주세요:\n\n$3\n\n당신의 계정이 아니라면,\n이메일 인증 신청을 취소하기 위해 아래의 주소를 열어주세요:\n\n$5\n\n인증 코드는 $4에 만료됩니다.",
+       "confirmemail_body_set": "당신일 수도 있는 $1 IP 주소를 사용하는 사용자가\n{{SITENAME}}의 \"$2\" 계정의 이메일 주소를 지정하였습니다.\n\n이 계정이 당신의 계정이고 {{SITENAME}}에서 이메일 기능을\n활성화하려면 아래 주소를 열어서 이메일 인증을 해 주세요:\n\n$3\n\n당신의 계정이 아니라면,\n이메일 인증 신청을 취소하기 위해 아래의 주소를 열어주세요:\n\n$5\n\n인증 코드는 $4에 만료됩니다.",
        "confirmemail_invalidated": "이메일 확인이 취소됨",
        "invalidateemail": "이메일 확인 취소",
        "notificationemail_subject_changed": "{{SITENAME}}의 등록된 이메일 주소가 변경되었습니다",
        "notificationemail_subject_removed": "{{SITENAME}}의 등록된 이메일 주소가 제거되었습니다",
-       "notificationemail_body_changed": "IP 주소 $1에 속하는 누군가가 {{SITENAME}}의 사용자 \"$2\" 계정의 이메일 주소를 \"$3\"으로 변경하였습니다.\n\n지금 이 글을 보고 계신 사용자로 추정되지만 만약 본인이 아닌 경우, 지금 바로 사이트 관리자에게 문의하십시오.",
-       "notificationemail_body_removed": "IP 주소 $1에 속하는 누군가가 {{SITENAME}}의 사용자 \"$2\" 계정의 이메일 주소를 제거하였습니다.\n\n지금 이 글을 보고 계신 사용자로 추정되지만 만약 본인이 아닌 경우, 지금 바로 사이트 관리자에게 문의하십시오.",
+       "notificationemail_body_changed": "당신일 수도 있는 IP 주소 $1에 속하는 사용자가\n{{SITENAME}}의 사용자 \"$2\" 계정의 이메일 주소를 \"$3\"(으)로 바꾸었습니다.\n\n지금 이 글을 보고 계신 사용자로 추정되지만 만약 본인이 아닌 경우, 지금 바로 사이트 관리자에게 문의하십시오.",
+       "notificationemail_body_removed": "당신일 수도 있는 IP 주소 $1에 속하는 사용자가 {{SITENAME}}의 사용자 \"$2\" 계정의 이메일 주소를 제거하였습니다.\n\n지금 이 글을 보고 계신 사용자로 추정되지만 만약 본인이 아닌 경우, 지금 바로 사이트 관리자에게 문의하십시오.",
        "scarytranscludedisabled": "[인터위키가 비활성되어 있습니다]",
        "scarytranscludefailed": "[$1 틀을 불러오는 데에 실패했습니다]",
        "scarytranscludefailed-httpstatus": "[$1 틀을 가져오는 데 실패했습니다: HTTP $2]",
        "table_pager_limit_submit": "확인",
        "table_pager_empty": "결과 없음",
        "autosumm-blank": "문서를 비움",
-       "autosumm-replace": "문ì\84\9c ë\82´ì\9a©ì\9d\84 \"$1\"ì\9c¼로 바꿈",
+       "autosumm-replace": "ë\82´ì\9a©ì\9d\84 \"$1\"(ì\9c¼)로 바꿈",
        "autoredircomment": "[[$1]] 문서로 넘겨주기",
        "autosumm-new": "새 문서: $1",
        "autosumm-newblank": "빈 문서를 만듦",
        "watchlistedit-clear-submit": "주시목록 문서 지우기 (이는 영구적입니다!)",
        "watchlistedit-clear-done": "주시문서 목록을 지웠습니다.",
        "watchlistedit-clear-removed": "{{PLURAL:$1|문서 1개|문서 $1개}}를 제거했습니다:",
-       "watchlistedit-too-many": "여기에 보여질 문서가 너무 많습니다.",
+       "watchlistedit-too-many": "여기에 표시할 문서가 너무 많습니다.",
        "watchlisttools-clear": "주시문서 목록 비우기",
        "watchlisttools-view": "주시문서 최근 바뀜",
        "watchlisttools-edit": "주시문서 목록 보기/편집하기",
        "version-ext-colheader-license": "라이선스",
        "version-ext-colheader-description": "설명",
        "version-ext-colheader-credits": "저자",
-       "version-license-title": "$1ì\9a© ë\9d¼ì\9d´ì\84¼스",
+       "version-license-title": "$1ì\9a© ë\9d¼ì\9d´ì\84 스",
        "version-license-not-found": "이 확장 기능에 대한 자세한 라이선스 정보가 없습니다.",
        "version-credits-title": "$1의 작성자",
        "version-credits-not-found": "이 확장 기능에 대한 자세한 제작진 정보가 없습니다.",
        "specialpages-group-developer": "개발자 도구",
        "blankpage": "빈 문서",
        "intentionallyblankpage": "일부러 비워 둔 문서입니다.",
-       "external_image_whitelist": " #ì\9d´ ì¤\84ì\9d\80 ê·¸ë\8c\80ë¡\9c ë\91\90ì\8b­ì\8b\9cì\98¤<pre>\n#ì \95ê·\9c í\91\9cí\98\84ì\8b\9d(// ì\82¬ì\9d´ì\97\90 ì\9e\88ë\8a\94 ë¶\80ë¶\84\9d\84 ì\95\84ë\9e\98ì\97\90 ì\9e\85ë ¥í\95\98ì\84¸ì\9a\94.\n#ì\9d´ ëª©ë¡\9dì\9d\80 ë°\94ê¹¥ ê·¸ë¦¼ì\9d\98 URLê³¼ ë\8c\80ì¡°í\95  ê²\83ì\9e\85ë\8b\88ë\8b¤.\n#ì\9d´ ëª©ë¡\9dê³¼ ì\9d¼ì¹\98í\95\98ë\8a\94 ê²\83ì\9d\80 ê·¸ë¦¼ì\9d´ ì§\81ì \91 ë³´ì\97¬ì§\80지만, 그렇지 않은 경우 그림을 가리키는 링크만 보이게 될 것입니다.\n#\"#\" 문자에서 줄의 끝까지는 주석입니다\n#이 목록은 대소문자를 구별하지 않습니다\n\n#모든 정규 표현식은 이 줄 위에 넣어 주십시오. 그리고 이 줄은 그대로 두십시오.</pre>",
+       "external_image_whitelist": " #ì\9d´ ì¤\84ì\9d\80 ê·¸ë\8c\80ë¡\9c ë\91\90ì\8b­ì\8b\9cì\98¤<pre>\n#ì \95ê·\9c í\91\9cí\98\84ì\8b\9d(// ì\82¬ì\9d´ì\97\90 ì\9e\88ë\8a\94 ë¶\80ë¶\84\9d\84 ì\95\84ë\9e\98ì\97\90 ì\9e\85ë ¥í\95\98ì\84¸ì\9a\94.\n#ì\9d´ ëª©ë¡\9dì\9d\80 ë°\94ê¹¥ ê·¸ë¦¼ì\9d\98 URLê³¼ ë\8c\80ì¡°í\95  ê²\83ì\9e\85ë\8b\88ë\8b¤.\n#ì\9d´ ëª©ë¡\9dê³¼ ì\9d¼ì¹\98í\95\98ë\8a\94 ê²\83ì\9d\80 ê·¸ë¦¼ì\9c¼ë¡\9c í\91\9cì\8b\9cë\90\98지만, 그렇지 않은 경우 그림을 가리키는 링크만 보이게 될 것입니다.\n#\"#\" 문자에서 줄의 끝까지는 주석입니다\n#이 목록은 대소문자를 구별하지 않습니다\n\n#모든 정규 표현식은 이 줄 위에 넣어 주십시오. 그리고 이 줄은 그대로 두십시오.</pre>",
        "tags": "올바른 편집 태그",
        "tag-filter": "[[Special:Tags|태그]] 필터:",
        "tag-filter-submit": "필터",
        "logentry-suppress-delete": "$1님이 $3 문서를 {{GENDER:$2|숨겼습니다}}",
        "logentry-suppress-event": "$1님이 비공개적으로 $3의 {{PLURAL:$5|기록 $5개}}에 대해 보이기 설정을 {{GENDER:$2|바꾸었습니다}}: $4",
        "logentry-suppress-revision": "$1님이 비공개적으로 $3 문서의 {{PLURAL:$5|판 $5개}}에 대해 보이기 설정을 {{GENDER:$2|바꾸었습니다}}: $4",
-       "logentry-suppress-event-legacy": "$1님이 비공개적으로 $3의 항목에 대한 보이기 설정을 {{GENDER:$2|바꾸었습니다}}",
+       "logentry-suppress-event-legacy": "$1님이 비공개적으로 $3의 기록 항목에 대한 보이기 설정을 {{GENDER:$2|바꾸었습니다}}",
        "logentry-suppress-revision-legacy": "$1님이 비공개적으로 $3 문서의 특정 판에 대한 보이기 설정을 {{GENDER:$2|바꾸었습니다}}",
        "revdelete-content-hid": "내용 숨겨짐",
        "revdelete-summary-hid": "편집 요약 숨겨짐",
        "revdelete-unrestricted": "관리자에 대한 제한을 해제함",
        "logentry-block-block": "$1님이 {{GENDER:$4|$3}}님을 $5 {{GENDER:$2|차단했습니다}} $6",
        "logentry-block-unblock": "$1님이 {{GENDER:$4|$3}} 사용자의 {{GENDER:$2|차단을 해제했습니다}}",
-       "logentry-block-reblock": "$1 님이 {{GENDER:$4|$3}} 사용자의 차단 기간을 $5 설정으로 {{GENDER:$2|바꾸었습니다}} $6",
+       "logentry-block-reblock": "$1님이 {{GENDER:$4|$3}}님의 차단 기간을 $5 설정으로 {{GENDER:$2|바꾸었습니다}} $6",
        "logentry-suppress-block": "$1님이 {{GENDER:$4|$3}} 사용자를 $5 {{GENDER:$2|차단했습니다}} $6",
-       "logentry-suppress-reblock": "$1 님이 {{GENDER:$4|$3}} 사용자의 차단 기간을 $5 설정으로 {{GENDER:$2|바꾸었습니다}} $6",
+       "logentry-suppress-reblock": "$1님이 {{GENDER:$4|$3}}님의 차단 기간을 $5 설정으로 {{GENDER:$2|바꾸었습니다}} $6",
        "logentry-import-upload": "$1님이 $3 문서를 파일 올리기로 {{GENDER:$2|가져왔습니다}}",
        "logentry-import-upload-details": "$1님이 $3 문서 ({{PLURAL:$4|판}} $4개)를 파일 올리기로 {{GENDER:$2|가져왔습니다}}",
        "logentry-import-interwiki": "$1님이 $3 문서를 다른 위키에서 {{GENDER:$2|가져왔습니다}}",
        "logentry-protect-protect-cascade": "$1님이 $3 문서를 {{GENDER:$2|보호했습니다}} $4 [연쇄적]",
        "logentry-protect-modify": "$1님이 $3 문서의 보호 수준을 {{GENDER:$2|바꾸었습니다}} $4",
        "logentry-protect-modify-cascade": "$1님이 $3 문서의 보호 수준을 {{GENDER:$2|바꾸었습니다}} $4 [연쇄적]",
-       "logentry-rights-rights": "$1님이 $3 사용자의 권한을 $4에서 $5(으)로 {{GENDER:$2|바꾸었습니다}}",
+       "logentry-rights-rights": "$1님이 {{GENDER:$6|$3}}님의 권한을 $4에서 $5(으)로 {{GENDER:$2|바꾸었습니다}}",
        "logentry-rights-rights-legacy": "$1님이 $3 사용자의 권한을 {{GENDER:$2|바꾸었습니다}}",
        "logentry-rights-autopromote": "$1님이 권한을 자동적으로 $4에서 $5으로 {{GENDER:$2|바꾸었습니다}}",
        "logentry-upload-upload": "$1님이 $3 파일을 {{GENDER:$2|올렸습니다}}",
        "log-name-managetags": "태그 관리 기록",
        "log-description-managetags": "이 문서는 [[Special:Tags|태그]]에 관한 관리 작업의 목록입니다. 이 기록에는 관리자가 직접 실행한 동작만이 기록되며, 위키 소프트웨어에 의해 태그가 생성 및 삭제되는 경우는 기록되지 않습니다.",
        "logentry-managetags-create": "$1님이 \"$4\" 태그를 {{GENDER:$2|만들었습니다}}",
-       "logentry-managetags-delete": "$1ë\8b\98ì\9d´ \"$4\" í\83\9c그를 ì\82­ì \9cí\95\98ì\98\80습니다 ($5개 {{PLURAL:$5|판 및 기록}}에서 {{GENDER:$2|제거되었습니다}})",
+       "logentry-managetags-delete": "$1ë\8b\98ì\9d´ \"$4\" í\83\9c그를 ì\82­ì \9cí\96\88습니다 ($5개 {{PLURAL:$5|판 및 기록}}에서 {{GENDER:$2|제거되었습니다}})",
        "logentry-managetags-activate": "$1님이 \"$4\" 태그를 사용자나 봇이 사용하도록 {{GENDER:$2|활성화시켰습니다}}",
        "logentry-managetags-deactivate": "$1님이 \"$4\" 태그를 사용자나 봇이 사용하지 못하도록 {{GENDER:$2|비활성화시켰습니다}}",
        "log-name-tag": "태그 기록",
        "api-error-ratelimited": "짧은 시간 안에 위키가 허용하는 것 보다 더 많은 파일을 업로드하려고 합니다.\n몇 분 뒤에 다시 시도해 주십시오.",
        "api-error-stashfailed": "내부 오류: 서버가 임시 파일을 저장하지 못했습니다.",
        "api-error-publishfailed": "내부 오류: 서버가 임시 파일을 게시하지 못했습니다.",
-       "api-error-stasherror": "파일을 안전한 곳으로 업로드 하는 동안 오류가 발생했습니다.",
+       "api-error-stasherror": "파일을 미공개 위치로 업로드하는 동안 오류가 발생했습니다.",
        "api-error-stashedfilenotfound": "임시 저장된 파일이 임시 저장소에서 올리려고 했을 때 찾을 수 없었습니다.",
        "api-error-stashpathinvalid": "임시 저장된 파일이 존재해야 할 경로에 유효한 파일이 없습니다.",
        "api-error-stashfilestorage": "파일을 임시 저장하는 동안 오류가 발생했습니다.",
        "limitreport-expansiondepth": "최대 전개 깊이",
        "limitreport-expensivefunctioncount": "부하 높은 파서 함수 수",
        "expandtemplates": "틀 전개",
-       "expand_templates_intro": "이 특수 문서는 글의 모든 틀을 끝까지 풀어 줍니다.\n<code><nowiki>{{</nowiki>#language:…}}</code> 같은 파서 함수나\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code> 같은 변수를 풀어줍니다.\n사실 두개의 중괄호 사이에 있는 것은 거의 모두 풀어줍니다.",
+       "expand_templates_intro": "이 특수 문서는 글의 모든 틀을 끝까지 풀어 줍니다.\n<code><nowiki>{{</nowiki>#language:…}}</code> 같은 파서 함수나\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code> 같은 변수를 풀어줍니다.\n사실 두 개의 중괄호 사이에 있는 것은 거의 모두 풀어줍니다.",
        "expand_templates_title": "문서 이름 ({{FULLPAGENAME}} 등):",
        "expand_templates_input": "전개할 내용:",
        "expand_templates_output": "결과",
        "log-name-pagelang": "언어 바꾸기 기록",
        "log-description-pagelang": "문서 언어를 바꾼 기록입니다.",
        "logentry-pagelang-pagelang": "$1님이 $3의 언어를 $4에서 $5로 {{GENDER:$2|바꾸었습니다}}",
-       "default-skin-not-found": "이런! 당신의 위키에 <code dir=\"ltr\">$wgDefaultSkin</code>에 <code>$1</code>(으)로 지정한 기본 스킨은 사용할 수 없습니다.\n\n설치에는 다음 {{PLURAL:$4|스킨}}이 포함된 것으로 보입니다. 스킨을 활성화{{PLURAL:$4||하고 기본값으로 선택}}하는 방법에 대한 정보에 대해서는 [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: 스킨 설정]을 보세요.\n\n$2\n\n; 미디어위키를 설치했다면:\n: 아마 git에서 설치했거나, 어떤 다른 방법을 사용하여 직접 설치했을 수 있을 것으로 봅니다. [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org의 스킨 디렉터리]에서 어떤 스킨을 설치해보세요:\n:* 여러 스킨과 확장 기능이 들어 있는 [https://www.mediawiki.org/wiki/Download tarball 설치 관리자]를 다운로드하세요. 거기서 <code>skins/</code> 디렉터리를 복사하여 붙여 넣을 수 있습니다.\n:* [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org]에서 개별 스킨 tarball을 다운로드하세요.\n:* 미디어위키 설치의 <code dir=\"ltr\">skins/</code> 디렉터리 안에 git를 통해 <code>mediawiki/skins/*</code> 저장소 중 하나를 복제하세요.\n: 당신이 미디어위키 개발자이면 당신의 git 저장소를 방해하면 안됩니다.\n\n; 미디어위키를 업그레이드했다면:\n: 미디어위키 1.24와 새 버전은 더 이상 설치된 스킨을 자동으로 활성화하지 않습니다 ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: 스킨 자동발견]을 보세요). 현재 설치된 {{PLURAL:$5|스킨|모든 스킨}}을 활성화하려면 <code>LocalSettings.php</code> 안에 다음 {{PLURAL:$5|줄}}을 붙여 넣을 수 있습니다:\n\n<pre dir=\"ltr\">$3</pre>\n\n; <code>LocalSettings.php</code>를 수정했다면:\n: 스킨 이름에 오타가 났는지 다시 확인하세요.",
-       "default-skin-not-found-no-skins": "이런! 당신의 위키에 <code dir=\"ltr\">$wgDefaultSkin</code>에 <code>$1</code>(으)로 지정한 기본 스킨은 사용할 수 없습니다.\n\n설치된 스킨은 없습니다.\n\n; 미디어위키를 설치했거나 업그레이드했다면:\n: 아마 git에서 설치했거나, 어떤 다른 방법을 사용하여 직접 설치했을 수 있을 것으로 봅니다. 미디어위키 1.24와 새 버전은 주 저장소에 어떠한 스킨도 포함되어 있지 않습니다. [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org의 스킨 디렉터리]에서 어떤 스킨을 설치해보세요:\n:* 여러 스킨과 확장 기능이 들어 있는 [https://www.mediawiki.org/wiki/Download tarball 설치 관리자]를 다운로드하세요. 거기서 <code>skins/</code> 디렉터리를 복사하여 붙여 넣을 수 있습니다.\n:* [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org]에서 개별 스킨 tarball을 다운로드하세요.\n:* 미디어위키 설치의 <code dir=\"ltr\">skins/</code> 디렉터리 안에 git를 통해 <code>mediawiki/skins/*</code> 저장소 중 하나를 복제하세요.\n: 당신이 미디어위키 개발자이면 당신의 git 저장소를 방해하면 안됩니다. 스킨을 활성화하고 기본값으로 선택하는 방법에 대한 정보에 대해서는 [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: 스킨 설정]을 보세요.",
+       "default-skin-not-found": "이런! 당신의 위키에 <code dir=\"ltr\">$wgDefaultSkin</code>에 <code>$1</code>(으)로 지정한 기본 스킨은 사용할 수 없습니다.\n\n설치에는 다음 {{PLURAL:$4|스킨}}이 포함된 것으로 보입니다. 스킨을 활성화{{PLURAL:$4||하고 기본값으로 선택}}하는 방법에 대한 정보에 대해서는 [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: 스킨 설정]을 보세요.\n\n$2\n\n; 미디어위키를 설치했다면:\n: 아마 git에서 설치했거나, 어떤 다른 방법을 사용하여 직접 설치했을 수 있을 것으로 봅니다. [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org의 스킨 디렉터리]에서 어떤 스킨을 설치해보세요:\n:* 여러 스킨과 확장 기능이 들어 있는 [https://www.mediawiki.org/wiki/Download tarball 설치 관리자]를 다운로드하세요. 거기서 <code>skins/</code> 디렉터리를 복사하여 붙여 넣을 수 있습니다.\n:* [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org]에서 개별 스킨 tarball을 다운로드하세요.\n:* 미디어위키 설치의 <code dir=\"ltr\">skins/</code> 디렉터리 안에 git를 통해 <code>mediawiki/skins/*</code> 저장소 중 하나를 복제하세요.\n: 당신이 미디어위키 개발자이면 당신의 git 저장소를 방해하면 안 됩니다.\n\n; 미디어위키를 업그레이드했다면:\n: 미디어위키 1.24와 새 버전은 더 이상 설치된 스킨을 자동으로 활성화하지 않습니다 ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: 스킨 자동발견]을 보세요). 현재 설치된 {{PLURAL:$5|스킨|모든 스킨}}을 활성화하려면 <code>LocalSettings.php</code> 안에 다음 {{PLURAL:$5|줄}}을 붙여 넣을 수 있습니다:\n\n<pre dir=\"ltr\">$3</pre>\n\n; <code>LocalSettings.php</code>를 수정했다면:\n: 스킨 이름에 오타가 났는지 다시 확인하세요.",
+       "default-skin-not-found-no-skins": "이런! 당신의 위키에 <code dir=\"ltr\">$wgDefaultSkin</code>에 <code>$1</code>(으)로 지정한 기본 스킨은 사용할 수 없습니다.\n\n설치된 스킨은 없습니다.\n\n; 미디어위키를 설치했거나 업그레이드했다면:\n: 아마 git에서 설치했거나, 어떤 다른 방법을 사용하여 직접 설치했을 수 있을 것으로 봅니다. 미디어위키 1.24와 새 버전은 주 저장소에 어떠한 스킨도 포함되어 있지 않습니다. [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org의 스킨 디렉터리]에서 어떤 스킨을 설치해보세요:\n:* 여러 스킨과 확장 기능이 들어 있는 [https://www.mediawiki.org/wiki/Download tarball 설치 관리자]를 다운로드하세요. 거기서 <code>skins/</code> 디렉터리를 복사하여 붙여 넣을 수 있습니다.\n:* [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org]에서 개별 스킨 tarball을 다운로드하세요.\n:* 미디어위키 설치의 <code dir=\"ltr\">skins/</code> 디렉터리 안에 git를 통해 <code>mediawiki/skins/*</code> 저장소 중 하나를 복제하세요.\n: 당신이 미디어위키 개발자이면 당신의 git 저장소를 방해하면 안 됩니다. 스킨을 활성화하고 기본값으로 선택하는 방법에 대한 정보에 대해서는 [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: 스킨 설정]을 보세요.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (활성화)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>비활성화</strong>)",
        "mediastatistics": "미디어 통계",
        "mw-widgets-dateinput-no-date": "선택된 날짜 없음",
        "mw-widgets-titleinput-description-new-page": "문서가 존재하지 않습니다",
        "mw-widgets-titleinput-description-redirect": "$1 문서로 넘겨주기",
-       "api-error-blacklisted": "이 파일을 설명할 수 있는 다른 제목을 선택하세요.",
        "sessionmanager-tie": "여러 요청 인증 유형 결합할 수 없습니다: $1.",
        "sessionprovider-generic": "$1 세션",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "쿠키 기반 세션",
        "log-action-filter-newusers": "계정 생성 종류:",
        "log-action-filter-patrol": "점검 종류:",
        "log-action-filter-protect": "보호 종류:",
-       "log-action-filter-rights": "권한 변경 종류",
-       "log-action-filter-suppress": "숨기기 종류",
+       "log-action-filter-rights": "권한 변경 종류:",
+       "log-action-filter-suppress": "숨기기 종류:",
        "log-action-filter-upload": "업로드 종류:",
        "log-action-filter-all": "모두",
        "log-action-filter-block-block": "차단",
        "log-action-filter-upload-overwrite": "다시 업로드",
        "authmanager-authn-not-in-progress": "인증이 진행 중이 아니거나 세션 데이터를 분실했습니다. 처음부터 다시 시작해 주십시오.",
        "authmanager-authn-no-primary": "제공된 자격 증명으로 인증할 수 없습니다.",
-       "authmanager-authn-no-local-user": "자격 증명으로 이 위키의 어느 사용자로도 로그인 할 수 없습니다.",
+       "authmanager-authn-no-local-user": "자격 증명으로 이 위키의 어느 사용자로도 로그인할 수 없습니다.",
        "authmanager-authn-no-local-user-link": "제공된 자격 증명은 유효하지만 이 위키의 어느 사용자와도 연결되어 있지 않습니다. 다른 방식으로 로그인하거나, 새로운 사용자를 생성하면 자격 증명을 계정에 추가할 수 있게 됩니다.",
        "authmanager-authn-autocreate-failed": "로컬 계정 자동 생성 실패: $1",
+       "authmanager-change-not-supported": "지정된 자격 증명을 사용하고 있는 곳이 없어서 변경할 수 없습니다.",
        "authmanager-create-disabled": "계정 만들기가 금지되어 있습니다.",
        "authmanager-create-from-login": "계정을 만드려면, 아래의 칸들을 채워 주십시오.",
        "authmanager-create-not-in-progress": "계정 만들기가 진행 중이 아니거나 세션 데이터를 분실했습니다. 처음부터 다시 시작해 주십시오.",
        "changecredentials-success": "자격 증명이 변경되었습니다.",
        "removecredentials": "자격 증명 제거",
        "removecredentials-submit": "자격 증명 제거",
-       "removecredentials-invalidsubpage": "$1 은(는) 유효한 자격 증명이 아닙니다.",
+       "removecredentials-invalidsubpage": "$1은(는) 유효한 자격 증명이 아닙니다.",
        "removecredentials-success": "자격 증명이 제거되었습니다.",
        "credentialsform-provider": "자격 증명:",
        "credentialsform-account": "계정 이름:",
        "linkaccounts-success-text": "계정이 연결되었습니다.",
        "linkaccounts-submit": "계정 연결",
        "unlinkaccounts": "계정 연결 해제",
-       "unlinkaccounts-success": "계정의 연결이 해제되었습니다."
+       "unlinkaccounts-success": "계정의 연결이 해제되었습니다.",
+       "authenticationdatachange-ignored": "인증 데이터 변경을 처리하지 못했습니다. 제공자를 설정하지 않으셨습니까?"
 }
index 2cc313f..9bf914e 100644 (file)
        "templatesusedpreview": "Одзвыв нёджалан листбок вылiсь {{PLURAL:$1|1=шаблон|шаблоннэз}}:",
        "template-protected": "(дорйöм)",
        "template-semiprotected": "(мымдакö дорйöм)",
-       "hiddencategories": "Этiя листбок пырö $1 {{PLURAL:$1|сайöвтöм категория|сайöвтöм категорияэз|сайöвтöм категория}} коласö:",
+       "hiddencategories": "Этiя листбок пырö $1 {{PLURAL:$1|сайöвтöм категория|сайöвтöм категория|сайöвтöм категорияэз}} коласö:",
        "permissionserrorstext-withaction": "Тэныт оз позь керны $2 то {{PLURAL:$1|1=мыля|мыля}}:",
        "viewpagelogs": "Мыччавны журналлэз этiя листбок понда",
        "currentrev": "Медбöрья версия",
        "block-log-flags-nocreate": "виль уджкерисьöн лоны оз позь",
        "movepagetext": "Кöр улiсь форма сьöртi вежан нимсö листбокыслiсь, öтдырйи вештан мöдлаö и вильмöтöм сьöртi журналсö. Важ ним лоас иньдöтанöн виль ним дынö. Тэ верман автоматическöя вильмöтны нiйо иньдöтаннэсö, кöдна ыстiсö важ ним дынö. Он кö кер сiдз, видзöт жö [[Special:DoubleRedirects|кыкпöвса]] да [[Special:BrokenRedirects|орöтöм иньдöтöммесö]]. Тэ ачыт видзан кыв сы понда, медбы ыстöттэз и одзлань вайöтiсö, сэтчö, кытчö колö. Тöд, листбокыслöн нимыс оз вежсьы, кöр виль нима листбокыс эм ни, и сыкоста оз ло мöдлаö иньдöтанöн нето тыртöмöн, и сэтчин абу мöдкодьсьöтöммес . Сiдзкö тэ верман сетны листбокыслö ним, кöда сылöн öнтай вöлi, сорасин кö ним вежико, но тэ он вермы казявтöг чышкыны тыр листбок.\n'''Тöд!'''\nНим вежöмыссянь вермасö лоны ыджыт и виччисьтöм мöдкодьсьöтöммез «йöзлы радейтана» листбоккез вылын.\nБура жö думайт сы вотодз, кыдз пондан мыйко керны, мый вермас этасянь аркмыны.",
        "movepagetalktext": "Сы йылiсь сёрнитан сiдзжö керсяс виль нимаöн аспонадсис. Но кöр:\n* Сэтшöм жö нима пондöтöм листбокыс эм ни, нето\n* Абу сувтöтöмыт улiсьжык ыбкоддьöмо вожок, сэк ковсяс вештыны нето öтлаöтны листбоккесö  кипонiсь.",
-       "movearticle": "Вежны листбокыслiсь ним:",
        "newtitle": "Виль ним:",
        "move-watch": "Пыртны этiйö листбоксö синмалöм понда нимлёдзö",
        "movepagebtn": "Вежны листбоклiсь ним",
index aab1026..ede9c55 100644 (file)
        "actions": "Actiòndèm",
        "namespaces": "Nemspasiodèm",
        "variants": "Variantdèm",
+       "navigation-heading": "Navigeshòn mènu",
        "errorpagetitle": "Èrròr",
        "returnto": "Go bak $1.",
        "tagline": "Dhis kòmòt {{SITENAME}}",
        "printableversion": "Printebul versiòn",
        "permalink": "Pèrmanènt link",
        "print": "Print",
+       "view": "Viu",
        "edit": "Èdit",
        "create": "Kreat",
        "editthispage": "Èdit dhis pej",
        "nstab-template": "Tèmplat",
        "nstab-help": "Hèppej",
        "nstab-category": "Katègòri",
+       "mainpage-nstab": "Men Pej",
        "nosuchaction": "Dha kain aktiòn nò de",
        "nosuchactiontext": "Dhi wiki nò de ùndarstan dhi aktiòn we dhi URL tèll am fòdu",
        "nosuchspecialpage": "Dha kain spèshial pej nò de",
        "badtitle": "Bad titulo",
        "viewsource": "Luk dhi sòrs",
        "yourname": "Yuzmannem:",
+       "userlogin-yourname": "Yuzarnem:",
+       "userlogin-yourname-ph": "Rait yu yuzarnem",
        "yourpassword": "Passwòrd",
+       "userlogin-yourpassword": "Passwòrd",
+       "createacct-yourpassword-ph": "Rait passwòrd",
        "yourpasswordagain": "Retayp passwòrd",
+       "createacct-yourpasswordagain": "Kònfarm passwòrd",
+       "createacct-yourpasswordagain-ph": "Rerait passwòrd",
        "login": "Lògin",
        "nav-login-createaccount": "Lògin / Mek yu yon akkaunt",
        "userlogin": "Lògin / Mek yu yon akkaunt",
        "createaccount": "Kreat yu yon akkaunt",
        "gotaccount": "Yu dòn mek yu akkaunt? '''$1'''.",
        "gotaccountlink": "Lògin",
+       "createacct-emailoptional": "Email (òpshòn)",
+       "createacct-email-ph": "Rait yu email",
        "createaccountmail": "Yuz shòrttèm randòm passwòrd èn sèn am go dhi imel address we spesifay",
+       "createacct-submit": "Kreat yu yon akkaunt",
        "badretype": "Dhi passwòrddèm we yu taip nò mach.",
        "userexists": "Odhar pòrsin de yuz dha yuzmannem.\nYu go gèt fòr pik differènt wan.",
        "mailmypassword": "Resèt passwòrd",
        "loginlanguagelabel": "Tòk: $1",
+       "pt-login": "Lògin",
+       "pt-login-button": "Lògin",
+       "pt-createaccount": "Kreat yu yon akkaunt",
+       "pt-userlogout": "Lògòt",
        "bold_sample": "Bold tèkst",
        "bold_tip": "Bold tèkst",
        "italic_sample": "Italik tèkst",
        "anoneditwarning": "'''Tek tèm o:''' Yu nò lògin yet.\nSo dèn go sev yu IP addrèss na dhi pejim èdithistoria",
        "missingsummary": "'''Mèmbar se:''' yu nò mek èditsùmmari.\nIf yu prèss sev bak, dhèm go sev yu èdit nòmor.",
        "missingcommenttext": "Rait yu kòmmènt ùndar hyar",
+       "loginreqlink": "lògin",
        "newarticle": "(Nyu)",
        "editing": "De èdit $1",
        "editingsection": "De èdit $1 (sèktiòn)",
        "yourrealname": "Real nem",
        "newuserlogpage": "Yuzman kreattin lòg",
        "action-edit": "èdit dhis pej",
+       "enhancedrc-history": "history",
        "recentchanges": "Resènt chenjdèm",
        "recentchanges-legend": "Risènt chenj òptiòndèm",
        "recentchanges-label-newpage": "Dhis edit kreat nyu pej",
        "recentchanges-label-bot": "Na bòt perform dhis èdit",
        "recentchanges-label-unpatrolled": "Dhis èdit nò patrol yet",
        "rcshowhideminor": "$1 smòll editdèm",
+       "rcshowhideminor-show": "Show",
+       "rcshowhideminor-hide": "Haid",
+       "rcshowhidebots-show": "Show",
+       "rcshowhidebots-hide": "Haid",
        "rcshowhideliu": "$1 yuzmandèm we dòn règistar",
+       "rcshowhideliu-hide": "Haid",
        "rcshowhideanons": "$1 nògètnem yuzmandèm",
+       "rcshowhideanons-show": "Show",
+       "rcshowhideanons-hide": "Haid",
        "rcshowhidemine": "$1 mi èditdèm",
+       "rcshowhidemine-show": "Show",
+       "rcshowhidemine-hide": "Haid",
        "diff": "diff",
        "hist": "hist",
        "hide": "Haid",
        "watchthisupload": "Wach dhis fail",
        "file-anchor-link": "Fail",
        "filehist": "failhistòria",
+       "filehist-help": "Klik pan det/tèm fòr luk dhi fail lèkkè haw i bin be dha tèm dher",
        "filehist-deleteone": "delet",
        "filehist-current": "kùrrènt",
        "filehist-datetime": "Dat/Tèm",
        "nolinkstoimage": "Nò pej nò de we de link kam dhis fail hyar.",
        "filedelete-submit": "Delet",
        "randompage": "Randòm pej",
+       "randomincategory-submit": "Go",
        "statistics": "Statistikdèm",
        "brokenredirects-edit": "èdit",
        "brokenredirects-delete": "delet",
        "movethispage": "Muf dhis pej hyar",
        "booksources": "Buk sòrsdèm",
        "booksources-search-legend": "Sarcg fòr buk sòrsdèm",
+       "booksources-search": "Sarch",
        "log": "Lògdèm",
        "allpages": "Òll pejdèm",
        "allarticles": "Òll pejdèm",
        "allpagessubmit": "Go",
        "categories": "Katègòridèm",
        "linksearch-ok": "Sarch",
+       "activeusers-submit": "sho",
        "listgrouprights-members": "(member list)",
        "emailuser": "Emel dhis yuzman",
        "watchlist": "Wachlist",
        "tooltip-pt-mycontris": "Yu kòntribushònlist",
        "tooltip-pt-login": "I go bèttèr if yu lògin, bùt i nò mandatòri",
        "tooltip-pt-logout": "Lògòt",
+       "tooltip-pt-createaccount": "Wi ènkòrej yu fòr kreat yu yon akkaunt èn lògin bùt nòto mandatòry kòndishòn",
        "tooltip-ca-talk": "Diskùsshòn bòt dhi kòntènt pej",
-       "tooltip-ca-edit": "Yu ebul fòr èdit dhis pej hyar\nBùt yuz dhi prevyu bùtin bifor yu sev",
+       "tooltip-ca-edit": "Èdit dhis pej",
        "tooltip-ca-addsection": "Start nyu sèkshòn.",
        "tooltip-ca-viewsource": "Dèn dòn protèkt dhis pej hyar.\nYu go ebul luk im sòrs.",
        "tooltip-ca-history": "Dhis pejim ol versiòndèm.",
        "tooltip-t-permalink": "Pèrmanènt link fòr go dhis vèrsiòn",
        "tooltip-ca-nstab-main": "Luk kòntènt pej",
        "tooltip-ca-nstab-user": "Luk dhi yuzmanpej",
+       "tooltip-ca-nstab-special": "Dhis na spèshal pej we nò kin èdito",
        "tooltip-ca-nstab-project": "Luk dhi projèkt pej",
        "tooltip-ca-nstab-image": "Luk dhi fail pej",
        "tooltip-ca-nstab-template": "Vyu dhi tèmplat",
        "tooltip-compareselectedversions": "Si dhi difèrèntia pan dhi pejim tu vèrsiòndèm we dòn selèkt",
        "tooltip-watch": "Put dhis pej na yu wachlist",
        "tooltip-summary": "Èntar shòrt sùmmari",
+       "pageinfo-toolboxlink": "Pej infòrmeshòn",
+       "previousdiff": "Mòr-ol èdit",
        "file-nohires": "Rèsòlutiòn we haih pass dhis nò de",
        "show-big-image": "Original fail",
        "ilsubmit": "Sarch",
        "metadata": "Mètadata",
+       "exif-orientation-1": "Nòrmal",
        "namespacesall": "òll",
        "monthsall": "òll",
        "confirmemail": "Kònfirm yu emel addrèss",
        "table_pager_limit_submit": "Go",
        "watchlisttools-edit": "Vyu èn èdit wachlist",
        "fileduplicatesearch-submit": "Sarch",
-       "specialpages": "Spèshal pejdèm"
+       "specialpages": "Spèshal pejdèm",
+       "searchsuggest-search": "Sarch"
 }
index eea6d36..17f733d 100644 (file)
@@ -31,7 +31,7 @@
        "sat": "Šuo",
        "january": "Pakkaiskuu",
        "february": "Tuiskukuu",
-       "march": "kevätkuu",
+       "march": "Kevätkuu",
        "april": "Šulakuu",
        "may_long": "Oraškuu",
        "june": "Kešäkuu",
@@ -77,7 +77,7 @@
        "october-date": "$1. šajekuuta",
        "november-date": "$1. pimiekuuta",
        "december-date": "$1. talvikuuta",
-       "pagecategories": "{{PLURAL:$1|Kategorija|Kategorijat}}",
+       "pagecategories": "{{PLURAL:$1|Luokka|Luokat}}",
        "category_header": "Šivut, kumpaset ollah luokašša $1",
        "subcategories": "Alaluokat",
        "category-media-header": "Medijafailit luokašša «$1»",
@@ -85,6 +85,7 @@
        "hidden-category-category": "Peitetyt luokat",
        "category-subcat-count": "{{PLURAL:$2|Täššä luokašša on vain tämä alaluokka.|Täššä luokašša on nämä {{PLURAL:$1|subcategory|$1 alaluokkua}}, kaikkieštah $2.}}",
        "category-article-count": "{{PLURAL:$2|Täššä luokašša on vain tämä šivu.|{{PLURAL:$1|Tämä šivu on|$1 Nämä šivut ollah}} täššä luokašša, $2 kaikkieštah.}}",
+       "category-file-count": "{{PLURAL:$2|Täššä luokašša on vain tämä šivu.|{{PLURAL:$1|Tämä šivu on|$1 Nämä šivut ollah}} täššä luokašša, $2 kaikkieštah.}}",
        "listingcontinuesabbrev": "jatkuu",
        "about": "Tietuo",
        "article": "Šivu",
@@ -93,7 +94,7 @@
        "moredotdotdot": "Lisyä...",
        "mypage": "Šivu",
        "mytalk": "Pakinat",
-       "navigation": "Valikko",
+       "navigation": "Navigacija",
        "and": "&#32;ta",
        "qbfind": "Eči",
        "qbedit": "Kohenna",
        "navigation-heading": "Navigacija",
        "errorpagetitle": "Hairahuš",
        "returnto": "Myöššy šivulla $1.",
-       "tagline": "{{SITENAME}}päin",
+       "tagline": "Lähteh {{SITENAME}}",
        "help": "Kyšy apuo",
        "search": "Eči",
        "searchbutton": "Eči",
        "redirectto": "Ohjauš šivulla:",
        "lastmodifiedat": "Viimesekši tätä šivuo on kohenneltu $1, $2 aikah.",
        "jumpto": "Šiirry:",
-       "jumptonavigation": "valličenduun",
-       "jumptosearch": "ečintä",
+       "jumptonavigation": "navigacija",
+       "jumptosearch": "eči",
        "aboutsite": "Tietuo {{SITENAME}}",
        "aboutpage": "Project:Tietoja",
        "copyrightpage": "{{ns:project}}:Tekijänoikeuvet",
        "currentevents": "Ajankohtaset tapahtumat",
        "currentevents-url": "Project:Ajankohtaset tapahukšet",
        "disclaimers": "Vaštuuvapauš",
-       "disclaimerpage": "Project:Vastuuvälly",
+       "disclaimerpage": "Project:Vaštuuvapauš",
        "edithelp": "Apu kohentelomiseh",
        "mainpage": "Piäšivu",
        "mainpage-description": "Piäšivu",
-       "portal": "Kahvihuoneh",
-       "portal-url": "Project:Kahvihuoneh",
+       "portal": "Ryhmän portali",
+       "portal-url": "Project:Ryhmän portali",
        "privacy": "Tietošuojakäytäntö",
-       "privacypage": "Project:Tiedošuojuskäytändö",
+       "privacypage": "Project:Tietošuojakäytäntö",
        "ok": "OK",
        "retrievedfrom": "Lähte - \"$1\"",
        "youhavenewmessages": "{{PLURAL:$3|Šiula on}} $1 ($2).",
        "editold": "kohenna",
        "viewsourceold": "näytä wikiteksti",
        "editlink": "kohentele",
-       "viewsourcelink": "näytä lähtekoodi",
+       "viewsourcelink": "näytä lähtehkoodi",
        "editsectionhint": "Korjua ošua: $1",
        "toc": "Šisällyšluvettelo",
        "showtoc": "näytä",
        "databaseerror-query": "Kyšely: $1",
        "databaseerror-error": "Hairahuš: $1",
        "badtitle": "Šivun nimi ei kelpua",
+       "badtitletext": "Šiun annetti šivunimi oli virheellini, tyhjä tahi viärin linkitetty kielienvälini tahi wikienvälini nimi.\nSiinä suattau olla yksi tahi usiempi sellani merkki, kumpasta ei voi käyttyä šivujen nimissä.",
        "viewsource": "näytä lähtehkoodi",
        "yourname": "Käyttäjänimi:",
        "userlogin-yourname": "Käyttäjänimi",
        "createacct-benefit-body2": "$1 {{PLURAL:$1|šivu|šivuo}}",
        "createacct-benefit-body3": "{{PLURAL:$1|Jälkimmäini käyttäjä|Jälkimmäistä käyttäjyä}}",
        "loginlanguagelabel": "Kieli: $1",
-       "pt-login": "Kirjauvu",
+       "pt-login": "Kirjuttauvu",
        "pt-login-button": "Kirjauvu šiämeh",
        "pt-createaccount": "Luo tunnuš",
        "pt-userlogout": "Kirjauvu pois",
        "blockednoreason": "ei šyytä annettu",
        "loginreqlink": "kirjauvu šiämeh",
        "newarticle": "(Uuši)",
+       "newarticletext": "Olet piätynyn šivulla, kumpasta ei ole. Ku luatie šivu, rupie kirjuttamah alla olijah juaššiekkah (kačo [$1 ohjavošivulta] lisätietuo).\nKu ollet piätynyn tänne petties, käytä livaimen <strong>mennä järilleh</strong>-toimintuo.",
        "noarticletext": "Tällä šivulla ei ole juuri nyt tekstie.\nVoit [[Special:Search/{{PAGENAME}}|eččie šivun nimellä]] muilta šivuilta,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} eččie šitä koškijua logie],\ntahi [{{fullurl:{{FULLPAGENAME}}|action=edit}} luuvva tämän šivun]</span>.",
        "noarticletext-nopermission": "Tällä šivulla ei ole juuri nyt tekstie.\nVoit [[Special:Search/{{PAGENAME}}|eččie šivun nimellä]] muilta šivuilta, tahi <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} eččie šivuo koškijua logie]</span>, ka šiula ei ole oikeutta luuvva tätä šivuo.",
        "editing": "Kohennellah sivuu $1",
        "templatesused": "Tällä šivulla {{PLURAL:$1|käytetty malli|käytetyt mallit}}:",
        "template-protected": "(šuojattu)",
        "template-semiprotected": "(ošittain šuojattu)",
+       "hiddencategories": "Tämä šivu kuuluu {{PLURAL:$1|1 peitettyh kategorijah|$1 peitettylöih kategorijoih}}:",
        "permissionserrorstext-withaction": "Šiula ei ole oikeutta {{lcfirst:$2}} {{PLURAL:$1|šeuruavašta šyyštä|šeuruavista šyistä}}:",
+       "moveddeleted-notice": "Tämä šivu on otettu iäre. Šivun iäreotanta- ta siirtoistorija ollah annettu alla viittavuksena.",
+       "viewpagelogs": "Näytä tämän šivun lokit",
        "currentrev-asof": "Nykyni versija $1",
        "revisionasof": "Versija $1",
        "revision-info": "Versija $1 {{GENDER:$6|$2}}$7",
        "difference-title": "Ero šivun ”$1” versijien välillä",
        "lineno": "Rivi $1:",
        "editundo": "lakauttua",
+       "diff-multi-sameuser": "({{PLURAL:$1|Yksi keskitason versija |$1 keskitason versijua}} samalta käyttäjältä ei näytetty)",
        "searchresults": "Eččimisen tulokšet",
        "searchresults-title": "Eči \"$1\"",
        "prevn": "iellini {{PLURAL:$1|$1}}",
        "nextn-title": "Šeuruava $1 {{PLURAL:$1|tuloš|tulokšet}}",
        "shown-title": "Näytä $1 {{PLURAL:$1|tuloš|tulošta}} šivulla",
        "viewprevnext": "Näytä ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>Luaji šivu \"[[:$1]]\" täh wikih!</strong> {{PLURAL:$2|0=|Kačo niise šiun eččolla löyvetyt šivut.|Kačo niise löyvetyt ečon tulokšet.}}",
        "searchprofile-articles": "Šisältöšivut",
        "searchprofile-images": "Multimedija",
        "searchprofile-everything": "Kaikki",
        "recentchanges": "Uuvvet muutokšet",
        "recentchanges-legend": "Verekšien kohennukšien ašetukšet",
        "recentchanges-summary": "Tällä šivulla voit šeurata verekšie täh wikih luajittuja muutokšie.",
-       "recentchanges-label-newpage": "Tämä muutoš loi uuvven šivun",
-       "recentchanges-label-minor": "Tämä on pieni muutoš",
-       "recentchanges-label-bot": "Tämän muutokšen šuoritti botti",
+       "recentchanges-label-newpage": "Tämä kohennuš on johtan uuvven šivun luatimiseh",
+       "recentchanges-label-minor": "Tämä on pieni kohennuš",
+       "recentchanges-label-bot": "Tämän kohennukšen šuoritti botti",
        "recentchanges-label-unpatrolled": "Tätä kohennušta ei ole vielä tarkissettu",
        "recentchanges-label-plusminus": "Šivu on kašvan [] baitilla",
        "recentchanges-legend-heading": "<strong>Šelityš:</strong>",
        "minoreditletter": "p",
        "newpageletter": "U",
        "boteditletter": "b",
-       "rc-change-size-new": "$1 {{PLURAL:$1|tavu|tavuo}} muutokšien jälkeh",
+       "rc-change-size-new": "$1 {{PLURAL:$1|baitti|baittie}} muutokšien jälkeh",
        "recentchangeslinked": "Toini toišeh liittyjät kohennukšet",
        "recentchangeslinked-toolbox": "Toini toiseh liittyjät kohennukšet",
        "recentchangeslinked-title": "Šivuo \"$1\" koškijat muutokšet",
-       "recentchangeslinked-summary": "Tämä on niijen šivujen korjaukšien luvettelo, kumpasih viittuau tämä šivu (tahi šiih luokkah kuulujat). Šivut, kumpaset kuulutah [[Special:Watchlist|teijän valvontaluvettelo]], ollah  <strong>bold</strong>.",
+       "recentchangeslinked-summary": "Tämä on niijen šivujen korjaukšien luvettelo, kumpasih viittuau tämä šivu (tahi šiih luokkah kuulujat). Šivut, kumpaset kuulutah [[Special:Watchlist|teijän valvontaluvetteloh]], ollah kirjutettu <strong>lihavalla</strong>.",
        "recentchangeslinked-page": "Šivun nimi:",
        "recentchangeslinked-to": "Näytä šen šijah muutokšet šivuloih, kumpasista on linkki täh šivuh",
        "upload": "Tallenna faili",
        "file-anchor-link": "Faili",
        "filehist": "Failin istorija",
        "filehist-help": "Klikkua päivämiäryä/aikua, jotta kaččuo, mimmoni faili oli šilloin",
-       "filehist-current": "nykyni",
+       "filehist-current": "nykyhini",
        "filehist-datetime": "Päiväyš",
        "filehist-thumb": "Pieni kuva",
        "filehist-thumbtext": "Pieni kuva versijah $1",
        "upload-disallowed-here": "Et voi tallentua uutta tiijoštuo tämän tilalla.",
        "randompage": "Sattumanvarani šivu",
        "brokenredirects-edit": "kohentele",
-       "nbytes": "$1 {{PLURAL:$1|tavu|tavuo}}",
+       "nbytes": "$1 {{PLURAL:$1|baitti|baittie}}",
        "nmembers": "$1 {{PLURAL:$1|käyttäjä|käyttäjyä}}",
        "newpages": "Uuvvet šivut",
        "move": "siirdyä",
        "watchlist": "Kaččuolistu",
        "mywatchlist": "Valvontaluvettelo",
        "watch": "Valvo",
+       "dellogpage": "Iäreotantaistorija",
        "rollbacklink": "Tuo entini versija",
        "rollbacklinkcount": "palauta $1 {{PLURAL:$1|muutoš|muutošta}}",
+       "protectlogpage": "Šuojavusistorija",
        "protectcomment": "Šyy",
        "restriction-edit": "Kohennuš",
        "undelete-search-submit": "Ečindy",
        "tooltip-invert": "Valiče tämä kohta, još haluot peittyä tämän šivun muutokšet valitullla nimitilalla",
        "namespace_association": "Liittyjät nimitilat",
        "tooltip-namespace_association": "Valiče tämä kohta, još haluot lisätä niise valittuh nimitilah liittyjät pakina- tahi aihenimitilat",
-       "blanknamespace": "(lehytyt)",
+       "blanknamespace": "(Piä)",
        "contributions": "{{GENDER:$1|Käyttäjän}} panoš",
-       "mycontris": "Omat kohendukset",
+       "mycontris": "Omat kohennukšet",
        "anoncontribs": "Omat kohennukšet",
        "month": "Täššä kuušša (tahi aijempi)",
        "year": "Vuosi",
        "ipblocklist-submit": "Ečindy",
        "blocklink": "Lukiče",
        "contribslink": "kohennukšet",
+       "movelogpage": "Šiirrä loki",
        "movereason": "Šyy",
        "export": "Vie šivuja",
        "allmessagesname": "Nimi",
        "tooltip-pt-preferences": "{{GENDER:|Omat ašetukset}}",
        "tooltip-pt-watchlist": "Lista šivuista, kumpasien muutokšie valvot",
        "tooltip-pt-mycontris": "Luvettelo {{GENDER:|šiun}} kirjutukšista",
-       "tooltip-pt-login": "Kirjauvu šiämeh ta luo tunnuš",
+       "tooltip-pt-login": "Täššä voit kirjuttautuo, ka še ei ole välttämätöintä",
        "tooltip-pt-logout": "Kirjauvu pois",
        "tooltip-pt-createaccount": "Voit luuvva käyttäjätunnuš ta kirjuttautuo järještelmäh. Še ei kuiteinkana ole pakollista.",
        "tooltip-ca-talk": "Pakaja piäšivušta",
        "tooltip-ca-viewsource": "Tämä šivu on šuojattu.\nVoit kaččuo šen lähtehkoodin",
        "tooltip-ca-history": "Tämän šivun jälkimmäiset versijat",
        "tooltip-ca-move": "Šiirrä tämä šivu",
-       "tooltip-ca-watch": "Lišiä tämä šivu omah valvontaluvetteloh",
+       "tooltip-ca-watch": "Lisyä tämä šivu omah valvontaluvetteloh",
        "tooltip-search": "Eči {{SITENAME}}",
        "tooltip-search-go": "Mäne šivulla, kumpasella on šama nimi",
        "tooltip-search-fulltext": "Eči šivuja, kumpasissa on tätä tekstie",
        "tooltip-p-logo": "Šiirry piäšivulla",
        "tooltip-n-mainpage": "Mäne piäšivulla",
-       "tooltip-n-mainpage-description": "Šiirry piäšivulla",
+       "tooltip-n-mainpage-description": "Mäne piäšivulla",
        "tooltip-n-portal": "Tietuo täšta projektista, mitä voit ruatua, missä mitä on",
        "tooltip-n-currentevents": "Lisätietuo tämänhetkisistä tapahtumista",
        "tooltip-n-recentchanges": "Luvettelo vaštaluajituista muutokšista",
        "tooltip-n-randompage": "Kačo šattumanvarani šivu",
        "tooltip-n-help": "Täštä voit kyšyö apuo",
-       "tooltip-t-whatlinkshere": "Kaikkien šivuloin luvettelo, kumpasišta on linkki täh sivuh",
+       "tooltip-t-whatlinkshere": "Kaikkien šivujen luvettelo, kumpasista on linkki täh šivuh",
        "tooltip-t-recentchangeslinked": "Viimesimmät muokkaukšet šivuloilla, kumpasih viitatah tältä šivulta",
        "tooltip-feed-atom": "Atom-šyöte tällä sivulla",
        "tooltip-t-contributions": "Lista tämän käyttäjän kirjutukšista {{GENDER:$1|this user}}",
        "tooltip-t-upload": "Tallenna failija",
-       "tooltip-t-specialpages": "Näytä toimintosivut",
+       "tooltip-t-specialpages": "Kaikkien erikoisien šivujen luvettelo",
        "tooltip-t-print": "Šivun tuloštettava versija",
-       "tooltip-t-permalink": "Ikilinkki šivun täh versijah",
+       "tooltip-t-permalink": "Vakituini linkki šivun täh versijah",
        "tooltip-ca-nstab-main": "Näytä šisältöšivu",
        "tooltip-ca-nstab-user": "Näytä käyttäjäšivu",
        "tooltip-ca-nstab-special": "Tämä on erikoini šivu, šitä ei voi kohennella",
        "tooltip-preview": "Esikačo muutokšet. Ole hyvä, luaji šitä aina ennen tallennušta.",
        "tooltip-diff": "Näytä luajitut muutokšet",
        "tooltip-rollback": "Pyyhi pois viimesen kohentelijan luatimat muutokšet yhellä kertua",
+       "tooltip-undo": "Kumoamini palauttau tämän muutokšen ta avuau artikkelin esikaččelussa. Yhtehvetokenttäh voi kirjuttua palautukšen šyyn.",
        "tooltip-summary": "Kirjuta lyhyt kuvauš",
        "simpleantispam-label": "Anti-spam-tarkissuš. \n<strong>älä</strong> täytä tätä!",
        "pageinfo-toolboxlink": "Šivun tiijot",
        "svg-long-desc": "SVG-faili, oletuštarkkuš $1 × $2 pikselie, failin koko: $3",
        "show-big-image": "Alkuperäni faili",
        "show-big-image-preview": "Tämän failin koko: $1.",
-       "show-big-image-other": "Toini {{PLURAL:$2|resolution|resolutions}}: $1.",
+       "show-big-image-other": "{{PLURAL:$2|Toini resolutija|Toiset resolutijat}}: $1.",
        "show-big-image-size": "$1 × $2 kuvapistehtä",
        "ilsubmit": "Ečintä",
-       "metadata": "Metatiijostot",
+       "metadata": "Metatiijoštot",
        "metadata-help": "Failih kuulutah lisätiijot, kumpasie tavan mukah lisätäh digikameralla tahi skannerilla. Još kuvua on muokattu šen alkuperäsen luonnan jälkeh, niin eryähät parametrit voijah erota nykyseštä kuvašta.",
        "metadata-fields": "Šeuruavat metatietojen kentät ruvetah näkymäh kuvašivulla, konša metatietojen taulukko ei ole näkyvissä.\nMuut kentät ollah automattisešti piilotettuja.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-orientation": "Šuunta",
        "version": "Versijo",
        "version-specialpages": "Toimintošivut",
        "fileduplicatesearch-submit": "Ečindy",
-       "specialpages": "Erityinen lehytyt",
+       "specialpages": "Erikoiset šivut",
        "tag-filter": "[[Special:Tags|Tag]] filtri:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Merkki|Merkit}}]]: $2)",
        "logentry-delete-delete": "$1 {{GENDER:$2|iäreotettu}} šivu $3",
index 92895f3..d3c0687 100644 (file)
@@ -28,6 +28,7 @@
        "tog-watchdefault": "Donn Sigge beim Ändere automattesch för ming Oppaßlėß vörschlonn",
        "tog-watchmoves": "Donn Sigge beim Ömnänne automattesch för ming Oppaßlėß vörschlonn",
        "tog-watchdeletion": "Donn Sigge beim Fottschmiiße automattesch för ming Oppaßlėß vörschlonn",
+       "tog-watchuploads": "Donn neu huhjelahde Datteije en ming Oppassleß.",
        "tog-watchrollback": "Donn Sigge beim schtantepee retuur Nämme vun Änderonge automattesch för ming Oppaßlėß vörschlonn",
        "tog-minordefault": "Dun all ming Änderonge jehdes Mohl als klein Mini-Änderonge vörschlonn",
        "tog-previewontop": "Zeisch de Vör-Aanseesch övver däm Fäld för der Täx enzejävve aan.",
        "databaseerror-query": "Opdraach: $1",
        "databaseerror-function": "Fonxjuhn: $1",
        "databaseerror-error": "Fähler: $1",
+       "transaction-duration-limit-exceeded": "Domedd et Dahtebangk-Koppehre zoh doll henger her hengk, ham_mer heh dä Vörjang affjebroche, weijl dä met $1 de zweijte Jräns vun $2 övverschredde hät.\n\nWann De vill Saache op eijmohl aam Änndere bes, versöhk ens schtatt dämm en Aanzahl kleijnere Ännderonge.",
        "laggedslavemode": "<strong>Opjepass:</strong> Künnt sin, dat heh nit dä neuste Stand vun dä Sigg aanjezeich weed.",
        "readonly": "De Daatebank es jesperrt",
        "enterlockreason": "Jevv aan, woröm un för wie lang dat de Daatebank jesperrt wääde soll",
-       "readonlytext": "De Daatebank es jesperrt. Neu Saache dren avspeichere jeiht jrad nit, un ändere och nit. Dä Jrund: „$1“",
+       "readonlytext": "De Dahtebangk es jeschpächt. Neu Saache dren avschpeijschere jeiht jrahd nit, un et Ändere och nit. Künnt sin wähje en rutihnemähßejje Waadong, un dernoh es alles widder zerögg op Nommahl.\n\nDä Verantwootlesche doför hät beim Deeschmaache als Jrond aanjejovve: „$1“.",
        "missing-article": "Dä Tex för de Sigg „$1“ $2 kunnte mer nit en de Daatebank fenge.\nDe Sigg es velleisch fottjeschmeße udder ömjenannt woode.\nWann dat nidd esu sin sullt, dann had_Der velleich ene Fähler em Projramm vum Wikke jefonge.\nVerzälld et enem [[Special:ListUsers/sysop|Wiki_Köhbeß]],\nun doht em och dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Locator\">URL</i> vun dä Sigg heh sare.",
        "missingarticle-rev": "(Väsjohn Numero: $1)",
        "missingarticle-diff": "(Ongerscheed zwesche de Versione $1 un $2)",
        "readonly_lag": "De Daatebank es för en koote Zigg automattesch jesperrt, för de Daate vun de ongerjeodente Rääschner mem Houprääschner avzejliiche.",
+       "nonwrite-api-promise-error": "Di Kopp-Reihj „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Promise-Non-Write-API-Action</code>“ wood mem <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Transfer Protocol\">HTTP</i> jeschek, ävver di Aanfrohch jingk aan e <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i>-Moduhl zom Schrihve.",
        "internalerror": "De Wiki-Soffwär hät ene Fähler jefunge",
        "internalerror_info": "Enne ennere Fäähler en de ẞoffwäer es opjetrodde: $1",
        "internalerror-fatal-exception": "Ene schlemme Fähler vun dä Zoot „$1“ es opjetrodde.",
        "mypreferencesprotected": "Do häs nit dat Rääsch, Ding Enschtällonge ze verändere.",
        "ns-specialprotected": "{{int:nstab-special}}e künne mer nit ändere.",
        "titleprotected": "Di Övverschreff för en Sigg eß fum [[User:$1|$1]] verbodde woode, un der Jrond wohr: „$2“",
-       "filereadonlyerror": "Mer künne di Dattei „$1“ nit ändere, weil dä Dateijebeshtand „$2“ bloß för ze Lässe doh es.\n\nDä Verantwootlesche doför hät beim Deeschmaache als Jrond aanjejovve: „$3“",
+       "filereadonlyerror": "Mer künne di Dattei „$1“ nit ändere, weil dä Dateijebeschtand „$2“ för bloß ze Lässe ennjeschtalld es.\n\nDä Verantwootlesche doför hät beim Deeschmaache als Jrond aanjejovve: „$3“.",
        "invalidtitle-knownnamespace": "„$3“ es en onjöltijje Övverschreff för em Appachtemang „$2“",
        "invalidtitle-unknownnamespace": "„$2“ es sn onjöltijje Övverschreff em onbikannte Appachtemang met dä Nommer $1",
        "exception-nologin": "Nit enjelogg",
        "userlogin-resetpassword-link": "Paßwoot verjäße?",
        "userlogin-helplink2": "Hölp mem Enlogge",
        "userlogin-loggedin": "Do bes ald als {{GENDER:$1|dä Metmaacher|de Metmaacherėn|dä Metmaacher|de Metmaacherėn|dä Metmaacher}} [[User:$1|$1]] enjelogg. Met heh dämm Fommolaa kanns De jäz ävver onger enem andere Nahme enlogge.",
+       "userlogin-reauth": "Do moß desch norr_ens enlogge, öm nohzewiise, dat De verhaftesch {{GENDER:$1|dä|dat|dä Metmaacher|de|dat}} $1 bes.",
        "userlogin-createanother": "Donn ene zohsäzlejje Zohjang aanlääje",
        "createacct-emailrequired": "Ding Addräß för de <i lang=\"en\">e-mail</i>",
        "createacct-emailoptional": "Ding Addräß för de <i lang=\"en\">e-mail</i>, kann fott bliive",
        "createacct-email-ph": "Jiv Ding Addräß för de <i lang=\"en\">e-mail</i> en!",
        "createacct-another-email-ph": "Jivv en Addräß för de <i lang=\"en\" xml:lang=\"en\">e-mail</i> aan",
        "createaccountmail": "Scheck mer en <i lang=\"en\">e-mail</i> met enem neu ußjedaachte Paßwood op Zick",
+       "createaccountmail-help": "Kammer ennsäzze, öm ene Zohjang föe ene Anndere Metmaacher aanzelähje, der ohne dat Paßwoot känne ze lihre.",
        "createacct-realname": "Dinge börjerlesche Nahme, kans De och fott lohße",
        "createaccountreason": "Jrond:",
        "createacct-reason": "Der Jrond udder Aanlaß",
        "createacct-reason-ph": "Woröm deihs De noch ene Zohjang aanlääje?",
+       "createacct-reason-help": "Wadd em Logbohch för et Zohjäng Aanlähje schtonn sull",
        "createacct-submit": "Lohß Jonn!",
        "createacct-another-submit": "Donn jäz enne zohsäzlejje Zohjang aanlääje",
        "createacct-continue-submit": "Wigger maache mem Aanmällde",
        "nocookiesnew": "Dinge neue Metmaacher Name es enjerich, ävver dat automatisch Enlogge wor dann nix.\nSchad.\n{{ucfirst:{{GRAMMAR:Nom|{{SITENAME}}}}}} bruch Cookies, öm ze merke, wä enjelogg es.\nWann De Cookies avjeschald häs en Dingem Brauser, dann kann dat nit laufe.\nSök Der ene Brauser, dä et kann, dun se enschalte, un dann log Dich noch ens neu en, met Dingem neue Metmaacher Name un Passwood.",
        "nocookieslogin": "{{ucfirst:{{GRAMMAR:Nominativ|{{SITENAME}}}}}} bruch <i lang=\"en\">cookies</i> för et Enlogge. Et süht esu us, als hätts De de <i lang=\"en\">cookies</i> avjeschalt. Dun se aanschalte un dann versök et noch ens. Odder söök Der ene Brauser, dä et kann.",
        "nocookiesfornew": "Et wood keine Zohjang opjemaat, weil mer nit jeweß sin künne, woh de Daate her kohme.\nDinge Brauser moß <i lang=\"en\">cookies</i> enjeschalldt han.\nDonn dat prööfe, donn heh di Sigg norr_ens neu laade, un dann versöhk et norr_ens.",
+       "nocookiesforlogin": "{{int:nocookieslogin}}",
+       "createacct-loginerror": "Dä Zohjang es aanjelaat, ävver mer kunnts Desch nit automattesch  enlogge. Be sesu jood un jangk mohm [[Special:UserLogin|Ennlogge vun Hand]].",
        "noname": "Dat jeiht nit als ene Metmaacher Name. Jetz muss De et noch ens versöke.",
        "loginsuccesstitle": "Enjelogg",
        "loginsuccess": "'''Do bes jetz enjelogg {{GRAMMAR:en|{{SITENAME}}}}, un Dinge Name als ene Metmaacher es „$1“.'''",
-       "nosuchuser": "Dä Metmaacher Name „$1“ wor verkihrt.\nJroß- un Kleinboochshtabe maache ene Ungerscheid!\n<br />\nJetz muss De et noch ens versöke.\nUdder donn_[[Special:CreateAccount|ene neue Metmaacher aanmelde]].",
+       "nosuchuser": "Dä Metmaacher-Name „$1“ wohr verkihrt.\nJrohß- un Kleinbohchschtahbe maache ene Ongerscheid!\nSchrihv en eeschtesch, udder donn_[[Special:CreateAccount|ene neue Metmaacher aanmälde]].",
        "nosuchusershort": "Dä Metmaacher Name „$1“ wor verkihrt. Jetz muss De et noch ens versöke.",
        "nouserspecified": "Dat jeiht nit als ene Metmaacher Name",
        "login-userblocked": "Heh dä Kääl es jesperrt. Enlogge verbodde.",
        "noemail": "Dä Metmaacher „$1“ hät en dämm sing Ennschtällonge kein <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß aanjejovve.",
        "noemailcreate": "Do moß en jöltijje Adräß för Ding <i lang=\"en\">e-mail</i> aanjävve",
        "passwordsent": "E neu Passwood es aan de E-Mail Adress vun däm Metmaacher „$1“ ungerwähs. Meld dich domet aan, wann De et häs. Dat ahle Passwood bliev erhalde un kann och noch jebruch wääde, bes dat De Dich et eetste Mol met däm Neue enjelogg häs.",
-       "blocked-mailpassword": "Ding IP Adress es blockeet.",
+       "blocked-mailpassword": "Ding IP Adress es blockeet, Änderonge em Wikki sin verbodde. Öm nix aanbränne ze lohße, es ed och verbode, vun heh dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräß et Passwoot affrohe ze lohße.",
        "eauthentsent": "En <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> es jäz ungerwähs aan di Adräß en de Enschtällonge. Ih dat mih <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mails</i> verschek wääde künne, moß mer maache, wat en dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> dren schteiht, öm ze beschtähteje, dat di Adräß schtemmp.",
        "throttled-mailpassword": "En Erennerung för di Passwood es alld ongerwähs, un mieh wi eimol en {{PLURAL:$1|der Schtond|$1 Schtonde|nidd ens ener Schtond}} dommer kein schecke.",
        "mailerror": "Fähler beim E-Mail Verschecke: $1.",
        "changepassword-success": "Et Paßwood es jeändert.",
        "changepassword-throttled": "Do häs zoh öff versöhk, enzelogge. Waat $1 Ih dat De es widder probeers.",
        "botpasswords": "Bot-Paßwööter",
+       "botpasswords-summary": "<strong>Bot-Paßwööter</strong> lohße ene Zohjreff obb enem Metmaacher singem Zohjang övver de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> zoh, ohne dem Houp-Zohjang sing Dahte bwnözze ze möße.\nDi Rääschte, di mer kritt, wam_mer med enem Bot-Paßwood ennlogg, künnte beschängk sin.\n\nWam_mer nit weijß, woröm mer dat donn sullt, sullt mer et wascheijnlesch nit donn. Opjepaß: Keijne sulld jehmohls welle, dat De eijn dervon oplähschß, öm ed em dann wiggerzejävve.",
        "botpasswords-disabled": "Bot-Paßwööter sin ußjeschallt",
        "botpasswords-no-central-id": "Öm Bot-Paßwööter bruche ze künne, moß De övve en jemeinsamme Aanmälldong ennjelogg sin.",
        "botpasswords-existing": "Vörhande Bot-Paßwööter",
        "botpasswords-label-cancel": "Ophüre",
        "botpasswords-label-delete": "Fottschmiiße",
        "botpasswords-label-resetpassword": "Paßwoot neu säze",
+       "botpasswords-label-grants": "Aanwändba Rääschte:",
+       "botpasswords-help-grants": "Jehde Ennwellejong deihjd e Räsch wigger jävve, wad enem Metmaacher övver singe Zohjang alld zohschteihjt.\nLoor op de Sigg met de [[Special:ListGrants|Tabäll met de Rääschde un Enwellejonge]], wann De mih weße wells.",
        "botpasswords-label-restrictions": "Beschränkonge:",
        "botpasswords-label-grants-column": "Zohjelohße",
        "botpasswords-bad-appid": "„$1“ es keine jölltejje Nahme för ene Bot.",
        "botpasswords-updated-body": "Dat Bot-Paßwoot för dä Bot „$1“ {{GENDER:$2|vum|vum|vumm Metmaacher|vun dä|vum}} „$2“ wood veränndert.",
        "botpasswords-deleted-title": "Dat Bot-Paßwood es fott",
        "botpasswords-deleted-body": "Dat Bot-Paßwoot för dä Bot „$1“ {{GENDER:$2|vum|vum|vumm Metmaacher|vun dä|vum}} „$2“ wood fott jeschmeße.",
+       "botpasswords-newpassword": "Et neuje Passwoot zom Ennlogge met <strong>$1</strong> es <strong>$2</strong>. Bes esu johd, dat för de Zohkonnef faßzehallde.",
+       "botpasswords-restriction-failed": "Beschrängkonge för em Bot sing Paßwoot maache et Ennlogge onmüjjelesch.",
+       "botpasswords-invalid-name": "En äm aanjejovve Nahme vum Metmaacher fähld et Trännzeijsche „$1“ för dem Bot sing Paßwoot.",
+       "botpasswords-not-exist": "Dä Metmaacher „$1“ kät keijn Paßwoot „$2“ för ene Bot.",
        "resetpass_forbidden": "E Passwoot kann nit jeändert wääde.",
        "resetpass_forbidden-reason": "Paßwööter kam_mer nit änndere: $1",
        "resetpass-no-info": "Do mööts ad enjelogg sin, öm tiräk op di Sigg jonn ze dörve",
        "passwordreset-emailtext-ip": "Do künns et sällver jewääse sin, öhnswää em Internet hät vun dä IP-Adräß $1 öm\ne neu Paßwoot jefrooch, för Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}\n$4\nHeh {{PLURAL:$3|dä Metmaacher hät|di Metmaacher han|hät keine Metmaacher}} Ding e-mail Addräß:\n\n$2\n\n{{PLURAL:$3|Dat Zweschepaßwoot leuf|Di Zweschepaßwööter loufe|Kein Zweschepaßwoot leuf}} en {{PLURAL:$5|enem Daach|$5 Dääsch|keinem Daach}} uß.\nDonn Desch jäz enlogge, un e neu Paßwoot faßlääje. Wann ene Andere wi\nDo dat heh aanjestüßße hät, udder wann De Desch widder aan Ding Paßwoot\nentsenne kanns, un et nimmih ändere wells, udder es suwwisu weiß, dann\nmoß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.",
        "passwordreset-emailtext-user": "Dä Metmaacher $1 vun {{GRAMMAR:Dativ|{{SITENAME}}}} hät öm e neu Paßwoot jefrooch,\nför Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}\n$4\nHeh {{PLURAL:$3|dä Metmaacher hät|di Metmaacher han|hät keine Metmaacher}} Ding e-mail Addräß:\n\n$2\n\n{{PLURAL:$3|Dat Zweschepaßwoot leuf|Di Zweschepaßwööter loufe|Kein Zweschepaßwoot leuf}} en {{PLURAL:$5|enem Daach|$5 Dääsch|keinem Daach}} uß.\nDonn Desch jäz enlogge, un e neu Paßwoot faßlääje. Wann ene Andere wi\nDo dat heh aanjestüßße hät, udder wann De Desch widder aan Ding Paßwoot\nentsenne kanns, un et nimmih ändere wells, udder es suwwisu weiß, dann\nmoß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.",
        "passwordreset-emailelement": "Metmaacher Name: \n$1\n\nEijmohl-Paßwoot: \n$2",
-       "passwordreset-emailsentemail": "Wann dat en ennjedrahre <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß vun Der es, dann weed en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> för der Zohjang heh verschek, öm e neu Paßwoot ze krijje.",
+       "passwordreset-emailsentemail": "Wann dat en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß vun Der es, dann weed en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> för Dinge Zohjang verschek, öm e neu Paßwoot ze krijje.",
+       "passwordreset-emailsentusername": "Wann heh dä Metmaacher en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß hät, dann weed en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> verschek, öm e neu Paßwoot ze krijje.",
        "passwordreset-emailsent-capture": "En <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> met Aanjahbe zom neue Paßwoot för der Zohjang heh es verschek woode. Heh dronger kanns De se lässe.",
        "passwordreset-emailerror-capture": "En <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> met Aanjahbe zom neue Paßwoot för der Zohjang heh sullt verschek wääde, ävver dat Verscheke aan {{GENDER:$2|dä|dat|dä Metmaacher|de|dat}} $2 hät nit jeflup: $1",
+       "passwordreset-emailsent-capture2": "{{PLURAL:$1|En <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> es|De <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>s sin|Nix es}} verschek woode, öm e neu Paßwoot ze krijje. {{PLURAL:$1|Dä Nahme vum Metmaacher un dat Paßwood|Di Leß met dä Nahme un Paßwööter|Nix weed}} heh noh aanjezeijsch.",
+       "passwordreset-emailerror-capture2": "{{GENDER:$2|Däm|Däm|Däm Metmaacher|Dä|Däm}} $1 en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> ze scheke hät nit jeflupp: {{PLURAL:$3|Dä Nahme vum Metmaacher un dat Paßwood|Di Leß met dä Nahme un Paßwööter|Nix weed}} heh noh aanjezeijsch.",
+       "passwordreset-nocaller": "Entärne Fähler: Ene Oprohfer moß aanjejovve sin.",
+       "passwordreset-nosuchcaller": "Entärne Fähler: Dä Oprohfer „$1“ känne mer nit.",
        "passwordreset-invalideamil": "Dat es en onjöltejje Addräß fö de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>",
+       "passwordreset-nodata": "Keine Metmaacher_Nahme un kein Adräß för de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> es aanjejovve woode.",
        "changeemail": "Donn en Adräß för de <i lang=\"en\">e-mail</i> ändere udder fott schmiiße",
        "changeemail-header": "Donn heh dat Fommulaa ußfölle, öm Ding Adräß för de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> ze ändere. Wann De en Adräß loß wähde wells, maach dat Fäld läddesch, ih dat De dat Fommolaa loß scheks.",
        "changeemail-passwordrequired": "Do moß Ding Paßwood enjävve, öm di Änderong ze beschtähteje.",
        "minoredit": "Dat es en klein Änderong (mini)",
        "watchthis": "Op di Sigg heh oppaßße",
        "savearticle": "De Sigg Avspeichere",
+       "savechanges": "Afschpeijschere",
        "publishpage": "Veröffentlesche",
+       "publishchanges": "Veröffentlesche",
        "preview": "Vör-Ansich",
        "showpreview": "Vöraff belohre",
        "showdiff": "Veränderonge zeije",
        "previewerrortext": "Ene Fähler es beim Versohch opjetrodde, de Sigg met de Änderonge aanzezeije.",
        "blockedtitle": "Dä Metmaacher es jesperrt",
        "blockedtext": "'''Dinge Metmaacher-Nahme oder IP Adress es vun „$1“ jesperrt woode.'''\n\nAls Jrund es enjedrage: „''$2''“\n\nDo kanns heh em Wiki immer noch lässe. Do sühß ävver di Sigg heh, wann De op rude Links klicks, neu Sigge aanlääje, udder Sigge ändere wells, denn doför bes De jäz jeschperrt.\n\nDo kanns met $1 oder enem andere [[{{MediaWiki:Grouppage-sysop}}|Wiki-Köbes]] övver dat Schpärre schwaade, wann De wells.\nDo kanns ävver nor dann „''E-Mail aan dä Metmaacher''“ aanwände, wann De ald en E-Mail Adress en Dinge [[Special:Preferences|Enstellunge]] enjedrage un freijejovve häs un wann et E-mail schecke nit metjesperrt es.\n\nDun en Ding Aanfroge nenne:\n* Dä Wikki-Köhbeß, dä jeschpächt hät: $1\n* Der Jrond för et Schpärre: $2\n* Da wood jesperrt: $8\n* De Sperr soll loufe bes: $6\n* De Nommer vun dä Schpärr: #$5\n* Ding IP-Adress is jetz: $3\n* Di Sperr es wäje odde jäje: $7\n\nDo kanns och noch en et <span class=\"plainlinks\">[{{fullurl:Special:IPBlockList|&action=search&limit=&ip=%23}}$5 Logbohch met de Schpärre]</span> loore.",
-       "autoblockedtext": "'''Ding IP Adress es automattesch jesperrt woode.'''\n<br />\n'''Se wor vun enem Metmaacher jebruch woode, dä vun „$1“ jesperrt woode es.'''\n<br />\nAls Jrund es enjedrage: „''$2''“\n\nDo kanns heh em Wiki immer noch lesse. Do sühß ävver di Sigg heh, wann De op rude Links klicks, neu Sigge aanlääje, odder Sigge ändere wells, denn doför bes De jetz jesperrt.\n\nDo kanns met $1 oder enem andere [[{{MediaWiki:Grouppage-sysop}}|Wiki-Köbes]] övver dat Schpärre schwaade, wann De wells.\nDo kanns ävver nor dann „''e-mail aan dä Metmaacher''“ aanwende, wann De ald en e-mail Adress en Dinge [[Special:Preferences|Enstellunge]] enjedrage un freijejovve häs un wann et e-mail schecke nit metjeschperrt es.\n\nDun en Dinge Aanfrore nänne:\n* Dä Wiki-Köbeß, dä jesperrt hät: $1\n* Der Jrond för et Sperre: $2\n* Da wood jesperrt: $8\n* De Sperr soll loufe bes: $6\n* De Nommer vun dä Sperr: #$5\n* Ding IP-Adress is jetz: $3\n* Di Sperr es wäje odde jäje: $7\n\nDo kanns och noch en et <span class=\"plainlinks\">[{{fullurl:Special:IPBlockList|&action=search&limit=&ip=%23}}$5 {{int:ipblocklist}}]</span> loore.",
+       "autoblockedtext": "'''Ding IP Adress es automattesch jeschpächt woode.'''\n<br />\n'''Se wohr vun enem Metmaacher jebruch woode, dä vun „$1“ jeschpächt woode es.'''\n<br />\nAls Jrond es enjedrage: „''$2''“\n\nDo kanns heh em Wikki emmer noch lesse. Do sühß ävver di Sigg heh, wann De op ene rude Lengk klrks, neu Sigge aanlääje, udder Sigge änndere wells, denn doför bes De jäz jeschpächt.\n\nDo kanns met $1 oder enem andere [[{{MediaWiki:Grouppage-sysop}}|Wiki-Köbes]] övver dat Schpärre schwaade, wann De wells.\nDo kanns ävver nor dann „''e-mail aan dä Metmaacher''“ aanwende, wann De ald en e-mail Adress en Dinge [[Special:Preferences|Enstellunge]] enjedrage un freijejovve häs un wann et e-mail schecke nit metjeschperrt es.\n\nDun en Dinge Aanfrore nänne:\n* Dä Wiki-Köbeß, dä jesperrt hät: $1\n* Der Jrond för et Sperre: $2\n* Da wood jesperrt: $8\n* De Sperr soll loufe bes: $6\n* De Nommer vun dä Sperr: #$5\n* Ding IP-Adress is jetz: $3\n* Di Sperr es wäje odde jäje: $7\n\nDo kanns och noch en et <span class=\"plainlinks\">[{{fullurl:Special:IPBlockList|&action=search&limit=&ip=%23}}$5 {{int:ipblocklist}}]</span> loore.",
        "blockednoreason": "Keine Aanlass aanjejovve",
        "whitelistedittext": "Do mööts ald $1, öm heh em Wiki Sigge ändere ze dürfe.",
        "confirmedittext": "Do muss Ding E-Mail Adress ald bestätich han, ih dat De heh Sigge ändere darfs.\nDrag Ding E-Mail Adress en Ding [[Special:Preferences|ming Ennschtällong]] en, un dun „Dun Ding <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß bestätije looße“ klicke.",
        "accmailtext": "En automattesch un zofällesch neu ußjewörfelt Passwood för dä\nMetmaacher „[[User talk:$1|$1]]“ es noh „$2“ jescheck woode.\n\nDat Passwoot för dä neue Zojang kanns De op dä {{int:Specialpage}} zom\n„[[Special:ChangePassword|{{int:resetpass}}]]“ ändere,\nwann De wider enjelogg bes.",
        "newarticle": "(Neu)",
        "newarticletext": "Ene Link op en Sigg, wo noch nix drop steiht, weil et se noch jar nit jitt, hät Dich noh heh jebraht.\nÖm di Sigg aanzelähje, schriev heh unge en dat Feld eren, un dun dat dann avspeichere.\nLuur op de [$1 Sigge met Hölp] noh, wann De mih doh drövver weßße wells.\nWann De jar nit heh hen kumme wollts, dann jangk zeröck op di Sigg, wo De herjekumme bes, Dinge Brauser hät ene Knopp doför.",
-       "anontalkpagetext": "----\n<i>Dat heh es de Klaaf Sigg för ene namenlose Metmaacher. Dä hät sich noch keine Metmaacher Name jejovve un\nenjerich, ov deit keine bruche. Dröm bruche mer sing IP Adress öm It oder In en uns Lisste fasszehalde.\nSu en IP Adress kann vun janz vill Metmaacher jebruch wääde, un eine Metmaacher kann janz flöck\nzwesche de ungerscheidlichste IP Adresse wähßele, womöchlich ohne dat hä et merk. Wann Do jetz ene namenlose\nMetmaacher bes, un fings, dat heh Saache an Dich jeschrevve wääde, wo Do jar nix met am Hot häs, dann bes Do\nwahrscheinlich och nit jemeint. Denk villeich ens drüvver noh, datte Dich [[Special:CreateAccount|anmelde]] deis,\ndomet De dann donoh nit mieh met esu en Ömständ ze dun häs, wie de andere namenlose Metmaacher heh. Wann de aanjemelldt bes un deis [[Special:UserLogin|enlogge]], dann kam_mer Desch och fun alle andere Metmaacher ongerschejde.</i>",
+       "anontalkpagetext": "----\n<strong>Dat heh es de Klaaf Sigg för ene nahmelohse Metmaacher. Dä hät sich noch keine Metmaacher Name jejovve un enjerich, ov deit keine bruche.</strong> Dröm bruche mer sing \n<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräß, öm It oder In en uns Lisste faßßzehalde.\nSu en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräß kann vun janz vill Metmaacher jebruch wääde, un eine Metmaacher kann flöck zwesche de ungerscheidleschste <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräßw ähßele, womöchlich ohne dat hä et merk. Wann Do jetz ene nahmelohse Metmaacher bes, un fengs, dat heh Saache an Desch jeschrevve wääde, wo Do jar nix med am Hoht häs, dann bes Do\nwahrscheinlich och nit jemeijnt. Dängk velleisch ens drövver noh, datte Dich [[Special:CreateAccount|anmelds]],\ndomet De dann donoh nit mih met esu en Ömständ ze don häs, wi de andere namenlose Metmaacher heh. Wann de aanjemälldt bes un deis [[Special:UserLogin|enlogge]], dann kam_mer Desch och fun alle andere Metmaacher ongerscheijde.",
        "noarticletext": "<span class=\"plainlinks\">Em Momang es keine Täx op heh dä Sigg. Jangk en de Täxte vun ander Sigge [[Special:Search/{{PAGENAME}}|noh däm Titel söhke]], udder [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} donn en de Logböscher donoh loore], udder [{{FULLURL:{{FULLPAGENAME}}|action=edit}} fang di Sigg aan] ze schrieve, udder jangk zeröck woh De heer kohms. Do hät Dinge Brauser ene Knopp för.</span>",
        "noarticletext-nopermission": "Op dä Sigg es em Momang nix drop.\nDo kanns noh däm Tittel vun heh dä Sigg [[Special:Search/{{PAGENAME}}|em Tex op ander Sigge söhke]],\nudder en dä zopaß <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Logbööscher nohloore]</span>.",
        "missing-revision": "En Version $1 vun dä Sigg „{{FULLPAGENAME}}“ jidd_et nit.\n\nEsu jät kütt för jewöhnlesch, wam_mer enem övverhollte Lengk ob en Sigg follesch, di zweschedren fottjeschmeße woode es.\nMih doh drövver fengk mer em [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Logbooch vum Sigge Fottschmiiße].",
        "previewnote": "<strong>Heh kütt blohß en Aanseesch vöraff — Ding Änderonge sin noch nidd em Wikki faßjehallde!</strong>",
        "continue-editing": "Jangk tiräk nohm Plaz zom Schrieve",
        "previewconflict": "Heh di Vör_Aanseesch zeisch dä Enhald vum bovvere Täxfäld.\nEsu wööd di Sigg ußsinn, wann De se jäz afschpeijschere dähts.",
-       "session_fail_preview": "<strong>Schahd: Met Dinge Änderonge kunnte mer su nix aanfange.\nVersöhk et jrahd noch ens.\nWann dat widder nit flupp, dann versöhk et ens met [[Special:UserLogout|Ußlogge]] un widder Enlogge.</strong>",
-       "session_fail_preview_html": "'''Schad: Ding Änderunge kunnte mer su nix met aanfange. De Daate vun Dinge Login-Säschen sin nit öntlich erüvver jekumme, oder einfach ze alt.'''\n\n''Dat Wiki heh hät rüh HTML zojelooße, dröm weed de Vör-Aansich nit jezeich. Domet solls De jeschötz wääde - hoffe mer - un Aanjreffe met Java_Skripp jäje Dinge Kompjuter künne Der nix aandun.''\n\n'''Falls för Dich söns alles jod ussüht, versök et jrad noch ens. Wann dat widder nit flupp, dann versök et ens met [[Special:UserLogout|Uslogge]] un widder Enlogge.'''",
+       "session_fail_preview": "Schahd: Met Dinge Änderonge kunnte mer su nix aanfange. De Sezongsdahte sin verschött jejange.\nDo künnts ußjelogg wohde sin.\n<strong>Bes sescher, dat De verhaftesc noch ennjelogg bes un dann versöhk et jrahd noch ens.</strong>\nWann dat widder nit flupp, dann versöhk et ens met [[Special:UserLogout|Ußlogge]] un widder Enlogge,\nun pröhf, dat Dinge Brauser <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„Plätzjer“\">cookies</i> vum Wikki aannemmp.",
+       "session_fail_preview_html": "<strong>Schahd: Ding Änderonge kunnte mer su nix met aanfange. De Daate vun Dinge Login-Swzong sin nit öntlich erövver jekumme, udder einfach zoh ahl un affjeloufe.</strong>\n\nDat Wiki heh hät rüh HTML zohjelohße, dröm weed de Vör-Aansesch nit aanjezeisch. Domet solls De jeschötz wääde - hoffe mer - un Aanjreffe met Java_Skripp jäje Dinge Kompjuter künne Der nix aandon.\n\n<strong>Falls för Dich söns alles jod ussüht, versök et jrad noch ens.</strong>\nWann dat widder nit flupp, dann versök et ens met [[Special:UserLogout|Uslogge]] un widder Enlogge,\nun pröhf, dat Dinge Brauser <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„Plätzjer“\">cookies</i> vum Wikki aannemmp.",
        "token_suffix_mismatch": "'''Ding Änderong ham_mer nit övvernomme. Dinge Brauser hät Sazzeijsche en dä verschtoche Makkehrong för et Ändere versout. Dat paßehrt och ens, wann enne <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„ene ẞööver en de Nohberschaff, ene Zweschedrääjer udder Zwescheschpeijscher, ene Vermeddelongsrääschner“\">proxy</i>-ẞööver nit fungkßjeneet. Et Affschpeischere wöhr doh jefährlesch, do künnt dä Sigge_Enhaldt kapott bei jon.'''",
        "edit_form_incomplete": "<strong>Ene Aandeil vun dämm Fommolaa es nit reeschtesch om ẞööver aanjekumme. Donn Ding Ennjahbe pröhve, reparehre, un versöhg et norrens.</strong>",
        "editing": "De Sigg „$1“ ändere",
        "template-semiprotected": "(halfjeschöz - tabu för neu Metmaacher un ohne Enlogge)",
        "hiddencategories": "Di Sigg heh is en {{PLURAL:$1|dä verschtoche Saachjropp: |dä $1 verschtoche Saachjroppe: |keij verschtoche Saachjroppe dren.}}",
        "edittools": "<!-- Dä Täx heh zeisch et Wikki onger däm Täxfeld zom „Ändere/Beärbeijde“ un beim Täxfeld vum „Huhlade“ ann. -->",
+       "edittools-upload": "-",
        "nocreatetext": "Sigge neu aanläje es nor müjjelich, wann de [[Special:UserLogin|enjelogg]] bes. Der ohne kanns De ävver Sigge ändere, di ald doh sin.",
        "nocreate-loggedin": "Do häs nit dat Rääch, neu Sigge aanzelääje.",
        "sectioneditnotsupported-title": "Afschnedde Ändere is nit zohjelohße",
        "content-model-json": "<i lang=\"en\" xml:lang=\"en\" title=\"JavaScript Object Notation\">JSON</i>",
        "content-json-empty-object": "Nix dren",
        "content-json-empty-array": "Nix dren",
+       "deprecated-self-close-category": "Sigge med onjölltejje <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i>-Befähle, di en sesch sällf ze Äng jonn.",
+       "deprecated-self-close-category-desc": "De Sigg hädd onjölltejje <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i>-Befähle, di en sesch sällf ze Äng jonn. Beijshpelle sin <code>&lt;b/></code> udder <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">&lt;span/></code>. Wat di donn, weed bahl esu verännert, dat se mem <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language Version 5\">HTML5</i> zesamme paße, woh mer se en Wikkitäx it bruche sullt.",
        "duplicate-args-warning": "<strong>Opjepaß:</strong> [[:$1]] röhf [[:$2]] met mih wi eijnem Wäät för der Parramehter „$3“ op. Blohß der läzde Wäät vun dänne weed opjenumme un jebruch.",
        "duplicate-args-category": "Sigge met dubbelt aanjejovve Parramehtere för Schablohne.",
        "duplicate-args-category-desc": "Sigge met Oprohve vun Schablohne met dubbelt aanjejovve Parramehtere dren, alsu esu jät wi <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> un <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "last": "met dovör",
        "page_first": "Aanfang",
        "page_last": "Engk",
-       "histlegend": "Heh kanns De Versione för et Verjliiche ußsöke: Dun met dä Knöpp di zweij markiere,\nzwesche dänne De de Ungerscheid jezeich krije wells, dann dröck „<b style=\"padding:2px; background-color:#ddd;\ncolor:black\">{{int:compareselectedversions}}</b>“ udder „<b style=\"padding:2px; background-color:#ddd;\ncolor:black\">{{int:visualcomparison}}</b>“ udder „<b style=\"padding:2px; background-color:#ddd;\ncolor:black\">{{int:wikicodecomparison}}</b>“ met Dinge Taste, oder klick op ein vun dä Knöpp övver oder unger de Liss.<br />\nVerklierung:\n({{int:cur}}) = donn met de neuste Väsjohn verjliche,\n({{int:last}}) = donn met de Väsjohn ein doför verjliche,\n<b>M</b> = en klein <b>M</b>ini-Änderong,\nDattum+Uhrzigg = don de Version fun dämm Daach un dä Zigg aanzeije.",
+       "histlegend": "Heh kanns De Väsiohne för et Verjliische ußsöhke: Dun met dä Knöpp di zweij makehre, zwesche dänne De de Ungerscheid jezeich krije wells, dann dröck „<b style=\"padding:2px; background-color:#ddd; color:black\">{{int:compareselectedversions}}</b>“ udder klek op ein vun dä Knöpp övver udder onger dä Less.<br />\nVerklierung:\n({{int:cur}}) = donn met de neuste Väsjohn verjliische,\n({{int:last}}) = donn met de Väsjohn ein doför verjliische,\n<b>{{int:minoreditletter}}</b> = en klein <strong>M</strong>ini-Änderong,\nDattum+Uhrzigg = don de Väsjohn fun dämm Daach un dä Zigg aanzeije.",
        "history-fieldset-title": "Wat uß de Verjangeheit ußwähle?",
        "history-show-deleted": "blohß fottjeschmeße Versione",
        "histfirst": "de Ählste",
        "mergehistory-from": "Ursprongssigg:",
        "mergehistory-into": "Zielsigg:",
        "mergehistory-list": "Versione, di zosamme jelaat wäde künne",
-       "mergehistory-merge": "De Versione onge künne fun „[[:$1]]“ noh „[[:$2]]“ övverdraare wäde.\nDonn de Version makeere bes wohen (inklusive) dat övverdraare wäde sull. Donn drop aachjevve, dat de Ußwahl fott es, wann De op eine fun dä Links klicks.",
+       "mergehistory-merge": "De Versione onge künne fun „[[:$1]]“ noh „[[:$2]]“ övverdrahre wäde.\nDonn de Väsjon makehre bes wohen (inklusive) dat övverdrahre wähde sull. Donn drobb aachjevve, dat de Ußwahl fott es, wann De op eine fun dä Lengk kleks.",
        "mergehistory-go": "Don Versione zeije, di mer zosamme läje künne",
        "mergehistory-submit": "Versione zosamme läje",
        "mergehistory-empty": "Mer han kei Versione för zesammezeläje",
        "mergehistory-fail-bad-timestamp": "Dattom odder Zigg udder beeds sin nit jöltesch",
        "mergehistory-fail-invalid-source": "De Quällesigg es nit jöltesch",
        "mergehistory-fail-invalid-dest": "De Zihlsigg es nit jöltesch",
+       "mergehistory-fail-no-change": "Et sin kein verjange Väsjohne zesamme jelaat wohde. Doht de Parramehtere för Sigg un Zigg norr_ens pröhfe.",
        "mergehistory-fail-permission": "Kein Berääschtejong, de vörreje Väsjohne zesamme ze lähle.",
        "mergehistory-fail-self-merge": "De Quell-Sigg un de Ziel-Sigg sin deselve Sigg.",
        "mergehistory-fail-timestamps-overlap": "De Väjsohne vun de Quällesigg kumme övverkrüz udder noh de Väsjohne vun de Zihlsigg.",
        "mergehistory-comment": "„[[:$1]]“ zosamme jelaat met „[[:$2]]“ — $3",
        "mergehistory-same-destination": "De Quell-Sigg un de Ziel-Sigg dörve nit deselve Sigg sinn.",
        "mergehistory-reason": "Der Jrond:",
+       "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
        "mergelog": "Logbohch fum Sigge zesamme Lähje",
        "revertmerge": "Dat Zosammelääje widder retuhr maache",
        "mergelogpagetext": "Dat heh es dat Logbohch fun de zesammejelaate Väsjohne fun Sigge",
        "difference-title-multipage": "Ongerscheide zwesche dä Sigge „$1“ un „$2“",
        "difference-multipage": "(Ongerscheide zwesche Sigge)",
        "lineno": "Reih $1:",
-       "compareselectedversions": "Dun de markehte Väsjohn verjliiche",
+       "compareselectedversions": "Dun de markehte Väsjohne verjliiche",
        "showhideselectedversions": "De ußjewählte Versione aanzeije udder vershteiche",
        "editundo": "De läzde Änderong zeröck nämme",
        "diff-empty": "(Keine Ongerscheid)",
        "youremail": "E-Mail *",
        "username": "{{GENDER:$1|Metmaacher|Metmaacherėnne|Metmaacher|Metmaacherėnne|Metmaacher}} Name:",
        "prefs-memberingroups": "{{GENDER:$2|Bes}} en {{PLURAL:$1|de Metmaacherjrupp:|$1 Metmaacherjruppe:|keijn Metmaacherjruppe.}}",
+       "prefs-memberingroups-type": "$1",
        "prefs-registration": "Aanjemäldt zigg",
        "prefs-registration-date-time": "dem $2 öm $3 Uhr",
        "yourrealname": "Dinge richtije Nahme *",
        "saveusergroups": "Donn {{GENDER:$1|däm|dem|däm Metmaacher|dä|däm}} [[User:$1|$1]] {{GENDER:$1|sing|singe|sing|ier|sing}} Jroppe faßhalle",
        "userrights-groupsmember": "Dä Metmaacher es en {{PLURAL:$1|dä Jropp:|dä Jroppe:|keine Jropp.}}",
        "userrights-groupsmember-auto": "Dä Metmaacher es automattesch en {{PLURAL:$1|dä Jropp:|dä Jroppe:|keine Jropp.}}",
+       "userrights-groupsmember-type": "$1",
        "userrights-groups-help": "Do kanns de Jroppe för dä Metmaacher heh änndere, ävver opjepaß:\n* E Käßje met Höksche bedüg, dat dä Metmaacher en dä Jropp es.\n* E Käßje ohne Höksche bedüg, dat dä Metmaacher nit en dä Jropp es.\n* E Käßje met Stähnsche donävve bedüg, dat De dat Rääsch zwa ändere, ävver de Änderong nit mih zeröck nämme kanns.",
        "userrights-reason": "Aanlaß odder Jrund:",
        "userrights-no-interwiki": "Do häs nit dat Rääsch, Metmaacher ier Rääschte in ander Wikis ze ändere.",
        "grant-patrol": "Änderonge aan Sigge nohkike",
        "grant-protect": "Sigge schöze un der Schoz wider ophävve",
        "grant-rollback": "Änderonge aan Sigge retuhr maache",
-       "grant-sendemail": "<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mails</i> aan ander Metmaacher schecke",
-       "grant-uploadeditmovefile": "Datteije uhlahde, ußtuusche un ömbenänne",
-       "grant-uploadfile": "Neu datteije huhlahde",
+       "grant-sendemail": "<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mails</i> aan annder Metmaacher schecke",
+       "grant-uploadeditmovefile": "Datteije huhlahde, ußtuusche un ömbenänne",
+       "grant-uploadfile": "Neu Datteije huhlahde",
        "grant-basic": "Jrondlähje Rääsch",
-       "grant-viewdeleted": "Fottjeschmeße Dahte un Sigge belohre",
-       "grant-viewmywatchlist": "De eije Oppaßleß ze belooere",
+       "grant-viewdeleted": "Fottjeschmeße Dahteije un Sigge belohre",
+       "grant-viewmywatchlist": "De eije Oppaßleß ze belohre",
        "newuserlogpage": "Logbohch för neu Metmaachere",
        "newuserlogpagetext": "He sin de Metmaacher opjelėßß, di sesh nöü aanjemäldt han.",
        "rightslog": "Logbohch för Änderonge aan Metmaacher-Rääschde",
        "action-read": "di Sigg ze lesse",
        "action-edit": "di Sigg ze ändere",
        "action-createpage": "di Sigg aanzeläje",
-       "action-createtalk": "Klaafsigge aanzeläje",
+       "action-createtalk": "he di Klaafsigg aanzeläje",
        "action-createaccount": "hee dä neue Metmaacher aanzemelde",
        "action-autocreateaccount": "automattesch heh dä Metmaacher vun Ußerhallf aanzelähje",
        "action-history": "de Leß met de fröhjere Väsohne vun heh dä Sigg ze belohre",
        "rcshowhidemine-hide": "verschteihsche",
        "rcshowhidecategorization": "De Sigge ier Ennohdenong $1",
        "rcshowhidecategorization-show": "Aanzeije!",
-       "rcshowhidecategorization-hide": "Verschteische!",
+       "rcshowhidecategorization-hide": "verschteihsche",
        "rclinks": "Zeisch de läzde {{int:pipe-separator}}$1{{int:pipe-separator}} Änderonge us de läzde {{int:pipe-separator}}$2{{int:pipe-separator}} Däch, un dun {{int:pipe-separator}} $3.",
        "diff": "Ongerscheid",
        "hist": "Väsjohne",
        "rc_categories_any": "Öhndseijne vun dä aanjejovve Saachjroppe",
        "rc-change-size": "$1 {{PLURAL:$1|Byte|Bytes}}",
        "rc-change-size-new": "$1 {{PLURAL:$1|Byte|Bytes|Bytes}} noh dem Ändere",
-       "newsectionsummary": "Neu Avschnet /* $1 */",
+       "newsectionsummary": "Neuje Afschnet /* $1 */",
        "rc-enhanced-expand": "Einzelheite aanzeije",
        "rc-enhanced-hide": "Einzelheite versteiche",
        "rc-old-title": "ojinaal als „$1“ aanjelaat",
        "uploaded-hostile-svg": "Mer han onseescher <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Cascading Style Sheet\">CSS</i>-Befähle en enem „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">style</code>“-Ellemänt vun dä huhjelahde <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Scalable Vector Graphics\">SVG</i>_Dattei jefonge.",
        "uploaded-event-handler-on-svg": "Projramme för Ä'eijschneße ze behanndelle „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">&lt;$1=\"$2\"&gt;</code>“ ennzesäze es en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Scalable Vector Graphics\">SVG</i>_Datteije verbodde.",
        "uploaded-href-attribute-svg": "En <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Scalable Vector Graphics\">SVG</i>_Datteije darrev övver <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">href</code> blohß op <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Transfer Protocol\">HTTP://</i> udder <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Transfer Protocol Secure - HTTP övver SSL - HTTP övver TSL\">HTTPS://</i> verlenk wähde. Heh es ävver <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">&lt;$1 $2=\"$3\"&gt;</code> dren.",
-       "uploaded-href-unsafe-target-svg": "Mer han ene „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">href</code>“-Befähl obb e onseescher Zihl „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">&lt;$1 $2=\"$3\"&gt;</code>“ en dä huhjelahde <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Scalable Vector Graphics\">SVG</i>_Dattei jefonge.",
+       "uploaded-href-unsafe-target-svg": "Mer han ene „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">href</code>“-Befähl obb e onseescher Zihl mem <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Identifier\">URI</i> „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">&lt;$1 $2=\"$3\"&gt;</code>“ en dä huhjelahde <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Scalable Vector Graphics\">SVG</i>_Dattei jefonge.",
        "uploaded-animate-svg": "Mer han dä Befähl „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">animate</code>“ en dä huhjelahde \n<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Scalable Vector Graphics\">SVG</i>_Dattei jefonge, dä ene „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">href</code>“-Befähl verändere künnt övver de „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">from</code>“-Eijeschaff „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">&lt;$1 $2=\"$3\"&gt;</code>“.",
        "uploaded-setting-event-handler-svg": "Ed es verbodde, Projramme för Ä'eijschneße ze behanndelle ennzesäze, un de Datteije, di dat donn, wähde jeschpächt. Mer han „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">&lt;$1 $2=\"$3\"&gt;</code>“ en dä huhjelahde <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Scalable Vector Graphics\">SVG</i>_Dattei jefonge.",
        "uploaded-setting-href-svg": "Dä Befähl „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">set</code>“ för de „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">href</code>“-Eijeschaff vun övverjeohdente Ällemänt ze säze es jeschpächt.",
        "upload-too-many-redirects": "Zoh vill Ömleitunge en däm <i lang=\"en\">URL</i>",
        "upload-http-error": "Ene <i lang=\"en\">HTTP</i>-Fäähler es opjetrodde: $1",
        "upload-copy-upload-invalid-domain": "Fun dä Domain künne mer nix noh heh huh laade. Di es nit zohjelohße.",
+       "upload-foreign-cant-upload": "Heh dat Wikki es nit esu ennjeschtallt, dat mer Datteije en dat jewönschte Repposetohrejom vun Datteije ußerhallef vum Wikki huhlahde künnt.",
+       "upload-foreign-cant-load-config": "Mer kunnte de Enschtälonge för et Datteije-Huhlahde en e Repposetohrejom vun Datteije ußerhallef vum Wikki nit lahde.",
+       "upload-dialog-disabled": "Op heh däm Wähsch Datteije huhzelahe es heh em Wikki affjeschalldt.",
        "upload-dialog-title": "Dateij huhlahde",
        "upload-dialog-button-cancel": "Ophühre!",
        "upload-dialog-button-done": "Jedonn",
        "upload-dialog-button-upload": "Lohß Jonn!",
        "upload-form-label-infoform-title": "Eijnzelheijte",
        "upload-form-label-infoform-name": "Nahme",
+       "upload-form-label-infoform-name-tooltip": "En eijndeutejje Titel för di Datei, di se beschrihv un als Dattejnahme dehnt. Mer kan jewöhnlejje Schprohch met Zweschreum zwesche de Wööter nämme. Donn keine Datteijnahme-Zohsaz derbeij.",
        "upload-form-label-infoform-description": "Äkliehrong",
+       "upload-form-label-infoform-description-tooltip": "Donn koot beschrihve, wat vun Belang es för dat Wärk.\nFör e Fotto, schrihv de Houpsaache op, di affjebelld sin, de Zigg un Jelähjeheid un der Plaz.",
        "upload-form-label-usage-title": "Der Jebruch",
        "upload-form-label-usage-filename": "Dä Dattei iehre Nahme",
        "upload-form-label-own-work": "Dat es ming eije Wärk",
        "upload-form-label-infoform-categories": "Saachjroppe",
        "upload-form-label-infoform-date": "Dattum",
+       "upload-form-label-own-work-message-generic-local": "Esch beschtähtejjen, dadd esch heh di Dattei aam Huhlahde ben un derbeij de Bedengonge för der Dehns un de Rähjelle för de Lezänze {{GRAMMAR:em|{{ucfirst:{{SITENAME}}}}}} ennhallden.",
        "upload-form-label-not-own-work-message-generic-local": "Wann De di Dattei nit en de jemeinsamme Sammlong vun Datteule huh lahde kanns un derbei och de Rähjelle {{GRAMMAR:vun|{{ucfirst:{{SITENAME}}}}}} ennhalde, dann maach heh nit wigger, un probehr ene anndere Wähsch.",
        "upload-form-label-not-own-work-local-generic-local": "Do künnts edd och ens met dä [[Special:Upload|Schtandatt-Sigg zom Huhlahde]] versöhke welle.",
        "upload-form-label-own-work-message-generic-foreign": "Esch verschtonn, dadd esch en en jemeinsamme Sammlong huh aam lahde ben un dadd sesch dat met dä Bedengonge un de Lezänzbedengonge heh verdräht.",
        "uploadstash-badtoken": "Dat ze donn hät nit jeflupp. Velleich wohre Ding Daate zom Deil verschött jejange udder afjeloufe. Versöhg et nor_rens.",
        "uploadstash-errclear": "Mer kunnte de Dateie nit fottschmieße.",
        "uploadstash-refresh": "De Leß met de Dateie op ene neue Shtand bränge",
+       "uploadstash-thumbnail": "et Minni-Belldsche aanlohre",
        "invalid-chunk-offset": "Ene onjöltijje Aanfangspungk för dä Rötsch",
        "img-auth-accessdenied": "Keine Zohjang",
        "img-auth-nopathinfo": "De <code xml:lang=\"en\" lang=\"en\" dir=\"rtl\">PATH_INFO</code> fäält.\nDä Webßööver es nit doför ennjerescht, di Ennfommazjuhn wigger ze jävve.\nHä künnd_op <code xml:lang=\"en\" lang=\"en\" dir=\"rtl\">CGI</code> opjebout sin, un dröm <code xml:lang=\"en\" lang=\"en\" dir=\"rtl\">img_auth</code> nit ongschtöze künne. Loor em [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization Handbohch] noh, wat domed es.",
        "nbytes": "$1 Byte{{PLURAL:$1||s|}}",
        "ncategories": "{{PLURAL:$1| ein Saachjropp | $1 Saachjroppe | keij Saachjroppe }}",
        "ninterwikis": "{{PLURAL:$1|Eine Engerwikilengk|$1 Engerwikilengks|Keine Engerwikilengk}}",
-       "nlinks": "{{PLURAL:$1|eine Link|$1 Links}}",
+       "nlinks": "{{PLURAL:$1|eine Lengk|$1 Lengks|Keijne Lengk}}",
        "nmembers": "met {{PLURAL:$1|ein Sigg|$1 Sigge}} dren",
        "nmemberschanged": "met&nbsp;$1&nbsp;→&nbsp;{{PLURAL:$2|eine Sigg|$2&nbsp;Sigge|keine Sigg}}",
        "nrevisions": "{{PLURAL:$1|Ein Änderong|$1 Änderonge|Keij Änderong}}",
        "apisandbox-jsonly": "Der ohne JavaSkrepp kam_mer de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> för zom erömprobehre nit bruche.",
        "apisandbox-api-disabled": "Dat <i lang=\"en\">API</i> es en heh dämm Wiki afjeschalldt.",
        "apisandbox-intro": "Op heh dä Sigg kanns De met dä <strong><i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> vum MehdijaWikki singem Wäbdehns</strong> eröm schpelle.\nBeloor Der de Einzelheijte, un wi di jebruch weed, op dä iere [[mw:API:Main_page Sigg met de Verklieronge]].\nE Beischpell: [https://www.mediawiki.org/wiki/API#A_simple_example De Houpsigg holle].\nSöhk ene {{int:Apisb-label-action}} uß, öm mih Beischpelle aanjezeisch ze krijje.\nOch wann dat heh nor zom Ußprobehre es, kann dat, wat De heh mähß, et Wikki veränndere.",
-       "apisandbox-unfullscreen": "Sigg aanzeije",
+       "apisandbox-fullscreen": "Om jannze Scherrem zeije",
+       "apisandbox-fullscreen-tooltip": "Maach de Sandkeß esu jruhß wi et jannze Brauser-Finster.",
+       "apisandbox-unfullscreen": "De Sigg nommahl aanzeije",
+       "apisandbox-unfullscreen-tooltip": "Maach de Sandkeß kleijner, esu dat dem Mehdijawikki sing Navvijazjuhns-Lengks zohjänglesch wähde.",
        "apisandbox-submit": "Lohß jonn!",
        "apisandbox-reset": "Läddesch maache",
        "apisandbox-retry": "Norr_ens versöhke",
+       "apisandbox-loading": "Ben de Ennfommazjuhne för et Moduhl „$1“ vun de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> aam lahde&nbsp;&hellip;",
+       "apisandbox-load-error": "Ene Fähler es opjetrodde beim Lahde vun Enfommazjuhne för et \n<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i>-Moduhl „$1“: $2",
+       "apisandbox-no-parameters": "Heh dat <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i>Moduhl hät kein Parramehtere.",
        "apisandbox-helpurls": "Lengks för Hölp",
        "apisandbox-examples": "Bäijshpelle",
        "apisandbox-dynamic-parameters": "Zohsäzlejje Parrameetere",
        "apisandbox-dynamic-error-exists": "Ne Parramehter mem Nahme „$1“ ham_mer ald.",
        "apisandbox-deprecated-parameters": "Övverhollte Parramehtere",
        "apisandbox-submit-invalid-fields-title": "Paa Flder sin nit jöltesch",
+       "apisandbox-submit-invalid-fields-message": "Donn de makkehrte Fällder bereeschtejje un versöhg et norr_ens.",
        "apisandbox-results": "Erus jekumme:",
+       "apisandbox-sending-request": "Ben en Aanfrohch aan et <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> aam schecke&nbsp;&hellip;",
+       "apisandbox-loading-results": "Ben en Antwoot vum <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> aam krijje&nbsp;&hellip;",
+       "apisandbox-results-error": "Ene Fähler es opjetrodde beim Lahde vun dä Antwoot ob de Aanfrohch aan et <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i>: $1.",
        "apisandbox-request-url-label": "Dä <i lang=\"en\">URL</i> vun dä Aanfrooch:",
-       "apisandbox-request-time": "De Zigg vum Afroof: $1",
+       "apisandbox-request-time": "De Dooer vun däm Afroof: {{PLURAL:$1|ein Millisekond|$1 Millisekonde|kein Millisekond}}.",
+       "apisandbox-alert-page": "Heh op dä Sigg sin onjölltejje Aanjahbe.",
+       "apisandbox-alert-field": "Dä Wääd en dämm Fäld heh es onjölltesch.",
        "booksources": "Böcher",
        "booksources-search-legend": "Söök noh Bezochsquelle för Bööcher",
        "booksources-isbn": "ISBN:",
        "specialloguserlabel": "Dä Metmaacher, dä et jedonn hät:",
        "speciallogtitlelabel": "Betroffe wohr: (dä Tittel vun ener Sigg udder enem Metmaacher singe Nahme)",
        "log": "Logböcher ehr Opzeichnunge (all)",
+       "logeventslist-submit": "Lohß jonn!",
        "all-logs-page": "All de öffentlich Logböcher",
        "alllogstext": "Dat heh es en jesampte Less us all dä Logböhscher {{GRAMMAR:en|{{SITENAME}}}}.\nDä Logböhscher ehre Enhald kam_mer all noh de Aat, de Metmaacher,\noder de Sigge ehr Name, un esu, einzel zoteht aanluhre.\nBei dä Name moß mer op Jruß- un Kleinschreff aachjävve.",
        "logempty": "Mer han kein zopaß Endrähsch en däm Logbooch.",
        "log-title-wildcard": "Sök noh Titelle, di aanfange met …",
        "showhideselectedlogentries": "Ußjesöhk Endrääsch verschteische udder zeije",
        "log-edit-tags": "Donn de Makehronge vun de ußjesöhk Enndrähsch em Logbohch beärbeide",
+       "checkbox-select": "Söhk us: $1",
        "checkbox-all": "Alle",
        "checkbox-none": "Keine",
        "checkbox-invert": "Ußwahl ömdrihje",
        "cachedspecial-viewing-cached-ts": "Dat heh küdd ussem Zewescheschpeischer un nünnt nidd om neuste Schtand sin.",
        "cachedspecial-refresh-now": "De neuste Väsjohn.",
        "categories": "Saachjroppe",
+       "categories-submit": "Lohß jonn!",
        "categoriespagetext": "Heh {{PLURAL:$1|es nur en Saachjropp|sin nur Saachjroppe|es kein Saachjropp}} jeleß, woh jät dren {{PLURAL:$1|es|es|wöhr}}. Mer han_er eije Leßte för de\n[[Special:UnusedCategories|Saachjropp met nix dren]], un de\n[[Special:WantedCategories|jewönschte un nit aanjelaate Saachjroppe]].",
        "categoriesfrom": "Zeijsch Saachjroppe vun heh af:",
        "deletedcontributions": "Fottjeschmeße Väsjohne",
        "activeusers-hidebots": "De Bots fott lohße",
        "activeusers-hidesysops": "De Wiki_Köbesse fott lohße",
        "activeusers-noresult": "Kein Metmaacher jefonge.",
+       "activeusers-submit": "Lohß jonn!",
        "listgrouprights": "Metmaacher_Jroppe-Rääschte",
        "listgrouprights-summary": "Hee kütt de Leß met dä Jroppe vun Metmaacher, di dat Wikki heh kennt, un dänne ier Rääschde.\nMih övver de einzel Rääschde fenkd_Er op de [[{{MediaWiki:Listgrouprights-helppage}}|Hölp-Sigg övver de Metmaacher ier Rääschde]].",
        "listgrouprights-key": "Lejend:\n* E <span class=\"listgrouprights-granted\">jejovve Rääsch</span>\n* E <span class=\"listgrouprights-revoked\">fottjenumme Rääsch</span>",
        "listgrouprights-namespaceprotection-header": "Beschrängkonge för Appachtemangs",
        "listgrouprights-namespaceprotection-namespace": "Appachtemang",
        "listgrouprights-namespaceprotection-restrictedto": "Rääsch(de) zom Verändere",
+       "listgrants": "Berääschtejonge",
+       "listgrants-grant": "Berääschtejong",
        "listgrants-rights": "Rääschte",
        "trackingcategories": "Saachjroppe för täschnsche Saache ze verfollje.",
        "trackingcategories-summary": "Op hee dä {{int:nstab-special}} sin Saachjroppe opjeleß, di automattesch vum Wikki jevöllt wähde. Dä iehr Nahme künne övver Veränderonge aan beschtemmpte Täxte em Appachtemang {{ns:8}} faßjelaat wäde.",
        "trackingcategories-msg": "Saachjropp för täschnsche Saache ze verfollje.",
        "trackingcategories-name": "Dä Nohreesch udder däm Täxschtöck singe Nahme",
        "trackingcategories-desc": "Bedengonge för enjeschloße ze sin",
+       "restricted-displaytitle-ignored": "Sigge met övverjange „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">{<nowiki />{DISPLAYTITLE}}</code>“-Befähle",
+       "restricted-displaytitle-ignored-desc": "Dä Sigg iere „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">{<nowiki />{DISPLAYTITLE}}</code>“-Befähl weed övverjange. Hä kütt nit zopaß met dä aktoälle Övverschreff vun dä Sigg.",
        "noindex-category-desc": "Di Sigg sull vun de Wäbkrauler Robots un de Söhkmaschihne nit opjenumme wähde, weil dat Zauberwoot <code><nowiki>__NOINDEX__</nowiki></code> dren schteiht un se en enem Appachemang es, woh dat zohjelohße es.",
        "index-category-desc": "Di Sigg sull vun de Wäbkrauler Robots un de Söhkmaschihne opjenumme wähde, weil dat Zauberwoot <code><nowiki>__INDEX__</nowiki></code> dren schteiht un se en enem Appachemang es, woh dat zohjelohße es, un wat nommahlerwihs nit vun de Robots dorschsöhk weed.",
        "post-expand-template-inclusion-category-desc": "Nohdämm a paa Schablohne enjesaz woode sen, hät di Sigg mieh Dahte wi <code xml:lang=\"en\" lang=\"en\">$wgMaxArticleSize</code> zohlöhß. Et sin nit alle Oprohve vun Schablohne opjelöhß.",
        "wlnote": "{{PLURAL:$1|Hee es de läzde Änderong uß|Hee sin de läzde <strong>$1</strong> Änderonge uß|Mer han kein Änderonge en}} de läzde {{PLURAL:$2|Stund|<strong>$2</strong> Stunde|<strong>noll</strong> Stunde}} zigg em $3 öm $4 Uhr.",
        "wlshowlast": "Zeisch de läzde $1 Schtunde, $2 Dähsch aan.",
        "watchlist-hide": "Verschtisch",
+       "watchlist-submit": "Aanzeije!",
+       "wlshowtime": "De Aandeijl vun e Zigg zom Aanzeije:",
        "wlshowhideminor": "klein Minni-Änderonge",
        "wlshowhidebots": "de Bots ehr Änderonge",
        "wlshowhideliu": "de ennjeloggte Metmaacher ier Änderonge",
        "wlshowhideanons": "de nahmelohse Metmaacher ier Änderonge",
        "wlshowhidepatr": "de nohjelohrte Änderonge",
        "wlshowhidemine": "ming eije Änderonge",
+       "wlshowhidecategorization": "de Sigge ier Ennohdenong",
        "watchlist-options": "Eijeschaffte fun de Oppassless",
        "watching": "Drobb oppaßße…",
        "unwatching": "Nimmih drobb oppaßße",
        "enotif_body_intro_changed": "{{GENDER:$2|Dä Metmaacher|Et|Dä Metmaacher|De Metmaacherėn|Dä Metmaacher}} $2 hät di Sigg $1 {{GRAMMAR:en 3|{{ucfirst:{{SITENAME}}}}}} aam $PAGEEDITDATE verändert. Op $3 fengks De der aktoälle Schtand vun dä Sigg.",
        "enotif_lastvisited": "Lohr onger „$1“ - doh fengks de all di Ännderonge zigg Dingem läzde Besohch heh.",
        "enotif_lastdiff": "Loor op $1 för heh di Änderong aan_ze_lohre.",
-       "enotif_anon_editor": "Dä namelose Metmaacher $1",
+       "enotif_anon_editor": "Dä nahmelohse Metmaacher $1",
        "enotif_body": "Leeven $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\n{{int:summary}} „$PAGESUMMARY“ $PAGEMINOREDIT\n\nDo kanns dä Metmaacher „$PAGEEDITOR“ aanschpräsche:\n* Övver e-mail: $PAGEEDITOR_EMAIL\n* Em Wiki: $PAGEEDITOR_WIKI\n\nDo kreß vun jetz aan kein e-mail mih, bes dat Do\nDer di Sigg aanjeluurt häs wann De enjelogg bes,\noch wann se norr_ens verändert weed. Do kanns ävver\noch all di Märker för e-mail för di Sigge en Dinger\nOppaßleß op eimohl ändere.\n\nEne schöne Jrohß {{GRAMMAR:vun|{{SITENAME}}}}.\n\n-- \nÖm de Enschtällonge för Nohreeschte aan Desch ze ändere,\njangk op:\n{{canonicalurl:{{#special:Preferences}}}}\n\nDo kanns heh Ding Oppaßleß ändere:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nÖm di Sigg vun Dinger Oppaßleß ze schmiiße:\n$UNWATCHURL\n\nDo kanns heh noh Hölp luhre:\n$HELPPAGE",
        "created": "neu aanjelaht",
        "changed": "jeändert",
        "delete-confirm": "„$1“ fottschmieße",
        "delete-legend": "Fottschmieße",
        "historywarning": "<strong>Opjepass:</strong> Di Sigg, di De fott schmiiße wells, hät {{PLURAL:$1|ein ällder Väsjohn|ald $1 ällder Väsjohne|jaa kein ällder Väsjohne}}.",
+       "historyaction-submit": "Aanzeije!",
        "confirmdeletetext": "Do bes koot dovör, en Sigg för iiwich fottzeschmiiße. Dobei verschwind och de janze Verjangeheit vun dä Sigg us de Dahtebangk, met all ehr Änderonge un Metmaacher Nahme, un all dä Opwand, dä do dren stich. Do moß heh jäz beschtähteje, dat de verschteihs, wat dat bedügg, un dat De weiß, wat Do do mähs.\n<strong>Dun et blohß, wann dat met de [[{{MediaWiki:Policy-url}}|Rääjelle]] verhaftech zosamme jeiht!</strong>",
        "actioncomplete": "Jedonn!",
        "actionfailed": "Dat es donevve jejange",
        "rollbacklinkcount": "{{PLURAL:$1|Ein Änderong|$1 Änderonge|Kein Änderonge}} schtantepee retuur nämme",
        "rollbacklinkcount-morethan": "{{PLURAL:$1|Mih wi ein Änderong|Övver $1 Änderonge|Kein Änderonge}} schtantepee retuur nämme",
        "rollbackfailed": "Dat Zeröcknemme jingk scheiv",
+       "rollback-missingparam": "Doh fähle nühdejje Parramehtere",
        "cantrollback": "De läzde Änderong zeröckzenemme es nit müjjelich. Dä läzde Schrihver es dä eijnzeje, dä aan dä Sigg heh jht jedonn hät!",
        "alreadyrolled": "Mer künne de letzte Änderonge vun dä Sigg „[[:$1]]“ vum Metmaacher „[[User:$2|$2]]“ ([[User talk:$2|Klaaf]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) nimieh zeröcknemme, dat hät ene Andere enzwesche ald jedon, udder de Sigg ömjeändert.\n\nDe Neuste Änderong aan dä Sigg es jetz vun däm Metmaacher „[[User:$3|$3]]“ ([[User talk:$3|Klaaf]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Bei dä Änderong schtundt: „$1“.",
        "revertpage": "Änderunge vun däm Metmaacher „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|däm sing Klaafsigg]]) fottjeschmeße, un doför de lätzde Väsjohn vum „[[User:$1|$1]]“ widder zeröckjehollt",
        "revertpage-nouser": "Änderunge vun enem Metmaacher, däm singe Name vershtoche es, retuur jemaat op de letzte Version {{GENDER:$1|vum|vum|vumm Metmaacher|vun dä|vum}} [[User:$1|$1]]",
        "rollback-success": "De Änderungen vum $1 zeröckjenumme, un dobei de letzte Version vum $2 widder jehollt.",
+       "rollback-success-notify": "Änderonge {{GENDER:$1|vum|vum|vumm Metmaacher|vun dä|vum}} „$1“ sin zerök jenumme un di Sigg es op der Schtand vun doför {{GENDER:$2|vum|vum|vumm Metmaacher|vun dä|vum}} „$2“ jesaz. [$3 Belohr, wat derbeij veränndert wood]",
        "sessionfailure-title": "Fähler met dä Daate vum Enlogge",
        "sessionfailure": "Et jov wall e täschnesch Problehm met Dingem Login. Dröm ham_mer dat us Vörseesch jäz nix jemaht, domet mer nit velleich Ding Änderong däm verkihrte Metmaacher ongerjubele. Jangk zeröck un versöhk et noch ens.",
        "changecontentmodel": "Et Modäll vum Ennhald vun ene Sigg verändere",
        "sp-contributions-username": "Metmaachername odder IP-Address:",
        "sp-contributions-toponly": "Bloß neuste Versione zeije",
        "sp-contributions-newonly": "Blohß neu aanjelaate Sigge zeije.",
+       "sp-contributions-hideminor": "Donn kein Minni-Ännderonge ußblände.",
        "sp-contributions-submit": "Söhke",
        "whatlinkshere": "Wat noh heh link",
        "whatlinkshere-title": "Sigge, woh Lengks op „$1“ dren sen",
        "isimage": "weed aanjezeisch",
        "whatlinkshere-prev": "de vörijje {{PLURAL:$1||$1|noll}} zeije",
        "whatlinkshere-next": "de nächste {{PLURAL:$1||$1|noll}} zeije",
-       "whatlinkshere-links": "← Links",
+       "whatlinkshere-links": "← Lengks",
        "whatlinkshere-hideredirs": "de Ömleijdonge $1",
        "whatlinkshere-hidetrans": "de Oproofe $1",
        "whatlinkshere-hidelinks": "de nommahle Lengks $1",
        "ipblocklist-otherblocks": "Ander {{PLURAL:$1|Sperr|Sperre|-nix-}}",
        "infiniteblock": "för iwich",
        "expiringblock": "bes aam $1 öm $2 Uhr",
-       "anononlyblock": "nor namelose",
+       "anononlyblock": "nor Nahmelohse",
        "noautoblockblock": "automattesch Schpärre avjeschalt",
        "createaccountblock": "neu Aanmelde verbodde",
        "emailblock": "<i lang=\"en\">e-Mail</i> Schecke verbodde",
        "block-log-flags-hiddenname": "Däm Metmaacher singe Name es för de Öffentleschkeit vershtoche",
        "range_block_disabled": "Adresse Jebeede ze sperre, es nit erlaub.",
        "ipb_expiry_invalid": "De Duur es Dress. Jevv se richtich aan.",
+       "ipb_expiry_old": "Di Zick för ed Ußloufe es ald eröm.",
        "ipb_expiry_temp": "Sperre för Metmaacher met verschtoche Nahme mößße för ihwish dohre.",
        "ipb_hide_invalid": "Mer künne dä Metmaacher nit verschteische. Dä hät övver {{PLURAL:$1|ein Änderong|$1 Änderong|kein Änderong}} jemaat.",
        "ipb_already_blocked": "„$1“ es ald jesperrt",
        "lockdbsuccesstext": "{{ucfirst:{{GRAMMAR:Genitive sing|{{SITENAME}}}}}} Daatebank jetz jesperrt.<br /> Dun se widder [[Special:UnlockDB|freijevve]], wann Ding Waadung eröm es.",
        "unlockdbsuccesstext": "De Daatebank es jetz freijejovve.",
        "lockfilenotwritable": "De Datei, wo de Daatebank met jesperrt wääde wööd, künne mer nit aanläje, oder nit dren schrieve. Esu ene Dress! Dat mööt dä Websörver ävver künne! Verzäll dat enem Verantwortliche för de Installation vun däm ẞööver oder repareer et selvs, wann De et kanns.",
+       "databaselocked": "De Dahtebangk es ald jeschpächt.",
        "databasenotlocked": "<strong>Opjepass:</strong> De Daatebank es <strong>nit</strong> jesperrt.",
        "lockedbyandtime": "(aam $2 öm $3 Uhr vum $1)",
        "move-page": "De Sigg „$1“ ömnenne",
        "move-page-legend": "Sigg Ömnenne",
-       "movepagetext": "Heh kanns De en Sigg ömnenne.\nDomet kritt di Sigg ene neue Name, un all vörherije Versione vun dä Sigg och.\nUnger däm ahle Tittel weed automatisch en Ömleidong op dä neue Tittel enjedrare.\n\nDo kannß dat Höksche säze domet Ömleidonge automattesch aanjepaß wääde, di op dä ahle Tittel zeije — dat weet ävver nur allmählesch pö a pö hengerher jemaat.\nLinks op dä ahle Tittel blieve ävver wi se wore, wann De dat Höksche nit säz.\nDat heiß, dann moß De selver nohluure, of do jäz [[Special:DoubleRedirects|dubbelde Ömleidonge]] udder [[Special:BrokenRedirects|kapodde Ömleiduoge]] bei eruskumme.\nWann De en Sigg ömnenne deis, häs Do och doför ze sorje, dat de betroffene Links do henjonn, wo se hen jonn solle.\nAlsu holl Der de Liss „Wat noh heh link“ fun dä Sigg heh un jangk se dorsch!\n\nDe Sigg weed '''nit''' ömjenannt, wann et met däm neue Name ald en Sigg jitt, '''ußer''' et es en Ömleidong un se es noch nie jeändert woode.\nEsu kam_mer en Sigg jlich widder zeröck ömbenänne, wam_mer sich bem Ömbenänne verdonn hät, un mer kann och kein Sigge kapottmaache, wo ald jet drop schteiht.\n\n'''Oppjepass!'''\nWat beim Ömnenne erus kütt, künnt en opfällije un villeisch stüürende Änderong aam Wiki sin, besönders bei öff jebruchte Sigge.\nAlsu bes secher, dat De verschteihs, wat De heh am maache bes, ih dat De et mähs!",
+       "movepagetext": "Heh kanns De en Sigg ömnenne.\nDomet kritt di Sigg ene neue Name, un all vörherije Versione vun dä Sigg och.\nUnger däm ahle Tittel weed automatisch en Ömleidong op dä neue Tittel enjedrare.\n\nDo kannß dat Höksche säze domet Ömleidonge automattesch aanjepaß wääde, di op dä ahle Tittel zeije — dat weet ävver nur allmählesch pö a pö hengerher jemaat.\nLinks op dä ahle Tittel blieve ävver wi se wore, wann De dat Höksche nit säz.\nDat heiß, dann moß De selver nohluure, of do jäz [[Special:DoubleRedirects|dubbelde Ömleidonge]] udder [[Special:BrokenRedirects|kapodde Ömleiduoge]] bei eruskumme.\nWann De en Sigg ömnenne deis, häs Do och doför ze sorje, dat de betroffene Links do henjonn, wo se hen jonn solle.\nAlsu holl Der de Liss „Wat noh heh link“ fun dä Sigg heh un jangk se dorsch!\n\nDe Sigg weed <strong>nit</strong> ömjenannt, wann et met däm neue Name ald en Sigg jitt, <strong>ußer</strong> et es en Ömleidong un se es noch nie jeändert woode.\nEsu kam_mer en Sigg jlich widder zeröck ömbenänne, wam_mer sich bem Ömbenänne verdonn hät, un mer kann och kein Sigge kapottmaache, wo ald jet drop schteiht.\n\n<strong>Oppjepass!</strong>\nWat beim Ömnenne erus kütt, künnt en opfällije un villeisch stüürende Änderong aam Wiki sin, besönders bei öff jebruchte Sigge.\nAlsu bes secher, dat De verschteihs, wat De heh am maache bes, ih dat De et mähs!",
        "movepagetext-noredirectfixer": "Heh kanns De en Sigg ömnenne.\nDomet kritt di Sigg ene neue Nahme, un all vörherije Väsjohne vun dä Sigg och.\nOnger däm ahle Tittel weed automattesch en Ömleidong op dä neue Tittel enjedrare.\n\nLenks op dä ahle Tittel bliive ävver, wie se wohre.\nDat heiß, Do moß selver nohloore, ov doh jetz [[Special:DoubleRedirects|dubbelde]] oder [[Special:BrokenRedirects|kapodde Ömleidonge]] bei eruskumme.\nWann De en Sigg ömnenne deiß, häs Do och doför ze sorje, dat de betroffe Links doh henjonn, wo se hen jonn solle.\nAlsu holl Der di Liss „Wat noh heh link“ fun dä Sigg heh un jangk se dorsch!\n\nDi Sigg weed '''nit''' ömjenannt, wann et met däm neue Tittel ald en Sigg jitt, '''ußer''' doh es nix drop, oder et es en Ömleijdong un se es noch nie jeändert woode.\nEsu kam_mer en Sigg jlich widder retuur ömnänne, wam_mer sich mem Ömnänne verdonn hät, un mer kann och kein Sigge kapottmaache, wo ald jet drop schteiht.\n\n<strong>Oppjepaß!</strong>\nWat beim Ömnänne erus kütt, künnt en opfällije un velleijsch stührende Änderong aam Wikki sin, besönders bei öff jebruchte Sigge.\nAlsu bes secher, dat De verschteihs, wat De heh am maache bes, ih dat De et mähs!",
        "movepagetalktext": "Wam_mer en däm Kääsje e Höhksche määt, weed heh di Sigg automattesch ömjenannd op di neuje Övverschreff, ußer wann en Klaafsigg met dä neuje Övverschrev ald do es, un et steiht och jet drop.\n\nEn dämm Fall mpß De Der dä Enhald vun dä Klaafsigge selvs vörnemme, un eröm kopeere wat De bruchs.",
        "moveuserpage-warning": "'''Opjepaß:''' Do wells en Metmaachersigg ömnänne, domet weed ävver dä Metmaacher sellver ''nit'' met ömjenannt.",
        "movenosubpage": "Di Sigg hät kei Ongersigge.",
        "movereason": "Aanlass:",
        "revertmove": "Et Ömnänne zerök_nämme",
-       "delete_and_move_text": "== Dä! Dubbelte Name ==\nDi Sigg „[[:$1]]“ jitt et ald. Wollts De se fottschmieße, öm heh di Sigg ömnenne ze künne?",
+       "delete_and_move_text": "Di Sigg „[[:$1]]“ jitt et ald. Wollts De se fottschmieße, öm heh di Sigg ömnenne ze künne?",
        "delete_and_move_confirm": "Jo, dun di Sigg fottschmieße.",
        "delete_and_move_reason": "Fottjeschmeße, öm di Sigg „[[$1]]“ ömbenänne ze künne.",
        "selfmove": "Du Doof! - dä ahle Name un dä neue Name es däselve - do hät et Ömnenne winnich Senn.",
        "move-leave-redirect": "Donn en Ömleidong doför ennreschte",
        "protectedpagemovewarning": "'''Opjepaß:''' Heh di Sigg es jespert su dat blooß de Wiki-Kööbeße se ömnänne künne.\nHeh kütt der neuste Enndrach em Logbooch doh drövver:",
        "semiprotectedpagemovewarning": "'''Opjepaß:''' Heh di Sigg es jespert su dat blooß aanjemeldte Metmaacher se ömnänne künne.\nHeh kütt der neuste Enndrach em Logbooch doh drövver:",
-       "move-over-sharedrepo": "==Di Dattei jidd_et ald==\nEn Dattei [[:$1]] jidd_et ald en enem jemeinsame Beschtand. En annder Dattei op dä Name ömzenänne sorresch doför, dat mer aan di Dattei em jemeinsame Beschtand vun heh uß donoh nit mieh draan kütt.",
+       "move-over-sharedrepo": "En Dattei [[:$1]] jidd_et ald en enem jemeinsame Beschtand. En annder Dattei op dä Name ömzenänne sorresch doför, dat mer aan di Dattei em jemeinsame Beschtand vun heh uß donoh nit mieh draan kütt.",
        "file-exists-sharedrepo": "Dinge Nahme för di Dattei weed ald jebruch, un zwa en enem jemeinsame Beschtand vun Dateije.\nDröm söhk ene andere Nahme uß.",
        "export": "Sigge Exporteere",
        "exporttext": "Heh exportees De dä Tex un de Eijeschaffte vun ener Sigg, oder vun enem Knubbel Sigge, de aktuelle Version, met oder ohne ehr ählere Versione.\nDat Janze es enjepack en XML.\nDat kam_mer en en ander Wiki — wann et och met dä MediaWiki-Soffwär läuf — övver de Sigg „[[Special:Import|Import]]“ do widder empotehre.\n\nSchriev de Titele vun dä Sigge en dat Feld för Tex enzejevve, unge, eine Titel en jede Reih.\nDann dun onoch ussöke, ov De all de vörherije Versione vun dä Sigge han wells, oder nor de aktuelle met dä Informazjuhne vun de läzde Änderong.\n\nEn däm Fall künns De, för en einzelne Sigg, och ene tirekte Link bruche, zom Beispill „[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]“ för de Sigg „[[{{MediaWiki:Mainpage}}]]“ ze exporteere.",
        "tooltip-pt-preferences": "De eije Ennschtällonge{{GENDER:|}}",
        "tooltip-pt-watchlist": "De Leß met de Sigge en Dinge eije Oppaßleß",
        "tooltip-pt-mycontris": "En Leß met Dinge eije Beijdrähsch{{GENDER:|}}",
+       "tooltip-pt-anoncontribs": "En Leß met de Verännderong, di vun heh dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräß uß jemaat wode sin.",
        "tooltip-pt-login": "Do moß Desch nit Enlogge, kannz_E ävver jähn maache!",
        "tooltip-pt-logout": "Ußlogge",
        "tooltip-pt-createaccount": "mer schlonn vör, dat De Desch aanmällde deihs un ennloggs, ävver müüdesch es et nit.",
        "tooltip-feed-rss": "Dä RSS-Abonnomang-Kannal (Feed) för heh di Sigg",
        "tooltip-feed-atom": "Dä Atom-Abonnomang-Kannal (Feed) för heh di Sigg",
        "tooltip-t-contributions": "Donn en Leß met dä Bedrähsch {{GENDER:$1|vun heh däm|vun heh dämm|vun heh dämm Metmaacher|vun heh dä|vun heh däm}} belohre",
-       "tooltip-t-emailuser": "Scheck en E-Mail aan dä Metmaacher",
+       "tooltip-t-emailuser": "Scheck en E-Mail aan {{GENDER:$1|dä Metmaacher|de Metmaacherėn|dä Metmaacher|de Metmaacherėn|dä Metmaacher}}",
        "tooltip-t-info": "Mih Aanjahbe övver heh di Sigg",
        "tooltip-t-upload": "Dateie huhlade",
        "tooltip-t-specialpages": "Leß met de {{int:nstab-special}}e",
        "lastmodifiedatby": "Di Sigg heh wohd et läz aam $1 öm $2 Uhr vum $3 jeändert.",
        "othercontribs": "Bout op et Werk vun $1 op.",
        "others": "ander",
-       "siteusers": "{{PLURAL:$2|däm|de|keine}} {{PLURAL:$2|Metmaacher|Metmaachere|Metmaacher}} $1 aan {{GRAMMAR:Dat|{{SITENAME}}}}",
+       "siteusers": "{{PLURAL:$2|däm Metmaacher|dä Metmaacher|keijnem Metmaacher}} $1 {{GRAMMAR:vum|{{ucfirst:{{SITENAME}}}}}}",
        "anonusers": "{{PLURAL:$2|dä|de|keine}} nameloose Metmaacher $1 vun de translatewiki.net",
        "creditspage": "Övver de Metmaacher un dänne ehr Beijdrähsch för heh di Sigg",
        "nocredits": "För di Sigg ham_mer nix en de Leß.",
        "pageinfo-category-files": "De Aanzahl Dateie",
        "markaspatrolleddiff": "Nohjeluurt. Dun dat fasshallde.",
        "markaspatrolledtext": "De Änderong es nohjeluhrt, don dat faßhallde",
+       "markaspatrolledtext-file": "Makkehr heh di Väsjohn vun dä Dateij als nohjekik.",
        "markedaspatrolled": "Et Kennzeiche „Nohjeluurt“ speichere",
        "markedaspatrolledtext": "Et es jetz fassjehallde, dat de usjewählte Version vun dä Sigg „[[:$1]]“ nohjeluurt sin.",
        "rcpatroldisabled": "Et Nohluure vun de letzte Änderunge es avjeschalt",
        "newimages-legend": "Ußwähle",
        "newimages-label": "Dä Dattei ier Name udder e Stöck dofun:",
        "newimages-showbots": "Zeisch, wat de Bots huhjelaade han.",
+       "newimages-hidepatrolled": "Donn de nohjekik huhjelahde Dateije ußblännde.",
        "noimages": "Kein Dateie jefunge.",
        "ilsubmit": "Söhk",
        "bydate": "nohm Datum",
        "exif-compression-34712": "<i lang=\"en\">JPEG</i>2000",
        "exif-copyrighted-true": "Häd_en Urhävverrääsch",
        "exif-copyrighted-false": "Nix övver et Urhävverrääsch jesaat",
+       "exif-photometricinterpretation-1": "Schwazz un Wiiß (Schwazz es 0)",
        "exif-photometricinterpretation-2": "RJB",
        "exif-photometricinterpretation-6": "<i lang=\"en\">YCbCr</i>",
        "exif-unknowndate": "Dattum onbikannt",
        "exif-orientation-1": "Nommahl",
        "exif-orientation-2": "Op der Kopp jespeejelt",
        "exif-orientation-3": "Op der Kopp jedrieht",
-       "exif-orientation-4": "Links-Räähß jespehjelt",
+       "exif-orientation-4": "Lingks-Rääschß jeschpehjelt",
        "exif-orientation-5": "En Vehdelsdriehjong mem Uhrzeijer un dann lengks-rähß jespehjelt",
        "exif-orientation-6": "En Veedelsdriejong mem Uhrzeijer",
        "exif-orientation-7": "En Veedelsdriejong jääje der Uhrzeijer un dann lengks-rähß jespehjelt",
        "confirmemail_body_set": "Künnt johd sin, Do wors et sällver. Vun dä IP-Adräß $1 hät op\njede Fall einer för dä Metmaacher \"$2\" op {{GRAMMAR:Akk bet|{{SITENAME}}}}\nheh di Adräß för däm sing e-mail aanjejovve.\n\nÖm jäz kloh ze kreje, dat di neu Adräß un dä Metmaacher och\nzosamme jehühre, un öm de e-mail op {{GRAMMAR:Akk bet|{{SITENAME}}}}\naanzschallde, moß dä Metmaacher en singem Brauser dä Lengk:\n\n$3\n\nopmaache. Noch för em $6 öm $7 Uhr. Alsu dun dat, wann dat sing\nReeschteschkeijt hät.\n\nWann nit Doh, sönders söns wä Ding Addräß för de e-Mail aanjejovve hät, bruchs\nDe jar nix ze don. Di Adräß weed nit jebruch, wann se nit beschtähtesch es.\nDo kanns ävver och op heh dä Lengk jon:\n\n$5\n\nDomet deiß De tirek vermällde, dat De di Adräß nit beschtähteje wells.",
        "confirmemail_invalidated": "Et Beschtähtejje för di <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß es afjebroche wohde, un di Adräß es '''nit''' beschtähtesch.",
        "invalidateemail": "E-Mail-Adress nit bestätich",
+       "notificationemail_subject_changed": "{{SITENAME}} - De Addräß för de e-mail wood veränndert.",
+       "notificationemail_subject_removed": "{{SITENAME}} - De Addräß för de e-mail wood fott jeschmeße.",
+       "notificationemail_body_changed": "Velleijsch wohß De_t sällver. Eijne hät vun dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräß $1 us {{ucfirst:{{GRAMMAR:em|{{ucfirst:{{SITENAME}}}}}}}} de \n<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß {{GENDER:$2|vum|vum|vumm Metmaacher|vun dä|vum}} „$2“ op „<code>$3</code>“ ömjeschtallt.\n\nWann De et nit sällver wohs, saach tirägg enem Verantwootlijje för di Wäbßait bescheijd!",
+       "notificationemail_body_removed": "Velleijsch wohß De_t sällver. Eijne hät vun dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräß $1 us {{ucfirst:{{GRAMMAR:em|{{ucfirst:{{SITENAME}}}}}}}} de \n<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß {{GENDER:$2|vum|vum|vumm Metmaacher|vun dä|vum}} „$2“ fott jenumme.\n\nWann De et nit sällver wohs, saach tirägg enem Verantwootlijje för di Wäbßait bescheijd!",
        "scarytranscludedisabled": "[Et Enbinge per Interwiki es avjeschalt]",
        "scarytranscludefailed": "[De Schablohn „$1“ enzebenge hät nit jeflupp]",
        "scarytranscludefailed-httpstatus": "[De Schablohn „$1“ enzebenge hät nit jeflupp. Dä HTTP-Fähler es: $2]",
        "confirm-unwatch-button": "Lohß Jonn!",
        "confirm-unwatch-top": "Sulle mer di Sigg uß Dinger Oppaßleß erußnämme?",
        "confirm-rollback-button": "Lohß Jonn!",
+       "confirm-rollback-top": "Ännderonge aan dä Sigg heh zerök nämme?",
        "semicolon-separator": ";",
        "word-separator": "&#32;",
        "ellipsis": "&nbsp;…",
        "watchlistedit-raw-done": "Ding Oppaßßleß es fassjehallde.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Ein Övverschreffför en Sigge wood|<strong>$1</strong> Övverschreffte för Sigge woodte|Kein Övverschreffte för Sigge}} dobeijedonn:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Eine Endrach es eruß jefloore:|<strong>$1</strong> Endräsh es eruß jefloore:|Keine Endrach es eruß jefloore.}}",
-       "watchlistedit-clear-title": "Oppaßleß läddesch jemaad",
+       "watchlistedit-clear-title": "Oppaßleß läddesch maache",
        "watchlistedit-clear-legend": "Oppaßleß läddesch maache",
        "watchlistedit-clear-explain": "Alle vun heh dä Siggetettelle fleeje uß dä Oppaßless eruß.",
        "watchlistedit-clear-titles": "Siggetettelle",
        "specialpages-group-login": "Enlogge udder Aanmälde",
        "specialpages-group-changes": "Läzde Änderonge un Logböhscher",
        "specialpages-group-media": "Dateije — Huhlahde un Opleßte",
-       "specialpages-group-users": "Metmaacher un denne ier Rääschte",
+       "specialpages-group-users": "Metmaacher un dänne ier Rääschde",
        "specialpages-group-highuse": "Öff jebruch…",
        "specialpages-group-pages": "Siggeleste",
        "specialpages-group-pagetools": "Werrekzüch för Sigge",
        "tags": "De jöltijje Makkehronge för Änderonge",
        "tag-filter": "[[Special:Tags|Makkehronge]] ußsöhke:",
        "tag-filter-submit": "Beschränke!",
-       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Ein|$1|Kein}} Kännzeijsche]]: $2)",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1||$1|Keij}} Kännzeijsche]]: $2)",
        "tags-title": "Makeeronge",
        "tags-intro": "Heh sin alle de Makeerunge opjeliß, di et Wikki för Änderunge verjävve kann, un wat se bedügge.",
        "tags-tag": "Dä Makkehrong iere Nahme",
        "expand_templates_generate_xml": "Och dä XML-Parser-Boum zeije",
        "expand_templates_generate_rawhtml": "Donn de Röh HTML Ußjaav aanzeije",
        "expand_templates_preview": "Vör-Aansich",
-       "expand_templates_preview_fail_html": "<em>Weil et Wiki rüh <i xml:lang=\"en\" title=\"HyperText Markup Language\" lang=\"en\">HTML</i> zohlöht un de Sezongsdahte verschött jejange sin, dom_mer de {{int:preview}} uß Vörseesch nit aanzeije, öm Aanjreffe övver JavaSkrep zevör ze kumme.</em>\n\n<strong>Wann dat heh en Ohdenong es, bes esu johd un versöhg et norr_ens.</strong>\nwann dat nix hellef, versöhg ens [[Special:UserLogout|ußzelogge]] un neu enzelogge.",
+       "expand_templates_preview_fail_html": "<em>Weil et Wiki rüh <i xml:lang=\"en\" title=\"HyperText Markup Language\" lang=\"en\">HTML</i> zohlöht un de Sezongsdahte verschött jejange sin, dom_mer de {{int:preview}} uß Vörseesch nit aanzeije, öm Aanjreffe övver JavaSkrep zevör ze kumme.</em>\n\n<strong>Wann dat heh en Ohdenong es, bes esu johd un versöhg et norr_ens.</strong>\nwann dat nix hellef, versöhg ens [[Special:UserLogout|ußzelogge]] un neu enzelogge, un donn pröhve dat Dinge Brauser <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„Plätzjer“\">cookies</i> vun heh däm Wikki aannemmp.",
        "expand_templates_preview_fail_html_anon": "<em>Weil et Wiki rüh <i xml:lang=\"en\" title=\"HyperText Markup Language\" lang=\"en\">HTML</i> zohlöht un Do nit ennjelogg bes, dom_mer de {{int:preview}} uß Vörseesch nit aanzeije, öm Aanjreffe övver JavaSkrep zevör ze kumme.</em>\n\n<strong>Wann dat heh en Ohdenong es, bes esu johd un donn [[Special:UserLogin|enlogge]] un versöhg et norr_ens.</strong>",
        "expand_templates_input_missing": "Mer mß winnischsdrens jät Täx ennjävve.",
        "pagelanguage": "De Schprohch för di Sigg faßlääje",
        "log-name-pagelang": "Logbohch vum Tuusche vun Sige iehr Schprohche",
        "log-description-pagelang": "Dat heh es et Logbohch vun de Veränderonge aan de Schprohch vun de Sigge.",
        "logentry-pagelang-pagelang": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät de Schprohch vun dä Sigg „$3“ vun $4 op $5 verändert.",
-       "default-skin-not-found": "De schtandattmähßejje Bedehnbovverfläsch <code>$1</code> för et Wikki es nit ze fenge. Se weed övver dä Enndrahch <code lang=\"en\" xml:lang=\"en\">$wgDefaultSkin</code> en dä Dattei <code lang=\"en\" xml:lang=\"en\">LocalSettings.php</code> om ẞööver faßjelaat.\n\n{{PLURAL:$4|Heh di Bedehnbovverfläsch es|Heh di Bedehnbovverfläsche sin|Kein Bedehnbovverfläsche sin}} doh:\n\n$2\n\nLohr och en et [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de Handbohch övver et Enschtälle vun Bedehnbovverfläsche].\n\n*'''Falls dat heh e fresch enjereesch MehdijaWikki es:'''\n*: MehdijaWikki wood velleisch övver <i lang=\"en\" xml:lang=\"en\">Git</i> enschtallehrt, udder der Quälltäx wood tiräk obb_en ander Manier enschtallehrt. Met däm Problehm heh wohr ze rääschne. Donn winneschßdens eine vun dä Bovverfläsche uss_em [https://www.mediawiki.org/wiki/Category:All_skins Verzeischneß vun de Bedehnbovverfläsche vum MehdijaWikki] enschtallehre. Dat jeihd, endämm dat De:\n*:* einzel veröffentleschte Bovverfläsche us [https://www.mediawiki.org/wiki/Special:SkinDistributor MediaWiki.org] erongerlähds un en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun dä MehdijaWikki_Enschtallazuhn holls,\n*:* winneschsdens eins vun dä Verzeischneße us <code lang=\"en\" xml:lang=\"en\">mediawiki/skins/*</code> met <i lang=\"en\" xml:lang=\"en\">Git</i> en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun Dinge MehdijaWikki_Enschtallazuhn holls,\n*:* de [https://www.mediawiki.org/wiki/Download Dattei vum MehdijaWikki] erongerlähds, woh ongerscheidlejje Bedehnbovverfläsche dren sin un Zohsäz derzoh. Uß däm Verzeischneß doh dren kam_mer Saache en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun dä MehdijaWikki_Enschtallazuhn holle.\n*: Dat sullt sesch nit met Dingem <i lang=\"en\" xml:lang=\"en\">git</i>-Verzeischneß schtühre, falls De och ene Äntweckler vum MehdijaWikki bes.\n*'''Falls dat MehdijaWikki heh jrahd obb ene neue Schtand jebraht wood:'''\n*: Bei MehdijaWikki en dä Väsjohn 1.24 un hüüter wääde de enschtallehrte Bedehnbovverfläsche nit mieh automattesch alle aanjemaat; süsch och em [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Handbohch] dernoh. Do kanns heh di {{PLURAL:$5|Reih|Reihje|kein Reihje}} en de Dattei <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">LocalSettings.php</code> eren koppehre, öm {{PLURAL:$5|di enschtallehrte Bedehnbovverfläsch|alle enschtallehrte Bedehnbovverfläsche|kein Bedehnbovverfläsch}} aanzeschallde:\n<pre lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$3</pre>\n* '''Falls de jrahd aan dä Dattei <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">LocalSettings.php</code> jät geändert häs:'''\n*: Donn de Nahme vun de Bedehnbovverfläsche en dä Dattei pröhve. Se künnte verhehrt jeschrevve sin.",
+       "default-skin-not-found": "De schtandattmähßejje Bedehnbovverfläsch <code>$1</code> för et Wikki es nit ze fenge. Se weed övver dä Enndrahch <code dir=\"ltr\">$wgDefaultSkin</code> en dä Dattei <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">LocalSettings.php</code> om ẞööver faßjelaat.\n\n{{PLURAL:$4|Heh di Bedehnbovverfläsch es|Heh di Bedehnbovverfläsche sin|Kein Bedehnbovverfläsche sin}} doh:\n\n$2\n\nLohr och en et [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de Handbohch övver et Enschtälle vun Bedehnbovverfläsche].\n\n; Falls dat heh e fresch enjereesch MehdijaWikki es:\n: MehdijaWikki wood velleisch övver <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Git</i> enschtallehrt, udder der Quälltäx wood tiräk obb_en ander Manier enschtallehrt. Met däm Problehm heh wohr ze rääschne. Donn winneschßdens eine vun dä Bovverfläsche uss_em [https://www.mediawiki.org/wiki/Category:All_skins Verzeischneß vun de Bedehnbovverfläsche vum MehdijaWikki] enschtallehre. Dat jeihd, endämm dat De:\n:* einzel veröffentleschte Bovverfläsche us [https://www.mediawiki.org/wiki/Special:SkinDistributor MediaWiki.org] erongerlähds un en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun dä MehdijaWikki_Enschtallazuhn holls,\n:* winneschsdens eins vun dä Verzeischneße us <code lang=\"en\" xml:lang=\"en\">mediawiki/skins/*</code> met <i lang=\"en\" xml:lang=\"en\">Git</i> en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun Dinge MehdijaWikki_Enschtallazuhn holls,\n:* de [https://www.mediawiki.org/wiki/Download Dattei vum MehdijaWikki] erongerlähds, woh ongerscheidlejje Bedehnbovverfläsche dren sin un Zohsäz derzoh. Uß däm Verzeischneß doh dren kam_mer Saache en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun dä MehdijaWikki_Enschtallazuhn holle.\n: Dat sullt sesch nit met Dingem <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">git</i>-Verzeischneß schtühre, falls De och ene Äntweckler vum MehdijaWikki bes.\n\n;Falls dat MehdijaWikki heh jrahd obb ene neue Schtand jebraht wood:\n: Bei MehdijaWikki en dä Väsjohn 1.24 un hüüter wääde de enschtallehrte Bedehnbovverfläsche nit mih automattesch alle aanjemaat; süsch och em [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Handbohch] dernoh. Do kanns heh di {{PLURAL:$5|Reih|Reihje|kein Reihje}} en de Dattei <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">LocalSettings.php</code> eren koppehre, öm {{PLURAL:$5|di enschtallehrte Bedehnbovverfläsch|alle enschtallehrte Bedehnbovverfläsche|kein Bedehnbovverfläsch}} aanzeschallde:\n\n<pre lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$3</pre>\n\n;Falls de jrahd aan dä Dattei <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">LocalSettings.php</code> jät geändert häs:\n: Donn de Nahme vun de Bedehnbovverfläsche en dä Dattei pröhve. Se künnte verhehrt jeschrevve sin.",
        "default-skin-not-found-no-skins": "De schtandattmähßejje Bedehnbovverfläsch <code>$1</code> för et Wikki es nit ze fenge. Se weed övver dä Enndraach <code lang=\"en\" xml:lang=\"en\">$wgDefaultSkin</code> en dä Dattei <code lang=\"en\" xml:lang=\"en\">LocalSettings.php</code> om ẞööver faßjelaat.\n\nEt sinn_er kein Bedehnbovverfläsche doh.\n\n*'''Falls dat heh e fresch enjereesch MehdijaWikki, es udder jrahd obb ene neue Schtand jebraht wood:'''\n*: MehdijaWikki wood velleisch övver <i lang=\"en\" xml:lang=\"en\">Git</i> enschtallehrt, udder der Quälltäx wood tiräk obb_en ander Manier enschtallehrt. Met däm Problehm heh wohr ze rääschne. Bei MehdijaWikki en dä Väsjohn 1.24 un hüüter sin kein Bedehnbovverfläsche mieh automattesch derbei. Donn winneschßdens eine vun dä Bovverfläsche uss_em [https://www.mediawiki.org/wiki/Category:All_skins Verzeischneß vun de Bedehnbovverfläsche] enschtallehre. Dat jeihd, endämm dat De:\n*:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins <i lang=\"en\" xml:lang=\"en\">Git</i> nemms, öm de Bedehnbovverfläsche eronger ze lahde].\n*:* einzel veröffentleschte Bovverfläsche us [https://www.mediawiki.org/wiki/Special:SkinDistributor MediaWiki.org] erongerlähds un en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun Dinge MehdijaWikki_Enschtallazuhn holls,\n*:* de [https://www.mediawiki.org/wiki/Download Dattei vum MehdijaWikki] erongerlähds, woh ongerscheidlejje Bedehnbovverfläsche dren sin un Zohsäz derzoh. Uß däm Verzeischneß doh dren kam_mer Saache en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun Dinge vun dä MehdijaWikki_Enschtallazuhn holle.\n*: Dat sullt sesch nit met Dingem <i lang=\"en\" xml:lang=\"en\">Git</i>-Verzeischneß schtühre, falls De och ene Äntweckler vum MehdijaWikki bes. Lohr em [https://www.mediawiki.org/wiki/Manual:Skin_configuration Handbohch] dernoh, wi mer Bedehnbovverfläsche aanmääd un ene Schtandatt faßlähsch.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (enjeschalldt)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>ußjeschalldt</strong>)",
        "special-characters-group-ipa": "IPA, et engernazjonal foneetesch Alfabeet",
        "special-characters-group-symbols": "Symbole",
        "special-characters-group-greek": "Jriischesch",
+       "special-characters-group-greekextended": "Jrihschesch met Zohsäz",
        "special-characters-group-cyrillic": "Kyrillesch",
        "special-characters-group-arabic": "Arabesch",
        "special-characters-group-arabicextended": "Araabesch met Extras",
        "mw-widgets-dateinput-no-date": "Kein Dattom es ußjewählt",
        "mw-widgets-titleinput-description-new-page": "di Sigg jidd_et noch nit",
        "mw-widgets-titleinput-description-redirect": "ömleijde op „$1“",
-       "api-error-blacklisted": "Söhk Der ene anndere Nahme uß, dä mih drövver säht.",
+       "sessionprovider-generic": "Sezonge övver $1",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„Plätzjer“\">cookies</i>",
+       "sessionprovider-nocookies": "<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„Plätzjer“\">Cookies</i> künnte affjeschalld sin. Schtäl sescher, dat se ennjeschalld sin un fang norr_ens aan.",
        "randomrootpage": "Zofällige Aanfangs-Sigg",
+       "log-action-filter-block": "Zoot vun Spärr",
+       "log-action-filter-delete": "Zoot vum Fottschmiiße:",
+       "log-action-filter-import": "Zoot vum Emmpoot:",
+       "log-action-filter-managetags": "Zoot vun Verwalldongsaxjuhn",
+       "log-action-filter-move": "Zoot vum Ömnänne:",
+       "log-action-filter-newusers": "Zoot vum Zohjang aanlähje:",
+       "log-action-filter-patrol": "Zoot vum Nohlohre:",
+       "log-action-filter-protect": "Zoot vum Schoz:",
+       "log-action-filter-rights": "De Zoot Ännderong aan de Rääschte:",
+       "log-action-filter-suppress": "De Zoot Ongerdrökong:",
+       "log-action-filter-upload": "Zoot vum Huhlahde:",
+       "log-action-filter-all": "Alle",
+       "log-action-filter-block-block": "Schpärre",
+       "log-action-filter-block-reblock": "Änderung vun ener Schpärr",
+       "log-action-filter-block-unblock": "Sperr ophävve",
        "log-action-filter-delete-delete": "En Sigg wohd fott jeschmeße",
+       "log-action-filter-delete-restore": "Sigge-Zerökholle",
+       "log-action-filter-delete-event": "Logbohch-Fottschmiiße",
+       "log-action-filter-delete-revision": "Väsjohn-Fottschmiiße",
+       "log-action-filter-import-interwiki": "Emmpood us enem anndre Wikki",
+       "log-action-filter-import-upload": "Empood uß ene huhjelade <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Extensible Markup Language\">XML</i>-Datteij",
+       "log-action-filter-managetags-create": "Makkehrong aanjelaat",
+       "log-action-filter-managetags-delete": "Makkehrong fottjeschmeße",
+       "log-action-filter-managetags-activate": "Makkehrong aanjeschalldt",
+       "log-action-filter-managetags-deactivate": "Makkehrong affjeschalldt",
+       "log-action-filter-move-move": "Ömjenannt ohne en Ömleijdong ze övverschrihve",
+       "log-action-filter-move-move_redir": "Ömjenannt obb en övverschrihve Ömleijdong",
+       "log-action-filter-newusers-create": "Aanjelaat vun enem Nahmelohse",
+       "log-action-filter-newusers-create2": "Aanjelaat vun enem ennjelogg Metmaacher",
+       "log-action-filter-newusers-autocreate": "Aumattesch-Aanlähje",
+       "log-action-filter-newusers-byemail": "Aanjelaat mem Paßwood pä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> jescheck",
+       "log-action-filter-patrol-patrol": "Vun Hand Nohjelohrt",
+       "log-action-filter-patrol-autopatrol": "Automattesch Nohjelohrt",
+       "log-action-filter-protect-protect": "Schoz",
+       "log-action-filter-protect-modify": "Schoz-Ännderong",
+       "log-action-filter-protect-unprotect": "Schoz-Ophävve",
+       "log-action-filter-protect-move_prot": "Schoz jähje et Ömbenänne",
+       "log-action-filter-rights-rights": "Vun Hand veränndert",
+       "log-action-filter-rights-autopromote": "Automattesch veränndert",
+       "log-action-filter-suppress-event": "Logbohch ongerdrök",
+       "log-action-filter-suppress-revision": "Väsjohn ongerdrök",
+       "log-action-filter-suppress-delete": "Sigg ongerdrök",
+       "log-action-filter-suppress-block": "Metmaacher ongerdrök pä Schpärr",
+       "log-action-filter-suppress-reblock": "Metmaacher ongerdrök pä Wider-Schpärr",
+       "log-action-filter-upload-upload": "Neu huhjelahde",
+       "log-action-filter-upload-overwrite": "Neu huhlahde",
+       "authmanager-authn-autocreate-failed": "Automattesch ene Zojang för heh et Wikki hät nit jeflup: $1",
+       "authmanager-create-disabled": "Neu Aanmelde es afjeschalldt",
+       "authmanager-create-from-login": "Öm Der ene Zohjang aanzelähje, bes esu johd, un föll heh di Fällder us:",
        "authmanager-authplugin-setpass-failed-title": "Dat Paßwoot ze änndere hät nit jeflupp",
+       "authmanager-authplugin-setpass-bad-domain": "Onjöltijje Domäijn",
+       "authmanager-autocreate-noperm": "Automattesch Zohjäng aanzelähje es nit zohjelohße.",
+       "authmanager-autocreate-exception": "Automattesch Zohjäng aanzelähje es wähje verjange Fähler för en Zigg nit zohjelohße.",
        "authmanager-userdoesnotexist": "Ene Metmaacher mem Nahme „$1“ es nit ennjedrahre.",
+       "authmanager-username-help": "Der Metmaacher_Nahme för et Enlloge.",
+       "authmanager-password-help": "Et Paßwootför et Enlogge.",
        "authmanager-domain-help": "De Domäijn för de Zohjangsdaht vun ußerhallef beschtähtech ze krijje.",
+       "authmanager-retype-help": "Norr_ens dat Paßwoot zom beschähtejje",
        "authmanager-email-label": "<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>",
        "authmanager-email-help": "De Addräß för de <i lang=\"en\">e-mail</i>",
        "authmanager-realname-label": "Der „reeschteje“ Nahme",
+       "authmanager-realname-help": "Der ääschte Nahme vun däm Metmaaacher",
        "authmanager-provider-temporarypassword": "Zweschepasswood:",
+       "authprovider-confirmlink-request-label": "De Zohjäng, di verlengk wähde sulle",
+       "authprovider-confirmlink-success-line": "$1 es jäz verbonge.",
+       "authprovider-confirmlink-failed": "Et Zohjang-Verlengke hät nit kumplätt jeflupp: $1",
+       "authprovider-confirmlink-ok-help": "Maach wigger nohdämm Fählernohreeschte övver et verbenge ußjejovve woode sin.",
        "authprovider-resetpass-skip-label": "Övverjonn",
+       "authprovider-resetpass-skip-help": "Övverjangk et Paßwood zerök ze säzze.",
+       "authform-nosession-login": "Et Ennlogge hät jeflupp, ävver Dinge Brauser kunnt sesch nit draan „äntsenne“, enjelogg ze sin.\n\n$1",
+       "authform-nosession-signup": "Dä Zohjang es ennjereescht, ävver Dinge Brauser kunnt sesch nit draan „äntsenne“, enjelogg ze sin.\n\n$1",
+       "authform-newtoken": "Keij CSRF Makkehrong:FUZZY!!$1",
+       "authform-notoken": "Keij CSRF Makkehrong!FUZZY!!",
        "specialpage-securitylevel-not-allowed-title": "Nit zohjelohße",
+       "authpage-cannot-login": "Mer künne et Ennlogge nit bejenne.",
+       "authpage-cannot-login-continue": "Mer kunnte mem Ennlogge nit wigger maache. Ding Sezong weed ußjeloufe sinn.",
+       "authpage-cannot-create": "Mer künne et Aanlähje vun enem Zohjang nit bejenne.",
+       "authpage-cannot-create-continue": "Mer kunnte mem Aanlähje vun däm Zohjang nit wigger maache. Ding Sezong weed ußjeloufe sinn.",
+       "authpage-cannot-link": "Mer künne mem Zohjang Verbenge nit bejenne.",
+       "authpage-cannot-link-continue": "Mer kunnte mem Zohjang Verbenge nit wigger maache. Ding Sezong weed ußjeloufe sinn.",
        "cannotauth-not-allowed-title": "Zohjang verbodde.",
+       "cannotauth-not-allowed": "Do häs nit dat Rääsch, he di Sigg ze bruche.",
        "changecredentials-submit": "Ändere",
-       "removecredentials-submit": "Fott nämme"
+       "removecredentials-submit": "Fott nämme",
+       "credentialsform-account": "Der Nahme för der Zohjang:",
+       "cannotlink-no-provider-title": "Mer han kein zweij Zohjäng, di mer verbenge künnt.",
+       "cannotlink-no-provider": "Mer han kein zweij Zohjäng, di mer verbenge künnt.",
+       "linkaccounts": "Zohjäng verbenge",
+       "linkaccounts-success-text": "Der Zohjang es jäz verbonge.",
+       "linkaccounts-submit": "Lohß jonn!",
+       "unlinkaccounts": "Zohjäng tränne",
+       "unlinkaccounts-success": "De Zohjäng sin jäz jetrännt."
 }
index dc2f043..ebee06b 100644 (file)
        "botpasswords-label-cancel": "Betal bike",
        "botpasswords-label-delete": "Jê bibe",
        "botpasswords-bad-appid": "Navê bot \"$1\" ne derbasdar e.",
+       "botpasswords-deleted-title": "Şîfreya robot hate jêbirin",
        "resetpass_forbidden": "Şîfre nikarin werin guhertin",
        "resetpass-submit-loggedin": "Şîfreyê biguherîne",
        "resetpass-submit-cancel": "Betal bike",
        "changeemail-oldemail": "Navnîşana e-nameya niha:",
        "changeemail-newemail": "Navnîşana e-nameya nû:",
        "changeemail-none": "(nîne)",
+       "changeemail-password": "Şîfreya te ya {{SITENAME}}ê:",
        "changeemail-submit": "Enameyê biguherîne",
        "resettokens": "Mifteya jê bibe",
        "bold_sample": "Nivîsa stûr",
        "minoredit": "Ev guhertineke biçûk e",
        "watchthis": "Vê gotarê bişopîne",
        "savearticle": "Rûpelê tomar bike",
+       "savechanges": "Guherandinan tomar bike",
+       "publishpage": "Rûpelê biweşîne",
+       "publishchanges": "Guherandinan biweşîne",
        "preview": "Pêşdîtin",
        "showpreview": "Pêşdîtinê nîşan bide",
        "showdiff": "Guherandinan nîşan bide",
        "showingresults": "{{PLURAL:$1|Encamek|'''$1''' encam}}, bi #'''$2''' dest pê dike.",
        "search-nonefound": "Ti rûpelên wek ya daxwazkirî nînin.",
        "powersearch-legend": "Lêgerîna pêşketî",
-       "powersearch-ns": "Di valahiya navan de lêbigere:",
+       "powersearch-ns": "Di valahiya navan de lê bigere:",
        "powersearch-togglelabel": "Kontrol bike:",
        "powersearch-toggleall": "Hemû",
        "powersearch-togglenone": "Tune",
        "right-sendemail": "Ji bikarhênerên di re ename bişîne",
        "grant-editpage": "Rûpelên ku hene biguherîne",
        "grant-editprotected": "Rûpelên parastî bigûherîne",
+       "grant-uploadfile": "Dosyeyên nû bar bike",
        "grant-basic": "Mafên bingehîn",
        "newuserlogpage": "Çêkirina hesabê nû",
        "newuserlogpagetext": "Ev têketina hesabên bikarhêneriyê ye ên ku nû hatine afirandin.",
        "rightslogtext": "Ev guhertineke ji bo mafên bikarhêneriyê ye.",
        "action-read": "vê rûpelê bixwîne",
        "action-edit": "vê rûpelê biguherîne",
-       "action-createpage": "rûpelan çêke",
-       "action-createtalk": "rûpelên gotûbêjan çêke",
+       "action-createpage": "vê rûpelê çêke",
+       "action-createtalk": "vê rûpela gotûbêjê çêke",
        "action-createaccount": "vê hesabê bikarhênerîyê çêke",
        "action-minoredit": "vê weke guhertineke biçûk nîşan bide",
        "action-move": "vê rûpelê bigerîne",
        "recentchanges-label-plusminus": "Qebareya vê rûpelê bi ev qas biteyan hate guherandin",
        "recentchanges-legend-heading": "<strong>Ravekirina kurtenavan:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (here [[Special:NewPages|lîsteya rûpelên nû]])",
+       "recentchanges-submit": "Nîşan bide",
        "rclistfrom": "Guherandinên ji $3 $2 şûnde nîşan bide",
        "rcshowhideminor": "Guherandinên biçûk $1",
        "rcshowhideminor-show": "nîşan bide",
        "tooltip-ca-nstab-category": "Li rûpelê kategorîyê seke",
        "tooltip-minoredit": "Vê guherandinê weka biçûk îşaret bike",
        "tooltip-save": "Guherandinên xwe tomarbike",
+       "tooltip-publish": "Guherandinên xwe biweşîne",
        "tooltip-preview": "Guherandinên xwe bibîne, berî ku tu wî qeyd bikî!",
        "tooltip-diff": "Guherandinên ku te di nivîsê de kirîyî nîşan bide",
        "tooltip-compareselectedversions": "Cudatiyên guhertoyên hilbijartî yên vê rûpelê bibîne.",
        "pageinfo-category-pages": "Hejmara rûpelan",
        "pageinfo-category-subcats": "Hejmara binkategoriyan",
        "pageinfo-category-files": "Hejmara dosyeyan",
-       "markaspatrolleddiff": "Wek serrastkirî nîşan bide",
-       "markaspatrolledtext": "Vê rûpelê wek serrastkirî nîşan bide",
-       "markedaspatrolled": "Wek serrastkirî tê nîşandan",
+       "markaspatrolleddiff": "Wek sererastkirî nîşan bide",
+       "markaspatrolledtext": "Vê rûpelê wek sererastkirî nîşan bide",
+       "markedaspatrolled": "Wek sererastkirî tê nîşandan",
        "markedaspatrolledtext": "Guherandina rûpelê wek serrastkirî tê nîşandan.",
        "patrol-log-page": "Têketina kontrolkirinê",
        "deletedrevision": "Guhertoya berê $1 hate jêbirin.",
        "imagemaxsize": "Sînorê mezinahiya wêneyî:<br /><em>(bo rûpelên danasîna wêneyan)</em>",
        "thumbsize": "Mezinahiya wêne:",
        "widthheight": "$1 x $2",
-       "widthheightpage": "$1 × $2, $3 rûpel",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|rûpel}}",
        "file-info": "mezinbûna daneyê: $1, MIME type: $2",
        "file-info-size": "$1 × $2 pixel, mezinbûnê data: $3, MIME-typ: $4",
        "file-nohires": "Versyonekî jê mezintir tune.",
        "searchsuggest-search": "Lêgerîn",
        "searchsuggest-containing": "dihundirîne...",
        "api-error-filename-tooshort": "Navê dosyeyê pir kurt e.",
+       "api-error-unclassified": "Çewtiyeke nenas pêk hat.",
        "api-error-unknown-code": "Çewtiya nenas: \"$1\".",
        "api-error-unknownerror": "Çewtiya nenas: \"$1\".",
        "duration-years": "$1 {{PLURAL:$1|sal}}",
        "mw-widgets-titleinput-description-redirect": "beralî bike ber bi $1 ve",
        "log-action-filter-all": "Hemû",
        "log-action-filter-block-block": "Asteng bike",
+       "log-action-filter-upload-upload": "Barkirina nû",
        "authmanager-email-label": "E-name",
        "authmanager-email-help": "Navnîşana e-nameyê"
 }
index 293c1c6..4f3f53a 100644 (file)
        "nstab-template": "Şablón",
        "nstab-help": "Ayudo",
        "nstab-category": "Kategoría",
+       "mainpage-nstab": "La Primera Hoja",
        "nosuchaction": "No egziste esa aksyon",
        "nosuchactiontext": "La aksyon espesefikada por el URL es invalido.\nEs posivle ke el URL fue eskrito mal, o ke segite un enlase inkorrecto.\nTambiem puede indikar un yerro en la programa uzado por {{SITENAME}}.",
        "nosuchspecialpage": "No ay tala hoja especial",
        "accountcreated": "Cuento creado",
        "accountcreatedtext": "El kuento de usuario para [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) fue kreado.",
        "loginlanguagelabel": "Lingua: $1",
+       "pt-login": "Entrar",
+       "pt-createaccount": "Criar un cuento",
        "changepassword": "Trocar el kóddiche",
        "resetpass_header": "Kambiar kontrasenya del kuento",
        "oldpassword": "Kóddiche viejo:",
index 8fb22f3..ef6e3ba 100644 (file)
        "hidden-category-category": "Verstoppt Kategorien",
        "category-subcat-count": "Dës Kategorie huet {{PLURAL:$2|nëmmen dës Ënnerkategorie.|dës {{PLURAL:$1|Ënnerkategorie|$1 Ënnerkategorien}}, vu(n) $2 am Ganzen.}}",
        "category-subcat-count-limited": "Dës Kategorie huet dës {{PLURAL:$1|Ënnerkategorie|$1 Ënnerkategorien}}.",
-       "category-article-count": "An dëser Kategorie {{PLURAL:$2|ass just dës Säit.|{{PLURAL:$1|ass just dës Säit|si(nn) $1 Säiten}}, vu(n) $2 am Ganzen.}}",
+       "category-article-count": "An dëser Kategorie {{PLURAL:$2|ass just dës Säit.|{{PLURAL:$1|ass just dës Säit|sinn dës $1 Säiten}}, vu(n) $2 am Ganzen.}}",
        "category-article-count-limited": "Dës {{PLURAL:$1|Säit ass|$1 Säite sinn}} an dëser Kategorie.",
        "category-file-count": "{{PLURAL:$2|Just dëse Fichier ass an dëser Kategorie.|{{PLURAL:$1|Just dëse Fichier ass|Dës $1 Fichiere sinn}} an dëser Kategorie, vu(n) $2 am Ganzen.}}",
        "category-file-count-limited": "{{PLURAL:$1|Dëse Fichier ass|Dës $1 Fichiere sinn}} an dëser Kategorie.",
        "protectedpagetext": "Dës Säit ass fir Ännerungen an aner Aktioune gespaart.",
        "viewsourcetext": "Dir kënnt de Quelltext vun dëser Säit kucken a kopéieren.",
        "viewyourtext": "Dir kënnt de Quelltext vun <strong>Ären Ännerungen</strong> op dëser Säit kucken a kopéieren.",
-       "protectedinterface": "Op dëser Säit fannt Dir Text fir de Sprooch-Interface vun der Software op dëser Wiki an dofir ass si gespaart fir Mëssbrauch ze verhënneren.\n\nFir Iwwersetzungen fir all Wikien bäizesetzen oder z'änneren gitt w.e.g. op [https://translatewiki.net/ translatewiki.net], de MediaWiki-Lokalisatiouns-Projet.",
+       "protectedinterface": "Op dëser Säit fannt Dir Text fir de Sprooch-Interface vun der Software op dëser Wiki an dofir ass si gespaart fir Mëssbrauch ze verhënneren.\n\nFir Iwwersetzunge fir all Wikien bäizesetzen oder z'änneren gitt w.e.g. op [https://translatewiki.net/ translatewiki.net], de MediaWiki-Lokalisatiouns-Projet.",
        "editinginterface": "<strong>Opgepasst:</strong> Dir sidd am Gaang, eng Säit z'änneren, déi do ass, fir Interface-Text fir d'Software ze liwweren. \nÄnnerungen op dëser Säit änneren den Interface-Text, jee no Kontext, op allen oder verschiddene Säiten, déi vun alle Benotzer op dëser Wiki gesi ginn.",
        "translateinterface": "Fir Iwwersetzunge fir all Wikien z'änneren oder dobäizesetze benotzt w.e.g.  [https://translatewiki.net/ translatewiki.net], de Projet fir d'Lokalisatioun vu MediaWiki.",
        "cascadeprotected": "Dës Säit gouf fir Ännerunge gespaart, well se duerch Cascadeprotectioun vun {{PLURAL:$1|dëser Säit|dëse Säite}} gespaart ass mat der Cascadenoptioun:\n$2",
        "password-change-forbidden": "Dir däerft op dëser Wiki Passwierder net änneren.",
        "externaldberror": "Entweder ass e Feeler bei der externer Authentifizéierung geschitt, oder Dir däerft Ären externe Benotzerkont net aktualiséieren.",
        "login": "Aloggen",
+       "login-security": "Iwwerpréift Är Idnetitéit",
        "nav-login-createaccount": "Aloggen / Benotzerkont uleeën",
        "userlogin": "Aloggen / Benotzerkont uleeën",
        "userloginnocreate": "Umellen",
        "userlogin-resetpassword-link": "Hutt Dir Äert Passwuert vergiess?",
        "userlogin-helplink2": "Hëllef beim Aloggen",
        "userlogin-loggedin": "Dir sidd schonn als {{GENDER:$1|$1}} ageloggt.\nBenotzt de Formulaire hei drënner fir Iech als een anere Benotzer anzeloggen.",
+       "userlogin-reauth": "Dir musst Iech nach emol aloggen fir z'iwwerpréiwen datt Dir {{GENDER:$1|$1}} sidd.",
        "userlogin-createanother": "Maacht een anere Benotzerkont op",
        "createacct-emailrequired": "E-Mail-Adress",
        "createacct-emailoptional": "E-Mailadress (fakultativ)",
        "createacct-email-ph": "Gitt Är E-Mail-Adress an",
        "createacct-another-email-ph": "E-Mailadress aginn",
        "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)",
        "createaccountreason": "Grond:",
        "createacct-reason": "Grond",
        "createacct-reason-ph": "Fir wat Dir een anere Benotzerkonnt uleet",
        "createacct-submit": "Äre Benotzerkont uleeën",
        "createacct-another-submit": "Benotzerkont uleeën",
+       "createacct-continue-submit": "Virufuere mam Uleeë vum Benotzerkont",
+       "createacct-another-continue-submit": "Virufuere mam Uleeë vum Benotzerkont",
        "createacct-benefit-heading": "{{SITENAME}} gëtt vu Leit wéi Iech gemaach.",
        "createacct-benefit-body1": "{{PLURAL:$1|Ännerung|Ännerungen}}",
        "createacct-benefit-body2": "{{PLURAL:$1|Säit|Säiten}}",
        "createacct-another-realname-tip": "De richtegen Numm ass fakultativ.\n\nWann Dir en ugitt, gëtt e benotzt fir d'Benotzerattributiounen fir Är Aarbecht zouzeuerdnen.",
        "pt-login": "Aloggen",
        "pt-login-button": "Aloggen",
+       "pt-login-continue-button": "Virufuere mam Aloggen",
        "pt-createaccount": "Benotzerkont opmaachen",
        "pt-userlogout": "Ausloggen",
        "php-mail-error-unknown": "Onbekannte Feeler an der PHP-Mail-Funktioun",
        "passwordreset-emailsent-capture": "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt, Dir gesitt se hei drënner.",
        "passwordreset-emailerror-capture": "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt, Dir gesitt se hei drënner, awer de {{GENDER:$2|Benotzer}} konnt se net kréien: $1",
        "passwordreset-invalideamil": "Net-valabel E-Mail-Adress",
+       "passwordreset-nodata": "Et gouf weder e Benotzernumm nach e Passwuert uginn",
        "changeemail": "E-Mail-Adress änneren oder ewechhuelen",
        "changeemail-header": "Fëllt dëse Formulaire aus fir Är E-Mailadress z'änneren.  Wann Dir d'Verbindung tëscht Ärer E-Mailadress an Ärem Benotzerkont ewechhuele wëllt, da loosst d'Feld e-Mailadress eidel wann Dir de Formulaire späichert.",
        "changeemail-passwordrequired": "Dir musst Äert Passwuert agi fir dës Ännerung ze konfirméieren.",
        "minoredit": "Dëst ass eng kleng Ännerung",
        "watchthis": "Dës Säit iwwerwaachen",
        "savearticle": "Säit späicheren",
+       "savechanges": "Ännerunge späicheren",
        "publishpage": "Säit publizéieren",
+       "publishchanges": "Ännerunge publizéieren",
        "preview": "Kucken ouni ofzespäicheren",
        "showpreview": "Kucken ouni ofzespäicheren",
        "showdiff": "Ännerunge weisen",
        "blankarticle": "<strong>Opgepasst:</strong> D'Säit déi Dir uleet ass eidel.\nWann Dir nach eng Kéier op \"{{int:savearticle}}\" klickt, da gëtt d'Säit ugeluecht.",
-       "anoneditwarning": "<strong>Opgepasst:</strong> Dir sidd net ageloggt. Dowéinst gëtt amplaz vun engem Benotzernumm Är IP Adress ëffentlech gewise wann Dir Ännerunge maacht. Wann Dir <strong>[$1 Iech aloggt]</strong> oder <strong>[$2 e Bnotzerkont opmaachen]</strong>, Är Ännerunge ginn dann Ärem Benotzerkont zougedeelt, genee wéi aner Avantagen.",
+       "anoneditwarning": "<strong>Opgepasst:</strong> Dir sidd net ageloggt. Dowéinst gëtt amplaz vun engem Benotzernumm Är IP Adress ëffentlech gewise wann Dir Ännerunge maacht. Wann Dir <strong>[$1 Iech aloggt]</strong> oder <strong>[$2 e Benotzerkont opmaachen]</strong>, Är Ännerunge ginn dann Ärem Benotzerkont zougedeelt, genee wéi aner Avantagen.",
        "anonpreviewwarning": "''Dir sidd net ageloggt. Wann Dir ofspäichert gëtt Är IP-Adress an der Lëscht vun de Versioune vun dëser Säit enregistréiert.''",
        "missingsummary": "'''Erënnerung:''' Dir hutt kee Resumé aginn.\nWann Dir nacheemol op \"{{int:savearticle}}\" klickt, gëtt Är Ännerung ouni Resumé ofgespäichert.",
        "selfredirect": "<strong>Opgepasst:</strong> Dir maacht eng Viruleedung vun dëser Aäit op sech selwer.\n\nEt ka sinn datt Dir déi falsch Zilsäit fir d'Viruleedung aginn hutt oder datt Dir déi falsch Säit ännert.\n\nWann Dir nach eng Kéier op \"{{int:savearticle}}\" klickt, da gëtt d'Viruleedung trotzdem ugeluecht.",
        "accmailtext": "En zoufälleg generéiert Passwuert fir [[User talk:$1|$1]] gouf op $2 geschéckt.\n\nEt kann op der ''[[Special:ChangePassword|Passwuert ännere]]'' Säit beim Alogge geännert ginn.",
        "newarticle": "(Nei)",
        "newarticletext": "Dir hutt op e Link vun enger Säit geklickt, déi et nach net gëtt. Fir déi Säit unzeleeën, gitt w.e.g. Ären Text an déi Këscht hei drënner an (kuckt d'[$1 Hëllef Säit] fir méi Informatiounen). Wann Dir duerch een Iertum heihi komm sidd, da klickt einfach op de Knäppchen '''Zréck''' vun Ärem Browser.",
-       "anontalkpagetext": "---- ''Dëst ass d'Diskussiounssäit fir en anonyme Benotzer deen nach kee Kont opgemaach huet oder en net benotzt. Dowéinst musse mir d'IP Adress benotzen, fir de Benotzer z'identifizéieren.\nSou eng IP Adress ka vun e puer Benotzer gedeelt ginn.\nWann Dir en anonyme Benotzer sidd an Dir irrelevant Bemierkunge krut, [[Special:CreateAccount|maacht w.e.g. e Kont op]] oder [[Special:UserLogin|loggt Iech an]], fir weider Verwiesselunge mat aneren anonyme Benotzer ze verhënneren.''",
+       "anontalkpagetext": "---- <em>Dëst ass d'Diskussiounssäit fir en anonyme Benotzer deen nach kee Kont opgemaach huet oder en net benotzt. Dowéinst musse mir d'IP Adress benotzen, fir de Benotzer z'identifizéieren.\nSou eng IP Adress ka vun e puer Benotzer gedeelt ginn.\nWann Dir en anonyme Benotzer sidd an Dir net-relevant Bemierkunge krut, [[Special:CreateAccount|maacht w.e.g. e Kont op]] oder [[Special:UserLogin|loggt Iech an]], fir weider Verwiesselunge mat aneren anonyme Benotzer ze verhënneren.</em>",
        "noarticletext": "Dës Säit huet elo keen Text.\nDir kënnt op anere Säiten no [[Special:Search/{{PAGENAME}}|dësem Säitentitel sichen]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} an den entspriechende Logbicher nokucken] oder [{{fullurl:{{FULLPAGENAME}}|action=edit}} dës Säit uleeën]</span>.",
        "noarticletext-nopermission": "Elo ass keen Text op dëser Säit.\nDir kënnt op anere Säiten [[Special:Search/{{PAGENAME}}|no dësem Säitentitel sichen]], oder <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} an de Logbicher sichen]</span>, mä Dir hutt net déi néideg Rechter fir dës Säit unzeleeën.",
        "missing-revision": "D'Versioun #$1 vun der Säit mam Numm \"{{FULLPAGENAME}}\" gëtt et net.\n\nDat geschitt normalerweis wann Dir op e vereelste Link vun enger Versioun vun enger Säit klickt déi geläscht ginn ass.\nDetailer fannt Dir am [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Logbuch vum Läschen].",
        "userpage-userdoesnotexist": "De Benotzerkont \"<nowiki>$1</nowiki>\" ass net registréiert.\nIwwerpréift w.e.g. op Dir dës Säit uleeën/ännere wëllt.",
        "userpage-userdoesnotexist-view": "De Benotzerkont \"$1\" ass net registréiert.",
        "blocked-notice-logextract": "Dëse Benotzer ass elo gespaart.\nDéi lescht Entrée am Logbuch vun de Späre steet als Referenz hei drënner:",
-       "clearyourcache": "'''Opgepasst - Nom Späichere muss der Ärem Browser seng Cache eidel maachen, fir d'Ännerungen ze gesinn.'''\n* '''Firefox / Safari:''' Halt ''Shift'' während Dir ''Reload'' klickt oder dréckt entweder ''Ctrl-F5'' oder ''Ctrl-R'' (''⌘-R'' op engem Mac);\n* '''Google Chrome:''' Dréckt ''Ctrl-Shift-R'' (''⌘-Shift-R'' op engem Mac)\n* '''Internet Explorer:''' dréckt ''Ctrl'' während Dir op ''Refresh'' klickt oder dréckt ''Ctrl-F5.''\n* '''Opera:''' maacht de Cache eidel an ''Tools → Preferences;''",
+       "clearyourcache": "<strong>Opgepasst - Nom Späichere muss der Ärem Browser seng Cache eidel maachen, fir d'Ännerungen ze gesinn.</strong>\n* <strong>Firefox / Safari:</strong> Halt <em>Shift</em> während Dir <em>Reload</em> klickt oder dréckt entweder <em>Ctrl-F5</em> oder <em>Ctrl-R</em> (<em>⌘-R</em> op engem Mac);\n* <strong>Google Chrome:</strong> Dréckt <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> op engem Mac)\n* <strong>Internet Explorer:</strong> dréckt <em>Ctrl</em> während Dir op <em>Refresh</em> klickt oder dréckt <em>Ctrl-F5.</em>\n* <strong>Opera:</strong> Gitt op de <em>Menu → Settings</em> (<em>Opera → Preferences</em> op engem  Mac) an dann op <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "usercssyoucanpreview": "'''Tipp:''' Benotzt de \"{{int:showpreview}}\"-Knäppchen, fir Ären neien CSS virum Späicheren ze testen.",
        "userjsyoucanpreview": "'''Tipp:''' Benotzt de ''{{int:showpreview}}''-Knäppchen, fir Ären neie JavaScript virum Späicheren ze testen.",
        "usercsspreview": "'''Bedenkt: Dir kuckt just är Benotzer CSS.\nSi gouf nach net gespäichert!'''",
        "previewnote": "'''Denkt drun datt dëst nëmmen eng net gespäichert Versioun ass.'''\nÄr Ännerunge sinn nach net gespäichert!",
        "continue-editing": "Gitt weider an de Beräich fir z'änneren",
        "previewconflict": "Dir gesitt an dem ieweschten Textfeld wéi den Text ausgesi wäert, wann Dir späichert.",
-       "session_fail_preview": "<strong>Är Ännerung konnt net gespäichert gi well d'Date vun Ärer Sessioun verluergaange sinn.</strong>\nVersicht et w.e.g. nach eng Kéier.\nWann de Problem dann ëmmer nach bestoe sollt, da versicht Iech [[Special:UserLogout|auszeloggen]] an dann erëm anzeloggen.",
+       "session_fail_preview": "Är Ännerung konnt net gespäichert gi well d'Date vun Ärer Sessioun verluergaange sinn.\nDir gouft eventuell ausgeloggt. <strong>Iwwerpréift w.e.g. ob Dir nach ageloggt sidd a probéiert nach eng Kéier</strong>.\nWann de Problem dann ëmmer nach bestoe sollt, da versicht Iech [[Special:UserLogout|auszeloggen]] an dann erëm anzeloggen an iwwerpréift datt Äre Browser Cookië vun dësem Site  akzeptéiert.",
        "session_fail_preview_html": "Är Ännerung konnt net gespäichert gi well d'Date vun Ärer Sessioun verluergaange sinn.\n\n<em>Well op {{SITENAME}} 'raw HTML' aktivéiert ass, gouf d'Uweise vun der nach net gespäicherter Versioun ausgeblennt fir JavaScript-Attacken ze vermeiden.</em>\n\n<strong>Wann Dir eng berechtegt Ännerung maache wëllt, da versicht et w.e.g. nach eng Kéier.</strong>\n\nWann de Problem dann ëmmer nach bestoe sollt, versicht Iech [[Special:UserLogout|auszeloggen]] an dann erëm anzeloggen a vergewëssert Iech datt Äre Browser d^Späichere vu Cookieë vun dësem Site zouléisst.",
        "token_suffix_mismatch": "'''Är Ännerung gouf refuséiert, well Äre Browser Zeechen am Ännerungs-Identifiant verännert huet.'''\nD'Ännerung gouf refuséiert, fir ze verhënneren datt den Text op der Säit onliesbar gëtt.\nDëst geschitt heiansdo wann Dir en anonyme Proxy-Service um Internet benotzt.",
        "edit_form_incomplete": "'''En Deel vum Ännerungsformulaire koum net um Server un; iwwerpréift w.e.g ob Är Ännerunge komplett sinn a probéiert nach emol.'''",
        "mergehistory-empty": "Et kënne keng Versioune zesummegeluecht ginn.",
        "mergehistory-done": "{{PLURAL:$3|1 Versioun gouf|$3 Versioune goufe}} vu(n) $1 op [[:$2]] zesummegeluecht.",
        "mergehistory-fail": "Versiounszesummeleeung war net méiglech, kuckt w.e.g. d'Säiten an d'Zäit-Parameter no.",
+       "mergehistory-fail-bad-timestamp": "Zäitstempel ass net valabel.",
+       "mergehistory-fail-invalid-source": "Quellsäit ass net valabel.",
+       "mergehistory-fail-invalid-dest": "Zilsäit ass net valabel.",
        "mergehistory-fail-toobig": "D'zesummeleeë vun der Lëscht vun de Versioune konnt net gemaach ginn well méi wéi d'Limite vun $1 {{PLURAL:$1|Versioun|Versioune}} geréckelt géife ginn",
        "mergehistory-no-source": "Originalsäit \"$1\" gëtt et net.",
        "mergehistory-no-destination": "Zilsäit \"$1\" gëtt et net.",
        "right-unwatchedpages": "Lëscht vun den net iwwerwaachte Säite weisen",
        "right-mergehistory": "Zesummeféierung vum Historique vun de Versioune vu Säiten",
        "right-userrights": "All Benotzerrechter änneren",
-       "right-userrights-interwiki": "Benotzerrechter vu Benotzer op anere Wiki-Siten änneren",
+       "right-userrights-interwiki": "Benotzerrechter vu Benotzer op anere Wiki-Sitten änneren",
        "right-siteadmin": "Datebank spären an d'Spär ophiewen",
        "right-override-export-depth": "Säiten exportéieren inklusiv de verlinkte Säite bis zu enger Déift vu 5",
        "right-sendemail": "Anere Benotzer E-Maile schécken",
        "rightslogtext": "Dëst ass d'Lëscht vun den Ännerunge vu Benotzerrechter.",
        "action-read": "dës Säit ze liesen",
        "action-edit": "dës Säit z'änneren",
-       "action-createpage": "Säiten unzelleeën",
-       "action-createtalk": "Diskussiounssäiten unzeleeën",
+       "action-createpage": "dës Säit uleeën",
+       "action-createtalk": "dës Diskussiounssäit uleeën",
        "action-createaccount": "dëse Benotzerkont unzeleeën",
        "action-history": "d'Versioune vun dëser Säit weisen",
        "action-minoredit": "dës Ännerung als kleng Ännerung ze markéieren",
        "upload-too-many-redirects": "Et waren zevill Viruleedungen fir d'URL do",
        "upload-http-error": "Et ass en HTTP-Feeler geschitt: $1",
        "upload-copy-upload-invalid-domain": "Vun dësem Domain ass d'Eropluede vu Kopien net méiglech.",
+       "upload-foreign-cant-upload": "Dës Wiki ass net agestallt fir Fichieren an den ugefrote frieme Repertoire fir Fichieren eropzelueden.",
+       "upload-dialog-disabled": "D'Eropluede vu Fichieren mat dësem Dialog ass op dëser Wiki desaktivéiert.",
        "upload-dialog-title": "Fichier eroplueden",
        "upload-dialog-button-cancel": "Ofbriechen",
        "upload-dialog-button-done": "Fäerdeg",
        "apisandbox-dynamic-parameters": "Zousätzlech Parameteren",
        "apisandbox-dynamic-parameters-add-label": "Parameter derbäisetzen:",
        "apisandbox-dynamic-parameters-add-placeholder": "Numm vum Parameter",
+       "apisandbox-dynamic-error-exists": "Et gëtt schonn e Parameter mam Numm \"$1\".",
        "apisandbox-deprecated-parameters": "Vereelst Parameter",
        "apisandbox-submit-invalid-fields-title": "E puer Felder sinn net valabel.",
        "apisandbox-results": "Resultater",
        "apisandbox-request-url-label": "URL fir Ufroen:",
        "apisandbox-request-time": "Dauer vun der Ufro: {{PLURAL:$1|$1 ms}}",
        "apisandbox-alert-page": "Felder op dëser Säit sinn net valabel.",
+       "apisandbox-alert-field": "De wäert vun dësem Feld ass net valabel.",
        "booksources": "Bicherreferenzen",
        "booksources-search-legend": "No Bicherreferenze sichen",
        "booksources-search": "Sichen",
        "listgrouprights-namespaceprotection-header": "Limitatioune vum Nummraum",
        "listgrouprights-namespaceprotection-namespace": "Nummraum",
        "listgrouprights-namespaceprotection-restrictedto": "Recht(er), déi dem Benotzer d'Änneren erlaben",
+       "listgrants": "Autorisatiounen",
+       "listgrants-grant": "Autorisatioun",
        "listgrants-rights": "Rechter",
        "trackingcategories": "Tracking-Kategorien",
        "trackingcategories-msg": "Tracking-Kategorie",
        "sp-contributions-username": "IP-Adress oder Benotzernumm:",
        "sp-contributions-toponly": "Nëmmen Ännerunge weisen déi déi lescht Versioun sinn",
        "sp-contributions-newonly": "Nëmmen Ännerunge weisen déi Säiten uleeën",
+       "sp-contributions-hideminor": "Kleng Ännerunge verstoppen",
        "sp-contributions-submit": "Sichen",
        "whatlinkshere": "Linken op dës Säit",
        "whatlinkshere-title": "Säiten, déi mat \"$1\" verlinkt sinn",
        "lockedbyandtime": "(vum $1 de(n) $2 ëm $3 Auer)",
        "move-page": "Réckel $1",
        "move-page-legend": "Säit réckelen",
-       "movepagetext": "Wann Dir dëse Formulaire benotzt gitt Dir enger Säit en aneren Numm a réckelt se mat hirem Historique op den neien Numm.\nDen alen Titel gëtt eng Viruleedung op déi nei Säit.\nDir kënnt Viruleedungen déi op déi al Säit ginn automatesch aktualiséieren.\nWann Dir dat net maacht, da vergewëssert Iech datt keng [[Special:DoubleRedirects|duebel]] oder [[Special:BrokenRedirects|futtis Viruleedungen]] am Spill sinn.\nDir sidd responsabel datt d'Linke weiderhin dohinner pointéieren, wou se hi sollen.\n\nBeuecht w.e.g. datt d'Säit '''net''' geréckelt gëtt, wann et schonn eng Säit mat deem Titel gëtt, ausser déi ass eidel, ass eng Viruleedung oder huet keen Historique.\nDëst bedeit datt Dir eng Säit zréck op hiren ursprénglechen Numm ëmbenenne kënnt wann Dir Iech geiert hat an datt Dir keng Säit iwwerschreiwe kënnt, déi et scho gëtt.\n\n'''OPGEPASST!'''\nDëst kann en drastesche Changement fir eng populär Säit bedeiten;\nverstitt w.e.g. d'Konsequenze vun Ärer Handlung ier Dir dëst maacht.",
-       "movepagetext-noredirectfixer": "Wann Dir dëse Formulaire benotzt, réckelt Dir eng komplett Säit mat hirem Historique op en neien Numm.\nDen alen Titel gëtt eng Viruleedung op den neien Titel.\nDir kënnt Viruleedungen déi op déi al Säit ginn automatesch aktualiséieren.\nVergewëssert Iech datt keng [[Special:DoubleRedirects|duebel]] oder [[Special:BrokenRedirects|futtis Viruleedungen]] am Spill sinn.\nDir sidd responsabel datt d'Linke weider dohi pointéieren, wou se hi sollen.\n\nDenkt w.e.g. drun datt d'Säit '''net''' geréckelt gëtt, wann et schonn eng Säit mat deem Titel gëtt, ausser déi ass eidel, ass eng Viruleedung oder huet keen Historique.\nDëst bedeit datt dir eng Säit zréck op deen Numm dee se virdrun hat ëmbenenne kënnt wann Dir e Feeler maacht an datt Dir keng Säit iwwerschreiwe kënnt, déi et scho gëtt.\n\n'''OPGEPASST!'''\nDëst kann en drastesche Changement fir eng populär Säit sinn;\nverstitt w.e.g. d'Konsequenze vun ärer Handlung ier Dir dëst maacht.",
+       "movepagetext": "Wann Dir dëse Formulaire benotzt gitt Dir enger Säit en aneren Numm a réckelt se mat hirem Historique op den neien Numm.\nDen alen Titel gëtt eng Viruleedung op déi nei Säit.\nDir kënnt Viruleedungen déi op déi al Säit ginn automatesch aktualiséieren.\nWann Dir dat net maacht, da vergewëssert Iech datt keng [[Special:DoubleRedirects|duebel]] oder [[Special:BrokenRedirects|futtis Viruleedungen]] am Spill sinn.\nDir sidd responsabel datt d'Linke weiderhin dohinner pointéieren, wou se hi sollen.\n\nBeuecht w.e.g. datt d'Säit '''net''' geréckelt gëtt, wann et schonn eng Säit mat deem Titel gëtt, ausser déi ass eidel, ass eng Viruleedung oder huet keen Historique.\nDëst bedeit datt Dir eng Säit zréck op hiren ursprénglechen Numm ëmbenenne kënnt wann Dir Iech geiert hat an datt Dir keng Säit iwwerschreiwe kënnt, déi et scho gëtt.\n\n<strong>Notiz:</strong>\nDëst kann en drastesche Changement fir eng populär Säit bedeiten;\nverstitt w.e.g. d'Konsequenze vun Ärer Handlung ier Dir dëst maacht.",
+       "movepagetext-noredirectfixer": "Wann Dir dëse Formulaire benotzt, réckelt Dir eng komplett Säit mat hirem Historique op en neien Numm.\nDen alen Titel gëtt eng Viruleedung op den neien Titel.\nDir kënnt Viruleedungen déi op déi al Säit ginn automatesch aktualiséieren.\nVergewëssert Iech datt keng [[Special:DoubleRedirects|duebel]] oder [[Special:BrokenRedirects|futtis Viruleedungen]] am Spill sinn.\nDir sidd responsabel datt d'Linke weider dohi pointéieren, wou se hi sollen.\n\nDenkt w.e.g. drun datt d'Säit <strong>net</strong> geréckelt gëtt, wann et schonn eng Säit mat deem Titel gëtt, ausser déi ass eidel, ass eng Viruleedung oder huet keen Historique.\nDëst bedeit datt dir eng Säit zréck op deen Numm dee se virdrun hat ëmbenenne kënnt wann Dir e Feeler maacht an datt Dir keng Säit iwwerschreiwe kënnt, déi et scho gëtt.\n\n<strong>Notiz:</strong>\nDëst kann en drastesche Changement fir eng populär Säit sinn;\nverstitt w.e.g. d'Konsequenze vun ärer Handlung ier Dir dëst maacht.",
        "movepagetalktext": "Wann Dir dës Këscht uklickt da gëtt déi associéiert Diskussiounssäit, am Fall wou  eng do ass, automatesch op deen neien Numm matgeréckelt, '''ausser:''' Et gëtt schonn eng Diskussiounssäit mat dësem Numm déi net eidel ass.\n\nAn deem Fäll musst Dir d'Diskussiounssäit manuell réckelen oder fusionéieren.",
        "moveuserpage-warning": "'''Opgepasst:''' Dir sidd am gaang eng Benotzersäit ze réckelen. Denkt w.e.g. dorunn datt just d'Säit geréckelt gëtt an datt de Benotzer ''net'' ëmbenannt gëtt.",
        "movecategorypage-warning": "<strong>Opgepasst:</strong> Dir sidd am Gaang eng Kategorie-Säit ze réckelen. Denkt drun datt nëmmen déi Säit geréckelt gëtt an all Säiten an der aler Kategorie ginn <em>net</em> an déi nei ëmkategoriséiert.",
        "move-leave-redirect": "Viruleedung uleeën",
        "protectedpagemovewarning": "<strong>OPGEPASST:</strong> Dës Säit gouf gespaart sou datt nëmme Benotzer mat Administreursrechter se réckele kënnen.\nDéi lescht Zeil aus de Logbicher fannt Dir zu Ärer Informatioun hei ënnendrënner.",
        "semiprotectedpagemovewarning": "'''OPGEPASST:''' Dës Säit gouf gespaart sou datt nëmme confirméiert Benotzer se réckele kënnen. Déi lescht Zeil aus de Logbicher fannt Dir zu Ärer Informatioun hei ënnendrënner.",
-       "move-over-sharedrepo": "== De Fichier gëtt et ==\n[[:$1]] gëtt et op engem gedeelte Repertoire. Wann dir e Fichier op dësen Titel réckelt dann ass dee gedeelte Fichier net méi accessibel.",
+       "move-over-sharedrepo": "== De Fichier gëtt et ==\n[[:$1]] gëtt et op engem gedeelte Repertoire. Wann Dir e Fichier op dësen Titel réckelt da gëtt dee gedeelte Fichier verstoppt.",
        "file-exists-sharedrepo": "Den Numm vum Fichier deen Dir erausgesicht hutt gëtt schonn op engem gemeinsame Repertoire benotzt.\nSicht Iech w.e.g. en aneren Numm.",
        "export": "Säiten exportéieren",
        "exporttext": "Dir kënnt den Text an den Historique vun enger bestëmmter Säit, oder engem Set vu Säiten, an XML agepakt, exportéieren, déi dann an eng aner Wiki mat MediaWiki Software importéiert gi mat Hëllef vun der [[Special:Import|Import-Säit]].\n\nFir eng Säit z'exportéieren, gitt den Titel an d'Textkëscht heidrënner an, een Titel pro Linn, a wielt aus op Dir nëmmen déi aktuell Versioun oder all Versioune mam ganzen Historique exportéiere wëllt.\n\nWann nëmmen déi aktuell Versioun exportéiert soll ginn, kënnt Dir och e Link benotze wéi z. B. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] fir d'\"[[{{MediaWiki:Mainpage}}]]\".",
        "import-nonewrevisions": "Et goufe keng Versiounen importéiert (se waren al entweder scho virdrun importéiert ginn oder se goufen iwwersprong well Feeler dra waren).",
        "xml-error-string": "$1 an der Zeil $2, Spalt $3, (Byte $4): $5",
        "import-upload": "XML-Daten importéieren",
-       "import-token-mismatch": "D'Date vun ärer Sessioun si verluer gaang. Versicht et w.e.g. nach eemol.",
+       "import-token-mismatch": "D'Date vun ärer Sessioun si verluer gaang.\n\nDir sidd eventuell ausgeloggt ginn. <strong>Kuckt w.e.g. no ob Dir nach ageloggt sidd a probéiert nach eng Kéier</strong>.\nWann et dann nach net geet, probéiert [[Special:UserLogout|Iech auszeloggen]] an duerno nees anzeloggen a kuckt no ob Äre Browser Cookië vun dësem Site akzeptéiert.",
        "import-invalid-interwiki": "Aus der Wiki déi Dir uginn hutt kann näischt importéiert ginn.",
        "import-error-edit": "D'Säit \"$1\" gouf net importéiert well Dir se net änneren däerft.",
        "import-error-create": "D'Säit \"$1\" gouf net importéiert well Dir se net uleeën däerft.",
        "tooltip-pt-preferences": "{{GENDER:|Är}} Astellungen",
        "tooltip-pt-watchlist": "Lëscht vu Säiten, bei deenen Dir op Ännerungen oppasst",
        "tooltip-pt-mycontris": "Lëscht vun {{GENDER:|Äre}} Kontributiounen",
+       "tooltip-pt-anoncontribs": "Eng Lëscht vun Ännerungen déi vun dëser IP-Adress aus gemaach goufen",
        "tooltip-pt-login": "Sech umelle gëtt gäre gesinn, Dir musst et awer net maachen.",
        "tooltip-pt-logout": "Ofmellen",
        "tooltip-pt-createaccount": "Et gëtt Iech geroden e Benotzerkont unzeleeën an Iech anzeloggen; dat ass awer net obligatoresch",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
        "mw-widgets-titleinput-description-new-page": "Säit gëtt et nach net",
        "mw-widgets-titleinput-description-redirect": "viruleeden op $1",
-       "api-error-blacklisted": "Sicht w.e.g. en aneren Titel, dee méi iwwer de Sujet ausseet.",
        "sessionprovider-generic": "$1-Sessiounen",
        "randomrootpage": "Zoufalls-Stammsäit",
        "log-action-filter-block": "Typ vun der Spär:",
        "log-action-filter-patrol-autopatrol": "Automatesch Kontroll",
        "log-action-filter-protect-protect": "Spär",
        "log-action-filter-protect-modify": "Spär-pÄnnerung",
+       "log-action-filter-protect-unprotect": "Spär ophiewen",
        "log-action-filter-protect-move_prot": "Geréckelt Spär",
        "log-action-filter-rights-rights": "Manuell Ännerung",
        "log-action-filter-rights-autopromote": "Automatesch Ännerung",
        "specialpage-securitylevel-not-allowed": "Leider däerft Dir dës Säit net benotze well Är Identitéit net konnt iwwerpréift ginn.",
        "cannotauth-not-allowed-title": "Erlaabnes refuséiert",
        "cannotauth-not-allowed": "Dir däerft dës Säit net benotzen",
-       "changecredentials-submit": "Änneren",
+       "changecredentials-submit": "Idendifikatiounsinformatiounen änneren",
        "changecredentials-success": "Är Idendifikatiounsinformatioune goufe geännert.",
-       "removecredentials-submit": "Ewechhuelen",
+       "removecredentials-submit": "Idendifikatiounsinformatiounen ewechhuelen",
        "credentialsform-account": "Numm vum Kont:",
        "cannotlink-no-provider-title": "Et gëtt keng Benotzerkonte fir ze verlinken",
        "linkaccounts": "Benotzerkonte verbannen",
index 5b8c07d..f1d9a18 100644 (file)
        "move-page-legend": "Юзун хъувун",
        "movepagetext": "Ишлемишиз кlеневай къаб,чарчин тlар дегишариp, кьиспесдин  чка дегишарун, цlийи тlар авун.\nИски тlарцlи ракъурда цlийи тlарцlел.\nКвевай жеда цlийи хъийиз ракъурун, къалурзай дуьз тlарцlел вуч вичиз.\nКвез кlанзаштlа,рекlел алудмир ахтармишиз инна [[Special:DoubleRedirects|double]] ва [[Special:BrokenRedirects|broken redirects]].\nКуьне тухузва шаидвал,мадни гьабур гьамиша алукьдайвал, гьиниз гьабур фена кlанзатl.\n\nАхтармиша, чар ''ваъ''' ракъур хьун, гьахьтин тlар алай чар ава, гьама ичlиди ятlа, ракъурнатlа ва дегишарунин кьиспес авачтlа.\nКевай жеда гьа чар тlар дегишараз кьулукъ гьаниз элкъуьриз, гьина гьадан тlар дегиш авунатlа, куьне гъалатl авунатlа, куьне чин тийиз авай чарчик гъалатl тада.\n\n'''Килига!'''\nАмма бейхабар жеда гзаф герекзай чарариз;\nБуюр, килиг , куьне фикирзатlа вуч жезатlа, кхьин хъийидади.",
        "movepagetalktext": "Ухшар авай чарар ихтилатдин, фида масса чкадал вуч вичиз ибур галаз''',амма:'''                                                                               *Эчlи чар ихтилатдин ава цlийи тlар алаз, ва                                                                                                                                           *Куьне иляйда пайдах кlеникай                                                                                                                                                                                  Гьа вахтунда, куьне чка дегишар авун или санал авуна чар гъилелди, кlанда",
-       "movearticle": "Юзун хъувун:",
        "newtitle": "ЦӀийи тӀвар:",
        "move-watch": "Гелкъуьн и хъувун",
        "movepagebtn": "Юзун хъувун",
        "movelogpage": "ТӀвар эхцигунрин журнал",
        "movereason": "Фагьум:",
        "revertmove": "Рахкъурун",
-       "delete_and_move": "Алудун ва тӀвар эхцигун",
        "export": "Ччинрин экспорт",
        "export-addns": "Алава авун",
        "export-download": "Файл хьиз хуьн",
index 17b837b..dd1e9d4 100644 (file)
        "loginerror": "Era de entra",
        "loginsuccesstitle": "Entra susedente",
        "loginsuccess": "'''Tu ia entrada aora a {{SITENAME}} como \"$1\".'''",
-       "nosuchuser": "Es no usor con la nom \"$1\".\nEsamina la spele, o [[Special:UserLogin/signup|crea un conta nova]].",
+       "nosuchuser": "Es no usor con la nom \"$1\".\nEsamina la spele, o [[Special:CreateAccount|crea un conta nova]].",
        "nosuchusershort": "Es no usor con esta nom \"$1\". Esamina la spele.",
        "nouserspecified": "Tu debe indica un nom de usor.",
        "wrongpassword": "La sinia de entra no es coreta. Per favore, atenta ancora.",
        "move-page-legend": "Move paje",
        "movepagetext": "Usa la forma a su va cambia la nom de un paje, e va move tota se istoria a la nom nova.\nLa titulo vea va deveni un paje de redirije a la titulo nova.\nLias a la titulo de la paje vea no va es cambiada;\nTu debe vide serta ce es redirijes duple o rompeda.\nTu es respondable per es serta ce la lias va continua vade a la locas intendeda.\n\nNota ce la paje '''no''' va es moveda si es ja un paje a la titulo nova, sin el es vacua o un redirije e no ave un istoria de editas presedente.\nEsta sinifia ce tu pote cambia la nom de un paje a la loca presedente si tu era, e tu no pote scrive supra un paje ce esiste ja.\n\n'''AVISA!'''\nEsta pote es un cambia dramos e nonespetada per un paje poplal;\nper favore, es serta ce tu comprende la resulta de esta ata ante tu continua.",
        "movepagetalktext": "La paje de discuta de esta paje va es moveda automatica con el '''eseta si:'''\n*Un paje de discuta ce no es vacua esiste ja su la nom nova, o\n*Tu cambia la indica en la caxa su.\n\nEn esta casos, tu va nesesa move o fusa la paje per mano, si desirada.",
-       "movearticle": "Move paje:",
        "newtitle": "A titulo nova:",
        "move-watch": "Oserva esta paje",
        "movepagebtn": "Move paje",
index de75f5e..e22617c 100644 (file)
        "tog-watchdefault": "Azonzi e paggine e i files che modiffico a-i mæ sotta oservaçion",
        "tog-watchmoves": "Azonzi e paggine e i file che mescio a-i mæ sotta oservaçion",
        "tog-watchdeletion": "Azonzi e paggine e i files che scancello a-i mæ sotta oservaçion",
+       "tog-watchuploads": "Azonzi i noeuvi file che metto in osservaçion",
        "tog-watchrollback": "Azonzi a-i sotta osservassion e paggine dovve ho fæto un rollback",
        "tog-minordefault": "Indica de longo comme menô e modiffiche",
        "tog-previewontop": "Veddi l'anteprimma de d'äto a-o spaçio pe cangiâ",
        "tog-previewonfirst": "Veddi l'anteprimma a-o primmo cangiamento",
        "tog-enotifwatchlistpages": "Famme savéi via e-mail quande 'na paggina o in file inti mæ osservæ a ven cangiâ.",
        "tog-enotifusertalkpages": "Màndime un'e-mail se gh'é de modìffiche inta mæ pagina de discuscion.",
-       "tog-enotifminoredits": "Inviami una email pe e modifiche menoî ascì de pagine e di file",
+       "tog-enotifminoredits": "Mandime una email ascì pe e modifiche menoî de pagine e di file",
        "tog-enotifrevealaddr": "Mostra o mæ addresso inte e-mail de notiffica",
        "tog-shownumberswatching": "Mostra o numero di utenti che tegnan d'oeuggio sta pagina",
        "tog-oldsig": "Firma attuale:",
@@ -66,8 +67,8 @@
        "editfont-sansserif": "Carattere sans-serif",
        "editfont-serif": "Carattere serif",
        "sunday": "Domenega",
-       "monday": "Lunedì",
-       "tuesday": "Martedì",
+       "monday": "Lunesdì",
+       "tuesday": "Matesdì",
        "wednesday": "Mäcordì",
        "thursday": "Zeuggia",
        "friday": "Venardì",
        "talkpage": "Paggina de discuscion",
        "talkpagelinktext": "Ciæti",
        "specialpage": "Pagina speçiâ",
-       "personaltools": "Strùmenti personâli",
+       "personaltools": "Strumenti personâli",
        "articlepage": "Veddi a voxe",
        "talk": "Discuscion",
        "views": "Vìxite",
        "databaseerror-query": "Query: $1",
        "databaseerror-function": "Fonsion: $1",
        "databaseerror-error": "Errô: $1",
+       "transaction-duration-limit-exceeded": "Pe evitâ un ato ritardo de replica, questa opiaçion a l'è stæta interotta perché a duata do tempo de scrittua ($1) a l'ha superou o limmite de $2 {{PLURAL:$2|segondo|segondi}}.\nSe t'ê aproeuvo a cangiâ tante cose inte'na votta sola, proeuva invece a cangiâ poche cose in tante votte.",
        "laggedslavemode": "'''Attension:''' a paggina a porriæ no riportâ i aggiornamenti ciù reçenti.",
        "readonly": "Database bloccòu",
        "enterlockreason": "Scrivi o motivo do blocco, e 'na stimma de quande o saiâ rimosso",
        "mypreferencesprotected": "No ti g'hæ o permisso pe modificâ e teu preferense.",
        "ns-specialprotected": "No se pœu modificâ e paggine speciali",
        "titleprotected": "A creaçion de 'na paggina con sto tittolo a l'è stæta bloccâ da [[User:$1|$1]].\nA raxon a l'è: <em>$2</em>.",
-       "filereadonlyerror": "N'ho posciuo modificâ o file \"$1\" perché o repository de file \"$2\" o l'è in modalitæ de sola lettua.\n\nL'amministratô ch'o l'ha bloccòu o l'ha fornio sta motivaçion: \"$3\".",
+       "filereadonlyerror": "N'ho posciuo modificâ o file \"$1\" perché o repository de file \"$2\" o l'è in modalitæ de sola lettua.\n\nL'amministratô de scistema ch'o l'ha bloccòu o l'ha fornio sta motivaçion: \"$3\".",
        "invalidtitle-knownnamespace": "Tittolo non vallido con namespace \"$2\" e testo \"$3\"",
        "invalidtitle-unknownnamespace": "Tittolo non vallido con namespace sconosciuo \"$1\" e testo \"$2\"",
        "exception-nologin": "No t'ê introu",
        "virus-scanfailed": "scansion fallia (codice $1)",
        "virus-unknownscanner": "antivirus sconosciuo:",
        "logouttext": "'''Sciortîa effettuâ.'''\n\nDanni a mente che gh'è de paggine che porrieivan continuâ a pai comme se a sciortîa a no foise avegnua, pe scin che no ti nettezzi a cache do to navegatô.",
+       "cannotlogoutnow-title": "Aoa no se poeu sciortî",
+       "cannotlogoutnow-text": "Quande s'adoeuvia $1 no se poeu sciortî.",
        "welcomeuser": "Benvegnuo, $1!",
        "welcomecreation-msg": "L'utensa a l'è stæta creâ correttamente.\nSe ti veu ti peu personalizzâ e [[Special:Preferences|preferençe de {{SITENAME}}]].",
        "yourname": "Nomme",
        "remembermypassword": "Aregòrda a mæ login in sto navegatô (pe in mascimo de $1 {{PLURAL:$1|giórno|giórni}})",
        "userlogin-remembermypassword": "Mantegnime collegou",
        "userlogin-signwithsecure": "Adoeuvia una conescion segua",
+       "cannotloginnow-title": "Aoa no se poeu intrâ",
+       "cannotloginnow-text": "Quande s'adoeuvia $1 no se poeu intrâ.",
        "yourdomainname": "Indirisso do scito:",
        "password-change-forbidden": "No ti peu cangiâ poula segretta in questa wiki.",
-       "externaldberror": "Gh'è stæto un aro co-ol server de autenticaçion esterno, oppû no ti g'hæ i aotorizzaçioin pe aggiornâ o to accesso esterno.",
+       "externaldberror": "Gh'è stæto un aro co-o server de aotenticaçion esterno, oppû no ti g'hæ i aotorizzaçioin pe aggiornâ o to accesso esterno.",
        "login": "Intra",
+       "login-security": "Veifica a to identitæ",
        "nav-login-createaccount": "Intra / Registrate",
        "userlogin": "Intra / Registrite",
        "userloginnocreate": "Intra",
        "userlogin-resetpassword-link": "T'hæ miga ascordou a teu poula segretta?",
        "userlogin-helplink2": "Agiutto pe intrâ",
        "userlogin-loggedin": "Ti t'ê zà connesso comme {{GENDER:$1|$1}}.\nUsa o formulaio sottostante pe accede comme 'n atro utente.",
+       "userlogin-reauth": "Ti g'hæ da intrâ 'n'atra votta pe veificâ che ti t'ê {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Crea 'n atra utensa",
        "createacct-emailrequired": "Addresso e-mail:",
        "createacct-emailoptional": "Adresso email (opsionale)",
        "createacct-email-ph": "Scrivi o teu adresso email",
        "createacct-another-email-ph": "Scrivi o teu adresso email",
        "createaccountmail": "Doeuvia una password temporanea abrettio e mandila a l'adresso de posta elettronica speçificou",
+       "createaccountmail-help": "O poeu ese doeuviou pe creâ un'utensa pe 'n'atra person-a sensa doveine conosce a password.",
        "createacct-realname": "Nomme reale (opçionâ)",
        "createaccountreason": "Raxon:",
        "createacct-reason": "Raxon",
        "createacct-reason-ph": "Perché t'ê apreuvo a creâ un'atra utensa",
+       "createacct-reason-help": "Messaggio vixualizou into registro da creaçion de l'utença",
        "createacct-submit": "Crea a to utensa",
        "createacct-another-submit": "Crea utensa",
+       "createacct-continue-submit": "Continnoa a creaçion de l'utença",
+       "createacct-another-continue-submit": "Continnoa a creaçion de l'utença",
        "createacct-benefit-heading": "{{SITENAME}} o l'è realizzou da de gente comme ti.",
        "createacct-benefit-body1": "{{PLURAL:$1|modiffica|modiffiche}}",
        "createacct-benefit-body2": "{{PLURAL:$1|paggina|paggine}}",
        "nocookiesnew": "L'utensa a l'è stæta creâ, ma ti no t'ê intròu. {{SITENAME}} o deuvia i cookie pe lasciâ intrâ i utenti e ti ti ghe l'hæ disattivæ.\nRipreuva a intrâ co-o to nomme utente e poula segretta apen-a creæ doppo avei attivòu i cookie.",
        "nocookieslogin": "Pe intrâ in {{SITENAME}} bezeugna aveighe i cookie attivæ. Ti ti ghe l'hæ disattivæ. Pe piaxei attîvili e preuva torna a intrâ.",
        "nocookiesfornew": "L'utensa a no l'è stæta creâ, perché n'emmo posciuo confermâ a so sorgente.\nAsseguite d'avei attivòu i cookie, recarrega sta paggina e ripreuva.",
+       "createacct-loginerror": "L'utença a l'è stæta creaa correttamente, ma no l'è stæto poscibbile fate accede in moddo aotomattico. Procedi co l'[[Special:UserLogin|accesso manoâ]].",
        "noname": "O nomme d'ûtente o l'è sballiòu.",
        "loginsuccesstitle": "Accesso effettuòu",
        "loginsuccess": "'''O collegamento a-o server de {{SITENAME}} co-o nomme d'ûtente \"$1\" o l'è attivo.'''",
        "nouserspecified": "Ti g'hæ da specificâ un nomme utente.",
        "login-userblocked": "St'utente o l'è bloccou. Accesso negou.",
        "wrongpassword": "Ti gh'æ scrîo 'na paròlla d'ordine sbaliâ. Tenta torna.",
-       "wrongpasswordempty": "No ti g'hæ scrîo nisciûnn-a paròlla d'ordine. Tenta torna.",
+       "wrongpasswordempty": "No ti g'hæ scrîto nisciûnn-a paròlla d'ordine. Ritenta.",
        "passwordtooshort": "E password devan aveighe aomanco {{PLURAL:$1|1 carattere|$1 caratteri}}.",
        "passwordtoolong": "A poula segretta a no peu contegnî ciù de {{PLURAL:$1|1 carattere|$1 caratteri}}.",
        "passwordtoopopular": "No se peu deuviâ de paole segrette troppo ordenaie. Pe piaxei çernitene un-a ciu particolâ.",
        "passwordremindertext": "Quarchedûn (probabilmente ti, con addresso IP $1) o l'ha domandòu l'invîo de 'na nêuva poula segretta pe l'accesso a {{SITENAME}} ($4).\nA poula segretta temporannia pe l'utente \"$2\" a l'è stæta impostâ a \"$3\".\nSe l'è questo che ti voeivi, intra òua e cangia subbito a poula segretta. A poula segretta temporannia a descazziâ doppo {{PLURAL:$5|un giorno|$5 giorni}}.\n\nSe no t'ê stæto ti a fâ 'sta recesta, oppûre se ti t'ê aregordòu da teu poula segretta e no ti veu ciu cangiâla , ti peu ignorâ sto messaggio e andâ avanti deuviando a vegia poula segretta.",
        "noemail": "No gh'è nisciûn indirisso e-mail registròu pe l'ûtente \"$1\".",
        "noemailcreate": "Ti devi dâ un addresso e-mail vallido.",
-       "passwordsent": "Ûnn-a nêuva paròlla d'ordine a l'è stæta inviâa a l'indirisso e-mail registròu pe l'ûtente \"$1\".\nPe piaxei, fa 'n accesso appenn-a ti a ghe reçeivi.",
-       "blocked-mailpassword": "O teu addresso IP o l'è bloccòu, e pe sta raxon non se peu usâ a funsion de recuppero da pòula segretta, pe prevegnî di abuxi.",
+       "passwordsent": "Ûnn-a nêuva paròlla d'ordine a l'è stæta inviâ a l'indirisso e-mail registròu pe l'ûtente \"$1\".\nPe piaxei, fa 'n accesso appenn-a ti a riçeivi.",
+       "blocked-mailpassword": "O teu addresso IP o l'è bloccòu a-e modiffiche, pe prevegnî di abuxi non se peu doeuviâ a fonçion de recuppero da pòula segretta da queseto addresso IP.",
        "eauthentsent": "Un messaggio e-mail de conferma o l'è stæto inviòu a l'addresso indicòu.\nPe abilitâ l'invîo de messaggi e-mail pe quest'utensa, se deve seguî e instrussioin indicæ, pe confermâ che ti t'ê o legittimo propietâio de l'utensa.",
        "throttled-mailpassword": "Un'e-mail de reimpostassione da poula segretta a l'è zà stæta inviâ da meno de {{PLURAL:$1|1 oa|$1 oe}}.\nPe prevegnî di abuxi, a fonsion de reimpostassion da poula segretta a peu vese deuviâ solo che 'na votta ogni {{PLURAL:$1|oa|$1 oe}}.",
        "mailerror": "Errô inte l'invio do messaggio: $1",
        "createacct-another-realname-tip": "O nomme veo o l'è opçionâ.\nSe ti çerni de inseilo, o saiâ deuviòu pe attribuî a l'aotô a paternitæ di contengnui inviæ.",
        "pt-login": "Intra",
        "pt-login-button": "Intra",
+       "pt-login-continue-button": "Continoa l'accesso",
        "pt-createaccount": "Registrite",
        "pt-userlogout": "Sciorti",
        "php-mail-error-unknown": "Errô sconosciuo intaa funçion PHP mail()",
        "newpassword": "Neuva poula segretta",
        "retypenew": "Ripette a nêuva paròlla d'ordine:",
        "resetpass_submit": "Çerni a poula segretta e intra",
-       "changepassword-success": "O cangio de password o l'é anæto ben!",
+       "changepassword-success": "A to password a l'è stæta cangiâ!",
        "changepassword-throttled": "T'hæ çercòu de intrâ troppe votte tutt'assemme.\nPe piaxei aspeta $1 primma de provâ torna.",
+       "botpasswords": "Password bot",
+       "botpasswords-summary": "<em>Password bot</em> o consente l'accesso a un'utença tramite API sença doeuviâ e credençiæ d'accesso prinçipæ de l'utença. I driti utente disponibili quande s'è effettuou l'accesso co-ina password bot poeuan ese limitæ.\n\nSe no ti conosci o motivo pe-o quæ ti porriesci voeilo fâ, alloa foscia no ti doviesci fâlo. Nisciun doviæ mai domandâte de generâ un de questi e dapoeu dâlo a liatri.",
+       "botpasswords-disabled": "E password bot son disabilitæ.",
+       "botpasswords-no-central-id": "Pe doeuviâ una password bot, l'è necessaio accede a un'utença çentralizzâ.",
+       "botpasswords-existing": "Password bot in existença",
+       "botpasswords-createnew": "Crea una noeuva password bot",
+       "botpasswords-editexisting": "Modifica una password bot existente",
+       "botpasswords-label-appid": "Nomme bot:",
+       "botpasswords-label-create": "Crea",
+       "botpasswords-label-update": "Aggiorna",
+       "botpasswords-label-cancel": "Anulla",
+       "botpasswords-label-delete": "Scassa",
+       "botpasswords-label-resetpassword": "Reimposta a poula segretta",
+       "botpasswords-label-grants": "Assegnaçioin applicabile:",
+       "botpasswords-help-grants": "Ogni assegnaçion a dà accesso a-i driti utente elencæ che un'utença a g'ha zà. Amia a [[Special:ListGrants|tabella d'e assegnaçioin]] pe de ulteioî informaçioin.",
+       "botpasswords-label-restrictions": "Restriçioin d'utilizzo:",
+       "botpasswords-label-grants-column": "Assegnaçioin",
+       "botpasswords-bad-appid": "O nomme bot \"$1\" o no l'è vallido.",
+       "botpasswords-insert-failed": "Imposcibile azonze o nomme bot \"$1\". O l'è za stæto azonto?",
+       "botpasswords-update-failed": "Imposcibile aggiornâ o nomme bot \"$1\". O l'è stæto scassou?",
+       "botpasswords-created-title": "Password bot creâ",
+       "botpasswords-created-body": "A password pe-o bot de nomme \"$1\" de l'utente \"$2\" a l'è stæta creâ.",
+       "botpasswords-updated-title": "Password bot aggiornâ",
+       "botpasswords-updated-body": "A password pe-o bot de nomme \"$1\" de l'utente \"$2\" a l'è stæta aggiornâ.",
+       "botpasswords-deleted-title": "Password bot scassâ",
+       "botpasswords-deleted-body": "A password pe-o bot de nomme \"$1\" de l'utente \"$2\" a l'è stæta scassâ.",
+       "botpasswords-newpassword": "A noeuva password pe accede con <strong>$1</strong> a l'è <strong>$2</strong>. <em>Marchitelo pe rifeimento futuo.</em>",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider o no l'è disponibbile.",
+       "botpasswords-restriction-failed": "E restriçioin de password bot impediscian questo accesso.",
+       "botpasswords-invalid-name": "O nomme utente indicou o no conten o separatô pe-o password bot (\"$1\").",
+       "botpasswords-not-exist": "L'utente \"$1\" o no dispon-e de 'na password bot ciamâ \"$2\".",
        "resetpass_forbidden": "No l'é poscìbile cangiâ e paròlle segrétte",
+       "resetpass_forbidden-reason": "No l'é poscìbile cangiâ e paole segrette: $1",
        "resetpass-no-info": "Pe anâ direttamente a sta paggina, primma ti g'hæ da intrâ .",
        "resetpass-submit-loggedin": "Cangia a password",
        "resetpass-submit-cancel": "Anulla",
        "passwordreset-email": "Addresso e-mail:",
        "passwordreset-emailtitle": "Dettaggi account sciu {{SITENAME}}",
        "passwordreset-emailtext-ip": "Quarcun (probabilmente ti, con adresso IP $1) o l'ha domandòu l'invio de 'na neuva poula segretta per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associòu|I utenti associæ}} a sto addresso e-mail son:\n\n$2\n\n{{PLURAL:$3|Questa poula segretta temporannia a descazziâ|Queste poule segrette temporannie descazzian}} doppo {{PLURAL:$5|un giorno|$5 giorni}}.\nTi doviesci accede e çerne una neuva poula segretta oua. \n\nSe no t'ê stæto ti a fâ a domanda, ò se ti t'hæ aregordòu a poula segretta originale e no ti veu ciù cangiâla, ti peu ignorâ sto messaggio e continuâ a deuviâ a teu vegia poula segretta.",
+       "passwordreset-emailtext-user": "L'utente $1 de {{SITENAME}} o l'ha domandou l'inandio de 'na noeuva password pe l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associou|I utenti associæ}} a questo indriçço email son:\n\n$2\n\n{{PLURAL:$3|Questa password temporannia a descazziâ|Queste password temporannie descazian}} doppo {{PLURAL:$5|un giorno|$5 giorni}}.\nTi doviesci accede e çerne una noeuva password aoa. \n\nSe no t'ê stæto ti a fâ a recesta, o se ti t'ê aregordou a password originâ e no ti voeu ciu cangiala, ti poeu ignorâ sto messaggio e continoâ a doeuviâ a to vegia password.",
        "passwordreset-emailelement": "Nomme utente: \n$1\n\nPoula segretta temporannia: \n$2",
-       "passwordreset-emailsentemail": "Se questo o l'è un addresso de posta elettronnica registròu pe-a teu utensa, alloa saiâ inviâ un'e-mail pe reimpostâ a poula segretta.",
+       "passwordreset-emailsentemail": "Se questo addresso de posta elettronnica o l'è associou a-a teu utença, alloa saiâ inviou un'e-mail pe rempostâ a poula segretta.",
+       "passwordreset-emailsentusername": "Se gh'è un adreçço de posta elettronica associou con questo nomme utente, alloa saiâ inviou una email pe rempostâ a password.",
        "passwordreset-emailsent-capture": "L'è stæto inviòu un'e-mail de reimpostaçion da poula segretta, o contegnuo o l'è riportòu chì appreuvo.",
        "passwordreset-emailerror-capture": "L'è stæto generòu un'e-mail de reimpostaçion da poula segretta, riportà chì appreuvo. L'invio {{GENDER:$2|a l'utente}} o no l'è ariêscîo: $1",
+       "passwordreset-emailsent-capture2": "L'email de rempostaçion da password {{PLURAL:$1|a l'è stæta inviâ|son stæte inviæ}}. {{PLURAL:$1|O nomme|L'elenco di nommi}} utente e password o l'è mostrou chì de sotta.",
+       "passwordreset-emailerror-capture2": "Invio de email {{GENDER:$2|a l'utente}} non ariescio: $1. {{PLURAL:$3|O nomme|L'elenco di nommi}} utente e password o l'è mostrou chì de sotta.",
+       "passwordreset-nocaller": "Un chi ciamma ti g'hæ da dâlo",
+       "passwordreset-nosuchcaller": "O ciamante o no l'existe: $1",
+       "passwordreset-ignored": "A reimpostaçion da password a no l'è stæta gestia. Foscia n'è stæto configuou nisciun provider ?",
+       "passwordreset-invalideamil": "Addresso e-mail non vallido",
+       "passwordreset-nodata": "No è stæto fornio ni un nomme utente ni un adreçço de posta elettronica",
        "changeemail": "Cangia o elimmina l'adresso e-mail",
        "changeemail-header": "Completa sto formulaio pe cangiâ o to adresso e-mail. Se ti veu rimeuve l'associaçion de quasesegge addresso e-mail da-a teu utensa, lascia io neuvo addresso e-mail veuo quande ti invii o formulaio.",
        "changeemail-passwordrequired": "Saiâ necessaio insei a poula segretta pe confermâ a modiffica.",
        "minoredit": "Cangiamento minô (m)",
        "watchthis": "Metti sotta oservaçion",
        "savearticle": "Sarva a pàgina",
+       "savechanges": "Sarva e modiffiche",
+       "publishpage": "Pubbrica a paggina",
+       "publishchanges": "Pubbrica e modiffiche",
        "preview": "Anteprìmma",
        "showpreview": "Veddi l'anteprimma",
        "showdiff": "Veddi i cangiamenti",
        "blockedtext": "''''O to nomme utente ò adresso IP o l'è stæto bloccòu.'''\n\nO blòcco o l'è stæto fæto da $1. A raxon dæta a l'è ''$2''.\n\n* Iniçio do blocco: $8\n* Fin do blocco: $6\n* Utente blocou: $7\n\nL'è poscibbile contattâ $1 o un âtro [[{{MediaWiki:Grouppage-sysop}}|amministratô]] pe discûtte inscio blòcco.\nNo ti poeu doeuviâ o comando \"Manda un'e-mail a st'ûtente\" se no ti g'hæ 'n adresso e-mail registròu inte to [[Special:Preferences|preferençe]] e se no t'ê stæto bloccòu ascì.\nO to adresso IP o l'è $3, e o to blòcco ID o l'è #$5.\nPe piaxei, pe domandâ informaçioin, speçifficali tutti doî.",
        "autoblockedtext": "O teu addresso IP o l'è stæto bloccòu outomaticamente perché o l'ea za usòu da 'n âtro utente, bloccòu da $1.\nA raxon dæta a l'è stæta:\n\n:''$2''\n\n* Prinsippio do blòcco: $8\n* Fin do blòcco: $6\n\nTi peu contattâ $1 ò un âtro\n[[{{MediaWiki:Grouppage-sysop}}|amministratô]] pe discutte o blòcco.\n\nDanni a mente a che no ti pêu ûsâ o comando \"manda 'na e-mail a sto utente\" se non ti g'hæ 'n addresso de posta elettronega registròu in te têu [[Special:Preferences|preferense]] e se ti no t'ê stæto bloccòu ascì.\n\nO to adresso IP o l'è $3, e o to blòcco ID o l'è #$5. Pe piaxei, pe domandâ informaçioin, speçifficali tutti doî.",
        "blockednoreason": "nisciun-a motivaçion dæta",
-       "whitelistedittext": "Pe cangia sta pagina devvi $1.",
+       "whitelistedittext": "Pe modificâ e paggine l'è necessaio $1.",
        "confirmedittext": "Pe ese abilitæ a-a modiffica de paggine bezeugna confermâ o proppio addresso e-mail. Pe impostâ e confermâ l'adresso servîse de [[Special:Preferences|preferençe]].",
        "nosuchsectiontitle": "Imposcibbile trovâ a seçion",
        "nosuchsectiontext": "T'hæ çercòu de modificâ una seçion inexistente.\nA porriæ ese stæta mesciâ ò eliminâ mentre ti t'amiavi a paggina.",
        "loginreqtitle": "Besêugna registrâse primma de modificâ 'sta paggina.",
-       "loginreqlink": "intra",
+       "loginreqlink": "intrâ",
        "loginreqpagetext": "Pe amiâ di atre paggine gh'è da $1",
        "accmailtitle": "Pòula segretta spedïa",
        "accmailtext": "Una poula segretta generâ abrettio pe [[User talk:$1|$1]] a l'è stæta mandâ a $2.\n\nSta poula segretta a peu ese cangiâ inta paggina pe ''[[Special:ChangePassword|cangiâ a poula segretta]]'' subbito doppo l'accesso.",
        "newarticle": "(Nêuvo)",
        "newarticletext": "Sto colegaménto o corisponde a 'na pàgina ch'a no l'existe ancon.\n\nSe se vêu creâ a pàgina òua, se pêu comensâ a scrive into spàçio chì sotta.\n(amia e [$1 paggine d'agiûtto] pe ciû informaçioìn).\n\nSe t'ê intròu chì pe sballio,  sciacca '''Inderê''' into navegatô.",
-       "anontalkpagetext": "----\n''Sta chì a l'è a paggina de discuscion de un utente anonnimo, ch'o no l'ha ancon creou un'utensa o comunque o no a doeuvia oua. Pe identificâlo l'è quindi necessaio doeuviâ o nummero do so adresso IP. I adresci IP poeuan però ese condivixi da ciù utenti. Se t'ê un utente anonimo e ti ritegni che i commenti inte sta pagina no se riferiscian a ti, [[Special:CreateAccount|crea una noeuva utensa]] o donque [[Special:UserLogin|intra con quella che ti g'hæ za]] pe evitâ de chì avanti de ese confuzo con di atri utenti anonnimi .''",
-       "noarticletext": "Po-u momento a pagina çercâ a l'è vêua. L'è poscibbile [[Special:Search/{{PAGENAME}}|çercâ 'sto tittolo]] inte âtre pagine do scîto opû [{{fullurl:{{FULLPAGENAME}}|action=edit}} cangiâ a pagina òua].",
+       "anontalkpagetext": "----\n<em>Sta chì a l'è a paggina de discuscion de un utente anonnimo, ch'o no l'ha ancon creou un'utensa o comunque o no a doeuvia oua.</em> Pe identificâlo l'è quindi necessaio doeuviâ o nummero do so adresso IP. I adresci IP poeuan però ese condivixi da ciù utenti. Se t'ê un utente anonnimo e ti ritegni che i commenti inte sta pagina no se riferiscian a ti, [[Special:CreateAccount|crea una noeuva utensa]] o donque [[Special:UserLogin|intra con quella che ti g'hæ za]] pe evitâ de chì avanti de ese confuzo con di atri utenti anonnimi .",
+       "noarticletext": "Po-u momento a pagina çercâ a l'è vêua. Ti poeu [[Special:Search/{{PAGENAME}}|çercâ sto tittolo]] inti atre pagine do scito, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} çercâ inti registri correlæ] oppû [{{fullurl:{{FULLPAGENAME}}|action=edit}} creâ questa pagina]</span>.",
        "noarticletext-nopermission": "Òua a pàgina çercâ a l'è vêua. L'è poscìbile [[Special:Search/{{PAGENAME}}|çercâ sto tìtolo]] inte di âtre pàgine do scîto o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} çercâ inti registri corelæ]</span>, ma no ti gh'hæ i outorizzaçioin pe creâ sta paggina.",
        "missing-revision": "La verscion #$1 da paggina \"{{FULLPAGENAME}}\" a no l'esiste.\n\nQuesto succede solitamente se inta stoia ti sciacchi un vegio ingancio a una paggina scassâ.\n\nI dettaggi peuan ese attrovæ into [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scançellaçioin].",
        "userpage-userdoesnotexist": "L'utensa \"$1\" a no corisponde a un utente registròu.\nTi veu davei creâ o modificâ sta paggina?",
        "userpage-userdoesnotexist-view": "L'utensa \"$1\" a no l'è registrâ.",
        "blocked-notice-logextract": "St'utente o l'è attualmente bloccòu.\nL'urtimo elemento into registro di blocchi o l'è riportòu chì appreuvo pe informassion:",
-       "clearyourcache": "<strong>Notta:</strong> doppo avei sarvou, poriæ ese necessaio nettezâ a cache do proppio navegatô pe vedde i cangiamenti. \n*<strong>Firefox / Safari:</strong> tegnî sciacou o tasto de maiuscole <em>Shift</em> e cliccâ <em>Riecarrega</em>, oppû premme <em>Ctrl-F5</em> ò <em>Ctrl-R</em> (<em>⌘-R</em> insce Mac)\n*<strong>Google Chrome:</strong> premme <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> insce un Mac)\n*<strong>Internet Explorer:</strong> tegnî sciacou o tasto <em>Ctrl</em> e cliccâ <em>Aggiorna</em>, oppû premme <em>Ctrl-F5</em>\n*<strong>Opera:</strong> svuâ completamente a cache da-o menu <em>Strumenti → Preferençe</em>",
+       "clearyourcache": "<strong>Notta:</strong> doppo avei salrvou, poriæ ese necessaio netezâ a cache do proppio browser pe vedde i cangiamenti. \n*<strong>Firefox / Safari:</strong> tegni sciacou o tasto de maiuscole <em>Shift</em> e clicca <em>Recarega</em>, oppû sciacca <em>Ctrl-F5</em> ò <em>Ctrl-R</em> (<em>⌘-R</em> su Mac)\n*<strong>Google Chrome:</strong> sciacca <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> insce un Mac)\n*<strong>Internet Explorer:</strong> tegni sciacou o tasto <em>Ctrl</em> e clicca <em>Aggiorna</em>, oppû sciacca <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Vanni into <em>Menu → Impostaçioin</em> (<em>Opera → Preferençe</em> insce 'n Mac) e dapoeu inte <em>Privacy & segueçça → Nettezza dæti do browser → Inmaggine e file inta cache</em>.",
        "usercssyoucanpreview": "'''Suggerimento:''' adeuvia o pomello 'Amia l'anteprimma' per provâ o to neuvo CSS primma de sarvâlo.",
        "userjsyoucanpreview": "'''Suggerimento:''' adeuvia o pomello 'Amia l'anteprimma' per provâ o to neuvo JavaScript primma de sarvâlo.",
        "usercsspreview": "'''Questa a l'è solo un'anteprimma do proppio CSS personâ. E modiffiche no son ancon stæte sarvæ!'''",
        "previewnote": "'''Questa chì a l'è solo 'n'anteprimma; i cangiamenti no son ancon stæti sarvæ!'''",
        "continue-editing": "Vanni a l'area de modiffica",
        "previewconflict": "L'anteprimma a mostra o scrito presente inta casella de modiffica de d'ato coscì comme o l'apaiâ se ti çerni de sarvalo òua.",
-       "session_fail_preview": "'''N'emmo posciuo elaborâ a modiffica a caosa da pèrdia di dæti relativi a-a sescion.'''\nRitenta.\nSe-o problema o persciste, preuva a [[Special:UserLogout|sciortî]] e a intrâ torna.'''",
+       "session_fail_preview": "Spiaxenti. No è stæto poscibile elaboâ a modifica perché son andæti persci i dæti relativi a-a sescion.\n\nFoscia t'ê stæto disconnesso. <strong>Verifica d'ese ancon collegou e riproeuva</strong>.\nSe o problema o persciste, ti poeu provâ a [[Special:UserLogout|scollegate]] e effettuâ un nuoeuvo accesso, controllando che o to browser o l'açette i cookie da questo scito.",
+       "session_fail_preview_html": "Spiaxenti. No è stæto poscibbile elaboâ a modifica perché son anæti persci i dæti relativi a-a sescion.\n\n<em>Scicomme {{SITENAME}} o g'ha de l'HTML sgroeuzzo attivou e gh'è stæto una perdia di dæti da sescion, l'anteprimma a l'è ascosa comme precaoçion contra i attacchi JavaScript.</em>\n\n<strong>Se se tratta de un normale tentativo d'anteprimma, riproeuva.</strong> \nSe o problema o persciste, ti poeu provâ a [[Special:UserLogout|scollegati]] e effettuâ un noeuvo accesso, controllando che o to browser o l'açette i cookie da questo scito.",
+       "token_suffix_mismatch": "'''A modiffica a no l'è stæta sarvâ perché o to client o l'ha mostrou de gestî in moddo errou i carattei de puntezatua into token associou a-a mæxima. Pe evitâ una poscibile corruçion do testo da pagina, l'è stæto refuou l'intrega modiffica. Questa scituaçion a poeu veificase, de votte, quande s'adoeuvia di serviççi de proxy anonnimi via web che presentan di bug.'''",
        "edit_form_incomplete": "'''De parte do formulaio de modiffica n'han razonto o server; controlla che e modiffiche seggian intatte e ripreuva.'''",
        "editing": "Modiffica de $1",
        "creating": "T'ê apreuvo a creâ $1",
        "editingold": "<strong>Attençion: t'ê apreuvo a modificâ una verscion non aggiornâ da paggina.</strong>\nSarvandola coscì, tutti i cangi fæti doppo sta verscion saian sorvescriti.",
        "yourdiff": "Differense",
        "copyrightwarning": "Nota: Tùtte e contribuçioìn a {{SITENAME}} van conscideræ comme rilasciæ drento a-i termini da licensa d'ûso $2 (veddi $1 pe savéine de ciù).\nSe no ti veu che i testi teu pêuan esse modificæ da quarchedùn sensa limitaçioìn, no mandâli a {{SITENAME}}.<br />\nInviando o testo ti diciâri, sott'a teu responsabilitæ, ch'o l'é stæto scrîto da ti personalmente oppure ch'o l'é stæto piggiòu da 'na fonte de pùbrico domìnio òu anàlogamente lìbea.<br />\n'''NO INVI MATERIÂLE COVERTO DA DRÎTI D'AUTÔ SENSA OUTORIZAÇION!'''",
+       "copyrightwarning2": "Pe piaxei tegni presente che tutti i contributi a {{SITENAME}} poeuan ese modificæ, alteræ ò scassæ da di atri contributoî.\nSe no ti voeu che se faççe ravaxo di to testi, alloa no stali manco a mette.<br />\nInviando o testo ti deciæi ascì, sotta a to responsabilitæ, ch'o l'è stæto scrito da ti personalmente oppù ch'o l'è stæto copiou da 'na fonte de pubbrico dominnio o scimilemente libera (vedi $1 pe dettaggi).\n'''No stanni a inviâ do mateiâ protetto da-o drito d'aotô sença aotorizzaçion!'''",
        "editpage-cannot-use-custom-model": "O modello do contegnuo de sta paggina o no peu ese modificòu.",
        "longpageerror": "'''Errô: o scrito inviou o l'è longo {{PLURAL:$1|1|$1}} kilobyte, ciu che-o mascimo consentio de ({{PLURAL:$2|1|$2}} kilobyte).'''\nNo se peu sarvâ.",
+       "readonlywarning": "<strong>Attençion</strong>: o database o l'è bloccou pe manutençion, no l'è momentaniamente poscibile sarvâ e modifiche effettuæ.\nPe no perdile, coppile in te'n file de testo e sarvilo in atteisa do sbrocco do database.\n\nL'amministratô de scistema ch'o l'ha misso l'abrocco o l'ha fornio questa spiegaçion: $1.",
        "protectedpagewarning": "'''Attençion: questa paggina a l'è stæta bloccâ de moddo che solo i utenti co-i privileggi d'amministratô possan modificala.'''\nL'urtimo elemento do registro o l'è riportou chì appreuvo pe referença:",
        "semiprotectedpagewarning": "'''Notta:''' Questa paggina a l'è stæta bloccä de moddo che solo i utenti registræ possan modificâla.\nL'urtimo elemento do registro o l'è riportou chì appreuvo pe referensa:",
        "cascadeprotectedwarning": "'''Attençion:''' Questa paggina a l'è stæta bloccâ de moddo che solo i utenti co-i privileggi d'amministratô possan modificala da-o momento ch'a l'é inclusa seleçionando a proteçion \"ricorsciva\" {{PLURAL:$1|inta paggina|inte paggine}}:",
        "permissionserrors": "No ti g'hæ o permisso",
        "permissionserrorstext": "No ti g'hæ i permissi pe fâlo, pe  {{PLURAL:$1|questa raxon|queste raxoin}}:",
        "permissionserrorstext-withaction": "No ti g'hæ i permìssi pe $2 pe {{PLURAL:$1|sta raxon|ste raxoìn}}:",
-       "contentmodelediterror": "No ti peu modificâ sta verscion da-o momento che o so modello de contegnuo o l'è <code>$1</code>, mentre o corrente modello de contegnuo da paggina o l'è <code>$2</code>.",
+       "contentmodelediterror": "No ti peu modificâ sta verscion da-o momento che o so modello de contegnuo o l'è <code>$1</code>, ch'o diffeisce da-o corrente modello de contegnuo da paggina <code>$2</code>.",
        "recreate-moveddeleted-warn": "Atençión: ti stæ pe ricreâ 'na pàgina zà scancelâ into passòu.'''\n\nConsciddera se l'è o caxo de continoâ  a cangiâ 'sta pàgina.\nPe comoditæ e cancellaçioìn e i stramui son pubricæ chì sotta:",
        "moveddeleted-notice": "Sta pàgina a l'é stæta scancelâ.\nA lista de scancelaçioìn e di stramui son riportæ chi de sotta pe informaçión.",
        "moveddeleted-notice-recent": "Spiaxenti, sta paggina a l'è stæta scassâ reçentemente (inte urtime 24 oe).\n\nE açioin de cançellaçion e spostamento pe questa paggina son disponibile chì appreuvo pe referença.",
        "content-model-javascript": "JavaScript",
        "content-json-empty-object": "Ogetto veuo",
        "content-json-empty-array": "Array veuo",
+       "deprecated-self-close-category": "Paggine ch'adoeuvian di tag HTML aoto-ciosi non vallidi",
+       "deprecated-self-close-category-desc": "A pagina a conten di tag HTML aoto-ciosi non vallidi, comme <code>&lt;b/></code> o <code>&lt;span/></code>. O comportamento de questi fito o cangiâ pe ese coerente co-e specifiche HTML5, pe questo o so utilizzo into wikitesto o l'è deprecou.",
        "duplicate-args-warning": "<strong>Avvertensa:</strong> [[:$1]] o ciamma [[:$2]] con ciù de un valô pe-o parammetro \"$3\".  Solo l'urtimo valô fornio o saiâ deuviou.",
        "duplicate-args-category": "Paggine che ciamman i template deuviando di parammetri duplicæ",
        "duplicate-args-category-desc": "A paggina a conten de ciamæ a di template ch'adeuvian di argomenti duplicæ, comme presempio <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ò <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
-       "expensive-parserfunction-warning": "'''Attençion:''' Questa paggina a conten troppe ciamæ a-e fonçioin de parser .\n\nA doviæ aveighene meno de $2, a-o momento ghe n'è $1.",
+       "expensive-parserfunction-warning": "'''Attençion:''' Questa paggina a conten troppe ciamæ a-e fonçioin de parser .\n\nA doviæ aveighene meno de $2, a-o momento ghe {{PLURAL:$1|n'è $1}}.",
        "expensive-parserfunction-category": "Paggine con troppe ciamæ a-e fonçioin de parser .",
        "post-expand-template-inclusion-warning": "'''Atento:''' a dimensción di template che t'æ misso a l'é tròppo grande.\nQuarchedun di teu template o no saiâ incluzo.",
        "post-expand-template-inclusion-category": "Pàgine con di template che gh'àn a dimensción ciù âta do limite mascimo",
        "rev-deleted-no-diff": "No ti peu amiâ sto diff percose un-a de verscioin a l'è stæta '''scassâ'''.\nConsurta a [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} lista de cançellaçioin] pe-i dettaggi.",
        "rev-suppressed-no-diff": "No ti peu fâ sto confronto tra verscioin perché un-a a l'è stæta '''scassâ'''.",
        "rev-deleted-unhide-diff": "Un-a de verscioin de sto confronto a l'è stæta '''scassâ'''.\nConsurta a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} lista de cançellaçioin] pe-i dettaggi.\nTi ti peu ancon [$1 fâ sto confronto] se necessaio.",
+       "rev-suppressed-unhide-diff": "Un-a de verscioin de sto confronto a l'è stæta '''sopressa'''.\nConsurta a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} lista de cançellaçioin] pe-i dettaggi.\nTi peu ancon [$1 fâ sto confronto] se necessaio.",
+       "rev-deleted-diff-view": "Un-a de verscioin de sto confronto a l'è stæta '''scassâ'''.\nTi ti peu amiala; consurta o [{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} recistro de rimoçioin] pe-i dettaggi.",
+       "rev-suppressed-diff-view": "Un-a de verscioin de sto confronto a l'è stæta '''sopressa'''.\nTi ti peu amiâla; consurta o [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de soprescioin] pe-i dettaggi.",
        "rev-delundel": "fanni védde/ascondi",
        "rev-showdeleted": "mostra",
        "revisiondelete": "Scassa ò ripristina verscioin",
        "revdelete-nooldid-title": "Verscion non specificâ",
+       "revdelete-nooldid-text": "No t'hæ speçificou nisciun-a revixon in sciâ quæ eseguî questa fonçion, oppû a revixon speçificâ a no l'existe, ò che donque t'ê aproeuvo a çercâ d'asconde a revixon attuale.",
        "revdelete-no-file": "O file specificou o no l'existe.",
        "revdelete-show-file-confirm": "T'ê seguo de voei amiâ a verscion scassâ do file \"<nowiki>$1</nowiki>\" do $2 a $3?",
        "revdelete-show-file-submit": "Sci",
        "revdelete-selected-text": "{{PLURAL:$1|Verscion seleçionâ|Verscioin seleçionæ}} de [[:$2]]:",
-       "revdelete-selected-file": "{{PLURAL:$1|Verscion seleçionata|Verscioin seleçionæ}} do file [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Verscion seleçionâ|Verscioin seleçionæ}} do file [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Evento do registro seleçionou|Eventi do registro seleçionou}}:",
+       "revdelete-text-text": "E verscioin scassæ apparian ancon inta cronologia da pagina, ma parte do so contegnuo o saiâ inaccescibile a-o pubbrico.",
+       "revdelete-text-file": "E verscioin di file scassæ apparian ancon inta cronologia do file, ma parte do so contegnuo a saiâ inaccescibile a-o pubbrico.",
+       "logdelete-text": "I eventi scassæ apparian ancon inti registri, ma 'na parte do so contegnuo a saiâ inaccescibile a-o pubbrico.",
+       "revdelete-text-others": "Di atri amministratoî saian ancon in grou de accede a-i contegnui ascoxi e porian ripristinali, se no l'è stæto impostou de restriçioin azontive.",
+       "revdelete-confirm": "Pe piaxei conferma che questo l'è quante t'intendi fâ, che t'accapisci e conseguençe, e che ti o fæ into rispetto de [[{{MediaWiki:Policy-url}}|linnie guidda]].",
+       "revdelete-suppress-text": "A rimoçion a saiæ da doeuviâ '''solo''' che inti seguenti caxi:\n* informaçioin potençialmente diffamatoie\n* dæti personæ inoportun\n*: ''indiriççi, nummeri de teleffono, coddiçi fiscali, ecc.''",
        "revdelete-legend": "Imposta e limitaçioin de vixibilitæ:",
        "revdelete-hide-text": "Testo da verscion",
        "revdelete-hide-image": "Ascondi i contegnui do file",
        "revdelete-unsuppress": "Elimmina e limitaçioin in scê verscioin ripristinæ",
        "revdelete-log": "Raxon:",
        "revdelete-submit": "Applica {{PLURAL:$1|a-a verscion seleçionâ|a-e verscioin seleçionæ}}",
-       "revdelete-success": "'''Vixibilitæ da verscion agiornâ con successo.'''",
+       "revdelete-success": "'''Vixibilitæ da verscion agiornâ.'''",
        "revdelete-failure": "'''A vixibilitæ da verscion a no peu ese agiornâ:'''\n$1",
-       "logdelete-success": "'''Registro de vixibilitæ impostou con successo.'''",
+       "logdelete-success": "'''Registro de vixibilitæ impostou.'''",
        "logdelete-failure": "No s'è posciuo impostâ o registro de vixibilitæ: $1",
        "revdel-restore": "càngia a vixibilitæ",
        "pagehist": "Stoia da paggina",
        "revdelete-modify-no-access": "Imposcibbile modificâ l'ogetto con dæta $1 $2 in quanto o l'è stæto identificou comme \"riservou\" e no se dispon-e do relativo accesso.",
        "revdelete-modify-missing": "Imposcibbile modificâ l'ogetto con ID $1: into database o no gh'è!",
        "revdelete-no-change": "'''Attençion:''' l'ogetto con dæta $1 $2 o l'aveiva zà e impostaçioin de vixibilitæ domandæ.",
+       "revdelete-concurrent-change": "Imposcibile modificâ l'ogetto con dæta $1, $2: pâ che o so stato o segge stæto modificou da un atro utente dementre che ti ti çercavi de modificalo.",
+       "revdelete-only-restricted": "Errô inte l'asconde l'ogetto datou $1, $2: no ti poeu asconde i ogetti a-i amministratoî sença seleçionâ un-a di atre opçioin de vixibilitæ.",
        "revdelete-reason-dropdown": "* Raxoin ciù comun-e pe-o scassamento\n** Violaçion do drito d'outô\n** Commenti ò informaçioin personæ inappropiæ\n** Nomme utente inappropiou\n** Informaçion potençialmente diffamatoia",
        "revdelete-otherreason": "Un atro motivo:",
        "revdelete-reasonotherlist": "Un'atra raxon",
        "revdelete-edit-reasonlist": "Modiffica e raxoin do scassamento",
        "revdelete-offender": "Aotô da verscion:",
        "suppressionlog": "Registro de sopprescioin",
+       "suppressionlogtext": "De sotta gh'è 'na lista de scassatue e di brocchi con do contegnuo ascoso a-i amministratoî.\nAmia a [[Special:BlockList|lista di blocchi]] pe l'elenco di bandi e di blocchi attivi a-o momento.",
        "mergehistory": "Union de stoie da paggina",
+       "mergehistory-header": "Questa pagina a consente de unî e verscioin d'a cronologia de 'na pagina sorgente a 'na pagina ciù reçente.\nAsseguite che sto cangio o mantegne a continuitæ storica da pagina.",
        "mergehistory-box": "Unisci a stoia de doe paggine:",
        "mergehistory-from": "Paggina d'origgine:",
        "mergehistory-into": "Paggina de destinaçion:",
        "mergehistory-empty": "Nisciun-a verscion da unî.",
        "mergehistory-done": "{{PLURAL:$3|Una verscion de $1 a l'è stæta unia|$3 vercsioin de $1 son stæte unie}} a-a stoia de [[:$2]].",
        "mergehistory-fail": "Imposcibbile unî e stoie. Verificâ a paggina e i parammetri temporali.",
+       "mergehistory-fail-bad-timestamp": "O timestamp o no l'è vallido.",
+       "mergehistory-fail-invalid-source": "A pagina sorgente a no l'è vallida.",
+       "mergehistory-fail-invalid-dest": "A pagina de destinaçion a no l'è vallida.",
+       "mergehistory-fail-no-change": "L'union de cronologie a no l'ha unio arcun-a verscion. Ricontrolla e pagine e i parametri temporali.",
+       "mergehistory-fail-permission": "Aotorizzaçioin insuffixente pe unî e cronologie.",
+       "mergehistory-fail-self-merge": "A paggina d'origgine e quella de destinaçion son a mæxima",
+       "mergehistory-fail-timestamps-overlap": "E verscioin d'origine se sorvepon-an ò vegnan doppo e verscioin de destinaçion.",
        "mergehistory-fail-toobig": "Imposcibbile eseguî l'union da stoia essendoghe ciu che o limmite de $1 {{PLURAL:$1|verscion|verscioin}} da mesciâ.",
        "mergehistory-no-source": "A paggina d'origgine $1 a no l'existe.",
        "mergehistory-no-destination": "A paggina de destinaçion $1 a no l'existe.",
        "diff-multi-sameuser": "({{PLURAL:$1|Una verscion intermedia|$1 De verscioin intermedie}} de 'n mæximo utente {{PLURAL:$1|a no l'è mostrâ|no son mostræ}})",
        "diff-multi-otherusers": "({{PLURAL:$1|Una verscion intermedia|$1 De verscioin intermedie}} de {{PLURAL:$2|'n atro utente|$2 utenti}} {{PLURAL:$1|a no l'è mostrâ|no son mostræ}})",
        "diff-multi-manyusers": "({{PLURAL:$1|Una verscion intermedia|$1 verscioin intermedie}} de ciu che $2 {{PLURAL:$2|utente|utenti}} non {{PLURAL:$1|mostrâ|mostræ}})",
-       "searchresults": "Resultati da reçerca",
-       "searchresults-title": "Rezoltati da riçerca de \"$1\"",
+       "difference-missing-revision": "{{PLURAL:$2|Una verscion|$2 verscioin}} de questa differença ($1) {{PLURAL:$2|a no l'è stæta atrovâ|no son stæte atrovæ}}.\n\nQuesto succede a l'uso se inta stoia ti sciacchi un vegio ingancio a una paggina scassâ.\n\nI dettaggi ti-i peu attrovâ into [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scançellaçioin].",
+       "searchresults": "Risultæ da riçerca",
+       "searchresults-title": "Risultæ da riçerca de \"$1\"",
        "titlematches": "Corispondençe into tittolo de paggine",
        "textmatches": "Corispondençe into scrito de paggine",
        "notextmatches": "Nisciun-a corispondença into scrito de paggine",
        "prev-page": "paggina precedente",
        "next-page": "paggina succesciva",
        "prevn-title": "{{PLURAL:$1|rezoltato precedénte|rezoltati precedénti}}",
-       "nextn-title": "Pròscimo $1 {{PLURAL:$1|rezoltato|rezoltati}}",
+       "nextn-title": "{{PLURAL:$1|Risultou succescivo|$1 risultæ succescivi}}",
        "shown-title": "Fanni védde {{PLURAL:$1|in rizoltato|$1 rizoltati}} pe pàgina",
        "viewprevnext": "Veddi ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Inte questa wiki gh'è za 'na pàgina co-o nómme \"[[:$1]]\"'''",
        "searchmenu-new": "<strong>Crea a paggina \"[[:$1]]\" insce questo wiki!</strong> {{PLURAL:$2|0=|Amia ascì a paggina trovâ co-a teu riçerca|Amia ascì i risultæ da riçerca}}",
-       "searchprofile-articles": "Pàgina di contegnûi",
+       "searchprofile-articles": "Pàgina de contegnûi",
        "searchprofile-images": "Moltimedia",
        "searchprofile-everything": "Tùtto",
        "searchprofile-advanced": "Avansæ",
        "powersearch-togglenone": "Nisciun",
        "powersearch-remember": "Aregordite a seleçion pe-e proscime riçerche",
        "search-external": "Riçerca esterna",
-       "searchdisabled": "La riçerca de {{SITENAME}} a no l'è attiva. Into fra tempo ti peu çercâ in sce Google. \nNotta che i seu indexi di contegnui de {{SITENAME}} porrieivan no ese aggiornæ.)",
+       "searchdisabled": "A riçerca de {{SITENAME}} a no l'è attiva. Into fratempo ti peu çercâ in sce Google. \nNotta che i so indexi di contegnui de {{SITENAME}} porrieivan no ese aggiornæ.",
        "search-error": "S'è verificou 'n errô durante a riçerca: $1",
        "preferences": "Preferençe",
        "mypreferences": "Preferençe",
        "recentchangesdays-max": "Mascimo $1 {{PLURAL:$1|giorno|giorni}}",
        "recentchangescount": "Nummero de modiffiche da mostrâ pe difetto:",
        "prefs-help-recentchangescount": "Comprende i urtime modiffiche, paggine de stoie e registri.",
+       "prefs-help-watchlist-token2": "Questa a l'è a ciave segretta pe-o feed web di to oservæ.\nChiunque a conosce saiâ in graddo de leze i to oservæ, quindi no stanni a condividdila. [[Special:ResetTokens|Clicca chi se ti g'hæ de besoeugno de rempostâla]].",
        "savedprefs": "E teu preferençe son stæte sarvæ.",
        "savedrights": "I driti utente de {{GENDER:$1|$1}} son stæti sarvæ.",
        "timezonelegend": "Fuso oraio:",
        "timezoneregion-europe": "Euiropa",
        "timezoneregion-indian": "Oçeano Indian",
        "timezoneregion-pacific": "Oçeano Paxiffego",
-       "allowemail": "Permitti a posta elettronega da ätri utenti",
+       "allowemail": "Permetti a posta elettronega da di ätri utenti",
        "prefs-searchoptions": "Çerca",
        "prefs-namespaces": "Namespace:",
        "default": "Predefinïo",
        "prefs-custom-css": "CSS personalizzou",
        "prefs-custom-js": "JavaScript personalizzou",
        "prefs-common-css-js": "CSS/JavaScript condiviso pe tutte e pelle:",
+       "prefs-reset-intro": "L'è poscibile doeuviâ sta pagina pe rimpostâ e propie preferençe a quelle predefinie do scito.\nL'opiaçion a no poeu ese annullâ.",
        "prefs-emailconfirm-label": "Conferma de l'e-mail:",
        "youremail": "Indirìsso email:",
        "username": "{{GENDER:$1|Nomme utente}}:",
        "yourvariant": "Variante da lengoa do contegnuo:",
        "prefs-help-variant": "A variante o grafia co-a quæ ti prefeisci che e paggine do wiki seggian mostræ.",
        "yournick": "Nomiagio:",
+       "prefs-help-signature": "I commenti inte pagine de discuscion devan ese firmæ con \"<nowiki>~~~~</nowiki>\" ch'o saiâ convertio inta proppia firma seguia da-a dæta.",
        "badsig": "Errô in ta firma; controlla i comandi HTML.",
        "badsiglength": "A firma scelta a l'è troppo longa.\nA non deve passâ $1 {{PLURAL:$1|carattere|caratteri}}.",
+       "yourgender": "Comme rifeise a ti?",
+       "gender-unknown": "Into mençunâte, o software o l'adoeuviâ de paole de genere noeütro ogni votta che saiâ poscibile",
        "gender-male": "O l'è registrou insce {{SITENAME}}",
        "gender-female": "A l'è registrâ insce {{SITENAME}}",
        "prefs-help-gender": "L'impostassion de sta preferensa a l'è opsionâ.\nO software o deuvia sto valô pe addressâse a ti e mensunate a-i atri deuviando o gennere grammaticale apropiou.\nQuesta informassion a saiâ pubblica.",
        "userrights": "Manezzo di driti di utenti",
        "userrights-lookup-user": "Gestisci i gruppi di utenti",
        "userrights-user-editname": "Scrivi o teu nomme utente:",
-       "editusergroup": "Modiffica i gruppi di utenti",
+       "editusergroup": "Modiffica groppi {{GENDER:$1|utente}}",
        "editinguser": "Apreuvo a cangiâ i driti de l'{{GENDER:$1|utente}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Modiffica i gruppi di utenti",
-       "saveusergroups": "Sarva i gruppi di utenti",
+       "saveusergroups": "Sarva groppi {{GENDER:$1|utente}}",
        "userrights-groupsmember": "Membro de:",
        "userrights-groupsmember-auto": "Membro impliçito de:",
+       "userrights-groups-help": "L'è poscibile modificâ i groppi de st'utente:\n* Una casella marcâ voeu dî che l'utente o l'è inte quello groppo.\n* Una casella smarcâ voeu dî che l'utente o no l'è inte quello groppo.\n* O scimbolo * o voeu dî che no ti poeu smarcâ o groppo una votta che ti l'hæ azonto (ò viçeversa).",
        "userrights-reason": "Raxon:",
        "userrights-no-interwiki": "No ti g'hæ i permissi pe modificâ i driti di utenti insce di atre wiki.",
        "userrights-nodatabase": "O database $1 o no l'esiste ò o no l'è un database locale.",
        "userrights-changeable-col": "Gruppi che ti peu modificâ",
        "userrights-unchangeable-col": "Gruppi che no ti peu modificâ",
        "userrights-conflict": "Conflito de modiffica di driti utente! Pe piaxei controlla e conferma e teu modiffiche.",
-       "userrights-removed-self": "T'hæ rimosso con successo i teu driti. E quindi, no ti saiæ ciù in grou de accede a questa paggina.",
+       "userrights-removed-self": "T'hæ rimosso i teu driti. E quindi, no ti saiæ ciù in grou de accede a questa paggina.",
        "group": "Gruppo:",
        "group-user": "Ûtenti",
        "group-autoconfirmed": "Utenti aotoconfermæ",
        "grouppage-sysop": "{{ns:project}}:Amministratoî",
        "grouppage-bureaucrat": "{{ns:project}}:Buroccrati",
        "grouppage-suppress": "{{ns:project}}:Soppressoî",
+       "right-read": "Leze paggine",
+       "right-edit": "Modiffica paggine",
+       "right-createpage": "Crea paggine (escluse e pagine de discuscion)",
+       "right-createtalk": "Crea pagine de discuscion",
+       "right-createaccount": "Crea noeuve utençe",
+       "right-autocreateaccount": "Accede aotomaticamente con un'utença esterna",
+       "right-minoredit": "Marca e modifiche comme menoî",
        "right-move": "Mescia e paggine",
+       "right-move-subpages": "Mescia e pagine insemme a-e relative sottopagine",
+       "right-move-rootuserpages": "Mescia e pagine prinçipæ di utenti",
+       "right-move-categorypages": "Mescia e categorie",
+       "right-movefile": "Mescia i file",
+       "right-suppressredirect": "O no crea un redirect aotomatico quande se mescia una pagina",
+       "right-upload": "Carrega file",
+       "right-reupload": "Sorvescrive un file existente",
+       "right-reupload-own": "Sorvescrive un file existente caregou da-o mæximo utente",
+       "right-reupload-shared": "Sorvescrive localmente di file presenti inte l'archivio condiviso",
+       "right-upload_by_url": "Carega un file da un addreçço URL",
+       "right-purge": "Nettezza a cache do scito sença conferma",
+       "right-autoconfirmed": "Non soggetto a-o limmite de açioin pe IP",
+       "right-bot": "Da trattâ comme processo aotomatico",
+       "right-nominornewtalk": "Fa scì che e modiffiche menoî a-e pagine de discuscion no faççan comparî l'avviso de noeuvo messaggio",
+       "right-apihighlimits": "Doeuvia di limmiti ciù erti pe-e interrogaçioin API",
        "right-writeapi": "Deuvia l'API in scrittua",
+       "right-delete": "Scassa e paggine",
+       "right-bigdelete": "Scassa e pagine con cronologie longhe",
+       "right-deletelogentry": "Scassa e ripristina voxe de registro specifiche",
+       "right-deleterevision": "Scassa e ripristina de verscion specifiche de pagine",
+       "right-deletedhistory": "Vixualizza e verscioin da cronologia scassæ, sença o so testo associou",
+       "right-deletedtext": "Vixualizza o testo scassou e-e modifiche fra de verscioin scassæ",
+       "right-browsearchive": "Çerca inte pagine scassæ",
+       "right-undelete": "Recuppera una paggina",
+       "right-suppressrevision": "Vedde, asconde e ripristina de verscioin specifiche de pagine a quæ-se-segge utente",
+       "right-viewsuppressed": "Vedde de verscioin ascose a qua-se-sæ utente",
+       "right-suppressionlog": "Vixualizza i registri privæ",
+       "right-block": "Blocca e modifiche di atri utenti",
+       "right-blockemail": "Impedisce a un utente de mandâ de email",
+       "right-hideuser": "Blocca un nomme utente, ascondendolo a-o pubbrico",
+       "right-ipblock-exempt": "Ignora i blocchi di IP, i blocchi aotomatichi e i blocchi de range de IP",
+       "right-unblockself": "Sblocca lê mæximo",
+       "right-protect": "Camgia i livelli de proteçion e modifica e pagine protette ricorscivamente",
+       "right-editprotected": "Modifica e pagine protette con \"{{int:protect-level-sysop}}\"",
+       "right-editsemiprotected": "Modifica e pagine protette con \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Modifica o modello de contegnuo de 'na paggina",
+       "right-editinterface": "Modiffica l'interfaccia utente",
+       "right-editusercssjs": "Modifica i file CSS e JS di atri utenti",
+       "right-editusercss": "Modifica i file CSS di atri utenti",
+       "right-edituserjs": "Modiffica i file JS di atri utenti",
+       "right-editmyusercss": "Modifica o file CSS do proppio utente",
+       "right-editmyuserjs": "Modifica o file JavaScript do proppio utente",
+       "right-viewmywatchlist": "Vixualizza i proppi osservæ speçiali",
+       "right-editmywatchlist": "Modifica i to osservæ speçiali. Da notâ che arcun-e açioin porian ancon azonze de pagine anche sença questo drito.",
+       "right-viewmyprivateinfo": "Vixualizza i proppi dæti personæ (presempio: adreçço email, nomme veo)",
+       "right-editmyprivateinfo": "Modiffica i proppi dæti personæ (presempio: addreçço email, nomme veo)",
+       "right-editmyoptions": "Modiffica e proppie preferençe",
+       "right-rollback": "Annulla rapidamente e modifiche de l'urtimo utente ch'o l'ha modificou una pagina in particolâ",
+       "right-markbotedits": "Marca e modifiche soggette a rollback comme effettuæ da bot",
+       "right-noratelimit": "No soggetto a-o limmite de açioin",
+       "right-import": "Importa de pagine da di atri wiki",
+       "right-importupload": "Importa paggine da un upload de file",
+       "right-patrol": "Marca e modifiche di altri utenti comme controllæ",
+       "right-autopatrol": "Marca aotomaticamente e proppie modifiche comme controllæ",
+       "right-patrolmarks": "Doeuvia a fonçion de verifica di urtime modiffiche",
+       "right-unwatchedpages": "Vixualizza una lista de pagine non öservæ",
+       "right-mergehistory": "Unisce a cronologia de paggine",
+       "right-userrights": "Modiffica tutti i driti de l'utente",
+       "right-userrights-interwiki": "Modiffica i driti di utenti insce di atre wiki",
+       "right-siteadmin": "Abbrocca e sbrocca o database",
+       "right-override-export-depth": "Esporta e paggine includendo e pagine collegæ scin a 'na profonditæ de 5",
+       "right-sendemail": "Manda de email a di atri utenti",
+       "right-passwordreset": "Vedde i messaggi de rempostaçion da password",
+       "right-managechangetags": "Crea e attiva/disattiva i [[Special:Tags|etichette]]",
+       "right-applychangetags": "Apprica di [[Special:Tags|etichette]] a-e proppie modiffiche",
+       "right-changetags": "Azonze e leva de specifiche [[Special:Tags|etichette]] insce scingole verscioin o voxe de registro",
+       "right-deletechangetags": "Scassa i [[Special:Tags|etichette]] da-o database",
+       "grant-generic": "Pacchetto diritti \"$1\"",
+       "grant-group-page-interaction": "Interagisce co-e paggine",
+       "grant-group-file-interaction": "Interagisce co-i file murtimediali",
+       "grant-group-watchlist-interaction": "Interagisce con i to oservæ speçiali",
+       "grant-group-email": "Invia email",
+       "grant-group-high-volume": "Esegue açioin mascive",
+       "grant-group-customization": "Personalizzaçion e preferençe",
+       "grant-group-administration": "Esegue açioin amministrative",
+       "grant-group-other": "Attivitæ varrie",
+       "grant-blockusers": "Blocca e sblocca utenti",
+       "grant-createaccount": "Crea un'utença",
+       "grant-createeditmovepage": "Crea, modiffica e mescia e pagine",
+       "grant-delete": "Scassa pagine, revixoin, e voxe de registro",
+       "grant-editinterface": "Modifica o namespace MediaWiki e i CSS/JavaScript di utenti",
+       "grant-editmycssjs": "Modifica i CSS/JavaScript da to utença",
+       "grant-editmyoptions": "Modifica e preferençe da to utença",
+       "grant-editmywatchlist": "Modiffica a to lista di öservæ",
+       "grant-editpage": "Modifica pagine existente",
+       "grant-editprotected": "Modifica pagine protette",
+       "grant-highvolume": "Modiffiche mascive",
+       "grant-oversight": "Asconde i utenti e soprimme e revixoin",
+       "grant-patrol": "Marca e modifiche a-e paggine comme veificæ",
+       "grant-protect": "Proteze e sproteze e paggine",
+       "grant-rollback": "Rollback de modifiche a-e pagine",
+       "grant-sendemail": "Manda di email a di atri utenti",
+       "grant-uploadeditmovefile": "Carega, sostituisce e mescia i file",
+       "grant-uploadfile": "Carrega di noeuvi file",
+       "grant-basic": "Driti de base",
+       "grant-viewdeleted": "Vedde i file e e pagine scassæ",
+       "grant-viewmywatchlist": "Vedde i to öservæ speçiali",
        "newuserlogpage": "Nêuvi utenti",
+       "newuserlogpagetext": "Questo o l'è un registro de creaçioin di utençe.",
        "rightslog": "Diritti d'ûtente",
+       "rightslogtext": "Questo o l'è un registro di cangi a-i driti di utenti.",
+       "action-read": "leze sta paggina",
        "action-edit": "càngia sta pàgina",
+       "action-createpage": "creâ sta paggina",
+       "action-createtalk": "creâ sta paggina de discuscion",
+       "action-createaccount": "creâ st'utença",
+       "action-autocreateaccount": "creâ aotomaticamente st'utença esterna",
+       "action-history": "vedde a cronologia de sta pagina",
+       "action-minoredit": "marcâ sta modifica comme menô",
+       "action-move": "mesciâ sta pagina",
+       "action-move-subpages": "mesciâ sta pagina e e relative sottopagine",
+       "action-move-rootuserpages": "mesciâ e paggine prinçipæ di utenti",
+       "action-move-categorypages": "mesciâ e categorie",
+       "action-movefile": "mesciâ sto file",
+       "action-upload": "caregâ sto file",
+       "action-reupload": "sorvescrive sto file existente",
+       "action-reupload-shared": "soviascrive sto file presente inte l'archivio condiviso",
+       "action-upload_by_url": "caregâ sto file da un addreçço URL",
+       "action-writeapi": "deuviâ l'API in scrittua",
+       "action-delete": "scassâ 'sta paggina",
+       "action-deleterevision": "scassâ sta verscion",
+       "action-deletedhistory": "vixualizzâ a cronologia scassâ de sta pagina",
+       "action-browsearchive": "çercâ paggine scassæ",
        "action-undelete": "Recuppera sta paggina",
        "action-suppressrevision": "rivedde e ripristinâ e modiffiche ascose",
+       "action-suppressionlog": "vedde questo registro privou",
+       "action-block": "bloccâ st'utente in scrittua",
+       "action-protect": "modificâ i livelli de proteçion pe questa pagina",
+       "action-rollback": "annullâ rapidamente e modifiche de l'urtimo utente ch'o l'ha modificou una pagina determinâ",
+       "action-import": "importâ de pagine da 'n'atra wiki",
+       "action-importupload": "importâ de pagine tramite upload da file",
+       "action-patrol": "marcâ e modifiche di atri utenti comme controllæ",
+       "action-autopatrol": "marcâ e proppie modifiche comme controllæ",
+       "action-unwatchedpages": "vixonâ a lista de pagine non öservæ",
+       "action-mergehistory": "unî a cronologia de sta pagina",
+       "action-userrights": "modificâ tutti i driti di utenti",
+       "action-userrights-interwiki": "modificâ i driti di utenti insce di atre wiki",
+       "action-siteadmin": "broccâ e sbroccâ o database",
+       "action-sendemail": "mandâ di e-mail",
+       "action-editmywatchlist": "modificâ a to lista di öservæ",
+       "action-viewmywatchlist": "vedde i to öservæ speçiali",
+       "action-viewmyprivateinfo": "vedde i proppi dæti personali",
+       "action-editmyprivateinfo": "modificâ i proppi dæti personali",
+       "action-editcontentmodel": "modificâ o modello de contegnuo de 'na paggina",
+       "action-managechangetags": "creâ e attivâ/disattivâ i etichette",
+       "action-applychangetags": "appricâ di etichette a-e to modiffiche",
+       "action-changetags": "Azonze e levâ de specifiche etichette sciu scingole verscioin o voxe de registro",
+       "action-deletechangetags": "scassâ i etichette da-o database",
        "nchanges": "$1 {{PLURAL:$1|modiffica|modiffiche}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|da l'urtima vixita}}",
        "enhancedrc-history": "cronologia",
        "recentchanges": "Ùrtimi cangiamenti",
        "recentchanges-legend": "Opçioin di ùrtimi cangiaménti",
-       "recentchanges-summary": "Questa pàgina a g'ha di càngi ciù reçenti a-i contegnûi do scîto.",
-       "recentchanges-feed-description": "Questo feed o g'ha di cangiaménti ciù reçenti a-i contegnûi do scîto.",
+       "recentchanges-summary": "Questa pagina a te mostra i cangiamenti ciu reçenti a-i contegnui do scito.",
+       "recentchanges-noresult": "Nisciun-a modiffica durante o periodo inseio ch'a soddisfe sti critei.",
+       "recentchanges-feed-description": "Questo feed o te mostra i cangiamenti ciu reçenti a-i contegnui do scito.",
        "recentchanges-label-newpage": "Sto cangiaménto o l'à creòu 'na pàgina nêuva",
        "recentchanges-label-minor": "Cangiamento minô (m)",
        "recentchanges-label-bot": "Sto cangiaménto o l'à fæto in bot",
        "recentchanges-label-plusminus": "Variassion da paggina in nummero de byte",
        "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (veddi e [[Special:NewPages|neuve paggine]])",
-       "rcnotefrom": "Chì sotta gh'è i cangiamenti fæti comensando da '''$2''' (scin a '''$1''').",
+       "recentchanges-submit": "Fanni vedde",
+       "rcnotefrom": "Chì sotta gh'è {{PLURAL:$5|o cangiamento|i cangiamenti}} a partî da <strong>$3, $4</strong> (scin a '''$1''').",
        "rclistfrom": "Fanni vedde e modiffiche apportæ partindo da $3 $2",
-       "rcshowhideminor": "$1 cangiaménti minoi",
+       "rcshowhideminor": "$1 cangiaménti minoî",
        "rcshowhideminor-show": "Fanni vedde",
        "rcshowhideminor-hide": "Ascondi",
        "rcshowhidebots": "$1 bot",
        "rcshowhidebots-show": "Fanni vedde",
        "rcshowhidebots-hide": "Ascondi",
        "rcshowhideliu": "$1 i utenti registræ",
+       "rcshowhideliu-show": "Fanni vedde",
        "rcshowhideliu-hide": "Ascondi",
        "rcshowhideanons": "$1 utenti anonnimi",
        "rcshowhideanons-show": "Fanni vedde",
        "rcshowhideanons-hide": "Ascondi",
        "rcshowhidepatr": "$1 i cangiaménti controllæ",
+       "rcshowhidepatr-show": "Fanni vedde",
+       "rcshowhidepatr-hide": "Ascondi",
        "rcshowhidemine": "$1 i mæ cangiamenti",
        "rcshowhidemine-show": "Fanni vedde",
        "rcshowhidemine-hide": "Ascondi",
+       "rcshowhidecategorization": "$1 categorizzaçion da pagina",
+       "rcshowhidecategorization-show": "Fanni vedde",
+       "rcshowhidecategorization-hide": "Ascondi",
        "rclinks": "Fanni vedde i $1 cangiaménti ciù reçenti fæti inti ùrtimi $2 giorni<br />$3",
        "diff": "diff",
        "hist": "stö",
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
+       "number_of_watching_users_pageview": "[osservâ da {{PLURAL:$1|un utente|$1 utenti}}]",
+       "rc_categories": "Limite a-e categorie (separæ da \"|\"):",
        "rc_categories_any": "Quâ-se-sæ fra quelle indicæ",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} doppo a modiffica",
        "newsectionsummary": "/* $1 */ neuva seçion",
        "recentchangeslinked-page": "Nómme da pàgina:",
        "recentchangeslinked-to": "Fanni védde sôlo i cangiaménti a-e pàgine colegæ a-a pàgina specificâ",
        "recentchanges-page-added-to-category": "[[:$1]] azonto a-a categoria",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] e [[Special:WhatLinksHere/$1|{{PLURAL:$2|una paggina a l'è azonta|$2 paggine son azonte}}]] a-a categoria",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] azonta a-a categoria, [[Special:WhatLinksHere/$1|questa pagina a l'è inclusa a l'interno di atre pagine]]",
        "recentchanges-page-removed-from-category": "[[:$1]] rimosso da-a categoria",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] e {{PLURAL:$2|una paggina a l'è rimossa|$2 paggine son rimosse}} da-a categoria",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] rimossa da-a categoria, [[Special:WhatLinksHere/$1|questa pagina a l'è inclusa a l'interno di atre pagine]]",
        "autochange-username": "Modiffica aotomattica MediaWiki",
        "upload": "Carrega 'n file",
        "uploadbtn": "Carrega 'n file",
        "reuploaddesc": "Torna a-o moddulo pe-o caregamento.",
        "upload-tryagain": "Invia a descrission do file modificou",
        "uploadnologin": "No t'ê introu",
+       "uploadnologintext": "Pe caregâ  di file bezoeugna $1.",
+       "upload_directory_missing": "A directory de upload ($1) a no l'existe e a no poeu ese creâ da-o server web.",
+       "upload_directory_read_only": "O server web o no l'è in graddo de scrive inta directory de upload ($1).",
+       "uploaderror": "Errô into caregamento",
+       "upload-recreate-warning": "<strong>Attençion: un file con questo nomme o l'è stæto scassou o mesciou.</strong>\nO registro de scassatue e di stramui de questa pagina o l'è riportou chì pe comoditæ:",
+       "uploadtext": "Doeuviâ o modulo sottostante pe caregâ di noeuvi file. Pe visualizzâ ò çercâ i file za caregæ, consultâ o [[Special:FileList|log di file caregæ]]. Caregamenti de file e de noeuve verscioin de file son registræ into [[Special:Log/upload|log di upload]], e scassatue into [[Special:Log/delete|log de scassatue]].\n\nPe insei un file a l'interno de 'na pagina, fanni un collegamento de questo tipo:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' pe doeuviâ a verscion completa do file\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|testo alternativo]]</nowiki></code>''' pe doeuviâ una verscion larga 200 pixel inseia inte 'n box, alliniâ a scinistra e con 'testo alternativo' comme didascalia\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' pe generâ un collegamento diretto a-o file sença vixualizzâlo",
+       "upload-permitted": "{{PLURAL:$2|Tipo de file consentio|Tipi de file consentii}}: $1.",
+       "upload-preferred": "{{PLURAL:$2|Tipo de file consegiou|Tipi de file consegiæ}}: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Tipo de file non consentio|Tipi de file non consentii}}: $1.",
        "uploadlogpage": "Log di file caregæ",
+       "uploadlogpagetext": "De sotta gh'è una lista di urtimi file caregæ.\nConsultâ a [[Special:NewFiles|galleria di noeuvi file]] pe 'na vixon d'insemme.",
        "filename": "Nomme do file",
        "filedesc": "Detaggi",
+       "fileuploadsummary": "Detaggi do file:",
+       "filereuploadsummary": "Cangiamenti a-o file:",
+       "filestatus": "Informaçioin in sciô copyright:",
        "filesource": "Reixe:",
+       "ignorewarning": "Ignora l'avviso e sarva comunque o file",
+       "ignorewarnings": "Ignora i messaggi de avvertimento do scistema",
+       "minlength1": "O nome do file o dev'ese a-o manco de una lettia.",
+       "illegalfilename": "O nomme \"$1\" o conten di caratteri non ammissi inti tittoli de paggine. Dagghe 'n atro nomme e proeuva torna a caregâlo.",
+       "filename-toolong": "I nommi di file no poeuan superâ i 240 byte.",
        "badfilename": "O nomme do file o l'è stæto cangiòu in \"$1\".",
-       "fileexists": "Un papê co sto nomme o existe de zà, pe piaxei da unn'euggiâ a <strong>[[:$1]]</strong> se non ti tei seguo de voleilo cangiâ.\n[[$1|thumb]]",
-       "fileexists-forbidden": "Un papê co sto nomme o existe de zà, pe piaxei vanni in derrê e carega sto papê co un ätro nomme. [[File:$1|thumb|center|$1]]",
+       "filetype-mime-mismatch": "L'estenscion do file \".$1\" a no corrisponde a-o tipo MIME rilevou da-o file ($2).",
+       "filetype-badmime": "No l'è consentio de caregâ di file de tipo MIME \"$1\".",
+       "filetype-bad-ie-mime": "Imposcibile caregâ o file perché Internet Explorer o rilevieiva comme \"$1\", ch'o l'è un tipo de file non consentio e potençialmente peigoso.",
+       "filetype-unwanted-type": "Caregâ di file de tipo '''\".$1\"''' l'è sconsegiou. {{PLURAL:$3|O tipo de file consegiou o l'è|I tipi de file consegiæ son}} $2.",
+       "filetype-banned-type": "'''\".$1\"''' {{PLURAL:$4|o no l'è un tipo de file consentio|no son di tipi de file consentii}}. {{PLURAL:$3|O tipo de file consentio o l'è|I tipi de file consentii son}} $2.",
+       "filetype-missing": "O file o no g'ha d'estenscion (pres. \".jpg\").",
+       "empty-file": "O file che t'hæ inviou o l'è voeuo.",
+       "file-too-large": "O file che t'hæ inviou o l'è troppo grande.",
+       "filename-tooshort": "O nomme do file o l'è troppo curto.",
+       "filetype-banned": "Questo tipo de file o l'è proibio.",
+       "verification-error": "Questo file o no l'ha superou a veriffica.",
+       "hookaborted": "A modiffica che t'hæ çercou de fâ a l'è stæta interrotta da un'estenscion.",
+       "illegal-filename": "O nomme do file o no l'è ammisso.",
+       "overwrite": "Soviascrive un file existente no l'è permisso.",
+       "unknown-error": "Gh'è stæto un aro sconosciuo.",
+       "tmp-create-error": "Imposcibbile creâ o file temporannio.",
+       "tmp-write-error": "Errô de scrittua do file temporannio.",
+       "large-file": "Se raccomanda de no superâ e dimenscioin de $1 pe ciascun file; questo file o l'è grande $2.",
+       "largefileserver": "O file o suppera e dimenscioin consentie da-a configuaçion do server.",
+       "emptyfile": "O file apen-a caregou pâ esee voeuo. Questo poriæ ese dovuo a un aro into nomme do file. Controlla se ti voeu davei caregâ sto file.",
+       "windows-nonascii-filename": "Questo wiki o no supporta di nommi de file con di caratteri speciali.",
+       "fileexists": "Un papê con sto nomme o l'existe za, pe piaxei danni 'n'euggiâ a <strong>[[:$1]]</strong> se no ti t'ê seguo de voeilo cangiâ.\n[[$1|thumb]]",
+       "filepageexists": "A pagina de descriçion de questo file aq l'è za stæta creâ a l'adreçço <strong>[[:$1]]</strong>, sciben che no ghe segge ancon un file con questo nomme. A descriçion de l'oggetto inseia in fase de caregamento a no l'appariâ in scia pagina de descriçion. Pe fâ scì che l'oggetto o comparisce in scia pagina de descriçion, saiâ necessaio modificala manualmente.\n[[$1|thumb]]",
+       "fileexists-extension": "Un file co-in nomme scimile a questo o l'esiste za: [[$2|thumb]]\n* Nomme do file caregou: <strong>[[:$1]]</strong>\n* Nomme do file existente: <strong>[[:$2]]</strong>\nTi voeu miga çerne un nomme ciu caratteristego?",
+       "fileexists-thumbnail-yes": "O file caregou o pâ ese una miniatua ''(thumbnail)''. [[$1|thumb]]\nVerifica, pe confronto, il file <strong>[[:$1]]</strong>.\nSe se tratta da mæxima inmaggine, inte dimenscioin originale, no l'è necessaio caregâne un'atra in miniatua.",
+       "file-thumbnail-no": "O nomme do file comença con <strong>$1</strong>; pâ ch'o segge un'inmaggine de dimenscioin redute ''(miniatua)''.\nSe ti dispon-i del'immaggine inta risoluçion originale, carreghila. Sedunque, pe piaxei, cangighe o nomme.",
+       "fileexists-forbidden": "Un file con questo nomme o l'existe za e o no poeu ese soviascrito. Se ti voeu caregâ o to file, torna inderê e dagghe un atro nomme. [[File:$1|thumb|center|$1]]",
+       "fileexists-shared-forbidden": "Un file con questo nomme o l'esiste za inte l'archivio de risorse multimediæ condivise. Se ti dexiddei ancon caregâ o file, torna inderê e modifica o nomme co-o quæ caregâ o file. [[File:$1|thumb|center|$1]]",
+       "file-exists-duplicate": "Questo file o l'è un dupricou {{PLURAL:$1|do seguente|di seguenti}} file:",
+       "file-deleted-duplicate": "Un file identico a questo ([[:$1]]) o l'è stæto scassou into passou. Verifica a cronologia de scassatue primma de caregâlo torna.",
+       "file-deleted-duplicate-notitle": "Un file identico a questo o l'è stæto scassou into passou, e o tittolo o l'è stæto soppresso. Domanda a quarcun ch'o g'ha a poscibilitæ de vedde i file soppresci de esaminâ a scituaçion primma de procede torna a-o caregamento.",
+       "uploadwarning": "Avviso de caregamento",
+       "uploadwarning-text": "Pe piaxei modifica chi de sotta a descriçion do file e proeuva torna.",
        "savefile": "Sarva o file",
-       "uploaddisabledtext": "In {{SITENAME}} non se peu caregâ de papê.",
+       "uploaddisabled": "O caregamento di file o l'è disabilitou.",
+       "copyuploaddisabled": "O caricamento tramite URL o l'è disabilitou.",
+       "uploaddisabledtext": "O caricamento di file o l'è disabilitou.",
+       "php-uploaddisabledtext": "O caregamento di file tramite PHP o l'è disabilitou. Controlla a configuaçion de file_uploads.",
+       "uploadscripted": "Questo file o conten un codiçe HTML ò de script, ch'o poriæ ese interpretou erroniamente da un browser web.",
+       "upload-scripted-pi-callback": "Imposcibile caregâ un file ch'o conten un'instruçion de elaboaçion in XML-stylesheet.",
+       "uploaded-script-svg": "Trovou elemento de script \"$1\" into file caregou in formato SVG.",
+       "uploaded-hostile-svg": "Trovou CSS no seguo inte l'elemento de stile do file in formato SVG caregou.",
+       "uploaded-event-handler-on-svg": "Impostâ i attributi de gestion di eventi <code>$1=\"$2\"</code> no l'è consentio inti file SGV",
+       "uploaded-href-attribute-svg": "i attributi href inti file SVG poeuan collegâse solo verso e destinaçioin http:// o https://, trovou <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-href-unsafe-target-svg": "Trovou href a dæti non segui: destinaçion URI <code>&lt;$1 $2=\"$3\"&gt;</code> caregou into file SVG",
+       "uploaded-animate-svg": "Trovou o tag \"animate\" ch'o poriæ cangiâ href, doeuviando l'attributo \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> into file SVG caregou.",
+       "uploaded-setting-event-handler-svg": "A configuaçion di attributi pe-o gestô di eventi a l'è bloccâ, trovou <code>&lt;$1 $2=\"$3\"&gt;</code> into file SVG caregou.",
+       "uploaded-setting-href-svg": "L'utilizzo do tag \"set\" pe azonze l'attributo \"href\" a l'elemento parentâ o l'è bloccou.",
+       "uploaded-wrong-setting-svg": "L'uso de l'elemento \"set\" pe azonze una destinaçion remote/data/script pe qua-se-sæ attributo o l'è bloccou. Trovou <code>&lt;set to=\"$1\"&gt;</code> into file SVG caregou.",
+       "uploaded-setting-handler-svg": "o SVG ch'o l'imposta l'attributo \"handler\" con remote/data/script o l'è bloccou. Trovou <code>$1=\"$2\"</code>into file SVG caregou.",
+       "uploaded-remote-url-svg": "o SVG ch'o l'imposta qua-se-sæ attributo de stile con di URL remoti o l'è bloccato. Trovou <code>$1=\"$2\"</code> into file SVG caregou.",
+       "uploaded-image-filter-svg": "Trovou filtro immaggine con URL: <code>&lt;$1 $2=\"$3\"&gt;</code> into file in formato SVG caregou.",
+       "uploadscriptednamespace": "Questo file SVG o conten un namespace '$1' non consentio",
+       "uploadinvalidxml": "O codiçe XML into file caregou o no poeu ese elaboou.",
        "uploadvirus": "Questo file o conten un virus! Dettaggi: $1",
+       "uploadjava": "Questo file o l'è un file ZIP ch'o conten un file .class Java.\nCaregâ i file Java no l'è consentio, perché poeuan caosâ l'aggiamento de restriçioin de segueçça.",
+       "upload-source": "File de origine",
        "sourcefilename": "Nomme do file d'origgine:",
+       "sourceurl": "URL de origine:",
        "destfilename": "Nomme do file de destinassion:",
+       "upload-maxfilesize": "Dimenscion mascima do file: $1",
+       "upload-description": "Descriçion do file",
+       "upload-options": "Opçioin de caregamento",
+       "watchthisupload": "Metti sotta oservaçion",
+       "filewasdeleted": "Un file con questo nomme o l'è stæto za caregou e scassou into passou. Controlla $1 primma de caregâlo torna.",
+       "filename-thumb-name": "Sto chì o pâ un tittolo da miniatua. Pe piaxei no stanni a caregâ e miniatue in scia mæxima wiki. O dunque, corezi o nomme do file de moddo ch'o segge ciù scignificativo e o no l'agge o prefisso da miniatua.",
+       "filename-bad-prefix": "O nomme do file che t'ê aproeuvo a caregâ o comença con '''\"$1\"''', ch'o l'è un nomme generico scimile a quelli assegnæ aotomaticamente da-e fotocammie digitale. Pe piaxei çerni un nomme ciù descrittivo pe-o to file.",
+       "upload-proto-error": "Protocollo errou",
+       "upload-proto-error-text": "Pe l'upload remoto l'è necessaio speçificâ di URL che començan con <code>http://</code> oppû <code>ftp://</code>.",
        "upload-file-error": "Errô interno",
+       "upload-file-error-text": "S'è veificou un errô interno durante a creaçion de 'n file temporannio in sciô server. Contatta un [[Special:ListUsers/sysop|amministratô]].",
+       "upload-misc-error": "Errô de caregamento sconosciuo",
+       "upload-misc-error-text": "S'è veificou un errô non identificou durante o caregamento do file. Controlla che a URL a segge corretta e accescibile e proeuva torna. Se o problema o persciste, contatta un [[Special:ListUsers/sysop|amministratô]].",
+       "upload-too-many-redirects": "L'URL o contegniva troppi redirect",
+       "upload-http-error": "S'è verificou un errô HTTP: $1",
+       "upload-copy-upload-invalid-domain": "No l'è consentio o caregamento de coppie da questo dominnio.",
+       "upload-foreign-cant-upload": "Questo wiki o no l'è configuou pe caregâ i file into repository de file esterno domandou.",
+       "upload-foreign-cant-load-config": "Imposcibbile caregâ a configuaçion pe-i upload de file inti file repository esterni.",
+       "upload-dialog-disabled": "O caregamento di file tramite questo barcon de dialogo o l'è disabilitou inte questo wiki.",
+       "upload-dialog-title": "Carrega file",
+       "upload-dialog-button-cancel": "Anulla",
+       "upload-dialog-button-done": "Fæto",
+       "upload-dialog-button-save": "Sarva",
+       "upload-dialog-button-upload": "Carrega",
+       "upload-form-label-infoform-title": "Detaggi",
+       "upload-form-label-infoform-name": "Nomme",
+       "upload-form-label-infoform-name-tooltip": "Un tittolo unnico e descritivo pe-o file, ch'o serviâ da nomme. Doeuviâ pure e toeu parolle e i spaççi. No stagh'a mette l'estenscion.",
+       "upload-form-label-infoform-description": "Descriçion",
+       "upload-form-label-infoform-description-tooltip": "Descrivi scinteticamente tutto quanto sæ degno de notta a propoxito de quest'oeuvia.\nPe-e foto, indica e cose prinçipæ che gh'en rappresentæ, l'öcaxon e/ò o posto.",
+       "upload-form-label-usage-title": "Utilizzo",
+       "upload-form-label-usage-filename": "Nomme do file",
+       "upload-form-label-own-work": "Questo o l'è travaggio mæ",
+       "upload-form-label-infoform-categories": "Categorie",
+       "upload-form-label-infoform-date": "Dæta",
+       "upload-form-label-own-work-message-generic-local": "Confermo che son aproeuvo a caregâ sto file segondo e condiçioin de serviçio e e polittiche in sce e liçençe de {{SITENAME}}.",
+       "upload-form-label-not-own-work-message-generic-local": "Se non t'ê in grou de caregâ o file segondo e politiche de {{SITENAME}}, særa sto barcon e proeuva un atro mettodo.",
+       "upload-form-label-not-own-work-local-generic-local": "Proeuva ascì a [[Special:Upload|pagina de caregamento predefinia]].",
+       "upload-form-label-own-work-message-generic-foreign": "Ho acapio che son aproeuvo a caregâ questo file inte 'n archivio condiviso. Confermo che-o façço segondo e so condiçioin de serviççio e-e so polittiche in sce e liçençe.",
+       "upload-form-label-not-own-work-message-generic-foreign": "Se non t'ê in grou de caregâ o file segondo e politiche de l'archivvio condiviso, særa sto barcon e proeuva un atro mettodo.",
+       "upload-form-label-not-own-work-local-generic-foreign": "Ti poeu provâ ascì a doeuviâ a [[Special:Upload|pagina de caregamento insce {{SITENAME}}]], se questo file o poeu ese caregou segondo e soeu politiche.",
+       "backend-fail-stream": "Imposcibile trasmette o file $1.",
+       "backend-fail-backup": "Imposcibile eseguî o backup do file $1 .",
+       "backend-fail-notexists": "O file $1 o no l'existe.",
+       "backend-fail-hashes": "Imposcibile ötegnî l'hash di file pe 'n confronto.",
+       "backend-fail-notsame": "Existe za un file non identico a \"$1\".",
+       "backend-fail-invalidpath": "$1 o no l'è un percorso de archiviaçion vallido.",
+       "backend-fail-delete": "Imposcibile scassâ o file $1.",
+       "backend-fail-describe": "Imposcibile modificâ i metadæti do file \"$1\".",
+       "backend-fail-alreadyexists": "O file $1 o l'existe za.",
+       "backend-fail-store": "Imposcibbile memorizzâ o file  $1  in  $2 .",
+       "backend-fail-copy": "Imposcibile copiâ o file  $1  in  $2 .",
+       "backend-fail-move": "Imposcibile messciâ o file  $1  in  $2 .",
+       "backend-fail-opentemp": "Imposcibbile arvî o file temporannio.",
+       "backend-fail-writetemp": "Imposcibbile scrive o file temporannio.",
+       "backend-fail-closetemp": "Imposcibbile serâ o file temporannio.",
+       "backend-fail-read": "Imposcibile leze o file  $1 .",
+       "backend-fail-create": "Imposcibile scrive o file $1.",
+       "backend-fail-maxsize": "Imposcibile scrive o file $1 perché o l'è ciù grande de {{PLURAL:$2|un|$2}} byte.",
+       "backend-fail-readonly": "O backend de memoia \"$1\" o l'è attualmente de sola lettua. A raxon indicâ a l'è: <em>$2</em>",
+       "backend-fail-synced": "O file \"$1\" o l'è inte 'n stato non coerente inti backend de memoia interna.",
+       "backend-fail-connect": "Imposcibile connettise a-o backend de memoia \"$1\".",
+       "backend-fail-internal": "S'è verificou un errô sconosciuo into backend de memoia \"$1\".",
+       "backend-fail-contenttype": "Imposcibile determinâ a tipologia do file da archiviâ inte \"$1\".",
+       "backend-fail-batchsize": "O backend de memoia o l'ha programmou una serie de $1 {{PLURAL:$1|opiaçion|opiaçioin}} sciu file; o limmite o l'è de $2 {{PLURAL:$2|opiacion|opiacioin}}.",
+       "backend-fail-usable": "Imposcibile leze ò scrive o file \"$1\" a caosa de aetorizzaçioin insuffixenti ò directory/contegnitoî mancanti.",
+       "filejournal-fail-dbconnect": "Imposcibile connettise a-o database journal pe l'archiviaçion back-end \"$1\".",
+       "filejournal-fail-dbquery": "Imposcibile aggiornâ o database journal pe l'archiviaçion back-end \"$1\".",
+       "lockmanager-notlocked": "Imposcibile sbloccâ \"$1\"; o no l'è bloccou.",
+       "lockmanager-fail-closelock": "Imposcibbile serâ o file de blocco pe \"$1\".",
+       "lockmanager-fail-deletelock": "Imposcibile scassâ o file de blocco pe $1.",
+       "lockmanager-fail-acquirelock": "Imposcibbile aquixî o blocco pe $1.",
+       "lockmanager-fail-openlock": "Imposcibbile arvî o file de blocco pe \"$1\".",
+       "lockmanager-fail-releaselock": "Imposcibile revocâ o blocco pe $1.",
+       "lockmanager-fail-db-bucket": "Imposcibile contattâ i necessai database de blocco into bucket $1.",
+       "lockmanager-fail-db-release": "Imposcibile revocâ i blocchi in sciô database $1.",
+       "lockmanager-fail-svr-acquire": "Imposcibile acquixî i blocchi in sciô server $1.",
+       "lockmanager-fail-svr-release": "Imposcibile revocâ i blocchi in sciô server $1.",
+       "zip-file-open-error": "S'è verificou 'n errô durante l'avertua do file pe-i controlli ZIP.",
+       "zip-wrong-format": "O file specificou o no l'ea un file ZIP.",
+       "zip-bad": "O file o l'è un file ZIP corrotto ò atrimenti illezibbile.\nO no poeu ese controllou comme se dè pe-a segueçça.",
+       "zip-unsupported": "O file o l'è un file ZIP ch'o l'adoeuvia de caratteristeghe ZIP non supportæ da MediaWiki.\nO no poeu ese ben controllou pe-a segueçça.",
+       "uploadstash": "Carrega stash",
+       "uploadstash-summary": "Questa pagina a consente l'accesso a-i file che son stæti caregæ (o son in fase de caregamento) ma che n'en ancon stæti pubbricæ in sciô wiki. Questi file son vixibbili solo a l'utente ch'o i ha caregæ.",
+       "uploadstash-clear": "Elimmina i file in stash",
+       "uploadstash-nofiles": "No ti g'hæ de file into stash.",
+       "uploadstash-badtoken": "Esecuçion de l'açion non riuscia, foscia perché e to credençiale de modiffica son descheite. Proeuva ancon.",
+       "uploadstash-errclear": "O nettezzo di file o no l'è ariescio.",
+       "uploadstash-refresh": "Aggiorna l'elenco di file",
+       "uploadstash-thumbnail": "veddi miniatua",
+       "invalid-chunk-offset": "Offset d'a parte non vallido.",
+       "img-auth-accessdenied": "Accesso negou",
+       "img-auth-nopathinfo": "PATH_INFO mancante.\nO server o no l'è impostou pe passâ quest'informaçion.\nO poriæ ese basou insce CGI e o no poeu supportâ img_auth.\nAmia https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
+       "img-auth-notindir": "O percorso domandou o no l'è inta directory de upload configuâ.",
+       "img-auth-badtitle": "Imposcibile construe un tittolo vallido da \"$1\".",
+       "img-auth-nologinnWL": "No t'ê introu e \"$1\" o no l'è inta whitelist.",
+       "img-auth-nofile": "O file \"$1\" o no l'existe.",
+       "img-auth-isdir": "Ti çerchi d'accede a 'na directory \"$1\".\nL'è consentio solo l'accesso a-i file.",
+       "img-auth-streaming": "\"$1\" in streaming.",
+       "img-auth-public": "La fonçion de img_auth.php a l'è de dâ in output di file da un scito wiki privou.\nQuesto scito o l'è configuou comme un wiki pubbrico.\nPe 'na segueçça ottimale, img_auth.php o l'è disattivou.",
+       "img-auth-noread": "L'utente o no g'ha accesso a-a lettua de \"$1\".",
+       "http-invalid-url": "URL non vallido: $1",
+       "http-invalid-scheme": "Di URL co-o prefisso \"$1\" no son supportæ.",
+       "http-request-error": "Recesta HTTP fallia a caosa de 'n aro sconosciuo.",
+       "http-read-error": "Errô de lettua HTTP.",
+       "http-timed-out": "Recesta HTTP descheita.",
+       "http-curl-error": "Errô durante o recuppero de l'URL: $1",
+       "http-bad-status": "S'è verificou un problema durante a recesta HTTP: $1 $2",
+       "upload-curl-error6": "URL no razonzibbile",
+       "upload-curl-error6-text": "Imposcibile razonze a URL specificâ. Verifica che a URL a sæ scrita correttamente e che o scito in question o sæ attivo.",
+       "upload-curl-error28": "Tempo descheito pe l'upload",
+       "upload-curl-error28-text": "O scito remoto o l'ha impiegou troppo tempo a risponde. Verifica che o sito o sæ attivo, attendi quarche menuto e proeuva torna, se mai inte 'n momento con meno traffego.",
        "license": "Licensa:",
        "license-header": "Licensa",
        "nolicense": "Nisciûnn-a liçensa indicâa",
+       "licenses-edit": "Modiffica opçioin de liçença",
+       "license-nopreview": "(Anteprimma non disponibbile)",
+       "upload_source_url": "(un file da un URL vallido e accescibile pubbricamente)",
+       "upload_source_file": "(un file da-o to computer)",
+       "listfiles-delete": "scassa",
+       "listfiles-summary": "Questa pagina speciale a mostra tutti i file caregæ.",
        "listfiles_search_for": "Çerca pe nomme de l'imàgine:",
+       "listfiles-userdoesnotexist": "L'utença \"$1\" a no l'è registrâ.",
        "imgfile": "file",
-       "listfiles": "Lista d'archivvi",
+       "listfiles": "Lista di file",
+       "listfiles_thumb": "Miniatua",
        "listfiles_date": "Dæta",
+       "listfiles_name": "Nomme",
+       "listfiles_user": "Utente",
+       "listfiles_size": "Dimenscion",
+       "listfiles_description": "Descriçion",
+       "listfiles_count": "Verscioin",
+       "listfiles-show-all": "Includdi e vege verscioin de inmaggine",
+       "listfiles-latestversion": "Verscion corente",
+       "listfiles-latestversion-yes": "Sci",
+       "listfiles-latestversion-no": "No",
        "file-anchor-link": "file",
        "filehist": "Stöia do file",
        "filehist-help": "Sciacca insce dæta/ôa pe amiâ o file comm'o s'apresentâva into momento indicòu.",
+       "filehist-deleteall": "scassa tutto",
+       "filehist-deleteone": "scassa",
        "filehist-revert": "Ripristina",
        "filehist-current": "Corrente",
        "filehist-datetime": "Dæta/Ôa",
        "filehist-thumb": "Miniatua",
        "filehist-thumbtext": "Miniatua da versción de $1",
+       "filehist-nothumb": "Nisciun-a miniatua",
        "filehist-user": "Utente",
        "filehist-dimensions": "Dimenscioin",
-       "filehist-filesize": "Dimension de l'archivvio",
+       "filehist-filesize": "Dimenscion do file",
        "filehist-comment": "Coménti",
        "imagelinks": "Ûzo do file",
        "linkstoimage": "{{PLURAL:$1|A segoente pàgina a contegne|E segoenti $1 pàgine contegnan}} colegaménti a-o file:",
+       "linkstoimage-more": "Ciù de $1 {{PLURAL:$1|pagina aponta|pagine apontan}} a questo file.\nA seguente lista a mostra {{PLURAL:$1|a primma paggina ch'a l'aponta|e primme $1 paggine ch'apontan}} a sto file.\nL'è disponibile un [[Special:WhatLinksHere/$2|elenco completo]].",
        "nolinkstoimage": "No gh'è nisciûnn-a pàgina collegâ con 'sto file.",
-       "sharedupload": "'St'archivvio o l'è condiviso; sajeiva a dî c'o pêu ese dêuviòu da ciû progetti wiki.",
+       "morelinkstoimage": "Vixualizza [[Special:WhatLinksHere/$1|di atri inganci]] a questo file.",
+       "linkstoimage-redirect": "$1 (rendriççamento file) $2",
+       "duplicatesoffile": "{{PLURAL:$1|O seguente file o l'è un dupricou|I seguenti $1 file son di dupricæ}} de questo file ([[Special:FileDuplicateSearch/$2|urteioî detaggi]]):",
+       "sharedupload": "Questo file o proven da $1 e o poeu ese doeuviou da di atri progetti.",
+       "sharedupload-desc-there": "Questo file o proven da $1 e o poeu ese doeuviou da di atri progetti.\nConsurta a [$2 pagina de descriçion do file] pe di urteioî informaçioin.",
        "sharedupload-desc-here": "Sto file o vegne da $1 e o peu êse dêuviòu inti âtri progetti.\nChì apreuvo ti peu védde a descriçión inta [$2 pàgina de descriçión do file].",
+       "sharedupload-desc-edit": "Questo file o proven da $1 e o poeu ese doeuviou da di atri progetti.\nFoscia ti voeu modificâ a descriçion presente inta [$2 pagina de descriçion do file].",
+       "sharedupload-desc-create": "Questo file o proven da $1 e o poeu ese doeuviou da di atri progetti.\nFoscia ti voeu modificâ a descriçion presente inta [$2 pagina de descriçion do file].",
+       "filepage-nofile": "No existe un file con sto nomme.",
+       "filepage-nofile-link": "No existe un file con sto nomme, ma l'è poscibile [$1 caregâlo].",
        "uploadnewversion-linktext": "Carrega 'na neuva verscion de sto file",
+       "shared-repo-from": "da $1",
+       "shared-repo": "un archivio condiviso",
        "upload-disallowed-here": "Imposcibbile sorvescrive sto file.",
+       "filerevert": "Ripristina $1",
+       "filerevert-legend": "Ripristina file",
+       "filerevert-intro": "Ti stæ pe ripristinâ o file '''[[Media:$1|$1]]''' a-a [$4 verscion do $2, $3].",
+       "filerevert-comment": "Raxon:",
+       "filerevert-defaultcomment": "Ripristinou a verscion do $2, $1 ($3)",
+       "filerevert-submit": "Ripristina",
+       "filerevert-success": "'''O file [[Media:$1|$1]]''' o l'è stæto ripristinou a-a [$4 verscion do $2, $3].",
+       "filerevert-badversion": "No gh'è de verscioin locali precedenti do file co-o timestamp provisto.",
+       "filedelete": "Scassa \"$1\"",
+       "filedelete-legend": "Scassa o file",
+       "filedelete-intro": "Ti stæ pe scassâ o file '''[[Media:$1|$1]]''' con tutta a so cronologia.",
+       "filedelete-intro-old": "T'ê aproeuvo a scassâ a vercsion de '''[[Media:$1|$1]]''' do [$4 $2, $3].",
+       "filedelete-comment": "Raxon:",
        "filedelete-submit": "Scassa",
+       "filedelete-success": "O file '''$1''' o l'è stæto scassou.",
+       "filedelete-success-old": "A verscion do file '''[[Media:$1|$1]]''' do $2, $3  a l'è stæta scassaa.",
+       "filedelete-nofile": "'''$1''' o no l'existe.",
+       "filedelete-nofile-old": "Verscioin d'archivio de '''$1''' co-e caratteristeghe indicæ no ghe n'è.",
+       "filedelete-otherreason": "Atra motivaçion ò motivaçion azontiva:",
+       "filedelete-reason-otherlist": "Un'atra raxon",
+       "filedelete-reason-dropdown": "*Raxoin comun-e de scançellaçion\n** Violaçion do drito d'aotô\n** File dupricou",
+       "filedelete-edit-reasonlist": "Modiffica e raxoin da scassatua",
+       "filedelete-maintenance": "Scançellaçion e ricuppero di file temporaniamente disattivæ durante a manutençion.",
+       "filedelete-maintenance-title": "Imposcibbile eliminâ o file",
        "mimesearch": "Çerca MIME",
+       "mimesearch-summary": "Questa pagina a consente de filtrâ i file in base a-o tipo MIME.\nInsei a stringa de riçerca inta forma tipo/sottotipo o tipo/*, pr'es. <code>image/jpeg</code>.",
+       "mimetype": "Tipo MIME:",
+       "download": "scarrega",
+       "unwatchedpages": "Paggine non öservæ",
        "listredirects": "Lista de rindirissamenti",
-       "unusedtemplates": "Template no ûtilissæ",
+       "listduplicatedfiles": "Lista di file doggi",
+       "listduplicatedfiles-summary": "Questo o l'è un elenco di file, donde a verscion ciù reçente de 'n file a l'è un dupricou da verscion ciù reçente de 'n atro file. Se piggia in  conscideraçion solo che i file locali.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] o g'ha [[$3|{{PLURAL:$2|un duplicou|$2 duplicæ}}]].",
+       "unusedtemplates": "Template no ûtilizæ",
+       "unusedtemplatestext": "Inte sta pagina l'è elencou e pagine do namespace {{ns:template}} che no son incluse inte nisciun-a pagina. Primma de scassâle l'è öportun veificâ che i scingoli template no g'aggian di atri collegamenti intranti.",
+       "unusedtemplateswlh": "atri collegamenti",
        "randompage": "Pagina a brettìo",
-       "randomredirect": "Ûn rindirissamento a brettîo",
+       "randompage-nopages": "Pagine {{PLURAL:$2|into seguente|inti seguenti}} namespace no ghe n'è: $1.",
+       "randomincategory": "Pagina a brettio inta categoria",
+       "randomincategory-invalidcategory": "\"$1\" o no l'è un nomme de categoria vallido.",
+       "randomincategory-nopages": "Paggine in [[:Category:$1]] no ghe n'è.",
+       "randomincategory-category": "Categoria:",
+       "randomincategory-legend": "Pagina a brettio inta categoria",
+       "randomincategory-submit": "Vanni",
+       "randomredirect": "Ûn rindirissamento a brettio",
+       "randomredirect-nopages": "Into namespace \"$1\" redirect no ghe n'è.",
        "statistics": "Statistiche",
+       "statistics-header-pages": "Statistiche de pagine",
+       "statistics-header-edits": "Statistiche de modifiche",
+       "statistics-header-users": "Statistiche di utenti",
+       "statistics-header-hooks": "Atre statistiche",
+       "statistics-articles": "Paggine de contegnui",
+       "statistics-pages": "Paggine",
+       "statistics-pages-desc": "Tutte e paggine do scito, compreiso e paggine de discuscion, i redirect, etç.",
+       "statistics-files": "File caregæ",
+       "statistics-edits": "Modifiche a partî dal l'installaçion de {{SITENAME}}",
+       "statistics-edits-average": "Meddia de modiffiche pe paggina",
+       "statistics-users": "[[Special:ListUsers|Utenti]] registræ",
+       "statistics-users-active": "Utenti attivi",
+       "statistics-users-active-desc": "Utenti che han effettuou un'açion {{PLURAL:$1|inte l'urtimo giorno|inti urtimi $1 giorni}}",
+       "pageswithprop": "Paggine co-ina propietæ de paggina",
+       "pageswithprop-legend": "Paggine co-ina propietæ de paggina",
+       "pageswithprop-text": "Questa pagina a fa 'na lista de paggine ch'adoeuvian una particolâ propietæ de paggina.",
+       "pageswithprop-prop": "Nomme da propietæ:",
+       "pageswithprop-submit": "Vanni",
+       "pageswithprop-prophidden-long": "valô testoale longo da propietæ ascoso ($1)",
+       "pageswithprop-prophidden-binary": "valô binaio da propietæ ascoso ($1)",
        "doubleredirects": "Rindirissamenti doggi",
+       "doubleredirectstext": "In questa pagina gh'è elencou e paggine che rendiriççan a di atre paggine de redirect.\nOgni riga a conten i collegamenti a-o primmo e a-o segondo redirect, oltre a-a primma riga de testo do segondo redirect che a l'uso o conten a paggina de destinaçion \"corretta\" a-a quæ doviæ puntâ o primmo redirect ascì.\nI redirect <del>scassæ</del> son stæti corretti.",
+       "double-redirect-fixed-move": "[[$1]] o l'è stæto mesciou.\nO l'è stato aggiornou aotomaticamente e oua o l'è un redirect a [[$2]].",
+       "double-redirect-fixed-maintenance": "Corretto aotomaticamente o redirect doggio da [[$1]] a [[$2]] into travaggio de manutençion.",
+       "double-redirect-fixer": "Correttô di redirect",
        "brokenredirects": "Rindirissamenti sballiæ",
-       "brokenredirectstext": "De sotta unn-a lista de reindirissi a pagine che non existàn:",
+       "brokenredirectstext": "I rendriççi chì de sotta colegan a de paggine inexistente:",
        "brokenredirects-edit": "cangia",
        "brokenredirects-delete": "scassa",
        "withoutinterwiki": "Paggine sensa interwiki",
-       "withoutinterwiki-summary": "'Ste paggine chì inzû no g'han nisciûn collegamento co-e verscioîn in âtre lengoe:",
-       "fewestrevisions": "Voxi con meno revixoîn",
+       "withoutinterwiki-summary": "E paggine chì de sotta no g'han nisciûn collegamento a-e verscioin in âtre lengoe:",
+       "withoutinterwiki-legend": "Prefisso",
+       "withoutinterwiki-submit": "Mostra",
+       "fewestrevisions": "Pagine con meno revixoin",
        "nbytes": "$1 {{PLURAL:$1|byte|byte}}",
+       "ncategories": "$1 {{PLURAL:$1|categoria|categorie}}",
+       "ninterwikis": "$1 {{PLURAL:$1|interwiki}}",
        "nlinks": "$1 {{PLURAL:$1|collegamento|collegamenti}}",
        "nmembers": "$1 {{PLURAL:$1|elemento|elementi}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|elemento|elementi}}",
+       "nrevisions": "$1 {{PLURAL:$1|revixon|revixoin}}",
+       "nimagelinks": "Doeuviou inte $1 {{PLURAL:$1|paggina|paggine}}",
+       "ntransclusions": "Doeuviou inte $1 {{PLURAL:$1|paggina|paggine}}",
+       "specialpage-empty": "Questa paggina speciale a l'è attualmente voeua.",
        "lonelypages": "Paggine orfane",
+       "lonelypagestext": "E seguente paggine no son incluse ni colegæ a di atre paggine de {{SITENAME}}.",
        "uncategorizedpages": "Paggine sensa categorîa",
        "uncategorizedcategories": "Categorîe sensa categorîa",
        "uncategorizedimages": "Immaggini sensa categorîa",
        "uncategorizedtemplates": "Template sensa categorîa",
-       "unusedcategories": "Categorîe no ûtilissæ",
-       "unusedimages": "Archivvi no ûtilissæ",
+       "unusedcategories": "Categorie voeue",
+       "unusedimages": "File inutilizæ",
        "wantedcategories": "Categorîe domandæ",
        "wantedpages": "Paggine domandæ",
+       "wantedpages-summary": "Lista de paggine inexistente co-o ciu gran nummero de collegamenti a lô, escludendo e pagine ch'han solo che i rendiriççi che-e collegan. Pe 'n elenco de pagine inexistente che g'han di rendriççi che-e collegan, amia [[{{#special:BrokenRedirects}}|a lista di rendriççi erræ]].",
+       "wantedpages-badtitle": "Tittolo invallido into groppo di risultæ: $1",
+       "wantedfiles": "File domandæ",
+       "wantedfiletext-cat": "I seguenti file son in doeuvia, ma no existan. I file ospitæ inte di repository esterni porieivan esighe elencæ sciben che existan. Questi fasci poxitivi saian <del>barræ</del>. E pagine che incòrpoan i file che no existan son elencæ in [[:$1]].",
+       "wantedfiletext-cat-noforeign": "I seguenti file son in doeuvia, ma no existan. Inoltre, e pagine che incòrpoan questi file son elencæ inta [[:$1]].",
+       "wantedfiletext-nocat": "I seguenti file son reciamæ da wikilink, ma no existan. I file ospitæ inte di repository esterni porieivan ese elencæ sciben existenti. Questi fasci poxitivi saian <del>barræ</del>.",
+       "wantedfiletext-nocat-noforeign": "I seguenti file son in doeuvia, ma no existan.",
+       "wantedtemplates": "Template domandæ",
        "mostlinked": "Paggine ciû collegæ",
        "mostlinkedcategories": "Categorîe ciû collegæ",
-       "mostlinkedtemplates": "Template ciû dêuviæ",
-       "mostcategories": "Voxi con ciû categorîe",
+       "mostlinkedtemplates": "Paggine ciu incluse",
+       "mostcategories": "Voxe con ciû categorîe",
        "mostimages": "Immaggini con ciû collegamenti",
-       "mostrevisions": "Voxi con ciû revixoîn",
+       "mostinterwikis": "Paggine con ciu interwiki",
+       "mostrevisions": "Voxe con ciû revixoin",
        "prefixindex": "Indiçe arfabetico de voxe",
+       "prefixindex-namespace": "Tutte e paggine co-o prefisso do namespace $1",
+       "prefixindex-submit": "Mostra",
+       "prefixindex-strip": "Ascondi o prefisso inta lista",
        "shortpages": "Paggine ciû cûrte",
        "longpages": "Paggine ciû longhe",
        "deadendpages": "Paggine sensa sciortîa",
+       "deadendpagestext": "E seguente paggine no son collegæ a di atre paggine de {{SITENAME}}.",
        "protectedpages": "Paggine protette",
+       "protectedpages-indef": "Solo proteçioin indefinie",
+       "protectedpages-summary": "Questa paggina a l'elenca e paggine existente ch'en attoalmente protezue. Pe 'n elenco di tittoli protezui da-a creaçion, amia [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
+       "protectedpages-cascade": "Solo proteçioin ricorscive",
+       "protectedpages-noredirect": "Ascondi redirect",
+       "protectedpagesempty": "Paggine protette con sti parametri pe-o momento no ghe n'è.",
+       "protectedpages-timestamp": "Dæta e oa",
+       "protectedpages-page": "Paggina",
+       "protectedpages-expiry": "Scadença",
+       "protectedpages-performer": "Protetta da l'utente",
+       "protectedpages-params": "Parammetri de proteçion",
+       "protectedpages-reason": "Raxon",
+       "protectedpages-submit": "Mostra paggine",
+       "protectedpages-unknown-timestamp": "Sconosciuo",
+       "protectedpages-unknown-performer": "Utente sconosciuo",
        "protectedtitles": "Tittoli protezûi",
+       "protectedtitles-summary": "Questa pagina a l'elenca i titoli che son attualmente protetti da-a creaçion. Pe 'n elenco de pagine existente che son protette, amia [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
+       "protectedtitlesempty": "Tittoli protezui con sti parammetri pe-o momento no ghe n'è.",
+       "protectedtitles-submit": "Mostra tittoli",
        "listusers": "Lista d'ûtenti",
+       "listusers-editsonly": "Mostra solo i utenti con di contributi",
+       "listusers-creationsort": "Ordina pe dæta de creaçion",
+       "listusers-desc": "Ordina in senso decrescente",
+       "usereditcount": "$1 {{PLURAL:$1|contributo|contributi}}",
        "usercreated": "{{GENDER:$3|Creòu/â}} o $1 a-a $2",
        "newpages": "Pagine ciù reçenti",
+       "newpages-submit": "Mostra",
+       "newpages-username": "Nomme utente",
        "ancientpages": "Paggine ciû vëgie",
        "move": "Mescia",
        "movethispage": "Mescia 'sta paggina",
+       "unusedimagestext": "I seguenti file existan ma no son doeuviæ inte nisciun-a paggina.\nNotta che di atri sciti web porieivan ese colegæ a 'n file co-in URL diretto, e coscì o poriæ ese inte sta lista sciuben ch'o segge in doeuvia.",
+       "unusedcategoriestext": "E seguente paggine de categoria existan, sciben che nisciun'atra paggina o categoria a-e doeuvie.",
+       "notargettitle": "Dæti mancanti",
+       "notargettext": "No t'hæ indicou una pagina o un utente con chi eseguî sta fonçion.",
+       "nopagetitle": "A pagina de destinaçion a no l'existe",
+       "nopagetext": "A pagina domandâ a no l'existe.",
        "pager-newer-n": "{{PLURAL:$1|1 ciù nêuvo|$1 ciù nêuvi}}",
        "pager-older-n": "{{PLURAL:$1|1 ciù vêgio|$1 ciù vêgi}}",
+       "suppress": "Soprimmi",
+       "querypage-disabled": "Questa pagina speciale a l'è disattivâ pe motivi de prestaçion.",
+       "apihelp": "Agiutto API",
+       "apihelp-no-such-module": "Moddulo \"$1\" non trovou.",
+       "apisandbox": "Paggina de proeuva API",
+       "apisandbox-jsonly": "Pe doeuviâ a paggina de proeuva API ghe voeu o JavaScript.",
+       "apisandbox-api-disabled": "E fonçionalitæ API son disabilitæ insce questo scito.",
+       "apisandbox-intro": "Doeuvia sta paggina pe fâ prattica co-e <strong>API web service MediaWiki</strong>.\nPe di urteioî detaggi de utilizzo de API, amia a [[mw:API:Main page|documentaçion API]]. Exempio: [https://www.mediawiki.org/wiki/API#A_simple_example ötegnî o contegnuo da paggina prinçipâ]. Seleçion-a un'açion pe vedde di atri exempi.\n\nNotta che, sciben che questa a segge 'na paggina pe-e proeuve, i açioin che ti esegui chì porieivan modificâ a wiki.",
+       "apisandbox-fullscreen": "Espandi pannello",
+       "apisandbox-fullscreen-tooltip": "Espandi o pannello sandbox pe impî o barcon do browser.",
+       "apisandbox-unfullscreen": "Mostra a pagina",
+       "apisandbox-unfullscreen-tooltip": "Reduxi o pannello sandbox, coscì che i collegamenti de navigaçion MediaWiki seggian disponibbili.",
+       "apisandbox-submit": "Inandia recesta",
+       "apisandbox-reset": "Nettezza",
+       "apisandbox-retry": "Ritenta",
+       "apisandbox-loading": "Caregamento de informaçioin pe-o moddulo API \"$1\"...",
+       "apisandbox-load-error": "S'è veificou un errô durante o caregamento de informaçioin pe-o moddulo API \"$1\": $2",
+       "apisandbox-no-parameters": "Questo modulo API o no g'ha de parammetri.",
+       "apisandbox-helpurls": "Collegamenti a-a guidda",
+       "apisandbox-examples": "Exempi",
+       "apisandbox-dynamic-parameters": "Parammetri azontivi",
+       "apisandbox-dynamic-parameters-add-label": "Azonzi parammetro:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Nomme do parammetro",
+       "apisandbox-dynamic-error-exists": "Un parammetro denominou \"$1\" o l'existe za.",
+       "apisandbox-deprecated-parameters": "Parammetri sconsegiæ",
+       "apisandbox-fetch-token": "Aoto-compilla o token",
+       "apisandbox-submit-invalid-fields-title": "Gh'è di campi che n'en vallidi",
+       "apisandbox-submit-invalid-fields-message": "Correzi i campi evidençiæ e riproeuva.",
+       "apisandbox-results": "Risultæ",
+       "apisandbox-sending-request": "Invio recesta de API...",
+       "apisandbox-loading-results": "Riceçion di risultæ de API in corso...",
+       "apisandbox-results-error": "S'è veificou un errô durante o caregamento da risposta a l'interrogaçion API: $1",
+       "apisandbox-request-url-label": "URL de recesta:",
+       "apisandbox-request-time": "Tempo richiesto: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-results-fixtoken": "Correzi token e reinvia",
+       "apisandbox-results-fixtoken-fail": "Imposcibile recuperâ o token \"$1\".",
+       "apisandbox-alert-page": "I campi insce questa pagina no son vallidi.",
+       "apisandbox-alert-field": "O valô de questo campo o no l'è vallido.",
        "booksources": "Fonte libraie",
        "booksources-search-legend": "Çerca e fonti",
        "booksources-isbn": "Codice ISBN:",
        "booksources-search": "Çerca",
        "booksources-text": "De sotta unn-a lista de inganci a di ätri sciti che vendan libbri neuvi e vegi e che porrieivan avei ciu informaçioin in scî libbri che ti te çerchi",
-       "specialloguserlabel": "Ûtente:",
-       "speciallogtitlelabel": "Tittolo:",
+       "booksources-invalid-isbn": "O ISBN inserio pâ no ese vallido; controlla che no ghe segge stæto di ari into copiâlo da-a fonte originale.",
+       "specialloguserlabel": "Açion effettuâ da:",
+       "speciallogtitlelabel": "Açion effettuâ sciu (tittolo da paggina ò {{ns:user}}:Nomme utente):",
        "log": "Log",
-       "all-logs-page": "Tûtti i registri",
-       "alllogstext": "Presentaçion unega de tutti i registri do scito {{SITENAME}}.\nTi te peu strinza a vista se ti te çerni un tipo de registro, un nomme de un utente o de pagina.",
+       "logeventslist-submit": "Mostra",
+       "all-logs-page": "Tutti i registri pubbrichi",
+       "alllogstext": "Presentaçion combinaa de tutti i registri de {{SITENAME}}.\nL'è poscibile restrenze i critei de riçerca seleçionando o tipo de registro, l'utente ch'o l'ha eseguio l'açion, e/ò a pagina interessâ (entrambi i campi son senscibbili a-o maiuscolo/minuscolo).",
+       "logempty": "O registro o no conten di elementi corespondenti a-a riçerca.",
+       "log-title-wildcard": "Riçerca di titoli che començan con",
+       "showhideselectedlogentries": "Mostra/ascondi e voxe de registro seleçionæ",
+       "log-edit-tags": "Modifica i etichette de voxe de registro seleçionæ",
+       "checkbox-select": "Seleçion-a: $1",
+       "checkbox-all": "Tutto",
+       "checkbox-none": "Nisciun",
+       "checkbox-invert": "Inverti",
        "allpages": "Tûtte e paggine",
        "nextpage": "Proscima paggina ($1)",
        "prevpage": "Paggina preçedente ($1)",
        "allpagesfrom": "Fanni vedde e paggine comensando da:",
+       "allpagesto": "Mostra e paggine scin a:",
        "allarticles": "Tùtte e pàgine",
        "allinnamespace": "Tutte e pagine ($1 namespace)",
        "allpagessubmit": "Vanni",
        "allpagesprefix": "Fanni vedde e paggine che inissian con:",
        "allpagesbadtitle": "O tittolo dæto a-a paggina o non va ben, òpû o conten di prefissi inter-lengua o inter-wiki. O porriæ ascì contegnî un o ciù caratteri che inti tittoli no se peuan deuviâ.",
        "allpages-bad-ns": "\"$1\" o no ghe in {{SITENAME}}.",
+       "allpages-hide-redirects": "Ascondi i redirect",
+       "cachedspecial-viewing-cached-ttl": "T'ê aproeuvo a 'miâ 'na verscion de sta paggina memorizzâ inta cache, ch'a poeu ese vegia de $1 a-o mascimo.",
+       "cachedspecial-viewing-cached-ts": "T'ê aproeuvo a 'miâ 'na verscion de sta paggina memorizzâ inta cache, ch'a poriæ no ese do tutto aggiornâ.",
+       "cachedspecial-refresh-now": "Mostra a ciù reçente.",
        "categories": "Categorîe",
+       "categories-submit": "Mostra",
+       "categoriespagetext": "{{PLURAL:$1|A seguente categoria a conten|E seguente categorie contengnan}} de pagine o di file murtimediali.\nE [[Special:UnusedCategories|categorie voeue]] no son mostræ chì.\nAmia ascì e [[Special:WantedCategories|categorie richieste]].",
+       "categoriesfrom": "Mostra e categorie a partî da:",
+       "deletedcontributions": "Contributi utente scassæ",
+       "deletedcontributions-title": "Contributi utente scassæ",
+       "sp-deletedcontributions-contribs": "contribuçioin",
+       "linksearch": "Çerchia di inganci esterni",
+       "linksearch-pat": "Pattern de riçerca:",
+       "linksearch-ns": "Namespace:",
+       "linksearch-ok": "Çerca",
+       "linksearch-text": "L'è poscibbile doeuviâ di metacaratteri comme \"*.wikipedia.org\".\nL'è necessaio a-o manco un dominnio di primmo livello, presempio \"*.org\".<br />\n{{PLURAL:$2|Protocollo supportou|Protocolli supportæ}}: $1 (predefinio http:// se no l'è specificou nisciun protocollo).",
        "linksearch-line": "$1 colegòu a-a pagina $2",
+       "linksearch-error": "I metacarattei poeuan ese usati solo a-o prinçippio de l'indiriçço.",
+       "listusersfrom": "Mostra i utenti a partî da:",
        "listusers-submit": "Fanni vedde",
        "listusers-noresult": "Utente non trovöo.",
+       "listusers-blocked": "(bloccou)",
+       "activeusers": "Lista di utenti attivi",
+       "activeusers-intro": "Questo o l'è un elenco di utenti ch'han avuo quarche tipo d'attivitæ da $1 {{PLURAL:$1|giorno|giorni}} a questa parte.",
+       "activeusers-count": "$1 {{PLURAL:$1|açione|açioin}} {{PLURAL:$3|inte l'urtimo giorno|inti urtimi $3 giorni}}",
+       "activeusers-from": "Mostra i utenti a partî da:",
+       "activeusers-hidebots": "Ascondi i bot",
+       "activeusers-hidesysops": "Ascondi i amministratoî",
+       "activeusers-noresult": "Nisciun utente o risponde a-i critei impostæ.",
+       "activeusers-submit": "Mostra utenti attivi",
+       "listgrouprights": "Driti do groppo utente",
+       "listgrouprights-summary": "De seguito l'è elencou i groppi utente definii pe questo scito, co-i so driti d'accesso associæ.\nPorieiva esighe di [[{{MediaWiki:Listgrouprights-helppage}}|urteioî informaçioin]] in scî driti individoali.",
+       "listgrouprights-key": "Legenda:\n* <span class=\"listgrouprights-granted\">Drito assegnou</span>\n* <span class=\"listgrouprights-revoked\">Drito revocou</span>",
+       "listgrouprights-group": "Groppo",
+       "listgrouprights-rights": "Driti",
+       "listgrouprights-helppage": "Help:Driti do groppo",
        "listgrouprights-members": "(Elenco di membri)",
+       "listgrouprights-addgroup": "O poeu azonze {{PLURAL:$2|a-o groppo|a-i groppi}}: $1",
+       "listgrouprights-removegroup": "O poeu rimoeuve {{PLURAL:$2|da-o groppo|da-i groppi}}: $1",
+       "listgrouprights-addgroup-all": "O poeu azonze a tutti i groppi",
+       "listgrouprights-removegroup-all": "O poeu rimoeuve da tutti i groppi",
+       "listgrouprights-addgroup-self": "O poeu azonzise {{PLURAL:$2|a-o groppo|a-i groppi}}: $1",
+       "listgrouprights-removegroup-self": "O poeu rimoeuvise {{PLURAL:$2|da-o groppo|da-i groppi}}: $1",
+       "listgrouprights-addgroup-self-all": "O poeu azonzise a tutti i groppi",
+       "listgrouprights-removegroup-self-all": "O poeu rimoeuvise da tutti i groppi",
+       "listgrouprights-namespaceprotection-header": "Restriçioin pe namespace",
+       "listgrouprights-namespaceprotection-namespace": "Namespace",
+       "listgrouprights-namespaceprotection-restrictedto": "Drito ch'o consente a l'utente de modificâ",
+       "listgrants": "Assegnaçioin",
+       "listgrants-summary": "De seguito l'è riportou un elenco de concescioin, co-i so driti utente associæ. I utenti poeuan aotorizzâ e appricaçioin a doeuviâ a proppia utença, ma con di aotorizzaçioin limitæ in base a-e assegnaçioin che l'utente o l'ha dæto a l'appricaçion. Tuttavia, un'appricaçion ch'a l'agisce pe conto de 'n utente a no poeu effettivamente doeuviâ i driti di quæ l'utente o no dispon-e.\nGhe poriæ ese di [[{{MediaWiki:Listgrouprights-helppage}}|urteioî informaçioin]] in scî driti individoali.",
+       "listgrants-grant": "Assegnaçion",
+       "listgrants-rights": "Driti",
+       "trackingcategories": "Categorie de monitoraggio",
+       "trackingcategories-summary": "Questa pagina a l'elenca e categorie de monitoraggio che vegnan popolæ aotomaticamente da-o software MediaWiki. I so nommi poeuan ese cangiæ modificando i relativi messaggi de scistema into namespace {{ns:8}}.",
+       "trackingcategories-msg": "Categoria de monitoraggio",
+       "trackingcategories-name": "Nomme do messaggio",
+       "trackingcategories-desc": "Critei pe l'incluxon intaa categoria",
+       "restricted-displaytitle-ignored": "Pagine con di tittoli da vixualizzâ ignoræ",
+       "restricted-displaytitle-ignored-desc": "A pagina a g'ha un <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> ignorou perché a no l'è equivalente a l'effettivo tittolo da pagina.",
+       "noindex-category-desc": "A pagina a no l'è indiçizzâ da-i robot perché a conten a paola magica <code><nowiki>__NOINDEX__</nowiki></code> e a s'atroeuva inte 'n namespace donde tâ flag a l'è consentia.",
+       "index-category-desc": "A pagina a conten <code><nowiki>__INDEX__</nowiki></code> (e a s'atroeuva inte 'n namespace donde tâ flag a l'è consentia) e quindi a l'è indiçizâ da-i robot, sci ben che normalmente a no-o saieiva.",
+       "post-expand-template-inclusion-category-desc": "A dimenscion da pagina a saiâ ciù grande de <code>$wgMaxArticleSize</code> doppo avei espanso tutti i template, e coscì çerti template no son stæti espansci.",
+       "post-expand-template-argument-category-desc": "A pagina a saiâ ciù grande de <code>$wgMaxArticleSize</code> doppo aver espanso o parametro de un template (quarcosa tra træ parentexi graffe, comme <code>{{{Foo}}}</code>).",
+       "expensive-parserfunction-category-desc": "A pagina a l'adoeuvia troppe fonçioin parser (come <code>#ifexist</code>). Amia [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "A pagina a conten un collegamento interotto a un file (un collegamento pe incorpoâ un file quande questo o no l'existe).",
+       "hidden-category-category-desc": "Questa categoria a conten <code><nowiki>__HIDDENCAT__</nowiki></code> inta so pagina, o quæ o l'impedisce ch'a segge mostrâ, in moddo predefinio, into riquaddro di collegamenti a-e categorie de pagine.",
+       "trackingcategories-nodesc": "Nisciun-a descriçion disponibbile.",
+       "trackingcategories-disabled": "A categoria a l'è disabilitâ",
+       "mailnologin": "Nisciun adreçço a chi mandâ o messaggio",
+       "mailnologintext": "Pe inviâ di messaggi e-mail a di atri utenti l'è necessaio [[Special:UserLogin|accede a-o scito]] e avei registrou un adreçço vallido inte proppie [[Special:Preferences|preferençe]].",
        "emailuser": "Invia 'na email a st'utente chi",
-       "defemailsubject": "{{SITENAME}} posta elettronega",
-       "noemailtitle": "Nisciûn conto e-mail",
-       "emailfrom": "Da",
-       "emailto": "A",
-       "emailsubject": "Argumento",
-       "emailmessage": "Comunicaçion",
+       "emailuser-title-target": "Invia un'email a questo {{GENDER:$1|utente}}",
+       "emailuser-title-notarget": "Invia una email a un utente",
+       "emailpagetext": "Doeuvia o moddulo sottostante pe inviâ un messaggio e-mail a l'{{GENDER:$1|utente}} indicou. L'adreçço speçificou inte [[Special:Preferences|preferençe]] do mittente o l'appariâ into campo \"Da:\" do messaggio pe consentî a-o destinataio de risponde direttamente.",
+       "defemailsubject": "Messaggio da {{SITENAME}} da l'utente \"$1\"",
+       "usermaildisabled": "e-mail utente disabilitâ",
+       "usermaildisabledtext": "No l'è poscibbile inviâ de e-mail a di atri utenti insce questo wiki",
+       "noemailtitle": "Nisciun adreççoo e-mail",
+       "noemailtext": "Questo utente o no l'ha indicou un adreçço e-mail vallido.",
+       "nowikiemailtext": "Questo utente o l'ha scerto de no riçeive messaggi de posta elettronica da-i atri utenti.",
+       "emailnotarget": "Nomme utente do destinataio inexistente o non vallido.",
+       "emailtarget": "Inseisci o nomme utente do destinataio",
+       "emailusername": "Nomme utente",
+       "emailusernamesubmit": "Invia",
+       "email-legend": "Invia un messaggio e-mail a un atro utente de {{SITENAME}}",
+       "emailfrom": "Da:",
+       "emailto": "A:",
+       "emailsubject": "Sogetto:",
+       "emailmessage": "Messaggio:",
        "emailsend": "Spèdi",
        "emailccme": "Mandame unn-a copia do messagio co unn-a lettìa elettronega.",
+       "emailccsubject": "Coppia do messaggio inviou a $1: $2",
        "emailsent": "Lettìa elettronega spèdïa",
-       "emailsenttext": "A teua lettìa elettronega a l'è stæta spèdïa.",
+       "emailsenttext": "A teu lettìa elettronega a l'è stæta spedïa.",
+       "emailuserfooter": "Questa email a l'è stæta {{GENDER:$1|inviâ}} da $1 a {{GENDER:$2|$2}} a traverso a fonçion \"{{int:emailuser}}\" insce {{SITENAME}}.",
+       "usermessage-summary": "Messaggio de scistema",
+       "usermessage-editor": "Messaggê de scistema",
        "watchlist": "Sotta osservassion",
        "mywatchlist": "Sotta oservaçion",
        "watchlistfor2": "Pe $1 $2",
-       "watchnologin": "Non ti t'æ entroö",
-       "addedwatchtext": "A paggina \"[[:$1]]\" a l'è stæta azzonta a-a pròpia [[Special:Watchlist|lista in osservaçion]]. De chì in avanti, i cangiamenti fæti a-a paggina e a-a sêu discûxon sajàn missi in lista lì; o tittolo da paggina o sajà scrîo in '''grascietto''' inta paggina di [[Special:RecentChanges|ûrtimi cangiamenti]] coscì ti o veddi megio. Se ti vêu eliminâla da-a lista in osservaçion ciû târdi, sciacca \"no seguî\" inscia barra de d'âto.",
-       "removedwatchtext": "A paggina \"[[:$1]]\" a l'è stæta scassâa da-a têu lista in osservaçion.",
+       "nowatchlist": "A lista di öservæ speciali a l'è voeua.",
+       "watchlistanontext": "Pe vixualizzâ e modificâ l'elenco di öservæ l'è necessaio eseguî l'accesso.",
+       "watchnologin": "Accesso non effettuou",
+       "addwatch": "Azonzi a-a lista sotta öservaçion",
+       "addedwatchtext": "\"[[:$1]]\" e a so paggina de discuscion son stæte azonte a-a proppia [[Special:Watchlist|lista di öservæ]].",
+       "addedwatchtext-short": "A pagina \"$1\" a l'è stæata azonta a-a proppia lista di öservæ.",
+       "removewatch": "Rimoeuvi da-i öservæ speciali",
+       "removedwatchtext": "\"[[:$1]]\" e a so paggina de discuscion son stæte rimosse da-a proppia [[Special:Watchlist|lista di öservæ]].",
+       "removedwatchtext-short": "A pagina \"$1\" a l'è stæata rimossa da-a proppia lista di öservæ.",
        "watch": "Metti sotta oservaçion",
        "watchthispage": "Vigilâ 'sta paggina",
        "unwatch": "Leva da sott'oservaçion",
-       "watchlist-details": "A lista d'oservaçión speçiâle a contegne {{PLURAL:$1|ina pàgina (co-a seu pàgina de discusción)|$1 de pàgine (co-e so pàgine de discusción)}}.",
-       "wlshowlast": "Famme vedde e ûrtime $1 ôe $2 giorni",
+       "unwatchthispage": "Smetti de öservâ",
+       "notanarticle": "Questa paggina a no l'è una voxe",
+       "notvisiblerev": "L'urtima revixon a l'è stæta scassâ",
+       "watchlist-details": "A lista di öservæ speciali a conten {{PLURAL:$1|una pagina (e a rispettiva pagina de discuscion)|$1 pagine (e e rispettive pagine de discuscion)}}.",
+       "wlheader-enotif": "A notiffica via email a l'è attiva.",
+       "wlheader-showupdated": "E paggine che son stæte modificæ doppo l'urtima vixita son evidençiæ in '''grascetto'''.",
+       "wlnote": "De sotta {{PLURAL:$1|a l'è elencâ a modifica ciù reçente apportâ|son elencæ e <strong>$1</strong> modifiche ciù reçente apportæ}} {{PLURAL:$2|inte l'urtima oa|inti urtime <strong>$2</strong> oe}}; i dæti son aggiornæ a-e $4 do $3.",
+       "wlshowlast": "Mostra i urtime $1 oe $2 giorni",
+       "watchlist-hide": "Ascondi",
+       "watchlist-submit": "Mostra",
+       "wlshowtime": "Periodo de tempo da vixualizzâ:",
+       "wlshowhideminor": "cangiamenti menoî",
+       "wlshowhidebots": "Bot",
+       "wlshowhideliu": "utenti registræ",
+       "wlshowhideanons": "utenti anonnimi",
+       "wlshowhidepatr": "cangiaménti controllæ",
+       "wlshowhidemine": "e mæ modiffiche",
+       "wlshowhidecategorization": "categorizzaçion da paggina",
        "watchlist-options": "Inpostaçioìn di oservæ speciâli",
        "watching": "Inti osservæ speçiâli...",
        "unwatching": "Scassâ da-i osservæ speçiâli",
+       "watcherrortext": "S'è veificou 'n errô durante a modifica di öservæ pe \"$1\".",
+       "enotif_reset": "Marca tutte-e paggine comme za vixitæ",
+       "enotif_impersonal_salutation": "Utente de {{SITENAME}}",
+       "enotif_subject_deleted": "A paggina $1 de {{SITENAME}} a l'è stæta scassâ da {{gender:$2|$2}}",
+       "enotif_subject_created": "A pagina $1 de {{SITENAME}} a l'è stæta creâ da {{gender:$2|$2}}",
+       "enotif_subject_moved": "A pagina $1 de {{SITENAME}} a l'è stæta mesciâ da {{gender:$2|$2}}",
+       "enotif_subject_restored": "A paggina $1 de {{SITENAME}} a l'è stæta ripristinâ da {{gender:$2|$2}}",
+       "enotif_subject_changed": "A pagina $1 de {{SITENAME}} a l'è stæta modificâ da {{gender:$2|$2}}",
+       "enotif_body_intro_deleted": "A pagina $1 de {{SITENAME}} a l'è stæta scassâ da {{gender:$2|$2}} o $PAGEEDITDATE (amia $3 pe-a verscion attoale).",
+       "enotif_body_intro_created": "A pagina $1 de {{SITENAME}} a l'è stæta creâ da {{gender:$2|$2}} o $PAGEEDITDATE, amia $3 pe-a verscion attoale.",
+       "enotif_body_intro_moved": "A pagina $1 de {{SITENAME}} a l'è stæta mesciâ da {{gender:$2|$2}} o $PAGEEDITDATE, amia $3 pe-a verscion attoale.",
+       "enotif_body_intro_restored": "A pagina $1 de {{SITENAME}} a l'è stæta ripristinâ da {{gender:$2|$2}} o $PAGEEDITDATE, amia $3 pe-a verscion attoale.",
+       "enotif_body_intro_changed": "A pagina $1 de {{SITENAME}} a l'è stæta modificâ da {{gender:$2|$2}} o $PAGEEDITDATE, amia $3 pe-a verscion attoale.",
+       "enotif_lastvisited": "Vixita $1 pe vedde tutte e modiffiche da l'urtima vixita.",
+       "enotif_lastdiff": "Vixita $1 pe vedde a modiffica.",
        "enotif_anon_editor": "ûtente anònnimo $1",
+       "enotif_body": "Gentî $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nÖgetto de l'intervento, inseio da l'aotô: $PAGESUMMARY $PAGEMINOREDIT\n\nContatta l'aotô:\nvia posta eletronnica: $PAGEEDITOR_EMAIL\nin sciô scito: $PAGEEDITOR_WIKI\n\nNo saiâ mandou atre notiffiche in caxo de urteioî attivitæ, se no ti vixiti a pagina doppo avei effettuou l'accesso. Inoltre, l'è poscibbile modificâ e impostaçioin de notiffica pe tutte e paggine inta lista dei öservæ speciali.\n\nO scistema de notiffica de {{SITENAME}}, a-o to serviççio\n\n--\nPe modificâ e impostaçioin de notiffiche via posta elettronnica, vixita \n{{canonicalurl:{{#special:Preferences}}}}\n\nPe modificâ a lista di öservæ speciali, vixita \n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPe rimoeuve a pagina da-a lista di öservæ speciali, vixita\n$UNWATCHURL\n\nPe commentâ e riçeive agiutto:\n$HELPPAGE",
        "changed": "cangiâ",
        "deletepage": "Scassa a paggina",
+       "confirm": "Conferma",
+       "excontent": "o contegnuo o l'ea: '$1'",
+       "excontentauthor": "o contegnuo o l'ea: '$1', e l'unnico contributô o l'ea \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|msg]])",
+       "exbeforeblank": "O contegnuo primma do svoeuamento o l'ea: '$1'",
        "delete-confirm": "Scassa \"$1\"",
        "delete-legend": "Scassa",
-       "historywarning": "Attension: A paggina c'a se sta pe scassâ a g'ha 'na cronologîa:",
+       "historywarning": "'''Attençion:''' a paggina che ti stæ pe scassâ a g'ha una cronologia con $1 {{PLURAL:$1|verscion|verscioin}}:",
+       "historyaction-submit": "Mostra",
        "confirmdeletetext": "Ti stæ pe scassâ pe sempre da-o database 'na paggina ò 'n'immaggine, assemme a tûtta a sêu cronologîa. Pe cortexia, conferma che davvei ti vêu andâ avanti con quella cancellassion, che ti capisci perfettamente e conseguense de 'st'assion e che a s'adatta a-e linnie guidda stabilîe in [[{{MediaWiki:Policy-url}}]].",
        "actioncomplete": "Açion completâ",
        "actionfailed": "Açión falîa",
        "deletedtext": "A paggina \"$1\" a l'è stæta scassâ. Consultâ o $2 pe 'na lista de paggine scassæ de reçente.",
        "dellogpage": "Registro de cose scassæ",
+       "dellogpagetext": "De sotta gh'è 'na lista co-e paggine scassæ ciu de reçente.",
+       "deletionlog": "registro de scassatue",
+       "reverted": "Ripristinou a verscion precedente",
        "deletecomment": "Raxon:",
        "deleteotherreason": "Ûn âtro motivo",
        "deletereasonotherlist": "Ûnn'âtra raxon",
+       "deletereason-dropdown": "* Motivaçioin ciù comun-e pe-a scançellaçion\n** Spam\n** Vandalismo\n** Violaçion do drito d'aotô\n** Recesta de l'aotô\n** Redirect rotto",
+       "delete-edit-reasonlist": "Modiffica e raxoin do scassamento",
+       "delete-toobig": "A cronologia de questa pagina a l'è ben longa (oltre $1 {{PLURAL:$1|verscion|verscioin}}). A so scançellaçion a l'è stæta limitâ pe evitâ de creâ açidentalmente di problemi de fonçionamento a-o database de {{SITENAME}}.",
+       "delete-warning-toobig": "A cronologia de questa pagina a l'è ben longa (oltre $1 {{PLURAL:$1|verscion|verscioin}}). A so scançellaçion a poeu creâ di problemi de fonçionamento a-o database do {{SITENAME}}; procede con caotella.",
+       "deleteprotected": "No ti poeu scassâ questa paggina perché a l'è stæta protetta.",
+       "deleting-backlinks-warning": "<strong>Attençion:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|di atre pagine]] contengnan di collegamenti o de incluxoin a-a paggina che t'ê aproeuvo a scassâ.",
+       "rollback": "Annulla e modiffiche",
        "rollbacklink": "rollback",
        "rollbacklinkcount": "rollback de {{PLURAL:$1|una modiffica|$1 modiffiche}}",
+       "rollbacklinkcount-morethan": "rollback de ciù de {{PLURAL:$1|una modiffica|$1 modiffiche}}",
+       "rollbackfailed": "Rollback fallio",
+       "rollback-missingparam": "Parammetri obrigatoi mancanti inta recesta.",
        "cantrollback": "No se peu tornâ inderê; l'utente ch'o l'ha fæto quelle modiffiche o l'è stæto l'unico contribuente.",
-       "alreadyrolled": "O no se peû tornâ inderê a-i ûrtimi cangiamenti da pagina [[:$1]]\nda [[User:$2|$2]] ([[User talk:$2|Ciæti]]); quarche âtro\no l'à cangiâ ò o l'è zà tornòu inderê.\nL'ûrtimo cangiamento o ghe l'à fæto [[User:$3|$3]] ([[User talk:$3|Ciæti]]).",
-       "revertpage": "E modificaçioin de [[Special:Contributions/$2|$2]] ([[User talk:$2|Ciæti]]) son stæte eliminæ; riportæ a verscion de primma de [[User:$1|$1]]",
+       "alreadyrolled": "No l'è poscibbile annullâ e modiffiche apportæ a-a pagina [[:$1]] da parte de [[User:$2|$2]] ([[User talk:$2|discuscion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); un atro utente o l'ha zà modificou a pagina oppù o l'ha effettuou o rollback.\n\nA modifica ciù reçente a.a paggina a l'è stæta apportâ da [[User:$3|$3]] ([[User talk:$3|discuscion]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "editcomment": "L'ogetto da modiffica o l'ea: <em>$1</em>.",
+       "revertpage": "Annullou e modiffiche de [[Special:Contributions/$2|$2]] ([[User talk:$2|discuscion]]), riportâ a-a verscion precedente de [[User:$1|$1]]",
+       "revertpage-nouser": "Annullou e modiffiche de un utente ascoso, riportâ a-a verscion precedente de {{GENDER:$1|[[User:$1|$1]]}}",
+       "rollback-success": "Annullou e modiffiche de $1; paggina riportâ a l'urtima verscion de $2.",
+       "rollback-success-notify": "Annullou e modiffiche de $1;\npaggina riportâ a l'urtima revixon de $2. [$3 Mostra e modiffiche]",
+       "sessionfailure-title": "Sescion fallia",
+       "sessionfailure": "S'è veificou un problema inta sescion ch'a l'identiffica l'accesso; o scistema o no l'ha eseguio o comando impartio pe precauçion. Torna a-a paggina precedente co-o tasto 'Inderê' do to browser, recarega a paggina e riproeuva.",
+       "changecontentmodel": "Cangia o modello de contegnuo de 'na paggina",
+       "changecontentmodel-legend": "Cangia o modello de contegnuo",
+       "changecontentmodel-title-label": "Tittolo da paggina",
+       "changecontentmodel-model-label": "Noeuvo modello de contegnuo",
+       "changecontentmodel-reason-label": "Raxon:",
+       "changecontentmodel-submit": "Cangia",
+       "changecontentmodel-success-title": "O modello de contegnuo o l'è stæto modificou",
+       "changecontentmodel-success-text": "O tipo de contegnuo de [[:$1]] o l'è stæto modificou.",
+       "changecontentmodel-cannot-convert": "O contegnuo de [[:$1]] o no poeu ese convertio inte 'n tipo de $2.",
+       "changecontentmodel-nodirectediting": "O modello de contegnuo $1 o no supporta a modiffica diretta",
+       "changecontentmodel-emptymodels-title": "Nisciun modello de contegnuo disponibbile",
+       "changecontentmodel-emptymodels-text": "O contegnuo de [[:$1]] o no poeu ese convertio inte nisciun tipo.",
+       "log-name-contentmodel": "Modiffiche do modello di contegnui",
+       "log-description-contentmodel": "Eventi relativi a-o modello de contegnuo de 'na paggina",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|l'ha creou}} a paggina $3 doeuviando un modello de contegnuo non predefinio \"$5\"",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|l'ha modificou}} o modello de contegnuo da paggina $3 da \"$4\" a \"$5\"",
+       "logentry-contentmodel-change-revertlink": "ripristina",
+       "logentry-contentmodel-change-revert": "ripristina",
        "protectlogpage": "Protessioin",
+       "protectlogtext": "De sotta gh'è 'na lista di cangi a-e proteçioin de paggine.\nAmia a [[Special:ProtectedPages|lista de pagine protette]] pe l'elenco de proteçioin de pagina attoalmente attive.",
        "protectedarticle": "o l'à protetto \"[[$1]]\"",
+       "modifiedarticleprotection": "ha modificou o livello de proteçion de \"[[$1]]\"",
+       "unprotectedarticle": "o l'ha sprotezuo \"[[$1]]\"",
+       "movedarticleprotection": "o l'ha mesciou a proteçion da \"[[$2]]\" a \"[[$1]]\"",
+       "protect-title": "Cangio do livello de proteçion pe \"$1\"",
+       "protect-title-notallowed": "Veddi o livello de proteçion de \" $1 \"",
        "prot_1movedto2": "[[$1]] mesciòu a [[$2]]",
+       "protect-badnamespace-title": "Namespace non protezibbile",
+       "protect-badnamespace-text": "E pagine de questo namespace no poeuan ese protezue.",
+       "protect-norestrictiontypes-text": "Questa pagina a no poeu ese protetta perché non gh'è arcun tipo de restriçion disponibbile.",
+       "protect-norestrictiontypes-title": "Paggina non protezibbile",
        "protect-legend": "Confermâ protession",
        "protectcomment": "Raxon:",
        "protectexpiry": "Scadensa:",
        "protect_expiry_invalid": "Scadensa invalida.",
        "protect_expiry_old": "Dæta de scadensa into passòu.",
+       "protect-unchain-permissions": "Desblocca di urteioî opçioin de proteçion",
        "protect-text": "Chì o l'è poscibbile vedde e modificâ o livello de protession pe-a paggina '''$1'''.",
+       "protect-locked-blocked": "No ti poeu cangiâ i livelli de proteçion quande gh'è un blocco. E impostaçioin corrente pe-a pagina son '''$1''':",
+       "protect-locked-dblock": "Imposcibile modificâ i livelli de proteçion durante un blocco do database.\nE impostaçioin corrente pe-a paggina son '''$1''':",
        "protect-locked-access": "No ti g'hæ permisso pe modificâ i livelli de protession da paggina.\nQueste son e impostassioîn correnti pe 'sta paggina ('''$1'''):",
-       "protect-cascadeon": "Pe-o momento 'sta paggina chì a l'è bloccâa perché a l'è inclûsa {{PLURAL:$1|inta paggina indicâa apprêuvo, pe-a quæ|inte paggine indicæ apprêuvo, pe-e quæ}} a l'è attiva a protession recorsciva. O se pêu modificâ o livello de protession individuâle da paggina, ma l'impostassioîn derivanti da-a protession recorsciva no sajàn modificæ.",
-       "protect-default": "(predefinîo)",
-       "protect-fallback": "Besêugna avei permisso \"$1\"",
-       "protect-level-autoconfirmed": "Solo ûtenti registræ",
-       "protect-level-sysop": "Solo amministratoî",
+       "protect-cascadeon": "A-o momento questa pagina a l'è bloccâ perché inclusa {{PLURAL:$1|inta pagina indicâ de seguito, pe-a quæ|inte pagine indicæ de seguito, pe-e quæ}} l'è attiva a proteçion ricorsciva.\nE modifiche a-o livello de proteçion individoale da pagina, no avian effetto in sce-e impostaçioin derivante da-a proteçion ricorsciva.",
+       "protect-default": "Aotorizza tutti i utenti",
+       "protect-fallback": "Consentio solo a-i utenti con permisso \"$1\"",
+       "protect-level-autoconfirmed": "Consentio solo a-i utenti aotoconvalidæ",
+       "protect-level-sysop": "Consentio solo a-i amministratoî",
        "protect-summary-cascade": "recorsciva",
        "protect-expiring": "scadensa: $1 (UTC)",
+       "protect-expiring-local": "o descazze o $1",
+       "protect-expiry-indefinite": "indefinio",
        "protect-cascade": "Protession recorsciva (estende a protession a tûtte e paggine inclûse in questa chì).",
        "protect-cantedit": "Ti no ti pêu modificâ i livelli de protession pe-a paggina se no ti g'hæ i permissi pe modificâ a paggina mæxima.",
-       "protect-expiry-options": "2 ôe:2 hours,1 giorno:1 day,3 giorni:3 days,1 settemann-a:1 week,2 settemann-e:2 weeks,1 meise:1 month,3 meixi:3 months,6 meixi:6 months,1 anno:1 year,infinîo:infinite",
+       "protect-othertime": "Duata non in elenco:",
+       "protect-othertime-op": "duata non in elenco",
+       "protect-existing-expiry": "Scadença attoale: $2, $3",
+       "protect-existing-expiry-infinity": "Scadença attoale: infinio",
+       "protect-otherreason": "Atri motivi/detaggi:",
+       "protect-otherreason-op": "Un'atra raxon",
+       "protect-dropdown": "*Motivi comun de proteçion\n** Reiteræ vandalismi\n** Reiteræ inseimenti de spam\n** Guæra de modiffiche contra-produxente\n** Paggina con ato traffego",
+       "protect-edit-reasonlist": "Modiffica e raxoin pe-a proteçion",
+       "protect-expiry-options": "1 oa:1 hour,1 giorno:1 day,1 setteman-a:1 week,2 setteman-e:2 weeks,1 meise:1 month,3 meixi:3 months,6 meixi:6 months,1 anno:1 year,infinio:infinite",
        "restriction-type": "Permisso",
        "restriction-level": "Livello de restrission",
+       "minimum-size": "Dimenscion minnima",
+       "maximum-size": "Dimenscion mascima:",
+       "pagesize": "(byte)",
        "restriction-edit": "Cangia",
        "restriction-move": "Mescia",
+       "restriction-create": "Crea",
+       "restriction-upload": "Carrega",
+       "restriction-level-sysop": "protetta",
+       "restriction-level-autoconfirmed": "semi-protezua",
        "restriction-level-all": "Tutti i livelli",
        "undelete": "Amîa e paggine scassæ",
+       "undeletepage": "Veddi e recuppera e pagine scançellæ",
+       "undeletepagetitle": "'''Quanto segue o l'è composto da de revixoin scassæ de [[:$1|$1]]'''.",
+       "viewdeletedpage": "Veddi e paggine scassæ",
+       "undeletepagetext": "{{PLURAL:$1|A seguente pagina a l'è stæta scassâ, ma a l'è ancon in archivio e pertanto a poeu ese recuperâ|Le seguente pagine son stæte scassæ, ma son ancon in archivio e pertanto poeuan ese recuperæ}}. L'archivio o poeu ese vuou periodicamente.",
+       "undelete-fieldset-title": "Ripristina revixoin",
+       "undeleteextrahelp": "Pe recuperâ l'intrega cronologia da pagina, lascia tutte e caselle deseleçionæ e fanni clic insce '''''{{int:undeletebtn}}'''''.\nPe effettuâ un ripristino selettivo, seleçion-a e caselle corrispondente a-e verscioin da ripristinâ e fanni clic insce '''''{{int:undeletebtn}}'''''.",
+       "undeleterevisions": "{{PLURAL:$1|Una revixon scassâ|$1 revixoin scassæ}}",
+       "undeletehistory": "Recuperando questa pagina, tutte e so verscioin saian ripristinæ inta relativa cronologia.\nSe doppo la scançellaçione l'è stato creou una noeuva pagina co-o mæximo tittolo, e verscioin recuperæ saian inseie inta cronologia precedente.",
+       "undeleterevdel": "O ripristino o no saiâ effettuou s'o determina a scançellaçion parçiâ da verscion attoale da pagina o do file interessou. In tâ caxo, l'è necessaio smarcâ o levâ l'oscuramento da-e verscioin scassæ ciù reçenti.",
+       "undeletehistorynoadmin": "Questa pagina a l'è stæta scassâ.\nO motivo da scassatua o l'è mostrou chì sotta, insemme a-i detaggi de l'utente ch'o l'ha modificou questa pagina primma da scassatua.\nO testo contegnuo inte verscioin scassæ o l'è disponibile solo a-i amministratoî.",
+       "undelete-revision": "Verscion scassâ da pagina $1, inseia o $4 a $5 da $3:",
+       "undeleterevision-missing": "Verscion errâ o mancante. O collegamento o l'è errou o dunque a verscion a l'è stæta zà ripristinâ ò eliminâ da l'archivvio.",
+       "undelete-nodiff": "No l'è stæto trovou nisciun-a verscion precedente.",
        "undeletebtn": "Ristorâ",
        "undeletelink": "fanni védde/repìggia",
        "undeleteviewlink": "fanni védde",
-       "cannotundelete": "O repiggio de i dæti o non l'è riuscïo (i peun ese za stæti repiggiæ da quarchedun ätro).",
+       "undeleteinvert": "Inverti a seleçion",
+       "undeletecomment": "Raxon:",
+       "undeletedrevisions": "{{PLURAL:$1|Una verscion recuperâ|$1 verscioin recuperæ}}",
+       "undeletedrevisions-files": "{{PLURAL:$1|Una verscion|$1 verscioin}} e $2 file recuperæ",
+       "undeletedfiles": "{{PLURAL:$1|Un file recuperou|$1 file recuperæ}}",
+       "cannotundelete": "Ripristino non riuscio:\n$1",
+       "undeletedpage": "'''A pagina $1 a l'è stæta recuperâ'''\n\nConsurta o [[Special:Log/delete|registro de scançellaçioin]] pe vedde e scançellaçioin e i recupperi ciù reçente.",
+       "undelete-header": "Consurta o [[Special:Log/delete|registro de scançellaçioin]] pe vedde e scassatue ciù reçente.",
+       "undelete-search-title": "Çerca inte pagine scassæ",
+       "undelete-search-box": "Çerca e paggine scassæ",
+       "undelete-search-prefix": "Mostra e paggine che començan con:",
+       "undelete-search-submit": "Çerca",
+       "undelete-no-results": "Nisciun-a pagina corrispondente inte l'archivio de scançellaçioin.",
+       "undelete-filename-mismatch": "Imposcibbile annullâ a scançellaçion da verscion do file con timestamp $1: nomme do file non corrispondente.",
        "undelete-bad-store-key": "No se peu repiggiâ o file co-a dæta $1: o file o no gh'ea za ciu primma d'ese scassou.",
        "undelete-cleanup-error": "Errô into scassâ o file d'archivio non utilizzòu \"$1\".",
+       "undelete-missing-filearchive": "Imposcibile ripristinâ l'ID $1 de l'archivio file in quanto o no l'è presente into database. O poriæ ese stæto za ripristinou.",
+       "undelete-error": "Errô into ripristino da pagina",
        "undelete-error-short": "Errô repiggiando i dæti do file \"$1\".",
        "undelete-error-long": "Gh'è stæto di erroî inte l'annullâ a cançellaçion do file:\n\n$1",
+       "undelete-show-file-confirm": "T'ê seguo de voei amiâ a verscion scassâ do file \"<nowiki>$1</nowiki>\" do $2 a $3?",
+       "undelete-show-file-submit": "Sci",
        "namespace": "Namespace:",
        "invert": "Invertî a seleçión",
        "tooltip-invert": "Selession-a sta casella pe asconde e modiffiche a-e paggine a l'interno do namespace selessionou (e o namespace associou, se selessionou)",
+       "tooltip-whatlinkshere-invert": "Marca sta casella pe asconde i collegamenti da-e pagine a l'interno do namespace seleçionou",
        "namespace_association": "Namespace associou",
        "tooltip-namespace_association": "Selession-a sta casella pe includde ascì a paggina de discuscion ò l'oggetto do namespace associou co-o namespace selessionou",
        "blanknamespace": "(Prinçipâ)",
        "contributions-title": "Contribuçioìn de $1",
        "mycontris": "Contribuçioin",
        "anoncontribs": "Contribuçioin",
-       "contribsub2": "Pe $1 ($2)",
-       "uctop": "(ûrtima pe-a paggina)",
+       "contribsub2": "Pe {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "L'utença \"$1\" a no l'è registrâ.",
+       "nocontribs": "Cangi che soddisfan i critei de riçerca no se n'è atrovou.",
+       "uctop": "(attoale)",
        "month": "Partindo da-o meize (e precedénti):",
        "year": "Partindo da l'anno (e precedenti):",
        "sp-contributions-newbies": "Fanni védde sôlo e contribuçioìn di nêuvi utenti",
        "sp-contributions-newbies-sub": "Pe i nêuvi ûtenti",
+       "sp-contributions-newbies-title": "Contribuçioin di noeuvi utenti",
        "sp-contributions-blocklog": "Blòcchi",
+       "sp-contributions-suppresslog": "contributi utente soppresci",
+       "sp-contributions-deleted": "contributi utente scassæ",
        "sp-contributions-uploads": "caregaménti",
        "sp-contributions-logs": "log",
        "sp-contributions-talk": "Ciæti",
+       "sp-contributions-userrights": "manezzo di driti di utenti",
+       "sp-contributions-blocked-notice": "St'utente o l'è attualmente bloccòu.\nL'urtimo elemento into registro di blocchi o l'è riportòu chì de sotta pe rifeimento:",
+       "sp-contributions-blocked-notice-anon": "St'addreçço IP o l'è attoalmente bloccòu.\nL'urtimo elemento into registro di blocchi o l'è riportòu chì de sotta pe rifeimento:",
        "sp-contributions-search": "Riçerca contribuçioìn",
        "sp-contributions-username": "Indirìsso IP ò nómme utente:",
        "sp-contributions-toponly": "Fanni védde sôlo i cangiaménti ch'en i ùrtime revixoìn da pàgina",
+       "sp-contributions-newonly": "Fanni védde sôlo i cangiaménti ch'en de creaçioin de pàgina",
+       "sp-contributions-hideminor": "Ascondi e modifiche menoî",
        "sp-contributions-submit": "Çerca",
        "whatlinkshere": "Cöse se colega chì",
        "whatlinkshere-title": "Pàgine c'apontàn a $1",
        "whatlinkshere-page": "Pàgina:",
        "linkshere": "E pàgine segoenti apontan a '''[[:$1]]''':",
        "nolinkshere": "Nisciùnn-a pàgina a se collega con '''[[:$1]]'''.",
+       "nolinkshere-ns": "Pagine ch'apontan a '''[[:$1]]''' into namespace seleçionou no ghe n'è.",
        "isredirect": "Paggina de rindirissamento",
        "istemplate": "Incluxon",
        "isimage": "Colegamento a file",
        "whatlinkshere-next": "{{PLURAL:$1|sûccescivo|sûccescivi $1}}",
        "whatlinkshere-links": "← colegaménti",
        "whatlinkshere-hideredirs": "$1 i rendirissamenti",
-       "whatlinkshere-hidetrans": "$1 Incluxon",
+       "whatlinkshere-hidetrans": "$1 Incluxoin",
        "whatlinkshere-hidelinks": "$1 colegaménti",
-       "whatlinkshere-hideimages": "$1 colegaménti di file",
+       "whatlinkshere-hideimages": "$1 colegamenti da file",
        "whatlinkshere-filters": "Filtri",
-       "blockip": "Blocca l'ûtente",
+       "whatlinkshere-submit": "Vanni",
+       "autoblockid": "Aotobrocco #$1",
+       "block": "Blocca utente",
+       "unblock": "Desblocca utente",
+       "blockip": "Blocca {{GENDER:$1|utente}}",
+       "blockip-legend": "Blocca l'utente",
+       "blockiptext": "Doeuvia o moddulo sottostante pe bloccâ l'accesso in scrittua a un speciffico addreçço IP ò a un utente registrou.\nO blocco o dev'ese doeuviou pe prevegnî di atti de vandalismo e in streita öservança de [[{{MediaWiki:Policy-url}}|reggole de {{SITENAME}}]].\nIndica o motivo speçiffico pe-o quæ se procede a-o blocco (presempio, çitando i tittoli di eventuæ paggine ögetto de vandalismo).\nTi poeu bloccâ di ntervalli de IP doeuviando a scintasci [https://it.wikipedia.org/wiki/CIDR CIDR]; l'intervallo ciù ampio consentio o l'è /$1 pe IPv4 e /$2 pe IPv6.",
+       "ipaddressorusername": "Adreçço IP ò nómme utente:",
+       "ipbexpiry": "Scadença:",
        "ipbreason": "Raxon:",
+       "ipbreason-dropdown": "*Motivaçioni ciù comun-e pe-i blocchi\n** Inseimento de informaçioin fase\n** Rimoçion di contegnti da-e paggine\n** Collegamenti promoçionæ a di sciti esterni\n** Inseimento di contegnui privi de senso\n** Comportamenti intimidatoi ò molestie\n** Uso indebbito de utençe murtiple\n** Nomme utente inaçettabbile",
+       "ipb-hardblock": "Impedisci a-i utenti registræ de contribuî da questo adreçço IP",
+       "ipbcreateaccount": "Impedisci a registraçion",
+       "ipbemailban": "Impedisci a l'utente l'invio di email",
+       "ipbenableautoblock": "Blocca aotomaticamente l'urtimo adreçço IP doeuviou da l'utente e i succescivi da-i quæ tentan e modiffiche",
+       "ipbsubmit": "Blocca st'utente",
+       "ipbother": "Duata non in elenco:",
        "ipboptions": "2 ôe:2 hours,1 giorno:1 day,3 giorni:3 days,1 settemann-a:1 week,2 settemann-e:2 weeks,1 meise:1 month,3 meixi:3 months,6 meixi:6 months,1 anno:1 year,infinîo:infinite",
+       "ipbhidename": "Ascondi o nomme utente da-e modiffiche e da-i elenchi.",
+       "ipbwatchuser": "Controlla e pagine e-e discuscioin utente de questo utente",
+       "ipb-disableusertalk": "Impedisci a questo utente de modificâ a proppia paggina de discuscion dementre ch'o l'è bloccou",
+       "ipb-change-block": "Re-blocca l'utente con queste impostaçioin",
+       "ipb-confirm": "Conferma o blocco",
        "badipaddress": "Indirisso IP non valido",
        "blockipsuccesssub": "Blocco ariêscîo",
-       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] o l'è stæto bloccou.\n<br />Veddi [[Special:BlockList|Lista di addressi IP bloccæ]] pe vedde i blocchi attivi.",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] o l'è stæto bloccou.\n<br />Amia a [[Special:BlockList|lista di adreççi IP bloccæ]] pe vedde i blocchi attivi.",
+       "ipb-blockingself": "Ti stæ pe bloccâ ti mæximo! T'ê seguo die voeilo fâ?",
+       "ipb-confirmhideuser": "Ti stæ pe bloccâ un utente con l'opçion \"Ascondi utente\" abilitâ.\nDe sta mainea o nomme utente o saiâ sopresso da tutte le liste e-e voxe de registro.\nT'ê seguo de voeilo fâ?",
+       "ipb-confirmaction": "Se t'ê seguo de voeilo fâ davei, controlla o campo \"{{int:ipb-confirm}}\" in fondo.",
+       "ipb-edit-dropdown": "Modifica i motivi do blocco",
+       "ipb-unblock-addr": "Sblocca $1",
+       "ipb-unblock": "Sblocca un utente ò un adreçço IP",
+       "ipb-blocklist": "Elenca i blocchi attivi",
+       "ipb-blocklist-contribs": "Contribuçioin de {{GENDER:$1|$1}}",
+       "ipb-blocklist-duration-left": "$1 arestæ",
+       "unblockip": "Desblocca utente",
+       "unblockiptext": "Doeuvia o moddulo sottostante pe restituî l'accesso in scrittua a 'n utente ò adreçço IP bloccou.",
+       "ipusubmit": "Leva sto blocco",
+       "unblocked": "L'utente [[User:$1|$1]] o l'è stæto sbloccou",
+       "unblocked-range": "$1 o l'è stæto sbloccou",
+       "unblocked-id": "O blocco $1 o l'è stæto rimòsso",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] o l'è stæto sbloccou.",
+       "blocklist": "Utenti bloccæ",
        "ipblocklist": "Utenti blocæ",
+       "ipblocklist-legend": "Çerca un utente bloccou",
+       "blocklist-userblocks": "Ascondi i blocchi di utenti registræ",
+       "blocklist-tempblocks": "Ascondi i blocchi temporannei",
+       "blocklist-addressblocks": "Ascondi i blocchi de un solo IP",
+       "blocklist-rangeblocks": "Ascondi i blocchi de range",
+       "blocklist-timestamp": "Dæta e oa",
+       "blocklist-target": "Destinaçion",
+       "blocklist-expiry": "O descazze",
+       "blocklist-by": "Amministratô ch'o l'ha misso o blocco",
+       "blocklist-params": "Parammetri de blocco",
+       "blocklist-reason": "Raxon",
+       "ipblocklist-submit": "Çerca",
+       "ipblocklist-localblock": "Blocco locale",
+       "ipblocklist-otherblocks": "{{PLURAL:$1|Atro blocco|Atri blocchi}}",
+       "infiniteblock": "infinio",
+       "expiringblock": "o descazze o $1 a $2",
        "anononlyblock": "Solo anonnimi",
+       "noautoblockblock": "blocco aotomatico disabilitou",
+       "createaccountblock": "registraçion bloccâ",
        "emailblock": "posta elettronega bloccâ",
+       "blocklist-nousertalk": "o no poeu modificâ a proppia pagina de discuscion",
        "ipblocklist-empty": "A lista di blocchi a l'è veua.",
+       "ipblocklist-no-results": "L'adreçço IP ô o nomme utente domandou o no l'è bloccou.",
        "blocklink": "Blocca",
        "unblocklink": "sblòcca",
        "change-blocklink": "càngia blòcco",
        "contribslink": "Contribuçioìn",
-       "autoblocker": "Affermoö automaticamente perchè o teu indirisso IP o l'è stæto usöo da \"[[User:$1|$1]]\" neuvamente. A razon dæta pe affermâ $1 a l'è stæta:\n\"$2\"",
+       "emaillink": "manda e-mail",
+       "autoblocker": "Bloccou aotomaticamente perché l'adreçço IP o l'è condiviso con l'utente \"[[User:$1|$1]]\".\nO blocco de l'utente $1 o l'è stæto imposto pe-o seguente motivo: \"$2\".",
        "blocklogpage": "Blòcchi",
+       "blocklog-showlog": "Questo utente o l'è stæto bloccou in precedença. O registro di blocchi o l'è riportou de sotta pe rifeimento:",
+       "blocklog-showsuppresslog": "Questo utente o l'è stæto bloccou e nscoso in precedença. O registro de rimoçioin o l'è riportou de sotta pe rifeimento:",
        "blocklogentry": "blocòu [[$1]] pe in periodo de $2 $3",
-       "blocklogtext": "Sta chie a l'è unn-a lista de affermaçioin fæte e levæ.\nI indirissi IP affermæ automaticamente non son  consideræ.\nVeddi a [[Special:BlockList|Lista de i indirissi IP affermæ]] pe e informaçioin neuve.",
-       "block-log-flags-anononly": "Utenti anonimmi soö",
+       "reblock-logentry": "o l'ha cangiou e impostaçioin do blocco pe [[$1]] co-ina scadença de $2 $3",
+       "blocklogtext": "De sotta gh'è 'n registro di açioin de blocco e sblocco utenti.\nI adreççi IP bloccæ aotomaticamente no son elencæ.\nConsurta l'[[Special:BlockList|elenco di blocchi]] pe l'elenco di bandi o blocchi attoalmente opiativi.",
+       "unblocklogentry": "o l'ha sbloccou $1",
+       "block-log-flags-anononly": "solo utenti anonnimi",
        "block-log-flags-nocreate": "Neuve registrascioin non son permisse",
        "block-log-flags-noautoblock": "O blocco automatego o non l'è attïvo",
        "block-log-flags-noemail": "A posta elettronega a non l'è attïva",
+       "block-log-flags-nousertalk": "o no poeu modificâ a proppia pagina de discuscion",
+       "block-log-flags-angry-autoblock": "blocco aotomatico avançou attivo",
+       "block-log-flags-hiddenname": "nomme utente ascoso",
+       "range_block_disabled": "O drito d'aministratô de bloccâ di intervalli d'adreççi IP o l'è disabilitou.",
+       "ipb_expiry_invalid": "Scadença non vallida.",
+       "ipb_expiry_old": "Scadença za trascorsa.",
+       "ipb_expiry_temp": "I blocchi di nommi utenti ascoxi devan ese permanenti.",
+       "ipb_hide_invalid": "Imposcibbile soprimme questa utença; a gha ciù de {{PLURAL:$1|'na modiffica|$1 modiffiche}}.",
+       "ipb_already_blocked": "L'utente \"$1\" o l'è za bloccou",
+       "ipb-needreblock": "L'utente $1 o l'è za bloccou. Ti voeu miga cangiâ e impostaçioin?",
+       "ipb-otherblocks-header": "{{PLURAL:$1|Atro blocco|Atri blocchi}}",
+       "unblock-hideuser": "No ti poeu sbloccâ questo utente, perché o so nomme utente o l'è stæto ascoso.",
+       "ipb_cant_unblock": "Errô: Imposcibbile trovâ o blocco con ID $1. O blocco o poriæ ese za stæto rimosso.",
+       "ipb_blocked_as_range": "Errô: L'adreçço IP $1 o no l'è soggetto a blocco individoale e o no poeu ese sbloccou. O blocco o l'è invece attivo a livello de l'intervallo $2, ch'o poeu ese sbloccou.",
+       "ip_range_invalid": "Intervallo d'adreççi IP non vallido.",
+       "ip_range_toolarge": "No l'è poscibbile bloccâ de range supeioî a-o /$1",
+       "proxyblocker": "Blocco di proxy averti",
+       "proxyblockreason": "Questo adreçço IP o l'è stæto bloccou perché o l'è un proxy averto. Se prega de contattâ o proppio fornitô d'accesso a Internet ò o supporto tecnico e informâli de questo grave problema de segueça.",
+       "sorbsreason": "Questo adreçço IP o l'è elencou comme proxy averto inta lista DNSBL doeuviâ da {{SITENAME}}.",
+       "sorbs_create_account_reason": "No l'è poscibbile creâ de noeuve utençe con questo adreçço IP perché o l'è elencou comme proxy averto inta lista DNSBL doeuviâ da {{SITENAME}}.",
+       "xffblockreason": "Un adreçço IP presente inte l'intestaçion X-Forwarded-For, toeu ò do server proxy che ti doeuvi, o l'è stæto bloccou. A raxon originâ do blocco a l'è: $1",
+       "cant-see-hidden-user": "L'utente che ti çerchi de bloccâ o l'è stæto za bloccou e ascoso. Scicomme no ti g'hæ o permisso \"hideuser\", no l'è poscibbile vixualizâ ò modificâ o blòcco de l'utente.",
+       "ipbblocked": "No ti poeu bloccâ ò sbloccâ di atri utenti, perché ti mæximo t'ê bloccou",
+       "ipbnounblockself": "No ti poeu sbloccâ ti mæximo",
+       "lockdb": "Blocca o database",
+       "unlockdb": "Sblocca o database",
+       "lockdbtext": "O blocco do database o comporta l'interruçion, pe tutti i utenti, da poscibilitæ de modificâ e paggine o de creâne de noeuve, de cangiâ e preferençe e modificâ e liste di öservæ speciali, e in generâ de tutte i opiaçioin pe-e quæ öcore de modiffiche a-o database. Pe cortexia, conferma che questo l'è proppio quello che t'intendi de fâ e che a-a fin da manutençion ti provediæ a-o sblocco do database.",
+       "unlockdbtext": "O sblocco do database o consente torna a tutti i utenti de modificâ e paggine o de creâne de noeuve, de cangiâ e preferençe e modificâ le liste di öservæ speciali, e in generâ de compî tutte i öpiaçioin pe-e quæ öcore de modiffiche a-o database. Pe cortexia, conferma che questo l'è proppio quello che t'intendi de fâ.",
+       "lockconfirm": "Scì, intendo effettivamente bloccâ o database.",
+       "unlockconfirm": "Scì, intendo effettivamente sbloccâ o database.",
+       "lockbtn": "Blocca o database",
+       "unlockbtn": "Sblocca o database",
+       "locknoconfirm": "No t'hæ marcou a casella de conferma.",
+       "lockdbsuccesssub": "Blocco do database eseguio",
+       "unlockdbsuccesssub": "Sblocco do database eseguio",
+       "lockdbsuccesstext": "O database o l'è stæto bloccou.<br />\nAregordite de [[Special:UnlockDB|levâ o blocco]] doppo d'avei terminou i opiaçioin de manutençion.",
+       "unlockdbsuccesstext": "O database o l'è stæto sbloccou.",
+       "lockfilenotwritable": "Imposcibbile scrive in sciô file de ''lock'' do database. Pe bloccâ e sbloccâ il database l'è necessaio l'accesso in scrittua a questo file da parte do server web .",
+       "databaselocked": "O database o l'è za bloccou.",
        "databasenotlocked": "O database o no l'è bloccòu.",
+       "lockedbyandtime": "(da $1 o $2 a $3)",
+       "move-page": "Stramuo de $1",
        "move-page-legend": "Mescia a paggina",
-       "movepagetext": "Chì o se pêu dâ 'n nêuvo nomme a 'na paggina, stramûando tûtta a sêu cronologîa a-o nêuvo nomme.\nA paggina attuâle a fa outomaticamente 'n rindirissamento a-o nêuvo tittolo.\nI collegamenti escistenti no sajàn aggiornæ; veriffica che 'sto stramûo o no l'agge creòu doggi rindirissamenti ò rindirissamenti sballiæ.\nA responsabilitæ pe tegnî i collegamenti sempre donde deivan andâ a l'è têu.\n\nA paggina a '''no''' sajà stramûâa se ghe foisse zà ûnn-a co-o nêuvo nomme, a meno c'a no segge vêua ò fæta solo da 'n rindirissamento a-a vegia e a no l'agge verscioîn preçedenti.\nIn caso de stramûo sballiòu o se pêu tornâ sûbbito a-o vegio tittolo, e o no l'è poscibbile sorvescrive pe errô 'na paggina zà escistente.\n\n'''ATTENSION:'''\n'N cangiamento coscì grande o porieiva creâ di controtempi e problemmi, sorvetûtto pe-e paggine ciû viscitæ.\nPensa ben e conseguense de 'sto stramûo primma d'andâ avanti!",
+       "movepagetext": "Questo moddulo o consente de rinominâ una pagina, mesciando tutta a so cronologia a-o noeuvo nomme. A paggina attoale a vegniâ aotomaticamente un redirect a-o noeuvo tittolo. Controlla che o stramuo o no l'abbia creou di [[Special:DoubleRedirects|doggi redirect]] ò di [[Special:BrokenRedirects|redirect erræ]]. L'onere de garantî che i collegamenti a-a pagina arestan corretti o speta a chi a mescia.\n\nNotta che a pagina a <strong>no</strong> saiâ mesciaa se n'existe za un-a co-o noeuvo nomme, a meno che a no segge costituia solo che da un redirect e a segge priva de verscioin precedente. In caxo de stramuo errou se poeu tornâ subbito a-o vegio tittolo, e no l'è poscibbile soviascrive pe sballio una pagina za existente.\n\n<strong>Nota:</strong>\nUn cangiamento coscì drastego o poeu creâ di contrattempi e di problemi, soviatutto pe-e paggine ciù vixitæ. Asseguite d'avei valutou e conseguençe primma de procede.",
+       "movepagetext-noredirectfixer": "Questo moddulo o consente de rinominâ una pagina, mesciando tutta a so cronologia a-o noeuvo nomme. A paggina attoale a vegniâ aotomaticamente un redirect a-o noeuvo tittolo. Controlla che o stramuo o no l'abbia creou di [[Special:DoubleRedirects|doggi redirect]] ò di [[Special:BrokenRedirects|redirect erræ]]. L'onere de garantî che i collegamenti a-a pagina arestan corretti o speta a chi a mescia.\n\nNotta che a pagina a <strong>no</strong> saiâ mesciaa se n'existe za un-a co-o noeuvo nomme, a meno che a no segge costituia solo che da un redirect e a segge priva de verscioin precedente. In caxo de stramuo errou se poeu tornâ subbito a-o vegio tittolo, e no l'è poscibbile soviascrive pe sballio una pagina za existente.\n\n<strong>Nota:</strong>\nUn cangiamento coscì drastego o poeu creâ di contrattempi e di problemi, soviatutto pe-e paggine ciù vixitæ. Asseguite d'avei valutou e conseguençe do stramuo primma de procede.",
        "movepagetalktext": "Se ti seleçion-i questa casella, a corispondente paggina de discuscion a saiâ mesciâ aotomaticamente a-o neuvo tittolo, a meno che existe zà una paggina de discuscion ch'a no segge veua.\n\nInte sti caxi, ti doviæ mesciâ o unî manoalmente a paggina, se proppio ti veu.",
-       "newtitle": "Nêuvo tittolo:",
+       "moveuserpage-warning": "'''Attençione:''' Ti stæ pe mesciâ una pagina utente. Notta che solo a pagina a saiâ mesciâ. L'utente o ''no'' saiâ rinominou.",
+       "movecategorypage-warning": "<strong>Attençione:</strong> ti stæ pe mesciâ una categoria. Notta che solo sta paggina a saiâ mesciâ e tutte e pagine inta vegia categoria <em>no</em> saian inseie inta noeuva.",
+       "movenologintext": "O stramuo dee paggine o l'è consentio solo che a-i utenti registræ ch'han eseguio l'[[Special:UserLogin|accesso]] a-o scito.",
+       "movenotallowed": "No ti g'hæ o permisso pe mesciâ de paggine.",
+       "movenotallowedfile": "No ti g'hæ o permisso pe mesciâ di file.",
+       "cant-move-user-page": "No ti g'hæ o permisso pe mesciâ de pagine utente (escluse e sottopagine).",
+       "cant-move-to-user-page": "No ti g'hæ o permisso pe mesciâ a pagina insce 'na pagina utente (escluse e sottopagine utente).",
+       "cant-move-category-page": "No ti g'hæ o permisso pe mesciâ de categorie.",
+       "cant-move-to-category-page": "No ti g'hæ o permisso pe mesciâ a pagina insce 'na categoria.",
+       "newtitle": "Noeuvo tittolo:",
        "move-watch": "Azzonze a li osservæ speçiâli",
        "movepagebtn": "Stramûâ a paggina",
        "pagemovedsub": "Remescio fæto",
-       "articleexists": "Ghe n'æmmo zà 'na paggina con 'sto nomme, oppûre quello che ti g'hæ scelto o no l'è permisso. Cangia nomme.",
+       "movepage-moved": "'''\"$1\" a l'è stæta mesciâ a \"$2\"'''",
+       "movepage-moved-redirect": "L'è stæto creou un redirect.",
+       "movepage-moved-noredirect": "A creaçion de un redirect a l'è stæta sopressa.",
+       "articleexists": "Una paggina con sto nomme ghe l'emmo za, oppûre quello che t'hæ çernuo o no l'è vallido. Pe piaxei çerni 'n atro nomme.",
+       "cantmove-titleprotected": "O stramuo da paggina o no l'è poscibbile in quante o noeuvo tittolo o l'è stæto protezuo pe impedîne a creaçion.",
        "movetalk": "Mescia a paggina de discuscion ascì.",
+       "move-subpages": "Mescia e sottopaggine (scin a $1)",
+       "move-talk-subpages": "Mescia e sottopaggine de discuscion (scin a $1)",
+       "movepage-page-exists": "A paggina $1 a l'existe za e a no poeu ese aotomaticamente soviascrita.",
+       "movepage-page-moved": "A paggina $1 a l'è stæta mesciaa a $2.",
+       "movepage-page-unmoved": "A paggina $1 a no poeu ese mesciâ a $2.",
+       "movepage-max-pages": "L'è stæto mesciou o nummero mascimo de $1 {{PLURAL:$1|paggina|paggine}}: aotomaticamente no ne saiâ mesciou ciu.",
        "movelogpage": "Lista di stramûi",
+       "movelogpagetext": "De sotta una lista de tutti i stramui de paggina.",
+       "movesubpage": "{{PLURAL:$1|Sottopagina|Sottopagine}}",
+       "movesubpagetext": "Questa pagina a g'ha $1 {{PLURAL:$1|sottopagina mostrâ|sottopagine mostræ}} chì de sotta.",
+       "movenosubpage": "Questa pagina a no g'ha de sottopagine.",
        "movereason": "Raxon",
        "revertmove": "Ristorâ",
+       "delete_and_move_text": "A pagina specificâ comme destinaçion \"[[:$1]]\" a l'existe za. Ti voeu miga scassâla pe fâ röso pe-o stramuo?",
        "delete_and_move_confirm": "Scì, scassa a pagina",
-       "delete_and_move_reason": "Levoö pe fâ röso pe un remescio",
+       "delete_and_move_reason": "Scassâ pe fâ röso pe un stramuo da \"[[$1]]\"",
+       "selfmove": "O tittolo de destinaçion o l'è pægio de quello de proveniença, no l'è poscibbile mesciâ una paggina insce lê mæxima.",
+       "immobile-source-namespace": "No l'è poscibbile mesciâ de pagine do namespace \"$1\"",
+       "immobile-target-namespace": "No l'è poscibbile mesciâ de paggine into namespace \"$1\"",
+       "immobile-target-namespace-iw": "Un collegamento interwiki o no l'è una destinaçion vallida pe'n stramuo de paggina.",
+       "immobile-source-page": "Questa pagina a no poeu ese mesciâ.",
+       "immobile-target-page": "No l'è poscibbile fâ o stramuo inte quello tittolo de destinaçion.",
+       "bad-target-model": "A destinaçion dexidiâ a l'adoeuvia un modello de contegnui despægio. No l'è poscibbile convertî da $1 a $2.",
+       "imagenocrossnamespace": "No l'è poscibbile mesciâ un file foeua da-o relativo namespace.",
+       "nonfile-cannot-move-to-file": "No l'è poscibbile mesciâ un file foeua da-o relativo namespace.",
+       "imagetypemismatch": "A noeuva estenscion do file a no corisponde a-o so tipo.",
+       "imageinvalidfilename": "O nomme de l'immaggine o no l'è vallido",
+       "fix-double-redirects": "Aggiorna tutti i redirect ch'apontan a-o tittolo originâ",
+       "move-leave-redirect": "Lascighe derê un redirect",
+       "protectedpagemovewarning": "'''Attençion: questa paggina a l'è stæta bloccâ de moddo che solo i utenti co-i privileggi d'amministratô possan modificâla.'''\nL'urtimo elemento do registro o l'è riportou chì sotta pe referença:",
+       "semiprotectedpagemovewarning": "'''Notta:''' Questa paggina a l'è stæta bloccä de moddo che solo i utenti registræ possan mesciâla.\nL'urtimo elemento do registro o l'è riportou chì sotta pe referensa:",
+       "move-over-sharedrepo": "[[:$1]] a l'existe za inte 'n archivvio condiviso. O stramuo de 'n file a questo tittolo o comportiâ a soviascritua do file condiviso.",
+       "file-exists-sharedrepo": "O nomme che t'hæ çernuo pe-o file o l'è za in doeuvia.\nPe piaxei, çerni un atro nomme.",
        "export": "Espòrta pàgine",
+       "exporttext": "L'è poscibbile esportâ o testo e a cronologia de modiffiche de una paggina ò de un groppo de pagine in formato XML pe importâle inte di atri sciti ch'adoeuvian o software MediaWiki, a traverso a [[Special:Import|paggina de importaçioin]].\n\nPe esportâ e paggine indica i tittoli inta casella de testo sottostante, un pe riga, e speciffica se ti dexiddei d'ötegnî l'urtima verscion e tutte e verscioin precedente, co-i dæti da cronologia da paggina, oppû soltanto l'urtima verscion e i dæti corispondenti a l'urtima modiffica.\n\nIn quest'urtimo caxo ti poeu doeuviâ ascì un collegamento, presempio [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] pe esportâ \"[[{{MediaWiki:Mainpage}}]]\".",
+       "exportall": "Esporta tutte e pagine",
+       "exportcuronly": "Includdi solo a verscion attoâ, non l'intrega cronologia",
+       "exportnohistory": "----\n'''Notta:''' l'esportaçion de l'intrega cronologia de paggine a traverso questa interfaccia a l'è stæta disattivâ pe di motivi ligæ a-e prestaçioin do scistema.",
+       "exportlistauthors": "Inciodi l'elenco completo di contributoî pe ogni paggina",
+       "export-submit": "Esporta",
+       "export-addcattext": "Azonzi pagine da-a categoria:",
+       "export-addcat": "Azonzi",
+       "export-addnstext": "Azonzi paggine da-o namespace:",
+       "export-addns": "Azonzi",
+       "export-download": "Sarva comme file",
+       "export-templates": "Inciodi i template",
+       "export-pagelinks": "Includdi paggine colegæ scin a 'na profonditæ de:",
+       "export-manual": "Azonzi paggine manoalmente:",
        "allmessages": "Messaggi do scistemma",
        "allmessagesname": "Nomme",
        "allmessagesdefault": "Testo predefinio",
        "allmessagescurrent": "Testo corrente",
-       "allmessagestext": "Sta chie a l'è unn-a lista de messaggi do scistema in ta MediaWiki.",
+       "allmessagestext": "Sta chie a l'è a lista de tutti i messaggi de scistema disponibili into namespace MediaWiki.\nVixita [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] e [https://translatewiki.net translatewiki.net] se ti voeu contribuî a-a localizzaçion generrica de MediaWiki.",
        "allmessagesnotsupportedDB": "'''{{ns:special}}:Allmessages''' o non ti te peu vedde, perchè '''$wgUseDatabaseMessages''' o non l'è attivo.",
+       "allmessages-filter-legend": "Filtro",
+       "allmessages-filter": "Filtra pe stato de modiffica:",
+       "allmessages-filter-unmodified": "Non modificæ",
+       "allmessages-filter-all": "Tutti",
+       "allmessages-filter-modified": "Modificæ",
+       "allmessages-prefix": "Filtra pe prefisso:",
        "allmessages-language": "Lengua:",
+       "allmessages-filter-submit": "Vanni",
+       "allmessages-filter-translate": "Traduxi",
        "thumbnail-more": "Ciù grande",
        "filemissing": "O file o no gh'è!",
        "thumbnail_error": "Errô inta creassion da miniatûa: $1",
-       "thumbnail_invalid_params": "Parametri da a imàginetta non validi",
+       "thumbnail_error_remote": "Messaggio de errô da $1:\n$2",
+       "djvu_page_error": "Nummero de paggina DjVu errou",
+       "djvu_no_xml": "Imposcibbile ötegnî l'XML pe-o file DjVu",
+       "thumbnail-temp-create": "Imposcibbile creâ o file temporannio de miniatue",
+       "thumbnail-dest-create": "Imposcibbile sarvâ a miniatua inta destinaçion",
+       "thumbnail_invalid_params": "Parammetri da miniatua non vallidi",
+       "thumbnail_toobigimagearea": "File con de dimenscioin maggioe de $1",
+       "thumbnail_dest_directory": "Imposcibbile creâ a directory de destinaçion",
+       "thumbnail_image-type": "Tipo de immagine non supportou",
+       "thumbnail_gd-library": "Configuaçion incompleta da libraia GD: fonçion $1 mancante",
+       "thumbnail_image-missing": "Pâ ch'amanche o file: $1",
+       "thumbnail_image-failure-limit": "Gh'è stæto troppi tentativi reçenti fallii ($1 ò ciù) de generâ questa miniatua. Riproeuva ciù tardi.",
+       "import": "Importa pagine",
+       "importinterwiki": "Importaçion da un atro wiki",
+       "import-interwiki-text": "Seleçion-a un progetto wiki e o titolo da paggina da importâ.\nE dæte de pubbricaçion e i nommi di aotoî de varrie verscioin saian conservæ.\nTutte i opiaçioin de importaçion da di atri wiki son registræ into [[Special:Log/import|registro de importaçion]].",
+       "import-interwiki-sourcewiki": "Wiki de origgine:",
+       "import-interwiki-sourcepage": "Paggina d'origgine:",
+       "import-interwiki-history": "Coppia l'intrega cronologia de questa paggina",
+       "import-interwiki-templates": "Inciodi tutti i template",
+       "import-interwiki-submit": "Importa",
+       "import-mapping-default": "Importa inte destinaçioin predefinie",
+       "import-mapping-namespace": "Importa inte 'n namespace:",
+       "import-mapping-subpage": "Importa comme sottopaggine da paggina seguente:",
+       "import-upload-filename": "Nomme do file:",
+       "import-comment": "Coménti:",
+       "importtext": "Se prega de esportâ o file da-o scito wiki de origgine co-a [[Special:Export|fonçion de esportaçion]], sarvâlo in sciô proppio disco e dapoeu caregâlo chie.",
+       "importstart": "Importaçion de paggine in corso...",
+       "import-revision-count": "$1 {{PLURAL:$1|revixon|revixoin}}",
+       "importnopages": "Nisciun-a paggina da importâ.",
+       "imported-log-entries": "Importou $1 {{PLURAL:$1|voxe}} de registro.",
+       "importfailed": "Importaçion no ariescia: <nowiki>$1</nowiki>",
+       "importunknownsource": "Tipo de sorgente d'importaçion sconosciuo",
+       "importcantopen": "Imposcibbile arvî o file d'importaçion.",
+       "importbadinterwiki": "Collegamento inter-wiki errou",
+       "importsuccess": "Importaçion ariescia.",
+       "importnosources": "No l'è stæto definio una wiki da chi importâ e i uploads diretti da cronologia no son attivi.",
+       "importnofile": "No l'è stæto caregou nisciun file pe l'importaçion.",
+       "importuploaderrorsize": "Caregamento do file pe l'importaçion fallio. O file o suppera e dimenscioin mascime consentie pe l'upload.",
+       "importuploaderrorpartial": "Caregamento do file pe l'importaçion fallio. O file o l'è stæto caregou solo in parte.",
+       "importuploaderrortemp": "Caregamento do file pe l'importaçion fallio. Manca 'na cartella tempoannia.",
+       "import-parse-failure": "Errô d'anallixi inte l'importaçion XML",
+       "import-noarticle": "Paggine da importâ no ghe n'è!",
+       "import-nonewrevisions": "Nisciun-a verscion importâ (ean zà tutte presente, ò satæ pe via di erroî)",
+       "xml-error-string": "$1 a-a riga $2, colonna $3 (byte $4): $5",
+       "import-upload": "Carrega dæti XML",
+       "import-token-mismatch": "I dæti relativi a-a sescion son anæti persci. Riproeuva.\nFoscia t'ê stæto disconnesso. <strong>Verifica d'ese ancon collegou e riproeuva</strong>.\nSe o problema o persciste, ti poeu provâ a [[Special:UserLogout|scollegate]] e effettuâ un nuoeuvo accesso, controllando che o to browser o l'açette i cookie da questo scito.",
+       "import-invalid-interwiki": "Imposcibbile importâ da-o progetto wiki indicou.",
+       "import-error-edit": "A paggina \"$1\" a no l'è stæta importâ perché no t'ê aotorizzou a modificâla.",
+       "import-error-create": "A paggina \"$1\" a no l'è stæta importâ perché no t'ê aotorizzou a creâla.",
+       "import-error-interwiki": "A paggina \"$1\" a no l'è stæta importâ perché o so nomme o l'è riservou pe-o collegamento esterno (interwiki).",
+       "import-error-special": "A pagina \"$1\" a no l'è stæta importâ perché a l'apparten a un namespace speciale ch'o no permette de pagine.",
+       "import-error-invalid": "A paggina \"$1\" a no l'è stæta importâ perché o nomme a-o quæ a saiæ stæta importâ o no l'è vallido insce questo wiki.",
+       "import-error-unserialize": "A verscion $2 da paggina \"$1\" a no poeu ese de-serializzâ. A verscion a l'è stæta segnalâ pe doeuviâ o modello de contegnuo $3 serializzou comme $4.",
+       "import-error-bad-location": "A verscion $2 a l'adoeuvia un modello de contegnuo $3 ch'o no poeu ese memorizzou in \"$1\" de questo wiki, da-o momento che a paggina a no suporta questo modello.",
+       "import-options-wrong": "{{PLURAL:$2|Opçion sbaliâ|Opçioin sbaliæ}}: <nowiki>$1</nowiki>",
+       "import-rootpage-invalid": "A paggina prinçipâ fornia a no l'è un tittolo vallido.",
+       "import-rootpage-nosubpage": "O namespace \"$1\" da paggina prinçipâ o no permette d'avei de sottopagine.",
        "importlogpage": "Importassioîn",
-       "tooltip-pt-userpage": "A teu pagina utilizatô",
-       "tooltip-pt-mytalk": "E mæ discûscioîn",
-       "tooltip-pt-preferences": "E mæ preferense",
+       "importlogpagetext": "Importaçioin aministrative de paggine da di atre wiki complete de cronologia.",
+       "import-logentry-upload-detail": "{{PLURAL:$1|una verscion importâ|$1 verscioin importæ}}",
+       "import-logentry-interwiki-detail": "{{PLURAL:$1|una verscion importâ|$1 verscioin importæ}} da $2",
+       "javascripttest": "Sperimentaçion JavaScript",
+       "javascripttest-pagetext-unknownaction": "Açion sconosciua \"$1\".",
+       "javascripttest-qunit-intro": "Amia insce mediawiki.org a [$1 documentaçion riguardante i test].",
+       "tooltip-pt-userpage": "A {{GENDER:|to}} pagina utente",
+       "tooltip-pt-anonuserpage": "A paggina utente de questo adreçço IP che t'ê aproeuvo a modificâ comme",
+       "tooltip-pt-mytalk": "A {{GENDER:|to}} paggina de discuscion",
+       "tooltip-pt-anontalk": "Discuscioin insce e modiffiche fæte da questo adreçço IP",
+       "tooltip-pt-preferences": "E {{GENDER:|to}} preferençe",
        "tooltip-pt-watchlist": "A lista de pagine che ti g'hæ sotta osservaçion",
-       "tooltip-pt-mycontris": "E mæ contribuçioìn",
+       "tooltip-pt-mycontris": "A lista de {{GENDER:|to}} contribuçioin",
+       "tooltip-pt-anoncontribs": "Un elenco de modiffiche fæte da questo adreçço IP",
        "tooltip-pt-login": "Consegemmo a registraçión, ma a no l'è obrigatoia.",
        "tooltip-pt-logout": "Sciorti",
        "tooltip-pt-createaccount": "Se conseggia de registrase e de intrâ, sciben che no segge obligatoio",
        "tooltip-ca-viewsource": "'Sta pagina a l'è protetta, ma ti peu védde o sêu còdice sorgente.",
        "tooltip-ca-history": "Verscioìn précedenti da pàgina",
        "tooltip-ca-protect": "Protezi 'sta paggina",
+       "tooltip-ca-unprotect": "Càngia a proteçión de sta paggina",
        "tooltip-ca-delete": "Scancella sta pàgina",
+       "tooltip-ca-undelete": "Ripristina a paggina com'a l'ea primma da scancelaçion",
        "tooltip-ca-move": "Mescia 'sta paggina (cangia tittolo)",
        "tooltip-ca-watch": "Azónzi 'sta pagina a-a teu lista d'oservaçion",
        "tooltip-ca-unwatch": "Leva sta pàgina da sott'oservaçion.",
        "tooltip-search": "Çerca {{SITENAME}}",
        "tooltip-search-go": "Vànni inte 'na pàgina con sto tìtolo, s'a l'existe",
-       "tooltip-search-fulltext": "Çerca sto testo in scie pàgine",
+       "tooltip-search-fulltext": "Çerca sto testo in sce pàgine",
        "tooltip-p-logo": "Vìxita a pàgina prinçipâ",
        "tooltip-n-mainpage": "Vìxita a pagina prinçipâ",
        "tooltip-n-mainpage-description": "Vìxita a pàgina prinçipâ",
        "tooltip-n-help": "Pagine d'agiùtto",
        "tooltip-t-whatlinkshere": "Lista de tùtte e pagine che son colegæ a sta chì.",
        "tooltip-t-recentchangeslinked": "Ùrtimi càngi de pàgine colegæ a quésta",
+       "tooltip-feed-rss": "Feed RSS pe questa paggina",
        "tooltip-feed-atom": "Feed Atom pe sta pàgina",
-       "tooltip-t-contributions": "Lista de contribûssioîn de quest'utente",
-       "tooltip-t-emailuser": "Invia 'n messaggio e-mail a quest'utente",
+       "tooltip-t-contributions": "Lista de contribûssioin de {{GENDER:$1|questo|questa}} utente",
+       "tooltip-t-emailuser": "Invia un messaggio email a {{GENDER:$1|questo|questa}} utente",
+       "tooltip-t-info": "Urteioî informaçioin insce questa pagina",
        "tooltip-t-upload": "Carrega di file murtimediali",
        "tooltip-t-specialpages": "Lista de tùtte e pagine speçiâli",
-       "tooltip-t-print": "Versción da stànpa pe sta pàgina",
+       "tooltip-t-print": "Verscion stanpabbile de sta paggina",
        "tooltip-t-permalink": "Colegaménto fisso a sta revixión da pàgina",
        "tooltip-ca-nstab-main": "Véddi a vôxe",
        "tooltip-ca-nstab-user": "Veddi a pàgina d'utente",
+       "tooltip-ca-nstab-media": "Veddi a paggina do file murtimediâ",
        "tooltip-ca-nstab-special": "Sta chi l'è 'na pàgina speciâle e a no peu êse cangiâ",
        "tooltip-ca-nstab-project": "Veddi a paggina de servissio",
        "tooltip-ca-nstab-image": "Veddi a paggina do file",
+       "tooltip-ca-nstab-mediawiki": "Veddi o messaggio de scistema",
        "tooltip-ca-nstab-template": "Veddi o template",
        "tooltip-ca-nstab-help": "Veddi a paggina d'agiûtto",
        "tooltip-ca-nstab-category": "Veddi a paggina da categorîa",
        "tooltip-minoredit": "Marchilo comme cangiaménto minô",
        "tooltip-save": "Sarva i cangiaménti",
+       "tooltip-publish": "Pubbrica e to modiffiche",
        "tooltip-preview": "Anteprimma de modiffiche (fannila, primma de sarvâ!)",
        "tooltip-diff": "Ammîa e modiffiche che t'æ fæto a-o testo.",
        "tooltip-compareselectedversions": "Amia e diferense tra e doê verscioìn seleçionæ de sta paggina chì.",
-       "tooltip-watch": "Azónzi sta pàgina a-a têu lista d'osservæ speçiâli",
+       "tooltip-watch": "Azónzi sta pàgina a-a têu lista di öservæ speçiâli",
+       "tooltip-watchlistedit-normal-submit": "Leva i tittoli",
+       "tooltip-watchlistedit-raw-submit": "Aggiorna a lista di öservæ speciali",
+       "tooltip-recreate": "Ricrea a pagina sciben ch'a segge stæta scassâ",
+       "tooltip-upload": "Comença o caregamento",
        "tooltip-rollback": "\"Rollback\" annulla e modiffiche a sta pagina de l'urtimo contributô co-in solo clic.",
        "tooltip-undo": "\"Anùlla\" o permette de anulâ sto cangiaménto e o l'arve o modulo de cangiaménto inta modalitæ anteprìmma. Ti peu ascì métte a raxón inte l'ogetto do cangiaménto.",
+       "tooltip-preferences-save": "Sarva e preferençe",
        "tooltip-summary": "Scrîvi 'na scintexi",
        "common.css": "/** i stili css scriti chie se applicana tutte e skin */",
-       "anonymous": "Utente anonimmo de {{SITENAME}}",
+       "anonymous": "{{PLURAL:$1|Utente anonnimo|Utenti anonnimi}} de {{SITENAME}}",
+       "siteuser": "$1, utente de {{SITENAME}}",
+       "anonuser": "$1, utente anonnimo de {{SITENAME}}",
        "lastmodifiedatby": "Sta pagina a l'è stæta cangiâ l'urtima votta a e $2 do $1 da $3.",
+       "othercontribs": "O testo attoale o l'è basou in sciô travaggio de $1.",
+       "others": "atri",
+       "siteusers": "$1, {{PLURAL:$2|{{GENDER:$1|utente}}|utenti}} de {{SITENAME}}",
+       "anonusers": "$1, {{PLURAL:$2|utente anonnimo|utenti anonnimi}} de {{SITENAME}}",
+       "creditspage": "Aotoî da paggina",
+       "nocredits": "Nisciun-a informaçion in scî aotoî disponibbile pe questa paggina.",
+       "spamprotectiontitle": "Filtro anti-spam",
+       "spamprotectiontext": "A pagina che s'è tentou dr sarvâ  a l'è stæta bloccâ da-o filtro anti-spam. Questo l'è probabilmente dovuo a-a presença de 'n collegamento a 'n scito esterno presente inta blacklist.",
+       "spamprotectionmatch": "O filtro anti-spam o l'è stæto attivou da-o seguente scrito: $1",
+       "spambot_username": "MediaWiki - scistema de netezzo do spam",
+       "spam_reverting": "Ripristinata l'urtima verscion priva de collegamenti a $1",
+       "spam_blanking": "Paggina svuâ, tutte e verscioin contegnivan di collegamenti a $1",
+       "spam_deleting": "Paggina scassâ, tutte e verscioin contegnivan di collegamenti a $1",
        "simpleantispam-label": "Controllo anti-spam.\n<strong>NO</strong> impîlo!",
+       "pageinfo-title": "Informaçioin pe \"$1\"",
+       "pageinfo-not-current": "Spiaxente, ma l'è imposcibbile fornî quest'informaçion pe de vege verscioin.",
+       "pageinfo-header-basic": "Informaçion de base",
+       "pageinfo-header-edits": "Cronologia de modiffiche",
+       "pageinfo-header-restrictions": "Proteçion da paggina",
+       "pageinfo-header-properties": "Propietæ da paggina",
+       "pageinfo-display-title": "Tittolo vixualizzou",
+       "pageinfo-default-sort": "Criteio d'ordenamento predefinio",
+       "pageinfo-length": "Longheçça da paggina (in byte)",
+       "pageinfo-article-id": "ID da paggina",
        "pageinfo-language": "Lengua do contegnuo da paggina",
+       "pageinfo-content-model": "Modello do contegnuo da paggina",
+       "pageinfo-robot-policy": "Indiçizzaçion pe-i robot",
+       "pageinfo-robot-index": "Consentio",
+       "pageinfo-robot-noindex": "Non consentio",
+       "pageinfo-watchers": "Nummero di utenti che g'han a paggina in öservaçion",
+       "pageinfo-visiting-watchers": "Nummero di öservatoî da paggina ch'han vixitou e modiffiche reçente",
+       "pageinfo-few-watchers": "Meno de $1 {{PLURAL:$1|öservatô|öservatoî}}",
+       "pageinfo-few-visiting-watchers": "Ghe poriæ ese ò meno di öservatoî ch'han vixitou e modiffiche reçente",
+       "pageinfo-redirects-name": "Nummero de redirect a questa paggina",
+       "pageinfo-subpages-name": "Sottopaggine de questa paggina",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirect}}; $3 {{PLURAL:$3|non redirect}})",
+       "pageinfo-firstuser": "Creatô da paggina",
+       "pageinfo-firsttime": "Dæta de creaçion da paggina",
+       "pageinfo-lastuser": "Urtimo contributô",
+       "pageinfo-lasttime": "Dæta de l'urtima modiffica",
+       "pageinfo-edits": "Nummero totale de modiffiche",
+       "pageinfo-authors": "Nummero totale di aotoî distinti",
+       "pageinfo-recent-edits": "Nummero de modiffiche reçente (inti urtimi $1)",
+       "pageinfo-recent-authors": "Nummero di aotoî distinti reçenti",
+       "pageinfo-magic-words": "{{PLURAL:$1|Paola maggica|Paole maggiche}} ($1)",
+       "pageinfo-hidden-categories": "{{PLURAL:$1|Categoria ascosa|Categorie ascose}} ($1)",
+       "pageinfo-templates": "Template {{PLURAL:$1|incluso|incluxi}} ($1)",
+       "pageinfo-transclusions": "{{PLURAL:$1|Paggina inta|Paggine inte}} quæ l'è incluso ($1)",
        "pageinfo-toolboxlink": "Informassioin in sciâ paggina",
+       "pageinfo-redirectsto": "Rendiriçça a",
+       "pageinfo-redirectsto-info": "info",
+       "pageinfo-contentpage": "Contezâ comme una paggina de contegnuo",
        "pageinfo-contentpage-yes": "Sci",
+       "pageinfo-protect-cascading": "Proteçioin ricorscive da chie",
        "pageinfo-protect-cascading-yes": "Sci",
+       "pageinfo-protect-cascading-from": "Proteçioin ricorscive ereditæ da",
+       "pageinfo-category-info": "Informaçion in sciâ categoria",
+       "pageinfo-category-total": "Nummero totale di membri",
+       "pageinfo-category-pages": "Nummero de paggine",
+       "pageinfo-category-subcats": "Nummio de sottacategorie",
+       "pageinfo-category-files": "Nummero di file",
+       "markaspatrolleddiff": "Marca comme controlâ",
+       "markaspatrolledtext": "Marca sta paggina comme controlâ",
+       "markaspatrolledtext-file": "Marca a verscion de sto file comme controlâ",
+       "markedaspatrolled": "Marcâ comme controlâ",
+       "markedaspatrolledtext": "A modiffica de [[:$1]] seleçionâ a l'è stæta marcâ comme veificâ.",
+       "rcpatroldisabled": "A verifica di urtime modiffiche a l'è disattivâ",
+       "rcpatroldisabledtext": "A fonçion de controllo di urtime cangiamenti pe-o momento a no l'è attiva.",
+       "markedaspatrollederror": "Imposcibbile marcâ a voxe comme controlâ",
+       "markedaspatrollederrortext": "Ocore specificâ una revixon da marcâ comme controlâ.",
+       "markedaspatrollederror-noautopatrol": "No ti poeu marcâ e toeu modiffiche comme controllæ.",
+       "markedaspatrollednotify": "A modifica a $1 a l'è stæta contrassegnâ comme veificâ.",
+       "markedaspatrollederrornotify": "Errô durante a veifica.",
+       "patrol-log-page": "Modiffiche controlæ",
+       "patrol-log-header": "Questo o l'è 'n registro de revixoin controlæ.",
+       "log-show-hide-patrol": "$1 registro di controlli",
+       "log-show-hide-tag": "$1 registro di etichette",
+       "deletedrevision": "Scassou a vegia verscion de $1.",
+       "filedeleteerror-short": "Errô inta scassatua do file: $1",
+       "filedeleteerror-long": "Gh'è stæto di erroî into tentativo de scassâ o file:\n\n$1",
+       "filedelete-missing": "Imposcibbile scassâ o file \"$1\" perchè o no l'existe.",
+       "filedelete-old-unregistered": "A verscion do file indicâ, \"$1\", a no l'è contegnua into database.",
+       "filedelete-current-unregistered": "O file specificou, \"$1\", o no l'è contegnuo into database.",
+       "filedelete-archive-read-only": "O server web o no l'è in graddo de scrive inta directory d'archivvio ($1).",
        "previousdiff": "← Diferensa precedénte",
        "nextdiff": "Pròscima diferensa →",
-       "thumbsize": "Dimescion da a imàginetta:",
+       "mediawarning": "'''Attençione''': Questo file o poriæ contegnî un codiçe maligno. A so esecuçion a poriæ dannezzâ o to scistema.",
+       "imagemaxsize": "Dimenscion mascima de ibmaggine:<br />''(pe-e paggine de descriçion do file)''",
+       "thumbsize": "Dimescion de l'imaginetta:",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|paggina|paggine}}",
+       "file-info": "dimenscion do file: $1, tipo MIME: $2",
        "file-info-size": "$1 × $2 pixel, dimenscioîn: $3, tippo MIME: $4",
+       "file-info-size-pages": "$1 × $2 pixel, dimenscion do file: $3, tipo MIME: $4, $5 {{PLURAL:$5|paggina|paggine}}",
        "file-nohires": "No ghe son verscioìn a rezoluçion ciù âta.",
        "svg-long-desc": "file in formato SVG, dimenscioìn nominâli $1 × $2 pixel, dimenscioin do file: $3",
+       "svg-long-desc-animated": "file in formato SVG animou, dimenscion nominale $1 × $2 pixel, dimenscion do file: $3",
+       "svg-long-error": "File SVG non vallido: $1",
        "show-big-image": "File originâ",
        "show-big-image-preview": "Dimenscioin de questa anteprimma: $1.",
+       "show-big-image-preview-differ": "Dimension de questa anteprimma $3 pe questo file $2: $1.",
        "show-big-image-other": "{{PLURAL:$2|Atra risolussion|Atre risolussioin}}: $1.",
        "show-big-image-size": "$1 × $2 pixel",
-       "newimages": "Gallerîa de nêuvi archivvi",
+       "file-info-gif-looped": "cicclico",
+       "file-info-gif-frames": "$1 {{PLURAL:$1|frame}}",
+       "file-info-png-looped": "cicclico",
+       "file-info-png-repeat": "ripetuo $1 {{PLURAL:$1|votta|votte}}",
+       "file-info-png-frames": "$1 {{PLURAL:$1|frame}}",
+       "file-no-thumb-animation": "'''Notta: pe de limitaçioin tecniche, e miniatue de questo file no saian animæ.'''",
+       "file-no-thumb-animation-gif": "'''Notta: pe de limitaçioin tecniche, e miniatue de immaggine GIF a ata risoluçion comme questa no saian animæ.'''",
+       "newimages": "Galleria di nêuvi file",
+       "imagelisttext": "A lista presentâ chì de sotta, costituia da {{PLURAL:$1|un file|'''$1''' file}}, a l'è amerçâ $2.",
+       "newimages-summary": "Questa pagina speciale a mostra i urtimi file caregæ.",
+       "newimages-legend": "Filtro",
+       "newimages-label": "Nomme do file (o una parte de questo):",
+       "newimages-showbots": "Mostra i caregamenti fæti dai bot",
+       "newimages-hidepatrolled": "Ascondi i caregamenti controlæ",
+       "noimages": "No gh'è ninte da vedde.",
        "ilsubmit": "Çerca",
        "bydate": "pe dâta",
+       "sp-newimages-showfrom": "Mostra i file ciù reçenti a partî da-e oe $2 do $1",
+       "seconds": "{{PLURAL:$1|un segondo|$1 segondi}}",
+       "minutes": "{{PLURAL:$1|un menuto|$1 menuti}}",
+       "hours": "{{PLURAL:$1|un'oa|$1 oe}}",
+       "days": "{{PLURAL:$1|$1 giorno|$1 giorni}}",
+       "weeks": "{{PLURAL:$1|$1 setteman-a|$1 setteman-e}}",
+       "months": "{{PLURAL:$1|$1 meise|$1 meixi}}",
+       "years": "{{PLURAL:$1|$1 anno|$1 anni}}",
+       "ago": "$1 fa",
+       "just-now": "proppio oua",
+       "hours-ago": "$1 {{PLURAL:$1|oa|oe}} fa",
+       "minutes-ago": "$1 {{PLURAL:$1|menuto|menuti}} fa",
+       "seconds-ago": "$1 {{PLURAL:$1|segondo|segondi}} fa",
        "monday-at": "Lunesdì a $1",
        "tuesday-at": "Matesdì a $1",
        "wednesday-at": "Mâcordì a $1",
        "metadata-expand": "Fâ vedde dettaggi",
        "metadata-collapse": "Asconde dettaggi",
        "metadata-fields": "I cànpi relativi a-i metadæti EXIF elencæ inte 'sto messaggio saiàn in sciâ pàgina de l'inmàgine quande a tabella di metadæti a saiâ inta forma cùrta. Cómme predefinîo, i âtri cànpi saiàn ascoxi.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-imagewidth": "Largheçça",
+       "exif-imagelength": "Ateçça",
+       "exif-bitspersample": "Bit pe campion",
+       "exif-compression": "Meccanismo de comprescion",
+       "exif-photometricinterpretation": "Struttua di pixel",
        "exif-orientation": "Orientamento",
+       "exif-samplesperpixel": "Nummero di componenti",
+       "exif-planarconfiguration": "Dispoxiçion di dæti",
+       "exif-ycbcrsubsampling": "Rapporto de campionamento Y / C",
+       "exif-ycbcrpositioning": "Poxiçionamento di componenti Y e C",
        "exif-xresolution": "Risoluçion orizzontâ",
        "exif-yresolution": "Risoluçion verticâ",
+       "exif-stripoffsets": "Poxiçion di dæti de l'inmaggine",
+       "exif-rowsperstrip": "Nummero righe pe striscia",
+       "exif-stripbytecounts": "Nummero di byte pe striscia compressa",
+       "exif-jpeginterchangeformat": "Poxiçion byte SOI JPEG",
+       "exif-jpeginterchangeformatlength": "Nummero di byte di dæti JPEG",
+       "exif-whitepoint": "Coordinæ cromattiche do ponto de gianco",
+       "exif-primarychromaticities": "Coordinæ cromattiche di coî primai",
+       "exif-ycbcrcoefficients": "Coeffixenti de matrixe de transformaçion di spaççi de cô",
+       "exif-referenceblackwhite": "Cobbia di valoî de rifeimento (neigro e gianco)",
        "exif-datetime": "Dæta e öa da modiffica do file",
+       "exif-imagedescription": "Tittolo de l'inmaggine",
        "exif-make": "Produttô fotocamera",
        "exif-model": "Modello fotocamera",
        "exif-software": "Software",
        "exif-artist": "Autô",
        "exif-copyright": "Diritti d'autô de",
        "exif-exifversion": "Verscion do formato Exif",
+       "exif-flashpixversion": "Verscion Flashpix supportâ",
        "exif-colorspace": "Spassio di coî",
+       "exif-componentsconfiguration": "Scignificou de ogni componente",
+       "exif-compressedbitsperpixel": "Modalitæ de comprescion immaggine",
+       "exif-pixelxdimension": "Largheçça immaggine",
+       "exif-pixelydimension": "Ateçça immaggine",
+       "exif-usercomment": "Notte de l'utente",
+       "exif-relatedsoundfile": "File audio collegou",
        "exif-datetimeoriginal": "Dæta e oa de creassion di dæti",
        "exif-datetimedigitized": "Dæta e oa de digitalizzaçion",
+       "exif-subsectime": "Dæta e oa, fraçioin de segondo",
+       "exif-subsectimeoriginal": "Dæta e oa de creaçion, fraçioin de segondo",
+       "exif-subsectimedigitized": "Dæta e oa de digitalizzaçion, fraçioin dr segondo",
+       "exif-exposuretime": "Tempo de espoxiçion",
+       "exif-exposuretime-format": "$1 s ($2)",
+       "exif-fnumber": "Rapporto focâ",
+       "exif-exposureprogram": "Programma de espoxiçion",
+       "exif-spectralsensitivity": "Senscibilitæ spettrâ",
+       "exif-isospeedratings": "Senscibilitæ ISO",
+       "exif-shutterspeedvalue": "Veloçitæ de l'otturatô APEX",
+       "exif-aperturevalue": "Avertua APEX",
+       "exif-brightnessvalue": "Luminoxitæ APEX",
+       "exif-exposurebiasvalue": "Correçion espoxiçion",
+       "exif-maxaperturevalue": "Avertua mascima",
+       "exif-subjectdistance": "Distança do soggetto",
+       "exif-meteringmode": "Mettodo de mesuaçion",
+       "exif-lightsource": "Sorgente luminosa",
+       "exif-flash": "Caratteristeghe e stæto do flash",
+       "exif-focallength": "Distança focâ de l'obiettivo",
+       "exif-subjectarea": "Area inquadrante o soggetto",
+       "exif-flashenergy": "Potença do flash",
+       "exif-focalplanexresolution": "Risoluçion X in sciô cian focâ",
+       "exif-focalplaneyresolution": "Risoluçion Y in sciô cian focâ",
+       "exif-focalplaneresolutionunit": "Unitæ de mesua risoluçion in sciô cian focâ",
+       "exif-subjectlocation": "Poxiçion do soggetto",
+       "exif-exposureindex": "Senscibilitæ impostâ",
+       "exif-sensingmethod": "Mettodo de rilevaçion",
        "exif-filesource": "Origgine do file",
+       "exif-scenetype": "Tipo de inquadratua",
+       "exif-customrendered": "Elaboaçion personalizzâ",
+       "exif-exposuremode": "Modalitæ d'espoxiçion",
+       "exif-whitebalance": "Bançamento do gianco",
+       "exif-digitalzoomratio": "Rapporto zoom digitale",
+       "exif-focallengthin35mmfilm": "Longheçça focâ sciu peliccola 35 mm",
+       "exif-scenecapturetype": "Tipo de aquixiçion da scena",
+       "exif-gaincontrol": "Controllo inquadratua",
+       "exif-contrast": "Controllo contrasto",
+       "exif-saturation": "Controllo saturaçion",
+       "exif-sharpness": "Controllo nitideçça",
+       "exif-devicesettingdescription": "Descriçion de impostaçioin do dispoxitivo",
+       "exif-subjectdistancerange": "Scaa distança soggetto",
+       "exif-imageuniqueid": "ID univvoco immaggine",
+       "exif-gpsversionid": "Verscion di tag GPS",
+       "exif-gpslatituderef": "Latituddine nord/sud",
+       "exif-gpslatitude": "Latituddine",
+       "exif-gpslongituderef": "Lonxituddine est/ovest",
+       "exif-gpslongitude": "Lonxituddine",
+       "exif-gpsaltituderef": "Rifeimento pe l'ærtituddine",
+       "exif-gpsaltitude": "Ærtituddine",
+       "exif-gpstimestamp": "Oa GPS (reloeuio atommico)",
+       "exif-gpssatellites": "Satelliti doeuviæ pe-a mesuaçion",
+       "exif-gpsstatus": "Stato do riçevitô",
+       "exif-gpsmeasuremode": "Modalitæ de mesuaçion",
+       "exif-gpsdop": "Precixone da mezuaçion",
+       "exif-gpsspeedref": "Unitæ de mesua da veloçitæ",
+       "exif-gpsspeed": "Veloçitæ do riçevitô GPS",
+       "exif-gpstrackref": "Rifeimento pe-a direçion de movimento",
+       "exif-gpstrack": "Direçion do movimento",
+       "exif-gpsimgdirectionref": "Rifeimento pe-a direçion de l'immaggine",
+       "exif-gpsimgdirection": "Direçion de l'immaggine",
+       "exif-gpsmapdatum": "Rilevamento geodetico doeuviou",
+       "exif-gpsdestlatituderef": "Rifeimento pe-a latituddine da destinaçion",
+       "exif-gpsdestlatitude": "Latituddine da destinaçion",
+       "exif-gpsdestlongituderef": "Rifeimento pe-a lonxituddine da destinaçion",
+       "exif-gpsdestlongitude": "Lonxituddine da destinaçion",
+       "exif-gpsdestbearingref": "Rifeimento pe-a direçion da destinaçion",
+       "exif-gpsdestbearing": "Direçion da destinaçion",
+       "exif-gpsdestdistanceref": "Rifeimento pe-a distança da destinaçion",
+       "exif-gpsdestdistance": "Distança da destinaçion",
+       "exif-gpsprocessingmethod": "Nomme do mettodo de elaboaçion GPS",
+       "exif-gpsareainformation": "Nomme da zona GPS",
+       "exif-gpsdatestamp": "Data GPS",
+       "exif-gpsdifferential": "Correçion differençiâ GPS",
+       "exif-jpegfilecomment": "Commento do file JPEG",
+       "exif-keywords": "Paole ciave",
+       "exif-worldregioncreated": "Region do mondo donde l'è stæto scattou l'immaggine",
+       "exif-countrycreated": "Paise dovve l'è stæto scattou a foto",
+       "exif-countrycodecreated": "Codiçe do paise dovve l'è stæto scattou a foto",
+       "exif-provinceorstatecreated": "Provincia o stato dovve l'è stæto scattou a foto",
+       "exif-citycreated": "Çittæ dovve l'è stæto scattou a foto",
+       "exif-sublocationcreated": "Parte da çittæ donde l'è stæto scattou a foto",
+       "exif-worldregiondest": "Region do mondo vixualizzâ",
+       "exif-countrydest": "Naçion vixualizzâ",
+       "exif-countrycodedest": "Codiçe pe-o paise indicou",
+       "exif-provinceorstatedest": "Provincia o stato vixualizzou",
+       "exif-citydest": "Çittæ mostrâ",
+       "exif-sublocationdest": "Parte da çittæ visualizzâ",
+       "exif-objectname": "Tittolo curto",
+       "exif-specialinstructions": "Instruçioin speciale",
+       "exif-headline": "Tittolo",
+       "exif-credit": "Credditi",
+       "exif-source": "Fonte",
+       "exif-editstatus": "Stato d'ediçion de l'inmaggine",
+       "exif-urgency": "Urgença",
+       "exif-fixtureidentifier": "Nomme do rifeimento",
+       "exif-locationdest": "Localitæ raffiguâ",
+       "exif-locationdestcode": "Coddiçe do loeugo raffiguou",
+       "exif-objectcycle": "Parte do giorno a-o quæ o medium o l'è destinou",
+       "exif-contact": "Contatti",
+       "exif-writer": "Chi l'ha scrito",
        "exif-languagecode": "Lengua",
+       "exif-iimversion": "Verscion IIM",
+       "exif-iimcategory": "Categoria",
+       "exif-iimsupplementalcategory": "Categorie azontive",
+       "exif-datetimeexpires": "No doeuviâ doppo",
+       "exif-datetimereleased": "Pubricou o",
+       "exif-originaltransmissionref": "Coddiçe do loeugo de transmiscion originaia",
+       "exif-identifier": "Identificatô",
+       "exif-lens": "Obiettivo doeuviou",
+       "exif-serialnumber": "Nummero de serrie da fotocammia",
+       "exif-cameraownername": "Proprietaio da macchina fotograffica",
+       "exif-label": "Etichetta",
+       "exif-datetimemetadata": "Dæta inta quæ i metadata son stæti modificæ l'urtima votta",
+       "exif-nickname": "Nomme informale de l'immaggine",
+       "exif-rating": "Valutaçion (su 5)",
+       "exif-rightscertificate": "Çertificou de gestion di driti",
+       "exif-copyrighted": "Informaçioin in scî driti d'aotô:",
+       "exif-copyrightowner": "Detentô di driti d'aotô",
+       "exif-usageterms": "Termi d'utilizzo",
+       "exif-webstatement": "Deciaraçion online do copyright",
+       "exif-originaldocumentid": "ID univvoco do documento origin*a",
+       "exif-licenseurl": "URL pe-a liçença do copyright",
+       "exif-morepermissionsurl": "Informaçioin insce e liçençe alternative",
+       "exif-attributionurl": "Se quest'oeuvia ti l'adoeuvi torna, pe piaxei coleghite a",
+       "exif-preferredattributionname": "Se quest'oeuvia ti l'adoeuvi torna, pe piaxei attribuiscine a paternitæ a",
+       "exif-pngfilecomment": "Commento do file JPEG",
+       "exif-disclaimer": "Avertençe",
+       "exif-contentwarning": "Avviso in sciô contegnuo",
+       "exif-giffilecomment": "Commento do file GIF",
+       "exif-intellectualgenre": "Tipo d'elemento",
+       "exif-subjectnewscode": "Coddiçe de l'ögetto",
+       "exif-scenecode": "Coddiçe de scena IPTC",
+       "exif-event": "Evento raffiguou",
+       "exif-organisationinimage": "Organizzaçion raffiguâ",
+       "exif-personinimage": "Person-a raffiguâ",
+       "exif-originalimageheight": "Ateçça de l'inmaggine primma ch'a foise retagiâ",
+       "exif-originalimagewidth": "Largheçça de l'immaggine primma ch'a foise retagiâ",
+       "exif-compression-1": "Nisciun",
+       "exif-compression-2": "CCITT gruppo 3 monodimenscionâ - codifica run length di Huffman modificâ",
+       "exif-compression-3": "Codiffica fax CCITT Group 3",
+       "exif-compression-4": "Codiffica fax CCITT groppo 4",
+       "exif-copyrighted-true": "Protezuo da-o drito d'aotô",
+       "exif-copyrighted-false": "Stato do drito d'aotô non impostou",
+       "exif-photometricinterpretation-1": "Gianco e neigro (o neigro o l'è 0)",
+       "exif-unknowndate": "Dæta sconosciua",
        "exif-orientation-1": "Normale",
+       "exif-orientation-2": "Imbösòu orizontalmente",
+       "exif-orientation-3": "Curlou de 180°",
+       "exif-orientation-4": "Imbösòu verticalmente",
+       "exif-orientation-5": "Curlou 90° in senso antiorario e imbösòu verticalmente",
+       "exif-orientation-6": "Curlou di 90° in senso antioraio",
+       "exif-orientation-7": "Curlou 90° in senso oraio e imbosou verticalmente",
+       "exif-orientation-8": "Curlou di 90° in senso oraio",
+       "exif-planarconfiguration-1": "formato a tocchi",
+       "exif-planarconfiguration-2": "formato planare",
+       "exif-colorspace-65535": "Non calibrou",
+       "exif-componentsconfiguration-0": "assente",
+       "exif-exposureprogram-0": "Non definio",
+       "exif-exposureprogram-1": "Manoale",
+       "exif-exposureprogram-2": "Programma normale",
+       "exif-exposureprogram-3": "Prioritæ a-o diaframma",
+       "exif-exposureprogram-4": "Prioritæ a l'espoxiçion",
+       "exif-exposureprogram-5": "Artistego (orientou a-a profonditæ de campo)",
+       "exif-exposureprogram-6": "Sportivo (orientou a-a veloçitæ de ripreisa)",
+       "exif-exposureprogram-7": "Ritræto (soggetti vexin con sfondo sfocou)",
+       "exif-exposureprogram-8": "Panoramma (soggetti lonten con sfondo a foeugo)",
+       "exif-subjectdistance-value": "$1 metri",
+       "exif-meteringmode-0": "Sconosciuo",
+       "exif-meteringmode-1": "Meddia",
+       "exif-meteringmode-2": "Meddia pesâ into centro",
+       "exif-meteringmode-3": "Spot",
+       "exif-meteringmode-4": "Murti-Spot",
+       "exif-meteringmode-5": "Pattern",
+       "exif-meteringmode-6": "Parçiâ",
+       "exif-meteringmode-255": "Atro",
+       "exif-lightsource-0": "Sconosciua",
+       "exif-lightsource-1": "Luxe diurna",
+       "exif-lightsource-2": "Lampa a fluorescença",
+       "exif-lightsource-3": "Lampa a-o tungsteno (a incandescença)",
+       "exif-lightsource-4": "Flash",
+       "exif-lightsource-9": "Tempo bello",
+       "exif-lightsource-10": "Nuvio",
+       "exif-lightsource-11": "Ombra",
+       "exif-lightsource-12": "Diurno fluorescente (D 5700 - 7100K)",
+       "exif-lightsource-13": "Giorno gianco fluorescente (N 4600 - 5400K)",
+       "exif-lightsource-14": "Gianco freido fluorescente (W 3900 - 4500K)",
+       "exif-lightsource-15": "Gianco fluorescente (WW 3200 - 3700K)",
+       "exif-lightsource-17": "Luxe standard A",
+       "exif-lightsource-18": "Luxe standard B",
+       "exif-lightsource-19": "Luxe standard C",
+       "exif-lightsource-24": "Lampa da studdio ISO a-o tungsten",
+       "exif-lightsource-255": "Atra sorgente luminosa",
+       "exif-flash-fired-0": "O flash o no l'è scattou",
+       "exif-flash-fired-1": "O flash o l'è scattou",
+       "exif-flash-return-0": "nisciun-a fonçion de individuaçion do ritorno da luxe stroboscoppica",
+       "exif-flash-return-2": "luxe stroboscoppica de ritorno non individoâ",
+       "exif-flash-return-3": "luxe stroboscoppica de ritorno individoâ",
+       "exif-flash-mode-1": "attivaçion forçâ do flash",
+       "exif-flash-mode-2": "rimoçion forçâ do flash",
+       "exif-flash-mode-3": "modalitæ aotomattica",
+       "exif-flash-function-1": "Disattiva o flash",
+       "exif-flash-redeye-1": "modalitæ riduçion oeuggi rosci",
+       "exif-focalplaneresolutionunit-2": "polliçi",
+       "exif-sensingmethod-1": "Non definio",
+       "exif-sensingmethod-2": "Sensô area cô a 1 chip",
+       "exif-sensingmethod-3": "Sensô area cô a 2 chip",
+       "exif-sensingmethod-4": "Sensô area colô a 3 chip",
+       "exif-sensingmethod-5": "Sensô area cô sequençiale",
+       "exif-sensingmethod-7": "Sensô triliniare",
+       "exif-sensingmethod-8": "Sensô liniare de cô sequençiale",
+       "exif-filesource-3": "Fotocammia digitâ",
+       "exif-scenetype-1": "Fotografia diretta",
+       "exif-customrendered-0": "Processo normale",
+       "exif-customrendered-1": "Processo personalizzou",
+       "exif-exposuremode-0": "Espoxiçion aotomattica",
+       "exif-exposuremode-1": "Espoxiçion manoâ",
+       "exif-exposuremode-2": "Bracketing aotomattico",
+       "exif-whitebalance-0": "Bançamento do gianco aotomattico",
+       "exif-whitebalance-1": "Bançamento do gianco manoâ",
+       "exif-scenecapturetype-0": "Standard",
+       "exif-scenecapturetype-1": "Panorama",
+       "exif-scenecapturetype-2": "Ritræto",
+       "exif-scenecapturetype-3": "Notturna",
+       "exif-gaincontrol-0": "Nisciun",
+       "exif-gaincontrol-1": "Enfaxi pe basso guaagno",
+       "exif-gaincontrol-2": "Enfaxi pe ato guaagno",
+       "exif-gaincontrol-3": "Deenfaxi pe basso guaagno",
+       "exif-gaincontrol-4": "Deenfaxi pe ato guaagno",
+       "exif-contrast-0": "Normale",
+       "exif-contrast-1": "Ato contrasto",
+       "exif-contrast-2": "Basso contrasto",
+       "exif-saturation-0": "Normale",
+       "exif-saturation-1": "Bassa saturaçion",
+       "exif-saturation-2": "Ata saturaçion",
+       "exif-sharpness-0": "Normale",
+       "exif-sharpness-1": "Minô nitideçça",
+       "exif-sharpness-2": "Maggiô nitideçça",
+       "exif-subjectdistancerange-0": "Sconosciua",
+       "exif-subjectdistancerange-1": "Macro",
+       "exif-subjectdistancerange-2": "Soggetto vexin",
+       "exif-subjectdistancerange-3": "Soggetto lontan",
+       "exif-gpslatitude-n": "Latituddine nord",
+       "exif-gpslatitude-s": "Latituddine sud",
+       "exif-gpslongitude-e": "Lonxituddine est",
+       "exif-gpslongitude-w": "Lonxituddine ovest",
+       "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|metro|metri}} in sciô livello do mâ",
+       "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|metro|metri}} sotta o livello do mâ",
+       "exif-gpsstatus-a": "Mezuaçion in corso",
+       "exif-gpsstatus-v": "Mesuaçion interopiabile",
+       "exif-gpsmeasuremode-2": "Mesuaçion bidimenscionâ",
+       "exif-gpsmeasuremode-3": "Mesuaçion tridimenscionâ",
+       "exif-gpsspeed-k": "Chilommetri orai",
+       "exif-gpsspeed-m": "Miggia oraie",
+       "exif-gpsspeed-n": "Noeui",
+       "exif-gpsdestdistance-k": "Chilommetri",
+       "exif-gpsdestdistance-m": "Miggia",
+       "exif-gpsdestdistance-n": "Miggia naotiche",
+       "exif-gpsdop-excellent": "Eccelente ($1)",
+       "exif-gpsdop-good": "Bon ($1)",
+       "exif-gpsdop-moderate": "Moderâ ($1)",
+       "exif-gpsdop-fair": "Discreto ($1)",
+       "exif-gpsdop-poor": "Scarso ($1)",
+       "exif-objectcycle-a": "Solo a-a mattin",
+       "exif-objectcycle-p": "Solo a-a seia",
+       "exif-objectcycle-b": "Mattin e seia",
+       "exif-gpsdirection-t": "Direçion reale",
+       "exif-gpsdirection-m": "Direçion magnettica",
+       "exif-ycbcrpositioning-1": "Centrou",
+       "exif-ycbcrpositioning-2": "Co-scituou",
+       "exif-dc-contributor": "contributoî",
+       "exif-dc-coverage": "Ambito spaçiâ o tempoâ di meddia",
+       "exif-dc-date": "Dæta (e)",
+       "exif-dc-publisher": "Editô",
+       "exif-dc-relation": "File correlæ",
+       "exif-dc-rights": "Driti",
+       "exif-dc-source": "Fonte do file",
+       "exif-dc-type": "Tipologia do file",
+       "exif-rating-rejected": "Refuou",
+       "exif-isospeedratings-overflow": "Maggiô de 65535",
+       "exif-iimcategory-ace": "Arte, coltua e spetaccolo",
+       "exif-iimcategory-clj": "Crimmine e lezze",
+       "exif-iimcategory-dis": "Disastri e açidenti",
+       "exif-iimcategory-fin": "Economia e affæ",
+       "exif-iimcategory-edu": "Instruçion",
+       "exif-iimcategory-evn": "Ambiente",
+       "exif-iimcategory-hth": "Salute",
+       "exif-iimcategory-hum": "Interesse uman",
+       "exif-iimcategory-lab": "Travaggio",
+       "exif-iimcategory-lif": "Stile di vitta e tempo libbero",
+       "exif-iimcategory-pol": "Polittica",
+       "exif-iimcategory-rel": "Religion e fe'",
+       "exif-iimcategory-sci": "Sciença e tecnologia",
+       "exif-iimcategory-soi": "Questioin sociale",
+       "exif-iimcategory-spo": "Sport",
+       "exif-iimcategory-war": "Guæra, confliti e disordini",
+       "exif-iimcategory-wea": "Meteo",
+       "exif-urgency-normal": "Normale ($1)",
+       "exif-urgency-low": "Bassa ($1)",
+       "exif-urgency-high": "Ata ($1)",
+       "exif-urgency-other": "Prioritæ definie da l'utente ($1)",
        "namespacesall": "Tùtti",
        "monthsall": "tutti",
+       "confirmemail": "Conferma l'adreçço e-mail",
+       "confirmemail_noemail": "No t'hæ indicou un adreçço e-mail vallido inte to [[Special:Preferences|preferençe]].",
+       "confirmemail_text": "{{SITENAME}} o domanda a convallida de l'adreçço e-mail primma de poei doeouviâ e relative fonçioin. Sciacca o pulsante chì de sotta pe inviâ una recesta de conferma a-o proppio addreçço; into messaggio gh'è un collegamento ch'o conten un coddiçe. Vixita o collegamento co-o to navegatô pe confermâ che l'adreçço e-mail o l'è vallido.",
+       "confirmemail_pending": "O coddiçe de conferma o l'è za stæto spedio via posta eletronnica; se l'account o l'è stæto\ncreou de reçente, se prega de attende l'arivo do coddiçe pe quarche menuto primma\nde tentâ de domandâne un noeuvo.",
+       "confirmemail_send": "Invia un coddiçe de conferma via email.",
+       "confirmemail_sent": "Messaggio e-mail de conferma inviou.",
+       "confirmemail_oncreate": "Un coddiçe de conferma o l'è stæto spedio a l'adreçço de posta elettronnica indicou. O coddiçe o no l'è necessaio pe accede a-o scito,\nma l'è necessaio fornîlo pe poei abilitâ tutte e fonçioin do scito ch'adoeuvian a posta elettronnica.",
+       "confirmemail_sendfailed": "{{SITENAME}} o no poeu inviâ o messaggio e-mail de conferma. Controlla che o to adrçço e-mail o no contegne di caratteri non vallidi.\n\nMessaggio de errô do mailer: $1",
+       "confirmemail_invalid": "Coddiçe de conferma non vallido. O codiçe o poriæ ese descheito.",
+       "confirmemail_needlogin": "L'è necessaio $1 confermâ o to adreçço e-mail.",
+       "confirmemail_success": "L'adreçço e-mail o l'è stæto confermou. Oua ti poeu [[Special:UserLogin|intrâ]] e gödîte a wiki.",
+       "confirmemail_loggedin": "L'adreçço e-mail o l'è stæto confermou.",
+       "confirmemail_subject": "{{SITENAME}}: recesta de conferma de l'adreççoo",
+       "confirmemail_body": "Quarcun, foscia ti mæximo da l'adreçço IP $1, o l'ha registrou l'utença \"$2\" insce {{SITENAME}} indicando questo adreçço e-mail.\n\nPe confermâ che l'utença a t'apparten da vei e attivâ e fonçioin relative a l'invio di e-mail insce {{SITENAME}}, arvi o collegamento seguente co-o to navegatô:\n\n$3\n\nSe *no* t'ê stæto ti a registrâ l'utença, segui sto colegamento pe annulâ a conferma de l'adreçço e-mail:\n\n$5\n\nQuesto coddiçe de conferma o descaziâ aotomaticamente a $4.",
+       "confirmemail_body_changed": "Quarcun, foscia ti mæximo da l'adreçço IP $1, o l'ha modificou l'adreçço e-mail de l'utença \"$2\" insce {{SITENAME}} indicando questo adreçço e-mail.\n\nPe confermâ che l'utença a t'apparten da vei e riattivâ e fonçioin relative a l'invio di e-mail insce {{SITENAME}}, arvi o collegamento seguente co-o to navegatô:\n\n$3\n\nSe l'utença a *no* t'aparten, segui sto colegamento pe annulâ a conferma de l'adreçço e-mail:",
+       "confirmemail_body_set": "Quarcun, foscia ti mæximo da l'adreçço IP $1, o l'ha impostcou l'adreçço e-mail de l'utença \"$2\" insce {{SITENAME}} indicando questo adreçço e-mail.\n\nPe confermâ che l'utença a t'apparten da vei e attivâ e fonçioin relative a l'invio di e-mail insce {{SITENAME}}, arvi o collegamento seguente co-o to navegatô:\n\n$3\n\nSe l'utença a *no* t'aparten, segui sto colegamento pe annulâ a conferma de l'adreçço e-mail:",
+       "confirmemail_invalidated": "Recesta de conferma adreçço e-mail annulâ",
+       "invalidateemail": "Annulla a recesta de conferma e-mail",
+       "notificationemail_subject_changed": "L'adreçço de posta elettronica registrou insce {{SITENAME}} o l'è stæto modificou",
+       "notificationemail_subject_removed": "L'adreçço de posta elettronica registrou insce {{SITENAME}} o l'è stæto rimosso",
+       "notificationemail_body_changed": "Quarcun, foscia ti, da l'adreçço IP $1,\no l'ha modificou l'adreçço de posta elettronica de l'utenza \"$2\" in \"$3\" insce {{SITENAME}}.\n\nSe no t'ê stæto ti, contatta subbito un amministratô do scito.",
+       "notificationemail_body_removed": "Quarcun, foscia ti, da l'adreçço IP $1,\no l'ha levou l'adreçço de posta elettronica de l'utenza \"$2\" insce {{SITENAME}}.\n\nSe no t'ê stæto ti, contatta subbito un amministratô do scito.",
+       "scarytranscludedisabled": "[L'incluxone de paggine tra di sciti wiki a no l'è attiva]",
+       "scarytranscludefailed": "[Errô: Imposcibbile ötegnî o template $1]",
+       "scarytranscludefailed-httpstatus": "[Errô: imposcibbile ötegnî o template $1: HTTP $2]",
+       "scarytranscludetoolong": "[Errô: URL troppo longa]",
+       "deletedwhileediting": "'''Attençion''': questa pagina a l'è stæta scassâ doppo che t'hæ començou a modificâla!",
+       "confirmrecreate": "L'utente [[User:$1|$1]] ([[User talk:$1|discuscioin]]) o l'ha scassou sta pagina doppo che t'hæ començou a modificâla, pe-o seguente motivo: ''$2''\nPe piaxei, conferma che ti voeu da vei ricreâ sta paggina.",
+       "confirmrecreate-noreason": "L'utente [[User:$1|$1]] ([[User talk:$1|discuscioin]]){{GENDER:$1|o|a}} l'ha scassou sta pagina doppo che t'hæ començou a modificâla.\nPe piaxei, conferma che ti voeu da vei ricreâ sta paggina.",
+       "recreate": "Ricrea",
+       "confirm_purge_button": "OK",
+       "confirm-purge-top": "Ti voeu netezâ a cache de questa pagina?",
+       "confirm-purge-bottom": "O netezzo da cache de una pagina o consente de mostrâ a so verscion ciù aggiornâ.",
+       "confirm-watch-button": "OK",
+       "confirm-watch-top": "Azónze sta pàgina a-a têu lista di öservæ speçiâli?",
+       "confirm-unwatch-button": "OK",
+       "confirm-unwatch-top": "Leva sta paggina da-a to lista sott'oservaçion.",
+       "confirm-rollback-button": "OK",
+       "confirm-rollback-top": "Ripristinâ e modiffiche de questa paggina?",
+       "quotation-marks": "«$1»",
        "imgmultipageprev": "← Pagina de primma",
        "imgmultipagenext": "Proscima pagina →",
        "imgmultigo": "Vanni!",
+       "imgmultigoto": "Vanni a-a paggina $1",
+       "img-lang-default": "(lengua predefinia)",
+       "img-lang-info": "Converti questa immaggine in $1. $2",
+       "img-lang-go": "Vanni",
        "ascending_abbrev": "cresc",
+       "descending_abbrev": "decresc",
        "table_pager_next": "Proscima pagina",
        "table_pager_prev": "Pagina de primma",
        "table_pager_first": "Primma pagina",
        "table_pager_last": "Urtima pagina",
-       "table_pager_limit": "Fanni devve $1 elementi pe pagina",
+       "table_pager_limit": "Mostra $1 elementi pe paggina",
+       "table_pager_limit_label": "Elementi pe paggina:",
        "table_pager_limit_submit": "Vanni",
        "table_pager_empty": "Nisciun resultato",
        "autosumm-blank": "Pagina svuâ",
        "autosumm-replace": "Sostituçion da pagina con '$1'",
        "autoredircomment": "Reindirissoö a [[$1]]",
        "autosumm-new": "Paggina creâ con \"$1\"",
+       "autosumm-newblank": "Creou paggina voeua",
+       "lag-warn-normal": "E modifiche apportæ {{PLURAL:$1|inte l'urtimo segondo|inti urtimi $1 segondi}} porieivan no apparî inte questa lista.",
+       "lag-warn-high": "A caosa de un eccescivo ritardo inte l'aggiornamento do server de database, e modiffiche apportæ {{PLURAL:$1|inte l'urtimo segondo|inti urtimi $1 segondi}} porieivan no apparî inte questa lista.",
+       "watchlistedit-normal-title": "Modiffica a lista sotta oservaçion",
+       "watchlistedit-normal-legend": "Rimoeuvi di tittoli da-i öservæ speciali",
+       "watchlistedit-normal-explain": "De sotta l'è elencou tutte e pagine sott'öservaçion.\nPe levâ un-a o ciù paggine da-a lista, seleçion-a e caselle relative e clicca o pulsante \"{{int:Watchlistedit-normal-submit}}\" in fondo a l'elenco.\nTi poeu ascì [[Special:EditWatchlist/raw|modificâ a lista in formato testoâ]].",
+       "watchlistedit-normal-submit": "Leva di tittoli",
+       "watchlistedit-normal-done": "Da-a lista di öservæ speciali l'è stæto eliminou {{PLURAL:$1|una pagina|$1 pagine}}:",
+       "watchlistedit-raw-title": "Modiffica a lista sotta oservaçion in formato testo",
+       "watchlistedit-raw-legend": "Modiffica a lista sotta oservaçion in formato testo",
+       "watchlistedit-raw-explain": "De sotta l'è elencou tutte e pagine sott'öservaçion.\nPe cangiâ a lista, azonzi ò leva i rispetivi tittoli, un pe riga. Una votta terminou, clicca o pulsante \"{{int:Watchlistedit-raw-submit}}\" in fondo a l'elenco.\nTi poeu ascì [[Special:EditWatchlist|modificâ a lista co l'interfaccia standard]].",
+       "watchlistedit-raw-titles": "Tittoli:",
+       "watchlistedit-raw-submit": "Agiorna a lista di öservæ speciali",
+       "watchlistedit-raw-done": "A lista di öservæ speciali a l'è stæta aggiornâ.",
+       "watchlistedit-raw-added": "L'è stæto azonto {{PLURAL:$1|una paggina|$1 paggine}}:",
+       "watchlistedit-raw-removed": "L'è stæto eliminou {{PLURAL:$1|una paggina|$1 paggine}}:",
+       "watchlistedit-clear-title": "Svoeua a lista sott'öservaçion",
+       "watchlistedit-clear-legend": "Svoeua a lista sott'öservaçion",
+       "watchlistedit-clear-explain": "Tutti i tittoli saian rimossi da-i to öservæ speciali",
+       "watchlistedit-clear-titles": "Tittoli:",
+       "watchlistedit-clear-submit": "Svoeua a lista sott'öservaçion (Permanentemente!)",
+       "watchlistedit-clear-done": "A lista di öservæ speciali a l'è stæta svuâ.",
+       "watchlistedit-clear-removed": "L'è stæto eliminou {{PLURAL:$1|una paggina|$1 paggine}}:",
+       "watchlistedit-too-many": "Gh'è troppe paggine da visualizzâ chì.",
+       "watchlisttools-clear": "Svoeua a lista sott'öservaçion",
        "watchlisttools-view": "Veddi e modiffiche pertinenti",
        "watchlisttools-edit": "Veddi e modiffica a lista",
        "watchlisttools-raw": "Modiffica a lista in formato testo",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discuscioin]])",
+       "timezone-local": "Locale",
        "duplicate-defaultsort": "Atençión: a ciâve de ordinaménto predefinîa \"$2\" a sostitoisce quella de primma \"$1\".",
+       "duplicate-displaytitle": "<strong>Attençion:</strong> o tittolo visualizzou \"$2\" o sostituisce o precedente tittolo \"$1\".",
+       "restricted-displaytitle": "<strong>Attençion:</strong> o titolo visualizzou \"$1\" o l'è stæto ignorou perché non equivalente a-o tittolo attoâ da paggina.",
+       "invalid-indicator-name": "<strong>Errô:</strong> l'attributo <code>name</code> di indicatoî do stato da paggina o no poeu ese voeuo.",
        "version": "Verscion",
+       "version-extensions": "Estenscioin installæ",
+       "version-skins": "Temi installæ",
+       "version-specialpages": "Paggine speciale",
+       "version-parserhooks": "Hook do parser",
+       "version-variables": "Variabbile",
+       "version-antispam": "Prevençion do spam",
+       "version-other": "Atro",
+       "version-mediahandlers": "Gestoî di contegnui murtimediæ",
+       "version-hooks": "Hook",
+       "version-parser-extensiontags": "Tag riconosciui da-o parser introduti da di estenscioin",
+       "version-parser-function-hooks": "Hook pe de fonçioin do parser",
+       "version-hook-name": "Nomme de l'hook",
+       "version-hook-subscribedby": "Sottoscriçioin",
+       "version-no-ext-name": "[sença nomme]",
+       "version-license": "Liçença MediaWiki",
+       "version-ext-license": "Liçença",
+       "version-ext-colheader-name": "Estenscion",
+       "version-skin-colheader-name": "Tema",
+       "version-ext-colheader-version": "Verscion",
+       "version-ext-colheader-license": "Liçença",
+       "version-ext-colheader-description": "Descriçion",
+       "version-ext-colheader-credits": "Aotoî",
+       "version-license-title": "Liçença pe $1",
+       "version-license-not-found": "Pe st'estenscion no l'è stæto atrovou arcun-a informaçion dettagiâ in sciâ liçença.",
+       "version-credits-title": "Credditi pe $1",
+       "version-credits-not-found": "Pe st'estenscion no l'è stæto atrovou arcun-a informaçion dettagiâ in scî credditi.",
+       "version-poweredby-credits": "Questo wiki o l'è realizou con '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+       "version-poweredby-others": "atri",
+       "version-poweredby-translators": "tradutoî de translatewiki.net",
+       "version-credits-summary": "A nostra riconoscença a-e seguente person-e pe avei contribuio a [[Special:Version|MediaWiki]].",
+       "version-license-info": "MediaWiki o l'è un software libbero; ti poeu redistribuîlo e/ò modificâlo segondo i termi da GNU General Public License, comme pubbricâ da-a Free Software Foundation; ò a verscion 2 da Liçença ò (a proppia scelta) qualunque verscion succesciva.\n\nMediaWiki o l'è distribuio inta spiança ch'a segge uttile, ma SENÇA ARCUN-A GARANÇIA; sença manco a garantia impliççita de NEGOÇIABILITÆ ò de APPRICABILITÆ PE 'N SCOPO PARTICOLÂ. Amia a GNU General Public License pe maggioî detaggi.\n\nQuesto programma o dev'ese distribuio assemme a  [{{SERVER}}{{SCRIPTPATH}}/COPYING 'na coppia da GNU General Public License]; in caxo contraio, se ne poeu ötegnî un-a scrivendo a-a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA oppû [http://www.softwarelibero.it/gnudoc/gpl.it.txt lezila in sciâ re'].",
+       "version-software": "Software instalou",
+       "version-software-product": "Produto",
+       "version-software-version": "Verscion",
+       "version-entrypoints": "URL d'accesso",
+       "version-entrypoints-header-entrypoint": "Ponti d'accesso",
+       "version-entrypoints-header-url": "URL",
+       "version-libraries": "Libraie instalæ",
+       "version-libraries-library": "Libraia",
+       "version-libraries-version": "Verscion",
+       "version-libraries-license": "Liçença",
+       "version-libraries-description": "Descriçion",
+       "version-libraries-authors": "Aotoî",
+       "redirect": "Rendriçamento da file, utente, paggina, verscion ò ID registro",
+       "redirect-summary": "Questa pagina speciale a rendriçça a un file (specificando o nome do file), a una pagina (specificando un ID de verscion ò un ID pagina), a un utente (specificando un ID utente numerrico) ò a 'n elemento do registro (specificando l'ID registro).\nEsempi: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], [[{{#Special:Redirect}}/logid/186]].",
+       "redirect-submit": "Vanni",
+       "redirect-lookup": "Riçerca:",
+       "redirect-value": "Valô:",
+       "redirect-user": "ID utente",
+       "redirect-page": "ID da paggina",
+       "redirect-revision": "Verscion da paggina",
+       "redirect-file": "Nomme do file",
+       "redirect-logid": "ID registro",
+       "redirect-not-exists": "Valô non trovou",
+       "fileduplicatesearch": "Riçerca di file dupricæ",
+       "fileduplicatesearch-summary": "Riçerca di eventuali dupricæ do file in base a-o valô de ''hash''.",
+       "fileduplicatesearch-filename": "Nomme do file:",
+       "fileduplicatesearch-submit": "Çerca",
+       "fileduplicatesearch-info": "$1 × $2 pixel<br />Dimenscion do file: $3<br />Tipo MIME: $4",
+       "fileduplicatesearch-result-1": "Dupricæ identichi a-o file \"$1\" no ghe n'è.",
+       "fileduplicatesearch-result-n": "Existe {{PLURAL:$2|un dupricou identico|$2 dupricæ identichi}} a-o file \"$1\".",
+       "fileduplicatesearch-noresults": "Nisciun file de nomme \"$1\" trovou.",
        "specialpages": "Pagine speçiâli",
+       "specialpages-note-top": "Legenda",
+       "specialpages-note": "* Pagine speciali non riservæ.\n* <span class=\"mw-specialpagerestricted\">Pagine speciali riservæ a çerte categorie d'utenti.</span>",
+       "specialpages-group-maintenance": "Raporti de manutençion",
+       "specialpages-group-other": "Atre paggine speciale",
+       "specialpages-group-login": "Intra / Registrite",
+       "specialpages-group-changes": "Urtime modiffiche e registri",
+       "specialpages-group-media": "File murtimediæ - caregamento e reisoconti",
+       "specialpages-group-users": "Utenti e driti",
+       "specialpages-group-highuse": "Paggine a ato utilizzo",
+       "specialpages-group-pages": "Elenchi de paggine",
+       "specialpages-group-pagetools": "Strumenti pe-e paggine",
+       "specialpages-group-wiki": "Dæti e strumenti",
+       "specialpages-group-redirects": "Paggine speciale de rendriççamento",
+       "specialpages-group-spam": "Strumenti contra o spam",
+       "specialpages-group-developer": "Strumenti pe-i sviluppatoî",
+       "blankpage": "Paggina voeua",
+       "intentionallyblankpage": "Questa paggina a l'è stæta lasciâ voeua aposta.",
        "external_image_whitelist": " #Lascia sta riga comm'a l'é<pre>\n#Inseisci i pessi de esprescioìn regolari (sôlo a pàrte ch'a va fra e //) chì sotta\n#Ste chi saiàn misse a confronto co-i indirìssi URL de inmàgini esterne (hotlinked)\n#E corispondense saiàn mostræ cómme inmàgini, donca saiâ mostròu sôlo in colegaménto\n#E righe che començan con # son conscideræ coménti\n#A diferensa tra maioscole e minoscole a no l'è scignificatîva\n\n#Inseisci sovia sta rîga tùtti i frammenti de regex. Lascia sta rîga ezattamente comm'a l'é</pre>",
+       "tags": "Etichette de modiffiche vallide",
        "tag-filter": "Filtra pe [[Special:Tags|etichetta]]:",
+       "tag-filter-submit": "Filtro",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etichetta|Etichette}}]]: $2)",
+       "tags-title": "Etichette",
+       "tags-intro": "Questa pagina a l'elenca i etichette che o software o poriæ associâ a 'na modiffica e o so scignificou.",
+       "tags-tag": "Nomme de l'etichetta",
+       "tags-display-header": "Aspetto inta lista de modiffiche",
+       "tags-description-header": "Descriçion completa do scignificou",
+       "tags-source-header": "Sorgente",
+       "tags-active-header": "Attivo?",
+       "tags-hitcount-header": "Modiffiche co l'etichetta",
+       "tags-actions-header": "Açioin",
+       "tags-active-yes": "Sci",
+       "tags-active-no": "No",
+       "tags-source-extension": "Definio da 'n'estenscion",
+       "tags-source-manual": "Appricou manoalmente da utenti e bot",
+       "tags-source-none": "No ciù in doeuvia",
+       "tags-edit": "cangia",
+       "tags-delete": "scassa",
+       "tags-activate": "attiva",
+       "tags-deactivate": "disattiva",
+       "tags-hitcount": "$1 {{PLURAL:$1|modiffica|modiffiche}}",
+       "tags-manage-no-permission": "No ti g'hæ a permiscion pe manezâ i cangi d'etichetta.",
+       "tags-manage-blocked": "No ti poeu manezâ i cangi d'etichetta dementre che t'ê blocou.",
+       "tags-create-heading": "Crea un noeuvo tag",
+       "tags-create-explanation": "Pe impostaçion predefinia, i tag apen-a creæ saian disponibbili pe l'utilizzo di utenti e di bot.",
+       "tags-create-tag-name": "Nomme de l'etichetta:",
+       "tags-create-reason": "Raxon:",
+       "tags-create-submit": "Crea",
+       "tags-create-no-name": "L'è necessaio specificâ un nomme d'etichetta.",
+       "tags-create-invalid-chars": "I nommi di etichette no devan contegnî de virgole (<code>,</code>) ò de bare (<code>/</code>).",
+       "tags-create-invalid-title-chars": "I nommi di etichette no devan contegnî di caratteri che no poeuan ese doeuviæ inti tirtoli de paggine.",
+       "tags-create-already-exists": "L'etichetta $1 a l'existe za.",
+       "tags-create-warnings-above": "L'è stæto rilevou {{PLURAl:$2|o seguente peigo|i seguenti peighi}} mentre se tentava de creâ l'etichetta \"$1\":",
+       "tags-create-warnings-below": "Ti dexiddei continoâ a creâ l'etichetta?",
+       "tags-delete-title": "Scassa l'etichetta",
+       "tags-delete-explanation-initial": "Ti stæ pe eliminâ o tag \"$1\" da-o database.",
+       "tags-delete-explanation-in-use": "A saiâ rimossa da {{PLURAL:$2|$2 verscioin ò voxe de registro| tutte e $2 verscioin e/ò voxe de registro}} dovv'a se troeuva oua.",
+       "tags-delete-explanation-warning": "Questa açion a l'è <strong>ireverscibbile</strong> e a <strong>no poeu ese annullâ</strong>, manco da di amministratoî de database. Asegûite che quest'o segge da vei o tag che t'intendi eliminâ.",
+       "tags-delete-explanation-active": "<strong> L'etichetta \"$1\" a l'è ancon attiva, e a-o restiâ in futuo. </strong> Pe disattivâla, vanni a fâlo da-e voxe de registro dovve l'etichetta a l'è in doeuvia.",
+       "tags-delete-reason": "Raxon:",
+       "tags-delete-submit": "Elimmina irreverscibilmente questo tag",
+       "tags-delete-not-allowed": "I tag definii da 'n'estenscion no poeuan ese eliminæ a meno che questo no segge specificamente permisso da l'estenscion.",
+       "tags-delete-not-found": "O tag \"$1\" o no l'existe.",
+       "tags-delete-too-many-uses": "O tag \"$1\" o l'è applicou a ciù de $2 {{PLURAL:$2|revixon|revixion}}, saieiv'a dî, ch'o no poeu ese eliminou.",
+       "tags-delete-warnings-after-delete": "L'etichetta \"$1\" a l'è stæta scassâ, ma fanni attençion {{PLURAL:$2|a-o seguente avviso|a-i seguenti avvixi}}:",
+       "tags-delete-no-permission": "No ti g'hæ a permiscion pe scassâ i cangi d'etichetta.",
+       "tags-activate-title": "Attiva tag",
+       "tags-activate-question": "Ti stæ pe attivâ o tag \"$1\".",
+       "tags-activate-reason": "Raxon:",
+       "tags-activate-not-allowed": "No l'è poscibbile attivâ o tag \"$1\".",
+       "tags-activate-not-found": "O tag \"$1\" o no l'existe.",
+       "tags-activate-submit": "attiva",
+       "tags-deactivate-title": "Disattiva o tag",
+       "tags-deactivate-question": "Ti stæ pe disattivâ o tag \"$1\".",
+       "tags-deactivate-reason": "Raxon:",
+       "tags-deactivate-not-allowed": "No l'è poscibbile disattivâ o tag \"$1\".",
+       "tags-deactivate-submit": "disattiva",
+       "tags-apply-no-permission": "No ti dispon-i de l'aotorizzaçion pe appricâ a modiffica di tag insemme a-e to modiffiche.",
+       "tags-apply-blocked": "No ti poeu appricâ i etichette a-e modiffiche mentre t'ê bloccou.",
+       "tags-apply-not-allowed-one": "L'etichetta \"$1\" a no poeu ese appricâ manoalmente.",
+       "tags-apply-not-allowed-multi": "{{PLURAL:$2|A seguente etichetta a no poeu ese appricâ|E seguente etichette no poeuan ese appricæ}} manoalmente: $1",
+       "tags-update-no-permission": "Non ti dispon-i de permiscioin necessaie pe azonze ò rimoeuve i etichette de modiffica da-e scingole verscioin ò voxe de registro.",
+       "tags-update-blocked": "No ti poeu rimoeuve i cangi d'etichetta dementre che t'ê blocou.",
+       "tags-update-add-not-allowed-one": "L'etichetta \"$1\" a no poeu ese azonta manoalmente.",
+       "tags-update-add-not-allowed-multi": "{{PLURAL:$2|A seguente etichetta a no poeu ese azonta|E seguente etichette no poeuan ese azonte}} manoalmente: $1",
+       "tags-update-remove-not-allowed-one": "L'etichetta \"$1\" a no poeu ese rimossa.",
+       "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|A seguente etichetta a no poeu ese rimossa|E seguente etichette no poeuan ese rimosse}} manoalmente: $1",
+       "tags-edit-title": "Modiffica etichette",
+       "tags-edit-manage-link": "Gestisci etichette",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Verscion seleçionâ|Verscioin seleçionæ}} de [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Evento do registro seleçionou|Eventi do registro seleçionæ}}:",
+       "tags-edit-revision-legend": "Azonzi ò rimoeuvi i etichette da {{PLURAL:$1|questa verscion|tutte $1 e verscioin}}",
+       "tags-edit-logentry-legend": "Azonzi ò rimoeuvi o etichette da {{PLURAL:$1|questa voxe de registro|tutte $1 e voxe de registro}}",
+       "tags-edit-existing-tags": "Etichette existente:",
+       "tags-edit-existing-tags-none": "<em>Nisciun-a</em>",
+       "tags-edit-new-tags": "Noeuve etichette:",
+       "tags-edit-add": "Azonzi queste etichette:",
+       "tags-edit-remove": "Rimoeuvi queste etichette:",
+       "tags-edit-remove-all-tags": "(leva tutti i tag)",
+       "tags-edit-chosen-placeholder": "Seleçion-a arcun-e etichette",
+       "tags-edit-chosen-no-results": "Nisciun tag corrispondente trovou",
+       "tags-edit-reason": "Raxon:",
+       "tags-edit-revision-submit": "Apprica e modiffiche a {{PLURAL:$1|questa verscion|$1 verscioin}}",
+       "tags-edit-logentry-submit": "Apprica e modiffiche a {{PLURAL:$1|questa voxe de registro|$1 voxe de registro}}",
+       "tags-edit-success": "E modifiche son stæte appricæ.",
+       "tags-edit-failure": "No l'è stæto poscibbile effettoâ e seguente modiffiche:\n$1",
+       "tags-edit-nooldid-title": "Verscion specificâ non vallida",
+       "tags-edit-nooldid-text": "No t'hæ specificou arcun-a verscion da paggina in sciâ quæ exeguî questa fonçion, oppû a verscion specificâ a no l'existe.",
+       "tags-edit-none-selected": "Pe piaxei, seleçion-a a-o manco un tag da azonzge ò da levâ.",
+       "comparepages": "Confronta e paggine",
+       "compare-page1": "Pagina 1",
+       "compare-page2": "Pagina 2",
+       "compare-rev1": "Verscion 1",
+       "compare-rev2": "Verscion 2",
+       "compare-submit": "Confronta",
+       "compare-invalid-title": "O tittolo che t'hæ specificou o no l'è vallido.",
+       "compare-title-not-exists": "O tittolo specificou o no l'existe.",
+       "compare-revision-not-exists": "A verscion che t'hæ specificou a no l'existe.",
+       "dberr-problems": "Spiaxenti! Questo scito o g'ha di problemi tecnichi.",
+       "dberr-again": "Proeuva a aspêtâ quarche menuto e recarrega.",
+       "dberr-info": "(Imposcibbile accede a-o database: $1)",
+       "dberr-info-hidden": "(Imposcibbile accede a-o database)",
+       "dberr-usegoogle": "Ti poeu provâ a çercâ insce Google into fratempo.",
+       "dberr-outofdate": "Notta che a so indiçizaçion di nostri contegnui a poriæ no ese agiornâ.",
+       "dberr-cachederror": "Questa a l'è una coppia cache dea paggina domandâ, e a poriæ no ese agiornâ.",
+       "htmlform-invalid-input": "Gh'è di problemi co-i dæti inseii.",
+       "htmlform-select-badoption": "O valô specificou a no l'è un'opçion vallida.",
+       "htmlform-int-invalid": "O valô specificou o no l'è un intrego.",
+       "htmlform-float-invalid": "O valô specificou o no l'è un nummero.",
+       "htmlform-int-toolow": "O valô specificou o l'è infeiô a-o minnimo de $1",
+       "htmlform-int-toohigh": "O valô specificou o l'è supeiô a-o mascimo de $1",
+       "htmlform-required": "Questo valô o l'è öbrigatoio.",
+       "htmlform-submit": "Invia",
+       "htmlform-reset": "Anulla e modiffiche",
+       "htmlform-selectorother-other": "Atro",
+       "htmlform-no": "No",
+       "htmlform-yes": "Sci",
+       "htmlform-chosen-placeholder": "Seleçion-a un'opçion",
+       "htmlform-cloner-create": "Azonzi de l'atro",
+       "htmlform-cloner-delete": "Leva",
+       "htmlform-cloner-required": "Ghe voeu a-o manco un valô.",
+       "htmlform-title-badnamespace": "[[:$1]] a no se troeuva into namespace \"{{ns:$2}}\".",
+       "htmlform-title-not-creatable": "\"$1\" o l'è o tittolo de una paggina non creabile",
+       "htmlform-title-not-exists": "$1 a no l'existe.",
+       "htmlform-user-not-exists": "'''$1''' o no l'existe.",
+       "htmlform-user-not-valid": "<strong>$1</strong> o no l'è un nomme utente vallido.",
+       "sqlite-has-fts": "$1 co-a poscibilitæ de riçerca completa into testo",
+       "sqlite-no-fts": "$1 sença a poscibilitæ de riçerca completa into testo",
        "logentry-delete-delete": "$1 {{GENDER:$2|o l'ha scassou}} a paggina $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|o|a}} l'ha ripristinou a paggina $3",
+       "logentry-delete-event": "$1 {{GENDER:$2|o|a}} l'ha modificou a vixibilitæ de {{PLURAL:$5|un'açion do registro|$5 açioin do registro}} de \"$3\": $4",
+       "logentry-delete-revision": "$1 {{GENDER:$2|o l'ha modificou}} a vixibilitæ pe {{PLURAL:$5|una verscion|$5 verscioin}} da paggina $3: $4",
+       "logentry-delete-event-legacy": "$1 {{GENDER:$2|o l'ha modificou}} a vixibilitæ de quarche açion do registro de $3",
+       "logentry-delete-revision-legacy": "$1 {{GENDER:$2|o l'ha modificou}} a vixibilitæ pe-e verscioin da paggina $3",
+       "logentry-suppress-delete": "$1 {{GENDER:$2|o l'ha soppresso}} a paggina $3",
+       "logentry-suppress-event": "$1 {{GENDER:$2|o l'ha segretamente modificou}} a vixibilitæ de {{PLURAL:$5|un'açion do registro|$5 açioin do registro}} de $3: $4",
+       "logentry-suppress-revision": "$1 {{GENDER:$2|o l'ha segretamente modificou}} a vixibilitæ de {{PLURAL:$5|una verscion|$5 verscioin}} da paggina $3: $4",
+       "logentry-suppress-event-legacy": "$1 {{GENDER:$2|o l'ha segretamente modificou}} a vixibilitæ de quarche açion do registro de $3",
+       "logentry-suppress-revision-legacy": "$1 {{GENDER:$2|o l'ha segretamente modificou}} a vixibilitæ de quarche verscion da pagina $3",
+       "revdelete-content-hid": "contegnuo ascoso",
+       "revdelete-summary-hid": "ögetto da modiffica ascoso",
+       "revdelete-uname-hid": "nomme utente ascoso",
+       "revdelete-content-unhid": "contegnuo ripristinou",
+       "revdelete-summary-unhid": "ögetto da modiffica ripristinou",
+       "revdelete-uname-unhid": "nomme utente ripristinou",
+       "revdelete-restricted": "limitaçioin a-i soli amministratoî attivæ",
+       "revdelete-unrestricted": "limitaçioin a-i soli amministratoî rimosse",
+       "logentry-block-block": "$1 {{GENDER:$2|o l'ha bloccou}} {{GENDER:$4|$3}} co-ina scadença de $5 $6",
+       "logentry-block-unblock": "$1 {{GENDER:$2|o l'ha sbroccou}} {{GENDER:$4|$3}}",
+       "logentry-block-reblock": "$1 {{GENDER:$2|o l'ha modificou}} e impostaçioin do blocco pe {{GENDER:$4|$3}} co-ina scadença de $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|o l'ha bloccou}} {{GENDER:$4|$3}} co-ina scadença de $5 $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|o l'ha modificou}} e impostaçioin do blocco pe {{GENDER:$4|$3}} co-ina scadença de $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|o l'ha importou}} $3 trammite caregamento",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|o l'ha importou}} $3 trammite caregamento de file ($4 {{PLURAL:$4|verscion|verscioin}})",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|o l'ha importou}} $3 da un'atra wiki",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|o l'ha importou}} $3 da $5 ($4 {{PLURAL:$4|verscione|verscioin}})",
+       "logentry-merge-merge": "$1 {{GENDER:$2|o l'ha unio}} $3 in $4 (verscioin scin a-o $5)",
        "logentry-move-move": "$1 {{GENDER:$2|o l'ha mesciou}} a paggina $3 a $4",
+       "logentry-move-move-noredirect": "$1 {{GENDER:$2|o l'ha mescioiu}} a paggina $3 a $4 sença lasciâ de redirect",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|o l'ha mesciou}} a paggina $3 a $4 trammite redirect",
+       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|o l'ha mesciou}} a paggina $3 a $4 a-o posto de 'n redirect sença lasciâ de redirect",
+       "logentry-patrol-patrol": "$1 {{GENDER:$2|o l'ha marcou}} a verscion $4 da paggina $3 comme controlâ",
+       "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|o l'ha marcou}} aotomaticamente a verscion $4 da paggina $3 comme controlâ",
+       "logentry-newusers-newusers": "L'utensa $1 a l'è stæta {{GENDER:$2|creâ}}",
        "logentry-newusers-create": "L'utensa $1 a l'è stæta {{GENDER:$2|creâ}}",
+       "logentry-newusers-create2": "L'utença $3 a l'è stæta {{GENDER:$2|creâ}} da $1",
+       "logentry-newusers-byemail": "L'utença $3 a l'è stæta {{GENDER:$2|creâ}} da $1 e a password a l'è stæta inviâ via e-mail",
+       "logentry-newusers-autocreate": "L'utença $1 a l'è stæta {{GENDER:$2|creâ}} aotomaticamente",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|o l'ha mesciou}} e impostaçioin de proteçion da $4 a $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|o l'ha rimosso}} a proteçion da $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|o l'ha protezuo}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|o l'ha protezuo}} $3 $4 [ricorsciva]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|o l'ha modificou}} o livello de proteçion pe $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|o l'ha modificou}} o livello de proteçion pe $3 $4 [ricorsciva]",
+       "logentry-rights-rights": "$1 {{GENDER:$2|o l'ha modificou}} l'appartenença de {{GENDER:$6|$3}} da-o groppo $4 a-o groppo $5",
+       "logentry-rights-rights-legacy": "$1 {{GENDER:$2|o l'ha modificou}} l'appartenença a di groppi de $3",
+       "logentry-rights-autopromote": "$1 o l'è {{GENDER:$2|stæto promosso|stæta promossa|stato/a promosso/a}} aotomaticamente da $4 a $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|o l'ha caregou}} $3",
-       "searchsuggest-search": "Çerca"
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|o l'ha caregou}} una noeuva verscion de $3.",
+       "logentry-upload-revert": "$1 {{GENDER:$2|o l'ha caregou}} $3",
+       "log-name-managetags": "Gestion etichette",
+       "log-description-managetags": "Questa paggina a l'elenca i açioin de gestion relative a-i [[Special:Tags|etichette]]. O registro o conten solo e açioin effettuæ manoalmente da 'n amministratoô; i etichette porieivan ese creæ ò scassæ da-o programma wiki sença che 'na voxe a segge registrâ chie.",
+       "logentry-managetags-create": "$1 {{GENERE:$2|o l'ha creou}}o tag \"$4\"",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|o l'ha rimosso}} l'etichetta \"$4\" (da $5 {{PLURAL:$5|verscione ò voxe de registro|verscioin ò voxe de registro}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|o l'ha inseio}} l'etichetta \"$4\" pe l'uso da parte d'utenti e bot",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|o l'ha disattivou}} l'etichetta \"$4\" pe l'uso da parte d'utenti e bot",
+       "log-name-tag": "Etichette",
+       "log-description-tag": "Questa pagina a mostra quande i utenti han azonto ò rimosso di [[Special:Tags|etichette]] da de scingole verscioin ò voxe do registro. O registro o no l'elenca o etichettatue che avegnan co-ina modiffica, una cançelaçione ò un'atra açion scimmile.",
+       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|o l'ha azonto}} {{PLURAL:$7|l'etichetta|i etichette}} $6 a-a verscion $4 da paggina $3",
+       "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|o l'ha azonto}} {{PLURAL:$7|l'etichetta|i etichette}} $6 a-a voxe de registro $5 da paggina $3",
+       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|o l'ha rimosso}} {{PLURAL:$9|l'etichetta|i etichette}} $8 da-a verscion $4 da paggina $3",
+       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|o l'ha rimosso}} {{PLURAL:$9|l'etichetta|i etichette}} $8 da-a voxe de registro $5 da paggina $3",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2|o l'ha aggiornou}} i etichette da verscion $4 da paggina $3 ({{PLURAL:$7|azonta|azonte}} $6; {{PLURAL:$9|rimossa|rimosse}} $8)",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2|o l'ha aggiornou}} i etichette da voxe de registro $5 de paggina $3 ({{PLURAL:$7|azonta|azonte}} $6; {{PLURAL:$9|rimossa|rimosse}} $8)",
+       "rightsnone": "(nisciun)",
+       "revdelete-summary": "ögetto da modiffica",
+       "feedback-adding": "Inseimento do feedback inta paggina...",
+       "feedback-back": "Inderê",
+       "feedback-bugcheck": "Ottimo! Controlla solo ch'o no segge za fra-i [$1 bug conosciui].",
+       "feedback-bugnew": "Controllo effettuou. Segnalla un noeuvo bug",
+       "feedback-bugornote": "Se t'ê pronto a descrive o problema tecnico riscontrou de maibea precisa, [$1 segnalla o bug]. In alternativa, ti poeu doeuviâ o moddulo semplificou sottostante. O to commento inseio o saiâ azonto a-a paggina \"[$3 $2]\", insemme a-o to nomme utente.",
+       "feedback-cancel": "Anulla",
+       "feedback-close": "Fæto",
+       "feedback-external-bug-report-button": "Documenta un problema tecnico",
+       "feedback-dialog-title": "Invia un feedback",
+       "feedback-dialog-intro": "Doeuvia o moddulo sottostante pe inviâ o to feedback. O to commento o l'appariâ inta paggina \"$1\", assemme a-o to nomme utente.",
+       "feedback-error-title": "Errô",
+       "feedback-error1": "Errô: Da-a API l'è arrivou un risultou non riconosciuo",
+       "feedback-error2": "Errô: No l'è stæto poscibbile eseguî a modiffica",
+       "feedback-error3": "Errô: Nisciun-a risposta da-a API",
+       "feedback-error4": "Errô: imposcibbile inviâ o feedback a-o tittolo indicou",
+       "feedback-message": "Messaggio:",
+       "feedback-subject": "Sogetto:",
+       "feedback-submit": "Invia",
+       "feedback-terms": "Acapiscio che e mæ informaçioin insce l'user agent includdan de informaçioin in sciô mæ esatto navegatô e verscion do scistema operativo, che saian condivise pubricamente, assemme a-o mæ feedback.",
+       "feedback-termsofuse": "Accetto de fornî di feedback conformemente a-e Condiçioin d'Uso.",
+       "feedback-thanks": "Graççie! O to feedback o l'è stæto pubricou a-a paggina \"[$2 $1]\".",
+       "feedback-thanks-title": "Graççie!",
+       "feedback-useragent": "Agente utente:",
+       "searchsuggest-search": "Çerca",
+       "searchsuggest-containing": "ch'o conten...",
+       "api-error-autoblocked": "O to adreçço IP o l'è stæto bloccou aotomaticamente, perché o l'è stæto doeuviou da un utente bloccou.",
+       "api-error-badaccess-groups": "No t'ê aotorizzou a caregâ di file insce questa wiki.",
+       "api-error-badtoken": "Errô interno: token errou.",
+       "api-error-blocked": "T'ê stæto bloccou, no ti poeu fâ modiffiche.",
+       "api-error-copyuploaddisabled": "O caregamento trammite URL o l'è disabilitou insce questo server.",
+       "api-error-duplicate": "Gh'è za {{PLURAL:$1|un atro file|di atri files}} into scito co-o mæximo contegnuo.",
+       "api-error-duplicate-archive": "Gh'ea za {{PLURAL:$1|un atro file|di ltri file}} into scito co-o mæximo contegnuo, ma {{PLURAL:$1|o l'è stæto scassou|son stæti scassæ}}.",
+       "api-error-empty-file": "O file che t'hæ inviou o l'è voeuo.",
+       "api-error-emptypage": "A creaçion de noeuve pagine voeue a no l'è consentia.",
+       "api-error-fetchfileerror": "Errô interno: s'è verificou un problema durante o recuppero do file.",
+       "api-error-fileexists-forbidden": "Un file de nomme \"$1\" o l'existe za e o no poeu ese sorvescrito.",
+       "api-error-fileexists-shared-forbidden": "Un file de nomme \"$1\" o l'existe za into repository condiviso e o no poeu ese sorvescrito.",
+       "api-error-file-too-large": "O file che t'hæ inviou o l'ea troppo grande.",
+       "api-error-filename-tooshort": "O nomme do file o l'è troppo curto.",
+       "api-error-filetype-banned": "Questo tipo de file o l'è proibio.",
+       "api-error-filetype-banned-type": "\"$1\" {{PLURAL:$4|o no l'è un tipo de file consentio|no son di tipi de file consentii}}. {{PLURAL:$3|O tipo de file consentio o l'è|I tipi de file consentii son}} $2.",
+       "api-error-filetype-missing": "A-o file gh'amanca l'estenscion.",
+       "api-error-hookaborted": "A modiffica che t'hæ çercou de fâ a l'è stæta interrotta da un'estenscion.",
+       "api-error-http": "Errô interno: imposcibbile connettise a-o server.",
+       "api-error-illegal-filename": "O nomme do file o no l'è ammisso.",
+       "api-error-internal-error": "Errô interno: quarcosa o l'è anæto storto con l'elaboaçion do to caregamento in sciâ wiki.",
+       "api-error-invalid-file-key": "Errô interno: file non presente inta cartella di file temporannei.",
+       "api-error-missingparam": "Errô interno: parammetri da recesta mancanti.",
+       "api-error-missingresult": "Errô interno: imposcibbile determinâ se a coppia a l'è ariescîa.",
+       "api-error-mustbeloggedin": "Pe caregâ di file ti devi primma intrâ.",
+       "api-error-mustbeposted": "Errô interno: a recesta a richiede HTTP POST.",
+       "api-error-noimageinfo": "O caregamento o l'è ariescio, ma o server o no n'ha dæto arcun-a informaçion  in sciô file.",
+       "api-error-nomodule": "Errô interno: no l'è stæto impostou o moddulo de caregamento.",
+       "api-error-ok-but-empty": "Errô interno: nisciun-a risposta da-o server.",
+       "api-error-overwrite": "No l'è permisso soviascrive un file existente.",
+       "api-error-ratelimited": "Ti çerchi de caregâ ciù file in meno tempo de quante questo wiki o permette.\nRiproeuva tra pochi menuti.",
+       "api-error-stashfailed": "Errô interno: o server o no l'è ariescio a memorizzâ o documento temporannio.",
+       "api-error-publishfailed": "Errô interno: o server o no l'è ariescio a pubbricâ o documento temporannio.",
+       "api-error-stasherror": "S'è veificou un errô durante o caregamento do file inta stash.",
+       "api-error-stashedfilenotfound": "O file inta stash o no l'è stæto trovou durante o tentativo de caregâ da-a stash.",
+       "api-error-stashpathinvalid": "O percorso ch'o l'aviæ dovuo portâ a-o file inta stash o no l'ea vallido.",
+       "api-error-stashfilestorage": "S'è veificou un errô durante a memorizzaçion do file inta stash.",
+       "api-error-stashzerolength": "O server o no poeu insei o file inta stash, perché o g'ha longheçça zero.",
+       "api-error-stashnotloggedin": "Pe poei sarvâ di file inta stash de caregamento ti devi primma intrâ.",
+       "api-error-stashwrongowner": "O file a-o quæ ti çercavi d'accede inta stash o no t'apparten.",
+       "api-error-stashnosuchfilekey": "A ciave do file a-a quæ ti çercavi d'accede inta stash a no l'existe.",
+       "api-error-timeout": "O server o no l'ha risposto entro o tempo previsto.",
+       "api-error-unclassified": "Gh'è stæto un aro sconosciuo.",
+       "api-error-unknown-code": "Errô sconosciuo: \"$1\"",
+       "api-error-unknown-error": "Errô interno: quarcosa l'è anæto storto provando a caregâ o file.",
+       "api-error-unknown-warning": "Avviso sconosciuo: $1",
+       "api-error-unknownerror": "Errô sconosciuo: \"$1\"",
+       "api-error-uploaddisabled": "O caregamento o l'è disabilitou insce questa wiki.",
+       "api-error-verification-error": "Questo file o poriæ ese dannezou, o aveighe l'estenscion sbaliâ.",
+       "api-error-was-deleted": "Un file co-o mæximo nomme o l'è stæto precedentemente caregou e succescivamente eliminou.",
+       "duration-seconds": "$1 {{PLURAL:$1|segondo|segondi}}",
+       "duration-minutes": "$1 {{PLURAL:$1|menuto|menuti}}",
+       "duration-hours": "$1 {{PLURAL:$1|oa|oe}}",
+       "duration-days": "$1 {{PLURAL:$1|giorno|giorni}}",
+       "duration-weeks": "$1 {{PLURAL:$1|setteman-a|setteman-e}}",
+       "duration-years": "$1 {{PLURAL:$1|anno|anni}}",
+       "duration-decades": "$1 {{PLURAL:$1|deccade}}",
+       "duration-centuries": "$1 {{PLURAL:$1|seccolo|seccoli}}",
+       "duration-millennia": "$1 {{PLURAL:$1|milennio|milenni}}",
+       "rotate-comment": "Immaggine curlâ de $1 {{PLURAL:$1|grao|groei}} in senso oraio",
+       "limitreport-title": "Dæti de profî do parser:",
+       "limitreport-cputime": "Tempo de utilizzo CPU",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|segondo|segondi}}",
+       "limitreport-walltime": "Tempo de utilizzo reale",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|segondo|segondi}}",
+       "limitreport-ppvisitednodes": "Nummero di noeui do preprocessô vixitæ",
+       "limitreport-ppgeneratednodes": "Nummero di noeui do preprocessô generæ",
+       "limitreport-postexpandincludesize": "Dimenscion de incluxoin post-espanscion",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|byte}}",
+       "limitreport-templateargumentsize": "Dimenscion di parammetri do template",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte}}",
+       "limitreport-expansiondepth": "Mascima profonditæ d'espanscion",
+       "limitreport-expensivefunctioncount": "Nummero de fonçioin do parser dispendiose",
+       "expandtemplates": "Espanscion di template",
+       "expand_templates_intro": "Questa pagina speciale a l'elabboa un testo espandendo tutti i template presenti.\nA carcoa ascì o risultou de fonçioon supportæ da-o parser comme\n<code><nowiki>{{</nowiki>#language:…}}</code> e de variabbile de scistema quæ\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>,\nsaiv'a dî inta prattica tutto 'lo che s'attroeuva tra parentexi graffe dogge.",
+       "expand_templates_title": "Contesto (pe {{FULLPAGENAME}} eçç.):",
+       "expand_templates_input": "Testo da espande:",
+       "expand_templates_output": "Risultou",
+       "expand_templates_xml_output": "Output in formato XML",
+       "expand_templates_html_output": "Risultou HTML",
+       "expand_templates_ok": "OK",
+       "expand_templates_remove_comments": "Rimoeuvi i commenti",
+       "expand_templates_remove_nowiki": "Elimmina o tag <nowiki> into risultou",
+       "expand_templates_generate_xml": "Mostra l'ærbo scintattico XML",
+       "expand_templates_generate_rawhtml": "Mostra l'HTML sgroeuzzo",
+       "expand_templates_preview": "Anteprimma",
+       "expand_templates_preview_fail_html": "<em>Scicomme {{SITENAME}} o g'ha de l'HTML sgroeuzzo attivou e gh'è stæto una perdia di dæti da sescion, l'anteprimma a l'è ascosa comme precaoçion contra i attacchi JavaScript.</em>\n\n<strong>Se se tratta de 'n normale tentativo d'anteprimma, riproeuva.</strong> \nSe o problema o persciste, ti poeu provâ a [[Special:UserLogout|scollegate]] e effettoâ un noeuvo accesso, controllando che o to navegatô o l'açette i bescoeutti da questo scito.",
+       "expand_templates_preview_fail_html_anon": "<em>Scicomme {{SITENAME}} o g'ha de l'HTML sgroeuzzo attivou e ti no t'ê introu, l'anteprimma a l'è ascosa comme precaoçion contra i attacchi JavaScript.</em>\n\n<strong>Se se tratta de 'n normale tentativo d'anteprimma [[Special:UserLogin|intra]] e proeuvighe torna.</strong>",
+       "expand_templates_input_missing": "Quarcosa ti ghe-o devi scrive.",
+       "pagelanguage": "Cangia a lengua da paggina",
+       "pagelang-name": "Paggina",
+       "pagelang-language": "Lengua",
+       "pagelang-use-default": "Adoeuvia a lengua predefinia",
+       "pagelang-select-lang": "Seleçion-a a lengua",
+       "pagelang-submit": "Invia",
+       "right-pagelang": "Cangia a lengua da paggina",
+       "action-pagelang": "cangiâ a lengua da paggina",
+       "log-name-pagelang": "Registro di cangi de lengua",
+       "log-description-pagelang": "Questo o l'è un registro di cangiamenti de lengua de paggine.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|o l'ha modificou}} a lengua de $3 da $4 a $5",
+       "default-skin-not-found": "Oops! O tema predefinio pe-o to wiki, definio in <code dir=\"ltr\">$wgDefaultSkin</code> comme <code>$1</code>, o no l'è disponibbile.\n\nA to installaçion a pariæ includde {{PLURAL:$4|o seguente tema|i seguenti temi}}. Amia [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manuale: configuaçion do tema] pe de informaçioin insce comme {{PLURAL:$4|abilitâlo|abilitâli}} e çerne quello predefinio.\n\n$2\n\n; Se t'hæ appen-a installou MediaWiki:\n: Foscia ti l'hæ installou da git, o direttamente da-o codiçe sorgente doeuviando quarch'atro mettodo. Questo o l'ea previsto. Proeuva a installâ di temi da-a [https://www.mediawiki.org/wiki/Category:All_skins directory insce mediawiki.org], de ste mainee chì:\n:* Scaregando o [https://www.mediawiki.org/wiki/Download programma de installaçion tarball], ch'o l'è fornio con diversci temi e estenscioin. Ti poeu fâ o coppia e incolla da directory <code dir=\"ltr\">skins/</code> da lì.\n:* Scaregando di tarball di scingoli temi da [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Doeuviando Git pe scaregâ i temi].\n: In questo moddo no doviæ interfei co-o to repository git se t'ê un sviluppatô MediaWiki.\n\n; Se t'hæ appen-a aggiornou MediaWiki:\n: MediaWiki 1.24 e verscioin succescive no abillitan ciù aotomaticamente i temi installæ (amia [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manoale: rilevamento aotomattico di temi]). Ti poeu copiâ {{PLURAL:$5|a seguente linnia|e seguente linne}} into <code>LocalSettings.php</code> pe abilitâ {{PLURAL:$5|o tema installou|tutti i temi installæ}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Se t'hæ appen-a modificou <code>LocalSettings.php</code>:\n: Ricontrolla i nommi di temi pe di ari de battitua.",
+       "default-skin-not-found-no-skins": "Oops! O tema predefinio pe-o to wiki, definio in <code>$wgDefaultSkin</code> comme <code>$1</code>, o no l'è disponibbile.\n\nTemi installæ no ti ghe n'hæ.\n\n; Se t'hæ appen-a installou ò aggiornou MediaWiki:\n: Foscia ti l'hæ installou da git, ò direttamente da-o coddiçe sorgente doeuviando quarch'atro mettodo. Questo o l'ea previsto. MediaWiki 1.24 e e verscioin succescive no includdan arcun tema into repository prinçipâ. Proeuva a installâ di temi da-a [https://www.mediawiki.org/wiki/Category:All_skins directory insce mediawiki.org], inte sti moddi:\n:* Scaregando o [https://www.mediawiki.org/wiki/Download programma de instalaçion tarball], ch'o l'è fornio con diversci temi e estenscioin. Ti poeu fâ o coppia e incolla da directory <code>skins/</code> da lì.\n:* Scaregando tarball di scingoli temi da [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Doeuviando Git pe scaregâ i temi].\n: Sto moddo o no doviæ interfei co-o to repository git se t'ê un sviluppatô MediaWiki. Amia [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manoale: configuaçion di temi] pe informaçioin insce comme abilitâle e scellie quello predefinio.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (abilitâ)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>disabilitâ</strong>)",
+       "mediastatistics": "Statistiche relative a-i file murtimediæ",
+       "mediastatistics-summary": "Statistiche in scî tipi de file caregæ. L'è incluso solo che a verscion ciù reçente de 'n file. E verscioin vege ò scassæ di file son escluse.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte}} ($2; $3%)",
+       "mediastatistics-bytespertype": "Dimenscione totâ di file pe questa seçion: {{PLURAL:$1|$1 byte}} ($2; $3%).",
+       "mediastatistics-allbytes": "Dimenscion totâ de tutti i file: {{PLURAL:$1|$1 byte}} ($2).",
+       "mediastatistics-table-mimetype": "Tipo MIME",
+       "mediastatistics-table-extensions": "Poscibbile estenscioin",
+       "mediastatistics-table-count": "Nummero di file",
+       "mediastatistics-table-totalbytes": "Dimenscion combinâ",
+       "mediastatistics-header-unknown": "Sconosciuo",
+       "mediastatistics-header-bitmap": "Immaggine bitmap",
+       "mediastatistics-header-drawing": "Disegni (immaggine vettoiæ)",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Video",
+       "mediastatistics-header-multimedia": "Contegnui murtimediæ",
+       "mediastatistics-header-office": "Öfiççio",
+       "mediastatistics-header-text": "Testoale",
+       "mediastatistics-header-executable": "File exeguibbili",
+       "mediastatistics-header-archive": "Formati compresci",
+       "mediastatistics-header-total": "Tutti i file",
+       "json-warn-trailing-comma": "$1 {{PLURAL:$1|virgola finâ a l'è stæta rimossa|virgole finæ son stæte rimosse}} da-o JSON",
+       "json-error-unknown": "Gh'è stæto un problema co-o JSON. Errô: $1",
+       "json-error-depth": "A profonditæ mascima do stack a l'è stæta superâ",
+       "json-error-state-mismatch": "JSON non vallido ò mäformou",
+       "json-error-ctrl-char": "Errô into carattere de controllo, poscibbile codiffica errâ",
+       "json-error-syntax": "Errô de scintasci",
+       "json-error-utf8": "Caratteri UTF-8 non vallidi, poscibbile codiffica errâ",
+       "json-error-recursion": "Un o ciù rifeimenti ricorscivi into valô da codificâ",
+       "json-error-inf-or-nan": "Un ò ciu valoî NAN o INF into valô da codificâ",
+       "json-error-unsupported-type": "L'è stæto fornio un valô de un tipo ch'o no poeu ese codificou",
+       "headline-anchor-title": "Colegamento a questa seçion",
+       "special-characters-group-latin": "Latin",
+       "special-characters-group-latinextended": "Latin esteiso",
+       "special-characters-group-ipa": "IPA",
+       "special-characters-group-symbols": "Scimboli",
+       "special-characters-group-greek": "Grego",
+       "special-characters-group-greekextended": "Grego esteiso",
+       "special-characters-group-cyrillic": "Çirillico",
+       "special-characters-group-arabic": "Arrabo",
+       "special-characters-group-arabicextended": "Arrabo esteiso",
+       "special-characters-group-persian": "Perscian",
+       "special-characters-group-hebrew": "Ebraico",
+       "special-characters-group-bangla": "Bengaleise",
+       "special-characters-group-tamil": "Tamil",
+       "special-characters-group-telugu": "Telugu",
+       "special-characters-group-sinhala": "Scingaleise",
+       "special-characters-group-gujarati": "Gujarati",
+       "special-characters-group-devanagari": "Devanagari",
+       "special-characters-group-thai": "Thailandeise",
+       "special-characters-group-lao": "Laotian",
+       "special-characters-group-khmer": "Khmer",
+       "special-characters-title-endash": "linieta enne",
+       "special-characters-title-emdash": "linieta emme",
+       "special-characters-title-minus": "segno meno",
+       "mw-widgets-dateinput-no-date": "Niscun-a dæta seleçionâ",
+       "mw-widgets-titleinput-description-new-page": "questa paggina o no l'existe ancon",
+       "mw-widgets-titleinput-description-redirect": "rendriçamento a $1",
+       "sessionmanager-tie": "No l'è poscibbile combinâ ciù tipi de receste de aotenticaçion: $1.",
+       "sessionprovider-generic": "sescioin $1",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "sescioin basæ in scî cookie",
+       "sessionprovider-nocookies": "I cookie poeuan ese disattivæ. Assegûite d'aveighe i cookie abilitæ e ricomença.",
+       "randomrootpage": "Paggina reixe a brettio",
+       "log-action-filter-block": "Tipo de blocco:",
+       "log-action-filter-contentmodel": "Tipo de modiffica do modello de contegnuo:",
+       "log-action-filter-delete": "Tipo de scassatua:",
+       "log-action-filter-import": "Tipo de importaçion:",
+       "log-action-filter-managetags": "Tipo d'açion de gestion d'etichetta:",
+       "log-action-filter-move": "Tipo de stramuo:",
+       "log-action-filter-newusers": "Tipo de creaçion d'utença:",
+       "log-action-filter-patrol": "Tipo de controllo:",
+       "log-action-filter-protect": "Tipo de proteçion:",
+       "log-action-filter-rights": "Tipo de modiffica di driti:",
+       "log-action-filter-suppress": "Tipo de soprescion:",
+       "log-action-filter-upload": "Tipo de caregamento:",
+       "log-action-filter-all": "Tutto",
+       "log-action-filter-block-block": "Blocco",
+       "log-action-filter-block-reblock": "Modiffica do blocco",
+       "log-action-filter-block-unblock": "Sblocco",
+       "log-action-filter-contentmodel-change": "Modiffica do modello do contegnuo",
+       "log-action-filter-contentmodel-new": "Creaçion de paggina con modello de contenuto non standard",
+       "log-action-filter-delete-delete": "Scancellaçion paggina",
+       "log-action-filter-delete-restore": "Ripristino paggina",
+       "log-action-filter-delete-event": "Scancellaçion registro",
+       "log-action-filter-delete-revision": "Scancellaçion verscion",
+       "log-action-filter-import-interwiki": "Importaçion transwiki",
+       "log-action-filter-import-upload": "Importaçion da XML caregou",
+       "log-action-filter-managetags-create": "Creaçion etichetta",
+       "log-action-filter-managetags-delete": "Scancellaçion etichetta",
+       "log-action-filter-managetags-activate": "Attivaçion etichetta",
+       "log-action-filter-managetags-deactivate": "Disattivaçion etichetta",
+       "log-action-filter-move-move": "Stramuo sença soviascrive di rendriçamenti",
+       "log-action-filter-move-move_redir": "Stramuo con soviascritua di rendriçamenti",
+       "log-action-filter-newusers-create": "Creaçion da utente anonnimo",
+       "log-action-filter-newusers-create2": "Creaçion da utente registrou",
+       "log-action-filter-newusers-autocreate": "Creaçion aotomattica",
+       "log-action-filter-newusers-byemail": "Creaçion con password inviâ via e-mail",
+       "log-action-filter-patrol-patrol": "Controllo manoâ",
+       "log-action-filter-patrol-autopatrol": "Cotrollo aotomattico",
+       "log-action-filter-protect-protect": "Proteçion",
+       "log-action-filter-protect-modify": "Modiffica proteçion",
+       "log-action-filter-protect-unprotect": "Desproteçion",
+       "log-action-filter-protect-move_prot": "Proteçion mesciâ",
+       "log-action-filter-rights-rights": "Modiffica manoâ",
+       "log-action-filter-rights-autopromote": "Modiffica aotomattica",
+       "log-action-filter-suppress-event": "Sopprescion de registro",
+       "log-action-filter-suppress-revision": "Sopprescion de verscion",
+       "log-action-filter-suppress-delete": "Sopprescion de paggina",
+       "log-action-filter-suppress-block": "Sopprescion utente da blocco",
+       "log-action-filter-suppress-reblock": "Sopprescion utente da re-blocco",
+       "log-action-filter-upload-upload": "Noeuvo caregamento",
+       "log-action-filter-upload-overwrite": "Ricaregamento",
+       "authmanager-authn-not-in-progress": "L'aotenticaçion a no l'è in corso ò i dæti da sescion son anæti persci. Se prega de recomençâ da cavo.",
+       "authmanager-authn-no-primary": "E credençiæ fornie no poeuan ese aotenticæ.",
+       "authmanager-authn-no-local-user": "E credençiæ fornie no son associæ a nisciun utente de questo wiki.",
+       "authmanager-authn-no-local-user-link": "E credençiæ fornie son vallide ma no son associæ a nisciun utente de questa wiki. Accedi inte 'n atro moddo ò crea un noeuvo utente, e ti gh'aviæ 'n'opçion pe collegâ e to credençiæ precedente a quell'utença.",
+       "authmanager-authn-autocreate-failed": "Creaçion aotomattica de 'n'utença locale fallia: $1",
+       "authmanager-change-not-supported": "E credençiæ fornie no poeuan ese modificæ, dæto che no saieivan doeuviæ da ninte.",
+       "authmanager-create-disabled": "A creaçion di utençe a l'è disabilitâ.",
+       "authmanager-create-from-login": "Pe creâ a to utença, completa i campi chì de sotta.",
+       "authmanager-create-not-in-progress": "A creaçion de un'utença a no l'è in corso ò i dæti da sescion son anæti perdui. Se prega de recomençâ da cavo.",
+       "authmanager-create-no-primary": "E credençiæ fornie no poeuan ese doeuviæ pe-a creaçion de l'utença.",
+       "authmanager-link-no-primary": "E credençiæ fornie no poeuan ese doeuviæ pe-o colegamento de l'utença.",
+       "authmanager-link-not-in-progress": "O colegamento de l'utença o no procede ò i dæti da sescion so-anæti perdui. Se prega de recomençâ da cavo.",
+       "authmanager-authplugin-setpass-failed-title": "Modiffica da password fallia",
+       "authmanager-authplugin-setpass-failed-message": "O plugin d'aotenticaçion o l'ha impedio a modiffica da password.",
+       "authmanager-authplugin-create-fail": "O plugin d'aotenticaçion o l'ha impedio a creaçion de l'utença.",
+       "authmanager-authplugin-setpass-denied": "O plugin d'aotenticaçion o no consente de cangiâ e password.",
+       "authmanager-authplugin-setpass-bad-domain": "Dominnio non vallido.",
+       "authmanager-autocreate-noperm": "A creaçion aotomattica del'utença a no l'è permissa.",
+       "authmanager-autocreate-exception": "A creaçion aotomattica di utençe a l'è temporaniamente disabilitâ a caosa di erroî precedenti.",
+       "authmanager-userdoesnotexist": "L'utença \"$1\" a no l'è registrâ.",
+       "authmanager-userlogin-remembermypassword-help": "Se a password a dev'ese aregordâ ciù a longo rispetto a-a duata da sescion.",
+       "authmanager-username-help": "Nome utente pe l'aotenticaçion.",
+       "authmanager-password-help": "Password pe l'aotenticaçion.",
+       "authmanager-domain-help": "Dominnio pe l'aotenticaçion esterna.",
+       "authmanager-retype-help": "Conferma torna a password.",
+       "authmanager-email-label": "E-mail",
+       "authmanager-email-help": "Addreçço e-mail:",
+       "authmanager-realname-label": "Nomme vêo:",
+       "authmanager-realname-help": "Nomme reale de l'utente",
+       "authmanager-provider-password": "Aotenticaçion basâ in sciâ password",
+       "authmanager-provider-password-domain": "Aotenticaçion con password ò con dominnio",
+       "authmanager-provider-temporarypassword": "Password temporannia",
+       "authprovider-confirmlink-message": "Basandose insce di reçenti tentativi d'accesso, e seguente utençe poeuan ese collegæ a-o to account wiki. Collegandole ti poeu effettuâ l'accesso con quelle ascì. Se prega de seleçionâ quelle che devan ese collegæ.",
+       "authprovider-confirmlink-request-label": "Utençe che dovieivan ese collegæ",
+       "authprovider-confirmlink-success-line": "$1: collegou correttamente.",
+       "authprovider-confirmlink-failed": "O collegamento de l'utença o no l'è pin-amente ariescio: $1",
+       "authprovider-confirmlink-ok-help": "Continnoa doppo a visualizzaçion di messaggi de errô de collegamento.",
+       "authprovider-resetpass-skip-label": "Sata",
+       "authprovider-resetpass-skip-help": "Sata a rempostaçion da password.",
+       "authform-nosession-login": "L'aotenticaçion a l'ha avuo successo, ma o to navegatô o no l'è in graddo de \"aregordâ\" che t'ê collegou.\n\n$1",
+       "authform-nosession-signup": "L'utença a l'è stæta creâ, ma o to navegatô o no l'è in graddo de \"aregordâ\" che t'ê collegou.\n$1",
+       "authform-newtoken": "Token mancante. $1",
+       "authform-notoken": "Token mancante",
+       "authform-wrongtoken": "Token errou",
+       "specialpage-securitylevel-not-allowed-title": "Non consentio",
+       "specialpage-securitylevel-not-allowed": "Spiaxenti, no t'ê aotorizzou a doeuviâ questa paggina perché a to identitæ a no poeu ese veificâ.",
+       "authpage-cannot-login": "Imposcibbile començâ co l'accesso.",
+       "authpage-cannot-login-continue": "Imposcibbile continoâ co l'accesso. L'è probabbile che a to sescion a segge descheita.",
+       "authpage-cannot-create": "Imposcibbile comença a creaçion de l'utença.",
+       "authpage-cannot-create-continue": "Imposcibbile continoâ co-a creaçion de l'utença. L'è probabbile che a to sescion a segge descheita.",
+       "authpage-cannot-link": "Imposcibbile inandiâ o collegamento de l'utença.",
+       "authpage-cannot-link-continue": "Imposcibbile continoâ co-o collegamento de l'utença. L'è probabbile che a to sescion a segge descheita.",
+       "cannotauth-not-allowed-title": "Permisso negou",
+       "cannotauth-not-allowed": "No t'ê aotorizou a doeuviâ questa paggina",
+       "changecredentials": "Modiffica credençiæ",
+       "changecredentials-submit": "Modiffica credençiæ",
+       "changecredentials-invalidsubpage": "$1 o no l'è 'na tipologia de credençiale vallida.",
+       "changecredentials-success": "E to credençiale son stæte modificæ.",
+       "removecredentials": "Rimoeuvi credençiæ",
+       "removecredentials-submit": "Rimoeuvi credençiæ",
+       "removecredentials-invalidsubpage": "$1 o no l'è 'na tipologia de credençiale vallida.",
+       "removecredentials-success": "E to credençiale son stæte rimosse.",
+       "credentialsform-provider": "Tipo de credençiale:",
+       "credentialsform-account": "Nomme utença:",
+       "cannotlink-no-provider-title": "Utençe collegabbile no ghe n'è",
+       "cannotlink-no-provider": "Utençe colegabbile no ghe n'è.",
+       "linkaccounts": "Collega utençe",
+       "linkaccounts-success-text": "L'utença a l'è stæta colegâ.",
+       "linkaccounts-submit": "Collega utençe",
+       "unlinkaccounts": "Scollega utençe",
+       "unlinkaccounts-success": "L'utença a l'è stæta scollegâ.",
+       "authenticationdatachange-ignored": "O cangiamento da dæta d'aotenticaçion o no l'è passou. Foscia che no gh'ea un provider configuou?"
 }
index 9feb651..0eec9c6 100644 (file)
        "block-log-flags-nocreate": "kontod lūomi um kīeldtõd",
        "movepagetext": "Siedā formõ kȭlbatõs sōtõ līed tuoizõks nimtõ. Līed istōrij nustõbõd ūd pēļikēra alā automātlistiz. Paldīž-vȯļļijiz pēļizkēraks līedst sōb jeddõpēḑõn sōtimiz lēḑ ūd līedpūol jūrõ. Sōd jedmõļiz pēļikēra jūrõ sidābõd jeddõpēḑõn sōtimizt automātlistiz parāntõ. Až tēg siedā äb tīend, vaņtlõgid lebbõ, ku jarā vīmiz pierāst ūo īenõd pāikal [[Special:DoubleRedirects|kōd-kȭrdaliži]] äbkā [[Special:BrokenRedirects|kaţkiži jeddõpēḑõn sōtimiži]].\nSin ilzandõks um ūoļikšõ sīe jedstõ, ku amād ažād īebõd strōdõm, nemē jeddõ nǟdõt. Pan tǟdõl, ku līetõ '''äb vībõd''' jeddõpēḑõn  siz, až ūd pēļizkēraks līedpūol um jubā vȯlmizõs, bäz luggõmõt až vȯlmizõs līedpūol um tijā agā bäz redigīerimiz istōrijõ jeddõpēḑõn sōtimiz lēḑ. \nSe tǟntõb, ku äb sō iļ kēratõ jubā vȯlmizõs līedpūoltõ, bet sōb äbvȯņštõn ūtstõ nimtimiz tāgiž kīerõ. \n\n'''Kūondõks!''' Se võib vȱlda lugdõb līed jūs ikš väggi tuožžī ja bäz vȯdlõmõt mõitõks; jedmõl jatkimizt pōlaks mõtlõgid iļ rezultātõd.",
        "movepagetalktext": "Īdskubs kēratõks līedkõks sōtõbõd jeddõpēḑõn automātlistiz ka nõvpidāmiz-lēḑ, '''bäs.luggõmõt siz, až:''' \n* ūd pēļikēra allõ um jubā nõvpidāmiz-lēḑ, mis äb.ūo tijā;\n* tēg jetīztõ allõ vȯlbiz merk rūţ bäz vēļõmõt. \nAž sugīz nei, sōd līed tōdõs kädūdõks jeddõpēḑõn sōtõ agā jūrõ-pānda.",
-       "movearticle": "Sōtõgid se lēḑ jeddõpēḑõn",
        "newtitle": "Ūd pēļizkēra alā:",
        "move-watch": "Vaņ iļ siedā līedtõ",
        "movepagebtn": "Sōtõgid se lēḑ jeddõpēḑõn",
index 18ccf64..39466e0 100644 (file)
@@ -6,7 +6,8 @@
                        "Lakzon",
                        "Mjbmr",
                        "Macofe",
-                       "Huji"
+                       "Huji",
+                       "Miladrahimi"
                ]
        },
        "tog-underline": "کڕ(خط)کیشائن ژێر پیوندەل:",
        "october-date": "$1 اکتبر",
        "november-date": "$1 نوامبر",
        "december-date": "$1 دسامبر",
+       "period-am": "صو",
+       "period-pm": "ظور",
        "pagecategories": "{{PLURAL:$1|ڕِزگ|ڕِزگەل}}",
        "category_header": "\"وەڵگەل ڕزگ(رده) \"$1",
        "subcategories": "ژێر ڕزگەل",
        "virus-scanfailed": "  )$1 پویش ناموفق (کد",
        "virus-unknownscanner": ":ضدویروس ناشناخته",
        "logouttext": "'''ایسة دةر چئن هؤمة ثبت بیة.'''\nتوجه داشته باشید که تا حافظهٔ نهان مرورگرتان را پاک نکنید، بعضی از صفحات ممکن است همچنان به گونه‌ای نمایش یابند که انگار وارد شده‌اید.",
+       "cannotlogoutnow-title": "نمه‌تونین ایسه بچینه‌در",
+       "cannotlogoutnow-text": "ئه‌دررچین نماو هنی $1",
        "welcomeuser": "خؤةش هةتینة/هاتینة $1!",
        "welcomecreation-msg": "حساوو کاربری هۆمە دؤرس بی.\nویرتان نەچوو(فراموش نشە) گإ [[Special:Preferences|تمارزووەل(ترجیحات) {{SITENAME}}]] ووِژت بگؤەڕنین( تغییر دهی).",
        "yourname": ":نۆم کاربەری",
        "remembermypassword": "رمزعبورت وة ئئ رایانة ئةویرت/یادت بو(تابیشترإژ$1{{PLURAL:$1|رووژةل|رووژ}})",
        "userlogin-remembermypassword": "مإ وارد  بی بیل",
        "userlogin-signwithsecure": "إژ ورود امن استفاده کةن",
+       "cannotloginnow-title": "ایسه نمه‌تونین باینه نوم",
        "yourdomainname": ":دامنهٔ شما",
        "password-change-forbidden": ".شما نمی‌توانید گذرواژه‌ها را در این ویکی تغییر دهید",
        "externaldberror": "خطایی در ارتباط با پایگاه داده رخ داده است یا اینکه شما اجازهٔ به‌روزرسانی حساب خارجی خود را ندارید.",
        "login": "إ نۆم هەتن سیستم",
+       "login-security": "وژت معرفی‌که",
        "nav-login-createaccount": " إ نؤم هةتن سیستم/ حساوو کاربةری سازین",
        "userlogin": " إ نؤم هةتن سیستم/ حساوو کاربةری سازین",
        "userloginnocreate": "نؤم هۀتن سیستم",
        "special-characters-title-minus": "علامت منفی",
        "mw-widgets-dateinput-no-date": "هیچ داده‌ای انتخاب نشده",
        "mw-widgets-titleinput-description-new-page": "اێ وەڵگە هەنی(هالی)وجود نِئرێ",
-       "mw-widgets-titleinput-description-redirect": "گؤەڕانن/تغییر مسیر به $1",
-       "api-error-blacklisted": "لطفاً یک عنوان توصیفی متفاوت انتخاب کنید."
+       "mw-widgets-titleinput-description-redirect": "گؤەڕانن/تغییر مسیر به $1"
 }
index b45d90c..690b149 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Passawuth",
                        "Tuinui",
-                       "아라"
+                       "아라",
+                       "Iberia2011"
                ]
        },
        "tog-underline": "ຂີດເສັ້ນກ້ອງລິງກ໌:",
        "disclaimers": "ຂໍ້ປະຕິເສດຄວາມຮັບຜິດຊອບ",
        "disclaimerpage": "Project:ຂໍ້ປະຕິເສດຄວາມຮັບຜິດຊອບ",
        "edithelp": "ວິທີດັດແກ້ໜ້າ",
+       "helppage-top-gethelp": "ຊ່ວຍເຫຼືອ",
        "mainpage": "ໜ້າຫຼັກ",
        "mainpage-description": "ໜ້າຫຼັກ",
        "policy-url": "Project:ປະຕູສູ່ຊຸມຊົນ",
        "linksearch": "ຄົ້ນຫາການເຊື່ອມຕໍ່ຫາເວັບ",
        "listusers-submit": "ສະແດງ",
        "emailuser": "ສົ່ງອີເມລ ຫາ ຜູ້ໃຊ້ນີ້",
-       "emailpage": "ສົ່ງອີເມລ ຫາ ຜູ້ໃຊ້",
        "emailpagetext": "ຖ້າຜູ້ໃຊ້ນີ້ ຂຽນທີ່ຢູ່ອີເມລຢ່າງຖືກຕ້ອງຢູ່ການຕັ້ງຄ່າຂອງລາວ, ຟອມທາງລຸ່ມນີ້​ ຈະສົ່ງຂໍ້ຄວາມໜຶ່ງຫາທີ່ຢູ່ອີເມລນັ້ນ.\nທີ່ຢູ່ອີເມລ ທີ່ທ່ານຂຽນຢູ່ການຕັ້ງຄ່າຂອງທ່ານ, ຈະປະກົດຂຶ້ນ ຢູ່ຊ່ອງ \"From\" ຂອງ ອີເມລ ເພື່ອໃຫ້ ຜູ້ຮັບສາມາດທຳການຕອບໄດ້.",
        "noemailtitle": "ບໍ່ມີ ທີ່ຢູ່ອີເມລ",
        "emailfrom": "ຈາກ",
        "move-page-legend": "ຍ້າຍໜ້າ",
        "movepagetext": "ທ່ານສາມາດ ປ່ຽນຊື່ໜ້າ ແລະ ຍ້າຍປະຫວັດການດັດແກ້ ຂອງໜ້າໃດໜຶ່ງ ໄປ ໜ້າໃໝ",
        "movepagetalktext": "ໜ້າສົນທະນາຈະຖືກຍ້າຍໄປພ້ອມກັນ '''ເວັ້ນເສຍແຕ່:''",
-       "movearticle": "ຍ້າຍໜ້າ:",
        "newtitle": "ຫາ ຫົວຂໍ້ໃໝ່",
        "move-watch": "ຕິດຕາມໜ້ານີ້",
        "movepagebtn": "ຍ້າຍໜ້າ",
        "movetalk": "ຍ້າຍທັງ ໜ້າສົນທະນາ ທີ່ ກ່ຽວພັນ.",
        "movelogpage": "ບັນທຶກການຍ້າຍ",
        "movereason": "ເຫດຜົນ:",
-       "delete_and_move": "ລຶບ ແລະ ຍ້າຍ",
        "delete_and_move_confirm": "ແມ່ນແລ້ວ, ລຶບໜ້ານີ້",
        "delete_and_move_reason": "ລຶບແລ້ວ ເພື່ອ ຍ້າຍໜ້າອື່ນ ມານີ້",
        "allmessages": "ຂໍ້ຄວາມ ຂອງ ລະບົບ",
index ded9f62..4afc969 100644 (file)
        "minoredit": "Tai smulkus pataisymas",
        "watchthis": "Stebėti šį puslapį",
        "savearticle": "Išsaugoti puslapį",
+       "savechanges": "Išsaugoti pakeitimus",
        "publishpage": "Skelbti puslapį",
+       "publishchanges": "Skelbti pakeitimus",
        "preview": "Peržiūra",
        "showpreview": "Rodyti peržiūrą",
        "showdiff": "Rodyti skirtumus",
        "action-read": "skaityti šį puslapį",
        "action-edit": "keisti šį puslapį",
        "action-createpage": "kurti puslapius",
-       "action-createtalk": "kurti aptarimų puslapius",
+       "action-createtalk": "sukurti šį diskusijų puslapį",
        "action-createaccount": "kurti šią naudotojo paskyrą",
        "action-autocreateaccount": "Automatiškai sukurti šią išorinę naudotojo paskyrą",
        "action-history": "peržiūrėti šio puslapio istoriją",
        "mw-widgets-dateinput-no-date": "Nepasirinkta data",
        "mw-widgets-titleinput-description-new-page": "puslapis dar neegzistuoja",
        "mw-widgets-titleinput-description-redirect": "nukreipti į $1",
-       "api-error-blacklisted": "Prašome pasirinkti kitą, aprašomąją antraštę.",
        "sessionmanager-tie": "Negalima kombinuoti kelių užklausų autentikacijos tipų: $1.",
        "sessionprovider-generic": "$1 sesijos",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesijos su slapukais",
        "sessionprovider-nocookies": "Slapukai gali būti neaktyvuoti. Įsitikinkite, kad slapukai yra aktyvuoti ir pradėkite vėl.",
        "randomrootpage": "Atsitiktinis šakninis puslapis",
+       "log-action-filter-rights": "Teisių tipo keitimas:",
        "log-action-filter-all": "Visi",
        "log-action-filter-newusers-autocreate": "Automatinis kūrimas",
        "log-action-filter-protect-protect": "Apsauga"
index b60e023..7f67c7c 100644 (file)
        "move-page-legend": "Puorceļt puslopu",
        "movepagetext": "Itamā lopā tu vari puorsaukt voi puorlikt lopu, kūpā ar tuos izmaiņu hronologeju puorlīkūt tū iz cytu nūsaukumu.\nĪprīškejuo lopa klius par lopu, kas puoradresēs iz jaunū lopu.\nIte var automatiskai izmaineit vysys puoradresacejis (redirektus) iz itū lopu (2. atzeime apakšā).\nSaitis puorejuos lopuos iz īprīškejū lopu nabyus maineitys. Ka gribi namaineit puoradresacejis automatiskai, puorbaud i izloboj, napīļaunūt [[Special:DoubleRedirects|dubultu puoradresaceji]] voi [[Special:BrokenRedirects|puoradresaceji iz naasūšu lopu]].\nTev ir juopuorsalīcynoj, voi saitis vēļ vys īt iz tīni, kur tuos ir īdūmuotys.\n\nJem vārā, ka lopa '''nabyus''' puorvītuota, ka jau eksistej kaida cyta lopa ar itaidu nūsaukumu (izjemūt gadīņus, kod tei ir tukša voi kod tei ir puoradresacejis lopa, kai ari tod, ka tai nav izmaiņu hronologejis).\nTys zeimoj, ka tu vari puorlikt lopu atpakaļ, nu kurīnis tu jau nazkod esi tū puorlics, ka byusi pīlaids klaidu, bet tu navari puorraksteit jau asūšu lopu.\n\n'''BREIDYNUOJUMS!'''\nPopularom lopom tei var byut kruosa i nagaideita puormaiņa;\npyrma tuoluok īsšonys apdūmoj, voi tu saprūt, kū eistyn dori.",
        "movepagetalktext": "Saisteituo sarunu lopa, ka taida eksistej, tiks automatiski puorvītuota, '''izjemūt gadejumus, kod''':\n*tu puorlīc lopu iz cytu paleiglopu,\n*ar jaunū nūsaukumu jau eksistej sarunu lopa, voi ari\n*atzeimiesi zamuok atrūnamū lauceņu.\n\nKa gribiesi, tod tev itei sarunu lopa byus juopuolīk voi juoapvīnoj pošam.",
-       "movearticle": "Puorceļt puslopu",
        "newtitle": "Jauna pasauka:",
        "move-watch": "Puorraudzeit itū lopu",
        "movepagebtn": "Puorceļt puslopu",
        "movesubpage": "{{PLURAL:$1|Zampuslopa|Zampuslopys}}",
        "movereason": "Īmesle:",
        "revertmove": "atsaukt",
-       "delete_and_move": "Iztreit i puorceļt",
        "delete_and_move_confirm": "Nui, iztreit puslopu",
        "export": "Eksportēt lopu",
        "export-addcattext": "Dalikt puslopys nu kategorejis",
        "watchlisttools-raw": "Maineit puorraugamūs rokstu listes kodu",
        "version": "Verseja",
        "version-specialpages": "Specialuos puslopys",
-       "version-version": "(Verseja $1)",
+       "version-version": "($1)",
        "version-license": "Liceņceja",
        "version-poweredby-others": "cyti",
        "version-software-product": "Produkts",
index 3301f8a..e5d9c93 100644 (file)
        "createacct-reason-ph": "Kāpēc jūs veidojat citu kontu",
        "createacct-submit": "Izveidot savu kontu",
        "createacct-another-submit": "Izveidot citu dalībnieka kontu",
+       "createacct-continue-submit": "Turpināt konta izveidi",
+       "createacct-another-continue-submit": "Turpināt konta izveidi",
        "createacct-benefit-heading": "{{SITENAME}} darbojas ar tādu cilvēku kā Tu ieguldījumu.",
        "createacct-benefit-body1": "{{PLURAL:$1|labojumi|labojums|labojumi}}",
        "createacct-benefit-body2": "{{PLURAL:$1|lapas|lapa|lapas}}",
        "newpassword": "Jaunā parole",
        "retypenew": "Atkārto jauno paroli",
        "resetpass_submit": "Uzstādīt paroli un ieiet",
-       "changepassword-success": "Jūsu parole tika nomainīta veiksmīgi!",
+       "changepassword-success": "Tava parole tika nomainīta!",
        "botpasswords": "Botu paroles",
+       "botpasswords-disabled": "Botu paroles ir atspējotas.",
+       "botpasswords-existing": "Esošās botu paroles",
        "botpasswords-createnew": "Izveidot jaunu bota paroli",
        "botpasswords-editexisting": "Rediģētu esošu bota paroli",
        "botpasswords-label-appid": "Bota nosaukums:",
        "passwordreset-emailsentemail": "Paroles atiestatīšanas e-pasts ir nosūtīts.",
        "passwordreset-emailsent-capture": "Atgādinājuma e-pasta ziņojums ir nosūtīts, tas parādīts zemāk.",
        "passwordreset-emailerror-capture": "Atgādinājuma e-pasta ziņojums tika izveidots, tas parādīts zemāk, bet nosūtīšana lietotājam neizdevās: $1",
+       "passwordreset-nosuchcaller": "Izsaucējs nepastāv: $1",
+       "passwordreset-invalideamil": "Nederīga e-pasta adrese",
        "changeemail": "Mainīt e-pasta adresi",
        "changeemail-header": "Mainīt konta e-pasta adresi",
        "changeemail-oldemail": "Pašreizējā e-pasta adrese:",
        "minoredit": "Maznozīmīgs labojums",
        "watchthis": "Uzraudzīt šo lapu",
        "savearticle": "Saglabāt lapu",
+       "savechanges": "Saglabāt izmaiņas",
        "publishpage": "Saglabāt lapu",
+       "publishchanges": "Publicēt izmaiņas",
        "preview": "Pirmskats",
        "showpreview": "Rādīt pirmskatu",
        "showdiff": "Rādīt izmaiņas",
        "history-feed-empty": "Pieprasītā lapa nepastāv.\nIespējams, tā ir izdzēsta vai pārdēvēta.\nMēģiniet [[Special:Search|meklēt]], lai atrastu saistītas lapas!",
        "rev-deleted-comment": "(labojuma kopsavilkums dzēsts)",
        "rev-deleted-user": "(lietotāja vārds nodzēsts)",
-       "rev-deleted-event": "(reģistra ieraksts nodzēsts)",
+       "rev-deleted-event": "(reģistra detaļas noņemtas)",
        "rev-deleted-user-contribs": "[lietotājvārds vai IP adrese ir dzēsta — izmaiņa slēpta no devuma]",
        "rev-deleted-text-permission": "Šī lapas versija ir '''dzēsta'''.\nSīkāku informāciju var atrast [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dzēšanas reģistrā].",
        "rev-deleted-text-view": "Šī lapas versija ir '''dzēsta'''.\nTo varat apskatīt, jo esat administrators. Sīkāku informāciju var atrast [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dzēšanas reģistrā].",
        "right-passwordreset": "Apskatīt paroles atiestatīšanas e-pasta ziņojumus",
        "grant-group-email": "Sūtīt e-pastu",
        "grant-createaccount": "Izveidot kontu",
+       "grant-editmywatchlist": "Labot uzraugāmo rakstu sarakstu",
+       "grant-editpage": "Labot esošās lapas",
+       "grant-editprotected": "Labot aizsargātās lapas",
+       "grant-basic": "Pamattiesības",
+       "grant-viewdeleted": "Skatīt dzēstos failus un lapas",
        "newuserlogpage": "Jauno dalībnieku reģistrs",
        "newuserlogpagetext": "Jauno lietotājvārdu reģistrs.",
        "rightslog": "Dalībnieku tiesību reģistrs",
        "rightslogtext": "Šis ir dalībnieku tiesību izmaiņu reģistrs.",
        "action-read": "lasīt šo lapu",
        "action-edit": "labot šo lapu",
-       "action-createpage": "izveidot lapas",
-       "action-createtalk": "izveidot diskusiju lapas",
+       "action-createpage": "izveidot šo lapu",
+       "action-createtalk": "izveidot šo diskusiju lapu",
        "action-createaccount": "izveidot šo dalībnieka kontu",
        "action-history": "apskatīt šīs lapas vēsturi",
        "action-minoredit": "atzīmēt šo labojumu kā maznozīmīgu",
        "rcshowhidemine": "$1 manus",
        "rcshowhidemine-show": "Rādīt",
        "rcshowhidemine-hide": "Slēpt",
+       "rcshowhidecategorization": "$1 lapu kategorizēšanu",
        "rcshowhidecategorization-show": "Rādīt",
        "rcshowhidecategorization-hide": "Paslēpt",
        "rclinks": "Parādīt pēdējās $1 izmaiņas pēdējās $2 dienās.<br />$3",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[šo lapu uzrauga $1 {{PLURAL:$1|dalībnieki|dalībnieks|dalībnieki}}]",
        "rc_categories": "Ierobežot uz kategorijām (atdalīt ar \"|\"):",
-       "rc_categories_any": "Jebkas",
+       "rc_categories_any": "Jebkas no izvēlētā",
        "rc-change-size-new": "$1 {{PLURAL:$1|baiti|baits|baiti}} pēc izmaiņām",
        "newsectionsummary": "/* $1 */ jauna sadaļa",
        "rc-enhanced-expand": "Skatīt detaļas",
        "recentchangeslinked-summary": "Šiet ir nesen izdarītās izmaiņas lapās, uz kurām ir saites no norādītās lapas (vai norādītajā kategorijā ietilpstošās lapas).\nLapas, kas ir tavā [[Special:Watchlist|uzraugāmo rakstu sarakstā]] ir '''treknas'''.",
        "recentchangeslinked-page": "Lapas nosaukums:",
        "recentchangeslinked-to": "Rādīt izmaiņas lapās, kurās ir saites uz šo lapu (nevis lapās uz kurām ir saites no šīs lapas)",
+       "autochange-username": "MediaWiki automātiskā izmaiņa",
        "upload": "Augšupielādēt failu",
        "uploadbtn": "Augšupielādēt",
        "reuploaddesc": "Atcelt augšupielādi un atgriezties pie augšupielādes veidnes.",
        "uploaderror": "Augšupielādes kļūda",
        "upload-recreate-warning": "<strong>Brīdinājums: Fails ar šādu nosaukumu ir dzēsts vai pārvietots.</strong>\n\nDzēšanas un pārvietošanas reģistri šai lapai ir pieejami šeit:",
        "uploadtext": "Pirms tu kaut ko augšupielādē, noteikti izlasi un ievēro [[Project:Attēlu izmantošanas noteikumi|attēlu izmantošanas noteikumus]].\n\nLai aplūkotu vai meklētu agrāk augšupielādētus attēlus,\ndodies uz [[Special:FileList|augšupielādēto attēlu sarakstu]].\nAugšupielādes un dzēšanas tiek reģistrētas [[Special:Log/upload|augšupielādes reģistrā]] un [[Special:Log/delete|dzēšanas reģistrā]].\n\nIzmanto šo veidni, lai augšupielādētu jaunus attēlu failus, ar kuriem ilustrēt tevis izmainītās lapas.\nGandrīz visos pārlūkos tev vajadzētu redzēt pogu '''\"Choose...\",''' kuru spiežot parādīsies faila atvēršanas dialogs.\nIzvēloties kādu failu, tā adrese parādīsies ailītē blakus šai pogai.\nTev ir arī jāatzīmē ailīte, kas apstiprina, ka tu nepārkāp nekādas autortiesības, augšupielādējot šo failu.\nSpied pogu '''Augšupielādēt''', lai pabeigtu augšupielādi.\nTas var ieilgt, ja tavs interneta pieslēgums ir lēns.\n\nIeteicamie formāti ir:\n* JPEG - ja tā ir fotogrāfija,\n* PNG - ja tas ir zīmējums vai kāda ikona, un\n* OGG - ja tas ir skaņas fails.\n\nLūdzu, pārliecinies, ka faila nosaukums ir pietiekami aprakstošs, lai izvairītos no neskaidrībām. Lai attēlu pēc tam ievietotu kādā lapā, izmanto šādi noformētu linkus:\n* '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fails.jpg|paskaidrojošs teksts]]</nowiki>'''\n* '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fails.png|paskaidrojošs teksts]]</nowiki>'''\nvai skaņām\n* '''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fails.ogg]]</nowiki>'''\n\nLūdzu, ņem vērā, ka tāpat kā citas wiki lapas arī tevis augšupielādētos failus citi var mainīt vai dzēst, ja uzskata, ka tas nāktu par labu šim projektam, kā arī atceries, ka tev var tikt liegta augšupielādes iespēja, ja tu šo sistēmu.",
-       "upload-permitted": "Atļautie failu tipi: $1.",
-       "upload-preferred": "Ieteicamie failu tipi: $1.",
-       "upload-prohibited": "Aizliegtie failu tipi: $1.",
+       "upload-permitted": "Atļautie failu {{PLURAL:$2|tipi|tips|tipi}}: $1.",
+       "upload-preferred": "Ieteicamie failu {{PLURAL:$2|tipi|tips|tipi}}: $1.",
+       "upload-prohibited": "Aizliegtie failu {{PLURAL:$2|tipi|tips|tipi}}: $1.",
        "uploadlogpage": "Augšupielādes reģistrs",
        "uploadlogpagetext": "Zemāk ir redzams jaunāko augšuplādēto failu saraksts.\nPārskatāmāka versija ir pieejama [[Special:NewFiles|jauno attēlu galerijā]].",
        "filename": "Faila nosaukums",
        "upload-dialog-button-save": "Saglabāt",
        "upload-dialog-button-upload": "Augšupielādēt",
        "upload-form-label-infoform-title": "Papildinformācija",
+       "upload-form-label-infoform-name": "Nosaukums",
        "upload-form-label-infoform-description": "Apraksts",
        "upload-form-label-usage-title": "Pielietojums",
        "upload-form-label-usage-filename": "Faila nosaukums",
+       "upload-form-label-own-work": "Šis ir manis paša darbs",
        "upload-form-label-infoform-categories": "Kategorijas",
        "upload-form-label-infoform-date": "Datums",
        "backend-fail-stream": "Nevar straumēt failu $1.",
        "backend-fail-read": "Nevar lasīt failu $1.",
        "backend-fail-create": "Nevar izveidot failu $1.",
        "zip-wrong-format": "Norādītais fails nebija ZIP fails.",
-       "uploadstash-errclear": "Failu tīrīšana bija neveiksmīga.",
+       "uploadstash-errclear": "Failu tīrīšana neizdevās.",
        "uploadstash-refresh": "Atsvaidzināt failu sarakstu",
        "img-auth-accessdenied": "Pieeja liegta",
        "img-auth-nopathinfo": "Trūkst PATH_INFO.\nJūsu serveris nav konfigurēts nodot šo informāciju.\nTas var būt bāzēts uz CGI un neatbalstīt img_auth.\nSkatīt https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "listfiles_thumb": "Sīktēls",
        "listfiles_date": "Datums",
        "listfiles_name": "Nosaukums",
-       "listfiles_user": "Lietotājs",
+       "listfiles_user": "Dalībnieks",
        "listfiles_size": "Izmērs",
        "listfiles_description": "Apraksts",
        "listfiles_count": "Versijas",
        "filehist-thumb": "Attēls",
        "filehist-thumbtext": "$1 versijas sīktēls",
        "filehist-nothumb": "Nav sīktēla",
-       "filehist-user": "Lietotājs",
+       "filehist-user": "Dalībnieks",
        "filehist-dimensions": "Izmēri",
        "filehist-filesize": "Faila izmērs",
        "filehist-comment": "Komentārs",
        "wantedtemplates": "Vajadzīgās veidnes",
        "mostlinked": "Lapas, uz kurām ir visvairāk norāžu",
        "mostlinkedcategories": "Kategorijas, uz kurām ir visvairāk saišu",
-       "mostlinkedtemplates": "Visvairāk izmantotās veidnes",
+       "mostlinkedtemplates": "Visvairāk iekļautās lapas",
        "mostcategories": "Raksti ar visvairāk kategorijām",
        "mostimages": "Attēli, uz kuriem ir visvairāk saišu",
        "mostinterwikis": "Lapas ar visvairāk starpviki saitēm",
        "protectedpages-indef": "Tikai bezgalīgas aizsardzības",
        "protectedpages-cascade": "Tikai kaskādes aizsardzības",
        "protectedpages-noredirect": "Paslēpt pāradresācijas",
+       "protectedpages-timestamp": "Laika zīmogs",
        "protectedpages-page": "Lapa",
        "protectedpages-reason": "Iemesls",
        "protectedpages-unknown-timestamp": "Nav zināms",
        "usercreated": "{{GENDER:$3|Izveidoja}} $1 plkst. $2",
        "newpages": "Jaunas lapas",
        "newpages-submit": "Rādīt",
-       "newpages-username": "Lietotājs:",
+       "newpages-username": "Dalībnieks:",
        "ancientpages": "Vecākās lapas",
        "move": "Pārvietot",
        "movethispage": "Pārvietot šo lapu",
        "apisandbox-api-disabled": "API ir atspējots šajā tīmekļa vietnē.",
        "apisandbox-reset": "Notīrīt",
        "apisandbox-retry": "Mēģināt vēlreiz",
+       "apisandbox-no-parameters": "Šo API modulim nav parametru.",
+       "apisandbox-helpurls": "Palīdzības saites",
        "apisandbox-examples": "Piemēri",
+       "apisandbox-dynamic-parameters": "Papildu parametri",
+       "apisandbox-dynamic-parameters-add-label": "Pievienot parametru:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Parametra nosaukums",
        "apisandbox-results": "Rezultāti",
        "apisandbox-request-url-label": "Pieprasījuma URL:",
-       "apisandbox-request-time": "Pieprasījuma izpildes laiks: $1",
+       "apisandbox-request-time": "Pieprasījuma izpildes laiks: {{PLURAL:$1|$1 ms}}",
        "booksources": "Grāmatu avoti",
        "booksources-search-legend": "Meklēt grāmatu avotus",
        "booksources-search": "Meklēt",
        "alllogstext": "Visi pieejamie {{grammar:akuzatīvs{{SITENAME}}}} reģistri.\nTu vari sašaurināt aplūkojamo reģistru, izvēloties reģistra veidu, lietotāja vārdu vai reģistrēto lapu. Visi teksta lauki izšķir lielos un mazos burtus.",
        "logempty": "Reģistrā nav atbilstošu ierakstu.",
        "log-title-wildcard": "Meklēt virsrakstus, kas sākas ar šo tekstu",
+       "checkbox-select": "Izvēlēties: $1",
+       "checkbox-all": "Visus",
+       "checkbox-none": "Nevienu",
+       "checkbox-invert": "Otrādi",
        "allpages": "Visas lapas",
        "nextpage": "Nākamā lapa ($1)",
        "prevpage": "Iepriekšējā lapa ($1)",
        "listgrouprights-removegroup-self-all": "Noņemt visas grupas no sava konta",
        "listgrouprights-namespaceprotection-header": "Vārdtelpas ierobežojumi",
        "listgrouprights-namespaceprotection-namespace": "Vārdtelpa",
+       "listgrants-rights": "Tiesības",
        "trackingcategories-nodesc": "Apraksts nav pieejams.",
        "trackingcategories-disabled": "Kategorija ir atslēgta",
        "mailnologin": "Nav adreses, uz kuru sūtīt",
        "mailnologintext": "Tev jābūt [[Special:UserLogin|iegājušam]], kā arī tev jābūt [[Special:Preferences|norādītai]] derīgai e-pasta adresei, lai sūtītu e-pastu citiem lietotājiem.",
        "emailuser": "Sūtīt e-pastu šim lietotājam",
-       "emailuser-title-target": "Nosūtīt e-pastu {{GENDER:$1|šim lietotājam|šai lietotājai}}",
+       "emailuser-title-target": "Nosūtīt e-pastu {{GENDER:$1|šim dalībniekam|šai dalībniecei}}",
        "emailuser-title-notarget": "Sūtīt e-pastu lietotājam",
        "emailpagetext": "Ar šo veidni ir iespējams nosūtīt e-pastu šim {{GENDER:$1|lietotājam}}.\nTā e-pasta adrese, kuru tu esi norādījis [[Special:Preferences|savā izvēļu lapā]], parādīsies e-pasta \"From\" lauciņā, tādejādi saņēmējs varēs tev atbildēt.",
        "defemailsubject": "{{SITENAME}} e-pasts no lietotāja \"$1\"",
        "wlheader-enotif": "E-pasta paziņojumi ir ieslēgti.",
        "wlheader-showupdated": "Lapas, kuras ir tikušas izmainītas, kopš tu tās pēdējoreiz apskatījies, te rādās ar '''pustrekniem''' burtiem",
        "wlshowlast": "Parādīt izmaiņas pēdējo $1 stundu laikā vai $2 dienu laikā, vai arī .",
+       "watchlist-hide": "Slēpt",
+       "watchlist-submit": "Rādīt",
+       "wlshowhidebots": "boti",
+       "wlshowhideliu": "reģistrēti lietotāji",
+       "wlshowhideanons": "anonīmi lietotāji",
+       "wlshowhidepatr": "pārbaudīti labojumi",
+       "wlshowhidemine": "mani labojumi",
+       "wlshowhidecategorization": "lapu kategorizēšana",
        "watchlist-options": "Uzraugāmo rakstu saraksta opcijas",
        "watching": "Uzrauga...",
        "unwatching": "Neuzrauga...",
        "rollback-success": "Novērsu izmaiņas, ko izdarīja $1;\natjaunoju versiju, ko saglabāja $2.",
        "sessionfailure-title": "sesijas kļūda",
        "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-title-label": "Lapas nosaukums",
        "changecontentmodel-reason-label": "Iemesls:",
        "changecontentmodel-submit": "Mainīt",
        "protectlogpage": "Aizsargāšanas reģistrs",
        "contributions-title": "Dalībnieka $1 devums",
        "mycontris": "Devums",
        "anoncontribs": "Devums",
-       "contribsub2": "Lietotājs: $1 ($2)",
+       "contribsub2": "{{GENDER:$3|Dalībnieks|Dalībniece}}: $1 ($2)",
        "nocontribs": "Netika atrastas izmaiņas, kas atbilstu šiem kritērijiem.",
        "uctop": "(pēdējā izmaiņa)",
        "month": "No mēneša (un senāki):",
        "whatlinkshere-next": "{{PLURAL:$1|nākamos $1|nākamo|nākamos $1}}",
        "whatlinkshere-links": "← saites",
        "whatlinkshere-hideredirs": "$1 pāradresācijas",
-       "whatlinkshere-hidetrans": "$1 lapas, kurās šī lapa izmantota kā veidne",
+       "whatlinkshere-hidetrans": "$1 iekļāvumi",
        "whatlinkshere-hidelinks": "$1 saites",
        "whatlinkshere-hideimages": "$1 failu saites",
        "whatlinkshere-filters": "Filtri",
        "special-characters-group-gujarati": "Gudžarati",
        "mw-widgets-dateinput-no-date": "Nav izvēlēts datums",
        "mw-widgets-titleinput-description-new-page": "lapa vēl nepastāv",
-       "api-error-blacklisted": "Lūdzu, izvēlieties citu, aprakstošu nosaukumu!",
        "authmanager-email-label": "E-pasts",
        "authmanager-email-help": "E-pasta adrese",
        "authmanager-realname-label": "Tavs īstais vārds",
index 0999c3e..153ab06 100644 (file)
@@ -21,7 +21,8 @@
                        "飞舞回堂前",
                        "Macofe",
                        "Bowleerin",
-                       "SolidBlock"
+                       "SolidBlock",
+                       "Suchichi02"
                ]
        },
        "tog-underline": "鏈墊線:",
        "editthispage": "纂",
        "create-this-page": "立",
        "delete": "刪",
-       "deletethispage": "刪",
+       "deletethispage": "刪是頁",
        "undeletethispage": "反刪此頁",
        "undelete_short": "還$1已刪",
        "viewdeleted_short": "察$1已刪",
        "edit-conflict": "纂突。",
        "edit-no-change": "爾之纂已略,由字無改也。",
        "postedit-confirmation-created": "其頁已建。",
-       "postedit-confirmation-saved": "汝之纂已成",
+       "postedit-confirmation-saved": "汝之纂已成",
        "edit-already-exists": "不建新頁。\n已存也。",
        "defaultmessagetext": "慣話文",
        "content-model-text": "純文本",
        "rcshowhidemine": "$1吾纂",
        "rcshowhidemine-show": "示",
        "rcshowhidemine-hide": "藏",
+       "rcshowhidecategorization-show": "示",
+       "rcshowhidecategorization-hide": "藏",
        "rclinks": "$2日內$1近易。<br />$3",
        "diff": "辨",
        "hist": "誌",
        "rc_categories_any": "任",
        "rc-change-size-new": "既纂,本文有$1字節",
        "newsectionsummary": "/* $1 */ 新節",
-       "rc-enhanced-expand": "示細(要 JavaScript)",
+       "rc-enhanced-expand": "示細",
        "rc-enhanced-hide": "藏細",
        "recentchangeslinked": "援引",
        "recentchangeslinked-feed": "援引",
        "contributions": "功績",
        "contributions-title": "$1之功績",
        "mycontris": "吾績",
+       "anoncontribs": "績",
        "contribsub2": "$1勛($2)",
        "nocontribs": "無勛及也。",
        "uctop": "(至頂)",
        "whatlinkshere-prev": "前$1",
        "whatlinkshere-next": "次$1",
        "whatlinkshere-links": "←佐",
-       "whatlinkshere-hideredirs": "$1",
+       "whatlinkshere-hideredirs": "$1",
        "whatlinkshere-hidetrans": "$1含",
        "whatlinkshere-hidelinks": "$1佐",
        "whatlinkshere-hideimages": "$1檔佐",
        "intentionallyblankpage": "此頁為白也,試速之用",
        "external_image_whitelist": " #同留<pre>\n#下(中之//)乃正表式\n#乃外(連)圖配之\n#配乃成像,非配則成連\n#有 # 之為注\n#無為大小之異也\n\n#入正表式。同留</pre>",
        "tag-filter": "[[Special:Tags|標]] 之濾:",
-       "tag-list-wrapper": "([[Special:Tags|簽]]: $2)",
+       "tag-list-wrapper": "([[Special:Tags|$1簽]]: $2)",
        "tags-title": "標",
        "tags-tag": "標名",
        "tags-source-header": "源",
        "sqlite-no-fts": "$1 不含全文之尋",
        "revdelete-restricted": "應限至有秩",
        "revdelete-unrestricted": "除限自有秩",
+       "logentry-newusers-create": "簿$1已{{GENDER:$2|增}}。",
        "rightsnone": "(凡)",
        "revdelete-summary": "摘",
        "searchsuggest-search": "尋",
index e5ab3e2..cd0a50d 100644 (file)
        "block-log-flags-nocreate": "hesabi okʼidu geinkʼilu",
        "movepagetext": "Tude na ren formi oxmarute butʼkʼaşi coxo iktirinen. Edo xolo mteli golaxteri kʼayitʼepeti ağani coxos itiren.\nMcveşi coxo, ağani coxoşa redirektʼi xali aqʼven.\nOtomatikurot mcveşi stʼatʼiaşa na ixvenen redirektʼepe gaktirinen.\nAm dulya otomatikurot oxvenu va ginonna [[Special:DoubleRedirects|tʼkʼubi]] varna [[Special:BrokenRedirects|tʼaxeri]] na renan redirektʼepe ti-skani kʼala oktiruşi re. Na qʼvare am oktirobate mteli kʼontʼaktʼepe dido kʼai oçalişu ren, amuşen si sorumli re.\n\nEger ağani coxos ar butʼkʼa zate korenna coxoşi oktiroba '''var ixvenasen'''. Amuş metʼi, coxoşi oktirobaşen pişmani qʼvi na, am oktiroba ipʼtʼali gaxvenen, aşoten başka butʼkʼapeşati zarari meçameri va gaqʼven.\n\n'''KʼUN3Xİ!'''\nAm ktira, populeri na ren a butʼkʼa şeni pʼatʼi mutxanepe axvenen; mu iqʼven ipti, aya giçkitʼas do ukʼule mutxanepe doktiri.",
        "movepagetalktext": "Okʼokʼatineri na ren oğarğaluşi butʼkʼati (eger korenna) otʼomatikurot ağani coxos itirinasen. Mara am situa3yonepes '''var itirinen''':\n\n*Ağani coxos ar oğarğaluşi butʼkʼa zaten korenna,\n*Tude na ren çʼitʼa boksi va ixmarit na.\n\nAm situa3yonepes, butʼkʼa skanişkʼelen otiruşi ren.",
-       "movearticle": "Mcveşi coxo:",
        "newtitle": "Ağani coxo:",
        "move-watch": "Am butʼkʼa gatxozi",
        "movepagebtn": "Coxo-muşi doktiri",
        "watchlisttools-edit": "Gotxozu listʼe koz*iri do doktiri",
        "watchlisttools-raw": "Kʼobo gotxozu listʼe doktiri",
        "specialpages": "Doxmeli butʼkʼape",
-       "rightsnone": "(Va ren)"
+       "rightsnone": "(Va ren)",
+       "special-characters-group-latin": "Lat'ini",
+       "special-characters-group-greek": "Xorumi",
+       "special-characters-group-arabic": "Arabuli"
 }
index 796d773..f7332f9 100644 (file)
@@ -62,7 +62,7 @@
        "tog-ccmeonemails": "हमरद्वारा दोसर प्रयोक्ताक पठाओल ई-पत्रक कपी पठाबी",
        "tog-diffonly": "फाइल-अन्तर प्रणालीक नीचाँ पन्नाक सामिग्री नै देखाबी",
        "tog-showhiddencats": "नुकाएल श्रेणी देखाबी",
-       "tog-norollbackdiff": "पà¥\8dरतà¥\8dयावरà¥\8dतनà¤\95 à¤¬à¤¾à¤¦ à¤«à¤¾à¤\87ल-à¤\85नà¥\8dतर à¤ªà¥\8dरणालà¥\80à¤\95 à¤¬à¤¿à¤¸à¤°ी",
+       "tog-norollbackdiff": "समà¥\8dपादन à¤µà¤¾à¤ªà¤¸ à¤² à¤²à¥\87ला à¤¬à¤¾à¤¦ à¤\85नà¥\8dतर à¤¨à¥\88 à¤¦à¥\87à¤\96ाबी",
        "tog-useeditwarning": "जब हम कोनो सम्पादन पृष्ठके बिना सुरक्षित केनै बदलाव संग छोडि दि त हमरा सूचित करी ।",
        "tog-prefershttps": "सम्प्रवेशित करलाक बाद सदैव सुरक्षित कनेक्शनके प्रयोग करी",
        "underline-always": "सदिखन",
@@ -84,7 +84,7 @@
        "mon": "सोम",
        "tue": "मंगल",
        "wed": "बुध",
-       "thu": "बृह.",
+       "thu": "बृह",
        "fri": "शुक्र",
        "sat": "शनि",
        "january": "जनवरी",
        "category-file-count": "{{PLURAL:$2|ई श्रेणीमे मात्र निम्नलिखित फाइल अछि।|ई श्रेणीमे निम्नलिखित {{PLURAL:$1|फाइल|$1 फाइलसभ}} अछि, कुल फाइलसभ $2}}",
        "category-file-count-limited": "ई श्रेणीमे निम्नलिखित {{PLURAL:$1|फाइल अछि।|फाइलसभ अछि।}}",
        "listingcontinuesabbrev": "शेष आगाँ।",
-       "index-category": "क्रम कएल पन्ना सभ",
+       "index-category": "क्रम कएल पन्नासभ",
        "noindex-category": "क्रम नै कएल पन्नासभ",
        "broken-file-category": "पन्नासभ जाइमे फाइल लिङ्कसभ टूटल हुअए",
        "about": "क विषयमे",
        "article": "सामग्री लेख",
        "newwindow": "(नव खिडकीसँ खुजैछ)",
-       "cancel": "समापà¥\8dत",
+       "cancel": "रदà¥\8dद à¤\95रà¥\80",
        "moredotdotdot": "आर...",
        "morenotlisted": "ई पुरा सूची नै छी।",
        "mypage": "पन्ना",
        "namespaces": "चेन्हासी समूहसभ",
        "variants": "प्रकारसभ",
        "navigation-heading": "दिक्चालन सूची",
-       "errorpagetitle": "à¤\97लतà¥\80",
+       "errorpagetitle": "तà¥\8dरà¥\81à¤\9fि",
        "returnto": "$1 पर आबी।",
        "tagline": "मैथिली {{SITENAME}}सँ",
        "help": "मदति",
        "searchbutton": "ताकी",
        "go": "जाए",
        "searcharticle": "जाए",
-       "history": "पनà¥\8dनाà¤\95 इतिहास",
+       "history": "पà¥\83षà¥\8dठ इतिहास",
        "history_short": "इतिहास",
        "updatedmarker": "हमर अन्तिम आगमनसँ पहिने अद्यतन कएल",
        "printableversion": "प्रिन्ट करबा योग्य",
        "confirmable-no": "नै",
        "thisisdeleted": "$1 देखी वा फेरसँ आनी?",
        "viewdeleted": "$1 के देखाबी?",
-       "restorelink": "{{PLURAL:$1|एकटा मेटाएल सम्पादन|$1 मेटाएल सम्पादन सभ}}",
+       "restorelink": "{{PLURAL:$1|एकटा मेटाएल सम्पादन|$1 मेटाएल सम्पादनसभ}}",
        "feedlinks": "सूचक:",
        "feed-invalid": "अमान्य सूचक प्रकार मासुल",
        "feed-unavailable": "अधिकृत सूचक उपलब्ध नै अछि",
        "nstab-category": "श्रेणी",
        "mainpage-nstab": "सम्मुख पन्ना",
        "nosuchaction": "एहेन कोनो क्रिया नै अछि",
-       "nosuchactiontext": "à¤\90 à¤¸à¤¾à¤°à¥\8dवतà¥\8dरिà¤\95 à¤µà¤¿à¤­à¤µ à¤¸à¤\82à¤\95à¥\87त à¤¦à¥\8dवारा à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤\95à¥\8dरिया à¤\85मानà¥\8dय à¤\85à¤\9bि।\nà¤\85हाà¤\81 à¤¸à¤¾à¤°à¥\8dवतà¥\8dरिà¤\95 à¤µà¤¿à¤­à¤µ à¤¸à¤\82à¤\95à¥\87तà¤\95 à¤\97लत à¤\9fà¤\82à¤\95ण à¤\95à¥\87नà¥\87 à¤¹à¤\8fब, à¤µà¤¾ à¤\95à¥\8bनà¥\8b à¤\97लत à¤²à¤¿à¤\82à¤\95à¤\95 à¤ªà¤¾à¤\9bाà¤\81 à¤\97à¥\87ल à¤¹à¤\8fब।\nà¤\88 {{à¤\85नà¥\8dतरà¥\8dà¤\9cाल}} à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤¦à¥\8dवारा à¤ªà¥\8dरयà¥\81à¤\95à¥\8dत à¤¤à¤\82तà¥\8dराà¤\82शमà¥\87 à¤¸à¥\8dथित à¤\95à¥\8bनà¥\8b à¤¦à¥\8bषà¤\95 à¤¸à¤\82केत सेहो कऽ सकैए।",
+       "nosuchactiontext": "à¤\88 à¤¸à¤¾à¤°à¥\8dवतà¥\8dरिà¤\95 à¤µà¤¿à¤­à¤µ à¤¸à¤\99à¥\8dà¤\95à¥\87तदà¥\8dवारा à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤\95à¥\8dरिया à¤\85मानà¥\8dय à¤\85à¤\9bि।\nà¤\85हाà¤\81 à¤¸à¤¾à¤°à¥\8dवतà¥\8dरिà¤\95 à¤µà¤¿à¤­à¤µ à¤¸à¤\99à¥\8dà¤\95à¥\87तà¤\95 à¤\97लत à¤\9fà¤\99à¥\8dà¤\95ण à¤\95à¥\87नà¥\87 à¤¹à¤\8fब, à¤µà¤¾ à¤\95à¥\8bनà¥\8b à¤\97लत à¤²à¤¿à¤\99à¥\8dà¤\95à¤\95 à¤ªà¤¾à¤\9bाà¤\81 à¤\97à¥\87ल à¤¹à¤\8fब।\nà¤\88 {{SITENAME}} à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dतादà¥\8dवारा à¤ªà¥\8dरयà¥\81à¤\95à¥\8dत à¤¤à¤¨à¥\8dतà¥\8dराà¤\82शमà¥\87 à¤¸à¥\8dथित à¤\95à¥\8bनà¥\8b à¤¦à¥\8bषà¤\95 à¤¸à¤\99à¥\8dकेत सेहो कऽ सकैए।",
        "nosuchspecialpage": "एहेन कोनो विशेष पृष्ठ नै अछि",
        "nospecialpagetext": "<strong> अहाँ एकटा अमान्य पन्नाक आग्रह केने छी। </strong>\nमान्य विशेष पन्नाक सूची एतए अछि [[Special:SpecialPages|{{int:specialpages}}]]।",
        "error": "भ्रम",
        "databaseerror-error": "त्रुटि: $1",
        "laggedslavemode": "'''चेतौनी:''' पन्नापर सम्भव जे अद्यतन परिवर्तन नै हुअए।",
        "readonly": "दत्तनिधि प्रतिबन्धित",
-       "enterlockreason": "पà¥\8dरतिबनà¥\8dध à¤²à¥\87ल à¤\95ारण à¤¬à¤¤à¤¾à¤\89, à¤¸à¤\82à¤\97मà¥\87 à¤\8fà¤\95à¤\9fा à¤\85à¤\82दाà¤\9c à¤¸à¥\87हà¥\8b à¤¬à¤¤à¤¾à¤\89 जे कखन ई प्रतिबन्ध हटाएल जाएत।",
+       "enterlockreason": "पà¥\8dरतिबनà¥\8dध à¤²à¥\87ल à¤\95ारण à¤¬à¤¤à¤¾à¤¬à¥\80, à¤¸à¤\82à¤\97à¥\87 à¤\8fà¤\95à¤\9fा à¤\85नà¥\8dदाà¤\9c à¤¸à¥\87हà¥\8b à¤¬à¤¤à¤¾à¤¬à¥\80 जे कखन ई प्रतिबन्ध हटाएल जाएत।",
        "readonlytext": "अखन दत्तांशनिधि नव प्रविष्टि आ आन संशोधन लेल प्रतिबन्धित अछि, सम्भवतः सामान्त दत्तांशनिधि देखभाल लेल, तकर बाद ई सामान्य भऽ जाएत।\n\nसञ्चालक जे एकरा प्रतिबन्धित कएने छथि ई कारण दै छथि:$1",
-       "missing-article": "दतà¥\8dतनिधि à¤ªà¥\83षà¥\8dठà¤\95 à¤µà¤¾à¤\82à¤\9bित à¤ªà¤¾à¤ à¥\8dय à¤¨à¥\88 à¤¤à¤¾à¤\95ि à¤¸à¤\95ल, à¤®à¤¾à¤¨à¥\87 \"$1\" $2\nà¤\8fà¤\95र à¤\95ारण à¤\95à¥\8bनà¥\8b à¤ªà¥\81रान à¤«à¤¾à¤\87ल à¤\9aà¥\87नà¥\8dहासà¥\80 à¤µà¤¾ à¤\90तिहासिà¤\95 à¤²à¤¿à¤\82à¤\95à¤\95 à¤ªà¤¾à¤\9bाà¤\81 à¤\9cाà¤\8fब à¤\85à¤\9bि, à¤\9cà¥\87 à¤®à¥\87à¤\9fा à¤¦à¥\87ल à¤\97à¥\87ल à¤\9bà¥\88।\nà¤\9cà¥\8cà¤\82 à¤\88 à¤¤à¤\95र à¤\95ारण à¤¨à¥\88 à¤\85à¤\9bि,  à¤¤à¤\96न à¤\85हाà¤\81à¤\95à¥\87à¤\81 à¤¤à¤\82तà¥\8dराà¤\82शमà¥\87 à¤\95à¥\8bनà¥\8b à¤¦à¥\8bष à¤­à¥\87à¤\9fल à¤\85à¤\9bि।\nà¤\8fà¤\95र à¤\96बरि à¤ªà¤¹à¥\81à¤\81à¤\9aाà¤\89 [[Special:ListUsers/sysop|administrator]], à¤\95à¥\87à¤\81, à¤\85पन à¤¸à¤¾à¤°à¥\8dवतà¥\8dरिà¤\95 à¤µà¤¿à¤­à¤µ à¤¸à¤\82केत सूचित करैत।",
+       "missing-article": "दतà¥\8dतनिधि à¤ªà¥\83षà¥\8dठà¤\95 à¤µà¤¾à¤¨à¥\8dà¤\9bित à¤ªà¤¾à¤ à¥\8dय à¤¨à¥\88 à¤¤à¤¾à¤\95ि à¤¸à¤\95ल, à¤®à¤¾à¤¨à¥\87 \"$1\" $2\nà¤\8fà¤\95र à¤\95ारण à¤\95à¥\8bनà¥\8b à¤ªà¥\81रान à¤«à¤¾à¤\87ल à¤\9aà¥\87नà¥\8dहासà¥\80 à¤µà¤¾ à¤\90तिहासिà¤\95 à¤²à¤¿à¤\99à¥\8dà¤\95à¤\95 à¤ªà¤¾à¤\9bाà¤\81 à¤\9cाà¤\8fब à¤\85à¤\9bि, à¤\9cà¥\87 à¤®à¥\87à¤\9fा à¤¦à¥\87ल à¤\97à¥\87ल à¤\9bà¥\88।\nà¤\9cà¥\8cà¤\82 à¤\88 à¤¤à¤\95र à¤\95ारण à¤¨à¥\88 à¤\85à¤\9bि, à¤¤à¤\96न à¤\85हाà¤\81 à¤¤à¤¨à¥\8dतà¥\8dराà¤\82शमà¥\87 à¤\95à¥\8bनà¥\8b à¤¦à¥\8bष à¤­à¥\87à¤\9fल à¤\85à¤\9bि।\nà¤\8fà¤\95र à¤\96बरि à¤ªà¤¹à¥\81à¤\81à¤\9aाबà¥\80 [[Special:ListUsers/sysop|पà¥\8dरबनà¥\8dधà¤\95]]à¤\95à¥\87à¤\81, à¤\85पन à¤¸à¤¾à¤°à¥\8dवतà¥\8dरिà¤\95 à¤µà¤¿à¤­à¤µ à¤¸à¤\99à¥\8dकेत सूचित करैत।",
        "missingarticle-rev": "(संशोधन#: $1)",
        "missingarticle-diff": "(फाइल-अन्तर प्रणाली: $1, $2)",
        "readonly_lag": "दत्तांशनिधि स्वचालित रूपसँ प्रतिबन्धित कएल गेल अछि जा परजीवी दतांशनिधि वितरक मूलक समक्ष नै आबि जाए।",
        "unexpected": "आसक विपरीत परिणाम: \"$1\"=\"$2\"",
        "formerror": "त्रुटि: फर्म अनुरोध नै कएल जा सकल",
        "badarticleerror": "ई क्रिया ऐ पन्नापर नै कएल जा सकैए।",
-       "cannotdelete": "पनà¥\8dना à¤µ à¤¸à¤\82चिका \"$1\" मेटाएल नै जा सकल।",
+       "cannotdelete": "पनà¥\8dना à¤µ à¤¸à¤\9eà¥\8dचिका \"$1\" मेटाएल नै जा सकल।",
        "cannotdelete-title": "पन्ना \"$1\" नै मेटा सकल",
        "delete-hook-aborted": "सम्पादन नोकसीसँ खतम भेल।\nई कोनो कारण नै देलक।",
        "no-null-revision": "\"$1\" पृष्ठक लेल बिना परिवर्तन नब अवतरण बनाबैमे असफल।",
        "viewsourcetext": "अहाँ ई पृष्ठक जडिक देख आ अनुकृत कऽ सकै छी:",
        "viewyourtext": "अहाँ ई पृष्ठमे '''अपन सम्पादन'''क देख आ एतए उतारि सकै छी:",
        "protectedinterface": "ई पन्ना तंत्रांश लेल मध्यस्थ पाठक व्यवस्था करैत अछि, आ अपशब्द रोकबाक ब्योंत करैत अछि।",
-       "editinginterface": "'''चेतौनी''' अहाँ एकटा एहेन पन्नाक सम्पादन कऽ रहल छी जे तंत्रांशक मध्यस्थ पन्नाकेँ पाठ देबा लेल प्रयोग भऽ रहल अछि।\nऐ पन्नामे परिवर्तन दोसर प्रयोक्ता लेल प्रयोक्ता मध्यस्थक रूपमे परिवर्तन करत।\nअनुवाद लेल [https://translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] जाउ, मीडियाविकी स्थानीयकरण परियोजना पर।",
-       "translateinterface": "सभ à¤µà¤¿à¤\95िसब à¤\95à¥\87 à¤²à¥\87ल à¤\85नà¥\81वाद à¤\9cà¥\8bडà¤\87 à¤¯à¤¾ à¤¬à¤¦à¤²à¤\88 à¤\95à¥\87 à¤²à¥\87ल à¤®à¥\80डियाविà¤\95ि à¤\95à¥\8dषà¥\87तà¥\8dरà¥\80यà¤\95रण à¤ªà¤°à¤¿à¤¯à¥\8bà¤\9cना [https://translatewiki.net/ translatewiki.net] à¤\95à¥\87à¤\82 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\81।",
+       "editinginterface": "<strong>चेतौनी:</strong> अहाँ एकटा एहेन पन्नाक सम्पादन कऽ रहल छी जे सफ्टवेयरक मध्यस्थ पन्नाक पाठ देबा लेल प्रयोग भऽ रहल अछि।\nई पन्नामे परिवर्तन दोसर प्रयोक्ता लेल प्रयोक्ता मध्यस्थक रूपमे परिवर्तन करत।\nअनुवाद लेल मिडियाविकी स्थानीयकरण परियोजना [https://translatewiki.net/wiki/Main_Page?setlang=en ट्रान्सलेटविकी.नेट] पर जाए।",
+       "translateinterface": "सभ à¤µà¤¿à¤\95िसभà¤\95 à¤²à¥\87ल à¤\85नà¥\81वाद à¤\9cà¥\8bडà¤\8f à¤¯à¤¾ à¤¬à¤¦à¤²à¥\88à¤\95 à¤²à¥\87ल à¤®à¤¿à¤¡à¤¿à¤¯à¤¾à¤µà¤¿à¤\95ि à¤\95à¥\8dषà¥\87तà¥\8dरà¥\80यà¤\95रण à¤ªà¤°à¤¿à¤¯à¥\8bà¤\9cना [https://translatewiki.net/ à¤\9fà¥\8dरानà¥\8dसलà¥\87à¤\9fविà¤\95à¥\80.नà¥\87à¤\9f]à¤\95 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\80।",
        "cascadeprotected": "ई पन्नाक सम्पादन सम्भव नै अछि, कारण अहिमे सम्मिलित अछि, {{PLURAL:$1|पृष्ठ|पृष्ठसभ}} सुरक्षित अछि \"तराउपडी\" विकल्प खोललाक बाद:\n$2",
-       "namespaceprotected": "अहाँकेँ '''$1''' नाम-पेटारमे सम्पादनक अनुमति नै अछि।",
-       "customcssprotected": "à¤\85हाà¤\82à¤\95à¥\87à¤\82 à¤\90 à¤¸à¥\80.à¤\8fस.à¤\8fस.पनà¥\8dनाà¤\95à¥\87à¤\82 à¤¸à¤®à¥\8dपादित à¤\95रबाà¤\95 à¤\85धिà¤\95ार à¤¨à¥\88 à¤\85à¤\9bि, à¤\95ारण à¤\90मà¥\87 à¤¦à¥\8bसर à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95 à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤µà¤¿à¤\95लà¥\8dप à¤\9bà¥\88।",
-       "customjsprotected": "à¤\85हाà¤\82à¤\95à¥\87à¤\82 à¤\90 à¤\9cावासà¥\8dà¤\95à¥\8dरिपà¥\8dà¤\9f à¤ªà¤¨à¥\8dनाà¤\95à¥\87à¤\82 à¤¸à¤®à¥\8dपादित à¤\95रबाà¤\95 à¤\85धिà¤\95ार à¤¨à¥\88 à¤\85à¤\9bि, à¤\95ारण à¤\90मà¥\87 à¤¦à¥\8bसर à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95 à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤µà¤¿à¤\95लà¥\8dप à¤\9bà¥\88।",
+       "namespaceprotected": "अहाँकेँ <strong>$1</strong> नाम-पेटारमे सम्पादनक अनुमति नै अछि।",
+       "customcssprotected": "à¤\85हाà¤\81à¤\95 à¤¸à¤¿à¤¯à¤¸à¤¯à¤¸ à¤ªà¤¨à¥\8dनाà¤\95à¥\87à¤\82 à¤¸à¤®à¥\8dपादित à¤\95रबाà¤\95 à¤\85धिà¤\95ार à¤¨à¥\88 à¤\85à¤\9bि, à¤\95ारण à¤\8fहिमà¥\87 à¤¦à¥\8bसर à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95 à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤µà¤¿à¤\95लà¥\8dप à¤\85à¤\9bि।",
+       "customjsprotected": "à¤\85हाà¤\81à¤\95à¥\87 à¤\88 à¤\9cावासà¥\8dà¤\95à¥\8dरिपà¥\8dà¤\9f à¤ªà¤¨à¥\8dनाà¤\95à¥\87à¤\82 à¤¸à¤®à¥\8dपादित à¤\95रबाà¤\95 à¤\85धिà¤\95ार à¤¨à¥\88 à¤\85à¤\9bि, à¤\95ारण à¤\8fहिमà¥\87 à¤¦à¥\8bसर à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95 à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤µà¤¿à¤\95लà¥\8dप à¤\85à¤\9bि।",
        "mycustomcssprotected": "अहाके लेल ई सीएसएस पन्नाके सम्पादित करवाक अधिकार नै अछि।",
        "mycustomjsprotected": "अहके लेल इ जावास्क्रिप्ट पन्नाके सम्पादित करवाक अधिकार नै अछि।",
        "myprivateinfoprotected": "अहाके अपन व्यक्तिगत जानकारी बदलैक अनुमति नै अछि।",
        "userlogin-resetpassword-link": "अपन कूटशब्द बिसरि गेलौ?",
        "userlogin-helplink2": "सम्प्रवेशित करवाकलेल मदत",
        "userlogin-loggedin": "अहाँ {{GENDER:$1|$1}}क रूपमे पहिनेसँ सम्प्रवेशित छी।\nकोनो दोसर सदस्यक रुपमे सम्प्रवेशित करवाक लेल देल गेल फारमके प्रयोग करी।",
+       "userlogin-reauth": "अहाँ {{GENDER:$1|$1}} छी, एहि लेल अहाँक एक बेर आर खातामे प्रवेश करै पडत।",
        "userlogin-createanother": "दोसर खाता बनाबी",
        "createacct-emailrequired": "ई-मेल पता",
        "createacct-emailoptional": "ई-मेल पता (वैकल्पिक)",
        "nocookiesfornew": "प्रयोक्ता खाजा नै खुजल, कारण हम ओकर जडि पूर्ण रूपेँ नै ताकि सकलौ।\nई दृढ करी जे ज्ञापक सक्रिय अछि, ई पन्नाक फेरसँ भारित करी आ फेरसँ प्रयास करी।",
        "noname": "अहाँ वैध प्रयोक्तानाम नै देने छी।",
        "loginsuccesstitle": "सम्प्रवेश भएल",
-       "loginsuccess": "'''अहाँ सम्प्रवेश केलहुँ {{SITENAME}} \"$1\".'''क रूपमे।",
+       "loginsuccess": "<strong>अहाँ सम्प्रवेश केलहुँ {{SITENAME}} \"$1\"'''क रूपमे। </strong>",
        "nosuchuser": "\"$1\" नामसँ कोनो प्रयोक्ता नै अछि।\nप्रयोक्तानाम ब्रह्मक्षर-लघ्वक्षर भेद युक्त अछि।\nअपन ह्रिजै जाँची, वा [[Special:CreateAccount|नव खाता बनाबी]] ।",
        "nosuchusershort": "\"$1\" नामक कोनो प्रयोक्ता नै अछि।\nअपन हिजए सुधारी।",
        "nouserspecified": "अहाँक एकटा प्रयोक्तानाम देबऽ पडत।",
        "wrongpassword": "गलत कूटशब्द देल गेल।\nफेरसँ प्रयास करी।",
        "wrongpasswordempty": "रिक्त कूटशब्द देल गेल।\nफेरसँ प्रयास करी।",
        "passwordtooshort": "कूटशब्द कमसँ कम {{PLURAL:$1|1 वर्ण|$1 वर्णक}} हुअए।",
-       "passwordtoolong": "कुटशब्द kuttsabda {{PLURAL:$1|1 वर्ण|$1 वर्णों}} से बेसी नम्हर भ्या सकएत अछि।",
+       "passwordtoolong": "कुटशब्द {{PLURAL:$1|1 वर्ण|$1 वर्णसभ}}सँ बेसी नम्हर नै भ सकएत अछि।",
        "passwordtoopopular": "आम पासवर्ड अहाँ नै चुनि सकएत अछि। कृपया अनोखा पासवर्ड चुनी।",
        "password-name-match": "अहाँक कूटशब्द अहाँक प्रयोक्तानामसँ भिन्न हेबाक चाही।",
        "password-login-forbidden": "ऐ प्रयोक्तानाम आ कूटशब्दक प्रयोग प्रतिबन्धित अछि।",
        "accountcreated": "खाता खुजि गेल",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|वार्ता]]) के लेल खाता खोलल गेल अछि।",
        "createaccount-title": "{{SITENAME}}क लेल खाता बनाबी",
-       "createaccount-text": "à¤\95ियà¥\8b à¤\85हाà¤\81à¤\95 à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त à¤²à¥\87ल à¤\8fà¤\95à¤\9fा à¤\96ाता {{à¤\85नà¥\8dतरà¥\8dà¤\9cाल}} à¤ªà¤° à¤\96à¥\8bललनà¥\8dहि ($4) à¤¨à¤¾à¤® à¤­à¥\87ल \"$2\", à¤\95à¥\82à¤\9fशबà¥\8dद à¤­à¥\87ल \"$3\"।\nà¤\85हाà¤\81 à¤¸à¤®à¥\8dपà¥\8dरवà¥\87श à¤\95रà¥\82 à¤\86 à¤\85पन à¤\95à¥\82à¤\9fशबà¥\8dद à¤¬à¤¦à¤²à¥\82।\n\nà¤\85हाà¤\81 à¤\90 à¤¸à¤\82दà¥\87शà¤\95à¥\87à¤\81 बिसरि सकै छी, जँ ई खाता भ्रमवश बनल हुअए।",
+       "createaccount-text": "à¤\95ियà¥\8b à¤\85हाà¤\81à¤\95 à¤\88-पतà¥\8dर à¤¸à¤\99à¥\8dà¤\95à¥\87त à¤²à¥\87ल à¤\8fà¤\95à¤\9fा à¤\96ाता {{SITENAME}} à¤ªà¤° à¤\96à¥\8bललनà¥\8dहि ($4) à¤¨à¤¾à¤® à¤­à¥\87ल \"$2\", à¤\95à¥\82à¤\9fशबà¥\8dद à¤­à¥\87ल \"$3\"।\nà¤\85हाà¤\81 à¤¸à¤®à¥\8dपà¥\8dरवà¥\87श à¤\95रà¥\80 à¤\86 à¤\85पन à¤\95à¥\82à¤\9fशबà¥\8dद à¤¬à¤¦à¤²à¥\80।\n\nà¤\85हाà¤\81 à¤\88 à¤¸à¤¨à¥\8dदà¥\87शà¤\95à¥\87 बिसरि सकै छी, जँ ई खाता भ्रमवश बनल हुअए।",
        "login-throttled": "अहाँ ढ़ेर रास सम्प्रवेश प्रयास केलहुँ।\nफेर प्रयास करबासँ पहिने कने काल थम्हू।",
        "login-abort-generic": "अहाँक सम्प्रवेश सफल नै भेल- रोकल गएल",
        "login-migrated-generic": "अहाँके खाता माइग्रेट कएल गेल अछि, आर अहाँके प्रयोक्ता नाम आब ई विकिमे नै अछि।",
        "resetpass_announce": "सम्प्रवेश सम्पूर्ण करबा लेल, अहाँ एकटा नव कूटशब्द एतए निर्धारित करी।",
        "resetpass_text": "<!-- पाठ एतऽ लिखू -->",
        "resetpass_header": "खाता कूटशब्द बदली",
-       "oldpassword": "पुरान कूटशब्द",
-       "newpassword": "नव कूटशब्द",
-       "retypenew": "नव à¤\95à¥\82à¤\9fशबà¥\8dद à¤«à¥\87रसà¤\81 à¤\9fà¤\82à¤\95ित à¤\95रà¥\80",
-       "resetpass_submit": "à¤\95à¥\82à¤\9fशबà¥\8dद à¤¬à¤¨à¤¾à¤\89 आ सम्प्रवेश करी",
+       "oldpassword": "पुरान कूटशब्द:",
+       "newpassword": "नव कूटशब्द:",
+       "retypenew": "नव à¤\95à¥\82à¤\9fशबà¥\8dद à¤«à¥\87रसà¤\81 à¤²à¤¿à¤\96à¥\80:",
+       "resetpass_submit": "à¤\95à¥\82à¤\9fशबà¥\8dद à¤¬à¤¨à¤¾à¤¬à¥\80 आ सम्प्रवेश करी",
        "changepassword-success": "अहाँक कूटशब्द सफलतासँ बदलि देल गेल!",
        "changepassword-throttled": "अहाँ ढेर रास सम्प्रवेश प्रयास केलहुँ।\nफेर प्रयास $1 करबासँ पहिने कने काल थम्हू।",
        "botpasswords": "बोट पासवर्ड",
        "botpasswords-label-delete": "मेटाबी",
        "botpasswords-label-resetpassword": "पासवर्ड पुनः तय करी",
        "botpasswords-label-grants": "अनुदान आवेदन:",
+       "botpasswords-label-grants-column": "प्रदान कएल",
+       "botpasswords-bad-appid": "बोट नाम \"$1\" मान्य नै अछि।",
        "resetpass_forbidden": "कूटशब्द नै बदलल जा सकैए।",
        "resetpass-no-info": "अहाँकेँ ऐ पन्नाकेँ सोझे प्रयोग करबालेल सम्प्रवेशित हुअए पड़त।",
        "resetpass-submit-loggedin": "कूटशब्द बदली",
        "resetpass-submit-cancel": "रद्द करी",
        "resetpass-wrong-oldpass": "अमान्य अस्थायी वा अखुनका कूटशब्द।\nअहाँ पहिनहिये सफलतासँ कूटशब्द बदलि लेने छी वा एकटा नव अस्थायी कूटशब्द लेल आग्रह केने छी।",
-       "resetpass-recycled": "रà¥\80सà¥\87à¤\9f à¤\95रà¤\8fà¤\95à¥\87 à¤²à¥\87ल à¤¨à¤¯à¤¾à¤\81 à¤\95à¥\82à¤\9fशबà¥\8dदमà¥\87 à¤\95à¥\83पया à¤\85पन à¤µà¤°à¥\8dतमान à¤\95à¥\82à¤\9fशबà¥\8dद à¤¨à¥\88 à¤¦ à¤\95à¥\87 à¤¨à¤¯à¤¾à¤\81 à¤\95à¥\82à¤\9fशबà¥\8dद à¤¦à¥\87ल à¤\9cाà¤\89।",
+       "resetpass-recycled": "रिसà¥\87à¤\9f à¤\95रà¥\88à¤\95 à¤²à¥\87ल à¤¨à¤¯à¤¾à¤\81 à¤\95à¥\82à¤\9fशबà¥\8dदमà¥\87 à¤\95à¥\83पया à¤\85पन à¤µà¤°à¥\8dतमान à¤\95à¥\82à¤\9fशबà¥\8dद à¤¨à¥\88 à¤¦ à¤¨à¤¯à¤¾à¤\81 à¤\95à¥\82à¤\9fशबà¥\8dद à¤¦à¥\87ल à¤\9cाà¤\8f।",
        "resetpass-temp-emailed": "अहाँ अखन एकटा अस्थायी ई-पत्र कोड सँ सम्प्रवेशित केनए छी। सम्प्रवेश पूर्ण करए के लेल अहाँ के एतए नयाँ कूटशब्द राखए पडत:",
        "resetpass-temp-password": "तात्कालिक कूटशब्द:",
        "resetpass-abort-generic": "कूटशब्दमे बदलाव कोनो एक्सटेंशनद्वारा रोकल गएल अछि।",
        "resetpass-expired": "अहाँके कूटशब्दक वैधता अवधि खत्तम भऽ गेल अछि । कृपया सम्प्रवेशित करवाक लेल नयाँ कूटशब्द राखु।",
-       "resetpass-expired-soft": "अहाँके कूटशब्दकऽ वैधता अवधि समाप्त भऽ गेल आर कूटशब्द परिवार्तान करवाक आवश्यकता अछि। कृपया एगो नव कूटशब्द राखु, वा पाछु रिसेट करवाक लेल \"{{int:authprovider-resetpass-skip-label}}\" क्लिक करु।",
-       "resetpass-validity-soft": "à¤\85हाà¤\81à¤\95à¥\87 à¤\95à¥\82à¤\9fशबà¥\8dद à¤®à¤¾à¤¨à¥\8dय à¤¨à¥\88 à¤\85à¤\9bि: $1 \n\nà¤\95à¥\83पया à¤\86ब à¤\8fà¤\97à¥\8b à¤¨à¤µ à¤\95à¥\82à¤\9fशबà¥\8dद à¤\9aà¥\81नà¥\81, à¤µà¤¾ à¤ªà¤¾à¤\9bà¥\81 à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रà¤\8f à¤\95à¥\87 à¤²à¥\87ल \"{{int:authprovider-resetpass-skip-label}}\" à¤®à¥\87à¤\82 à¤\95à¥\8dलिà¤\95 à¤\95रà¥\82।",
+       "resetpass-expired-soft": "अहाँक कूटशब्द कऽ वैधता अवधि समाप्त भऽ गेल आर कूटशब्द परिवार्तन करवाक आवश्यकता अछि। कृपया एगो नव कूटशब्द राखी, वा पाछा रिसेट करवाक लेल \"{{int:authprovider-resetpass-skip-label}}\" क्लिक करी।",
+       "resetpass-validity-soft": "à¤\85हाà¤\81à¤\95à¥\87 à¤\95à¥\82à¤\9fशबà¥\8dद à¤®à¤¾à¤¨à¥\8dय à¤¨à¥\88 à¤\85à¤\9bि: $1 \n\nà¤\95à¥\83पया à¤\86ब à¤\8fà¤\97à¥\8b à¤¨à¤µ à¤\95à¥\82à¤\9fशबà¥\8dद à¤\9aà¥\81नà¥\80, à¤µà¤¾ à¤ªà¤¾à¤\9b à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रà¤\8fà¤\95 à¤²à¥\87ल \"{{int:authprovider-resetpass-skip-label}}\" à¤\95à¥\8dलिà¤\95 à¤\95रà¥\80।",
        "passwordreset": "कूटशब्द फेरसँ बनाबी",
        "passwordreset-text-one": "अपन कूटशब्द रीसेट करवाक लेल इ फारम भरी।",
        "passwordreset-text-many": "{{PLURAL:$1|ई-पत्रके माध्यमसऽ एकटा अस्थायी कूटशब्द पावैलेल कोनो एकटा डिब्बा भरी।}}",
        "passwordreset-disabled": "कूटशब्द फेरसँ बनाएब ऐ विकीपर अक्षम कएल अछि।",
        "passwordreset-emaildisabled": "कूटशब्द फेरसँ बनाएब ऐ विकीपर अक्षम कएल अछि।",
-       "passwordreset-username": "प्रयोक्तानाम",
+       "passwordreset-username": "प्रयोक्तानाम:",
        "passwordreset-domain": "क्षेत्र:",
-       "passwordreset-capture": "परिणाम à¤\88-पतà¥\8dर à¤¦à¥\87à¤\96à¥\82?",
-       "passwordreset-capture-help": "à¤\9cà¤\81 à¤\85हाà¤\81 à¤\90 à¤¬à¤\95à¥\8dशाà¤\95à¥\87à¤\81 à¤¦à¥\87à¤\96à¥\88 à¤\9bà¥\80, à¤\88-पतà¥\8dर (तातà¥\8dà¤\95ालिà¤\95 à¤\95à¥\82à¤\9fशबà¥\8dदà¤\95 संग) अहाँकेँ देखाएल जाएत आ संगे प्रयोक्ताकेँ पठाएल जाएत।",
-       "passwordreset-email": "à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त",
-       "passwordreset-emailtitle": "{{SITENAME}} à¤ªà¤° à¤²à¥\87à¤\96ा विवरण",
+       "passwordreset-capture": "परिणाम à¤\88-पतà¥\8dर à¤¦à¥\87à¤\96à¥\80?",
+       "passwordreset-capture-help": "à¤\9cà¤\81 à¤\85हाà¤\81 à¤\88 à¤¬à¤\95à¥\8dशाà¤\95à¥\87à¤\81 à¤¦à¥\87à¤\96à¥\88 à¤\9bà¥\80, à¤\88-पतà¥\8dर (तातà¥\8dà¤\95ालिà¤\95 à¤\95à¥\82à¤\9fशबà¥\8dदà¤\95संग) अहाँकेँ देखाएल जाएत आ संगे प्रयोक्ताकेँ पठाएल जाएत।",
+       "passwordreset-email": "à¤\88-पतà¥\8dर à¤¸à¤\99à¥\8dà¤\95à¥\87त:",
+       "passwordreset-emailtitle": "{{SITENAME}} à¤ªà¤° à¤\96ाता विवरण",
        "passwordreset-emailtext-ip": "कियो (सम्भवतः अहाँ, अन्तर्जाल सेवा कल्पक $1 सँ) अपन लेखा विवरणक पुनःस्मरणक लेल अनुरोध केलहुँ ऐ लेल {{SITENAME}} ($4). ई प्रयोक्ता {{PLURAL:$3|लेखा अछि|लेखा सभ अछि}}\nऐ ई-पत्र संकेतसँ सम्बन्धित:\n\n$2\n\n{{PLURAL:$3|ई अल्पकालक कूटशब्द| ई सभ अल्पकालक कूटशब्द}} खतम भऽ जाएत {{PLURAL:$5|एक दिन|$5 पाँच दिन}}.\nअहाँ सम्प्रवेश करू आ एकटा नव कूटशब्द चुनू।. जौं कियो आन ई आग्रह केने अछि, वा अहाँकेँ अपन पुरान कूटशब्द मोन पड़ि गेल अछि , आ आब एकरा बदलबाक इच्छा नै राखै छी तँ अहाँ ऐ संदेशकेँ बिसरि जाउ आ अपन पुरान कूटशब्दक प्रयोग करैत रहू।",
        "passwordreset-emailtext-user": "प्रयोक्ता $1 {{अन्तर्जाल}} पर अहाँक खाता विवरणक {{SITENAME}} लेल फेरसँ ($4) आग्रह केने छथि। ई प्रयोक्ता {{PLURAL:$3|खाता अछि|खाता सभ अछि}} ऐ ई-पत्र संकेतसँ जुड़ल: $2\n{{PLURAL:$3| ई अस्थायी कूटशब्द|ई सभ अस्थायी कूटशब्द}} खतम भऽ जाएत {{PLURAL:$5|एक दिन|$5 दिन}} मे।\nअहाँ सम्प्रवेश करू आ एकटा नव कूटशब्द आब चुनू। जँ कियो दोसर ई आग्रह केने छथि, वा जँ अहाँकेँ अपन मूल कूटशब्द मोन पड़ि गेल अछि, आ अहाँ आब ओइ कूटशब्दकेँ नै बदलऽ चाहै छी, अहाँ ऐ संदेशकेँ बिसरि सकै छी आ अपन पुरान कूटशब्दक प्रयोग जारी राखि सकै छी।",
        "passwordreset-emailelement": "प्रयोक्ता: \n$1\n\nअस्थायी कूटशब्द: \n$2",
        "passwordreset-emailerror-capture": "एकटा स्मरण ई-पत्र बनाएल गेल अछि, जे नीचाँ देखाएल अछि, मुदा प्र्योक्ताकेँ एकरा पठेबाक प्रयास विफल भेल: $1",
        "changeemail": "ई-मेल पता परिवर्तित करी",
        "changeemail-header": "अपन ईमेल पता परिवर्तन हेतु एकरा पुरा करी। यदि अहाँ अपन वर्तमान ईमेल पता हटाबैलेल चाहैत छी, तँ एकरा खाली छोडि दी आ एकरा भेजी।",
-       "changeemail-no-info": "अहाँकेँ ऐ पन्नाकेँ सोझे देखबाले सम्प्रवेशित हुअए पड़त।",
-       "changeemail-oldemail": "à¤\85à¤\96à¥\81नà¤\95ा à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त:",
-       "changeemail-newemail": "नव à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त:",
+       "changeemail-no-info": "अहाँक ई पन्नाक सोझे प्रयोग करबालेल सम्प्रवेशित हुअए पडत।",
+       "changeemail-oldemail": "वरà¥\8dतमान à¤\88-मà¥\87ल à¤ªà¤¤à¤¾:",
+       "changeemail-newemail": "नव à¤\88-मà¥\87ल à¤ªà¤¤à¤¾:",
        "changeemail-none": "(कोनो नै)",
        "changeemail-password": "अहाँक {{SITENAME}} कूटशब्द:",
        "changeemail-submit": "ई-मेल बदली",
        "bold_sample": "मोट पाठ",
        "bold_tip": "मोट पाठ",
        "italic_sample": "कटि लेखन",
-       "italic_tip": "à¤\95़à¤\9fि à¤²à¥\87à¤\96न",
+       "italic_tip": "कटि लेखन",
        "link_sample": "लिङ्क शीर्षक",
        "link_tip": "आन्तरिक लिङ्क",
        "extlink_sample": "http://www.example.com लिङ्क शीर्षक",
        "image_sample": "उदाहरण.jpg",
        "image_tip": "समाहित चित्र",
        "media_sample": "उदाहरण.ogg",
-       "media_tip": "मà¥\80डिया à¤«à¤¾à¤\87ल à¤²à¤¿à¤\82क",
-       "sig_tip": "अहाँक हस्ताक्षर समयक मोहरक संग",
+       "media_tip": "मिडिया à¤«à¤¾à¤\87ल à¤²à¤¿à¤\99à¥\8dक",
+       "sig_tip": "अहाँक हस्ताक्षर समयक मोहरकसंग",
        "hr_tip": "अक्षांशीय पंक्ति (अल्प उपयोग)",
        "summary": "सारांश:",
        "subject": "विषय:",
        "showpreview": "पूर्वप्रदर्शन",
        "showdiff": "परिवर्तन देखाबी",
        "blankarticle": "<strong>चेतावनी:</strong> अहाँ एक रिक्त पन्ना के निर्माण करि रहल छी।\nयदि अहाँ \"{{int:savearticle}}\" क पुनः दाबबै त पन्नाक बिना कोनो सामग्रीक निर्मित भ जाएत।",
-       "anoneditwarning": "'''चेतौनी:''' अहाँ सम्प्रवेशित नै छी।\nअहाँक अनिकेत ई पन्नाक सम्पादन इतिहासमे दर्ज कएल जाएत।",
+       "anoneditwarning": "<strong>चेतौनी:</strong> अहाँ सम्प्रवेश नै केनए छी । यदि अहाँ सम्पादन करबै तहन ई पृष्ठक सम्पादन इतिहासमे अहाँक आइपी ठेगान दर्ज कएल जाएत। यदि अहाँ <strong>[$1 सम्प्रवेश]</strong> करैत छी अथवा <strong>[$2 खाता बनाबैत छी]</strong> तहन अन्य सुविधासभ संगे अहाँक सम्पादनसभक श्रेय अहाँक प्रयोगकर्तानाम पर दएल जाएत।",
        "anonpreviewwarning": "<em>अहाँ सम्प्रवेशित नै छी। अखन रक्षण केलासँ अहाँक अनिकेत पता ई पन्नाक सम्पादन इतिहासमे दर्ज भऽ जाएत।</em>",
        "missingsummary": "<strong>स्मारक:</strong> अहाँ सम्पादन सार नै देने छी।\nजँ अहाँ फेरसँ क्लिक करब \"{{int:savearticle}}\", अहाँक सम्पादन बिना एकर संरक्षित भऽ जाएत।",
        "selfredirect": "<strong>चेतावनी:</strong> आहाँ स्वेम के ई पन्ना पुनः निर्देशीत कएर रहल छी।\nआहाँ अनुप्रेषित के लेल गलत लक्ष्य निर्दिष्ट भ्या सकएत अछि, या आहाँ गलत पन्ना कें संपादन कैर सकएत छी।\nआहाँ फेरो से \"{{int:savearticle}}\" क्लिक करएत छी, रीडायरेक्ट ओनाहो भी बनाबल जेल अछि।",
-       "missingcommenttext": "à¤\95à¥\83पा à¤\95ऽ à¤\85पन à¤µà¤¿à¤\9aार à¤¨à¥\80à¤\9aाà¤\81 à¤ªà¥\8dरविषà¥\8dà¤\9f à¤\95रà¥\82।",
+       "missingcommenttext": "à¤\95à¥\83पा à¤\95ऽ à¤\85पन à¤µà¤¿à¤\9aार à¤¨à¥\80à¤\9aाà¤\81 à¤ªà¥\8dरविषà¥\8dà¤\9f à¤\95रà¥\80।",
        "missingcommentheader": "'''स्मरण:''' अहाँ कोनो विषय/ शीर्षक ऐ टिप्पणीक लेल नै देने छी।\nजँ अहाँ फेरसँ क्लिक करब \"{{int:savearticle}}\" , अहाँक सम्पादन बिना एकर संरक्षित भऽ जाएत।",
        "summary-preview": "सारांश पूर्वावलोकन",
        "subject-preview": "विषयक झलक:",
-       "previewerrortext": "à¤\86हाà¤\81à¤\95à¥\87à¤\82 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\95à¥\87 à¤ªà¥\82रà¥\8dवावलà¥\8bà¤\95न à¤\95रà¤\88 à¤\95à¥\87à¤\82 à¤¸à¤®à¤¯ à¤\8fà¤\95 à¤¤à¥\8dरà¥\81à¤\9fि à¤\8fल ।",
+       "previewerrortext": "à¤\85हाà¤\81à¤\95 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनà¤\95à¥\87 à¤ªà¥\82रà¥\8dवावलà¥\8bà¤\95न à¤\95रहिà¤\95 à¤¸à¤®à¤¯ à¤\8fà¤\95 à¤¤à¥\8dरà¥\81à¤\9fि à¤\86à¤\8fल।",
        "blockedtitle": "प्रयोक्ता प्रतिबन्धित अछि।",
-       "blockedtext": "''' अहाँक प्रयोक्तानाम वा अनिकेत प्रतिबन्धित कऽ देल गेल अछि।'''\n\nई प्रतिबन्ध $1 द्वारा कएल गेल।\nएकर कारण अछि ''$2'' ।\n\n* प्रतिबन्धक प्रारम्भ: $8\n* प्रतिबन्धक समाप्ति: $6\n* आसन्न प्रतिबन्धसँ प्रभावित: $7\n\nअहाँ $1 सँ सम्पर्क कऽ सकै छी वा दोसर [[{{MediaWiki:Grouppage-sysop}}|संचालक]] सँ प्रतिबन्धक विषयमे सम्पर्क कऽ सकै छी।\nअहाँ ’ऐ प्रयोक्ताकेँ ई-पत्र दिअ’ सुविधाक प्रयोग नै कऽ सकै छी यावत एकटा मान्य ई-पत्र संकेतक विवरण अहाँक  [[Special:Preferences|खाता विकल्प]] मे नै देल अछि आ अहाँकेँ एकर प्रयोग करबासँ रोकि नै देल गेल हो।\nअहाँक वर्तमान अनिकेत अछि $3, आ प्रतिबन्ध संख्या अछि # $5 ।\nऐ सभ विवरणक उल्लेख अहाँ अपन कोनो कएल जाइबला प्रश्नमे करू।",
-       "autoblockedtext": "अहाँक अनिकेत स्वचालित रूपेँ प्रतिबन्धित कऽ देल गेल अछि कारण एकर प्रयोग कोनो दोसर प्रयोक्ता द्वारा भऽ रहल छल, जे $1 द्वारा प्रतिबन्धतित कएल गेल।\nएकर कारण अछि:\n: ''$2'' ।\n\n* प्रतिबन्धक प्रारम्भ: $8\n* प्रतिबन्धक समाप्ति: $6\n* आसन्न प्रतिबन्धसँ प्रभावित: $७\n\nअहाँ $1 सँ सम्पर्क कऽ सकै छी वा दोसर [[{{MediaWiki:Grouppage-sysop}}|संचालक]] सँ प्रतिबन्धक विषयमे सम्पर्क कऽ सकै छी।\nअहाँ मोन राखू जे अहाँ ’ऐ प्रयोक्ताकेँ ई-पत्र दिअ’ सुविधाक प्रयोग नै कऽ सकै छी यावत एकटा मान्य ई-पत्र संकेतक पंजीकरण अहाँक  [[Special:Preferences|प्रयोक्ता विकल्प]] मे नै देल अछि आ अहाँकेँ एकर प्रयोग करबासँ रोकि नै देल गेल हो।\nअहाँक वर्तमान अनिकेत अछि $3, आ प्रतिबन्ध संख्या अछि # $5 ।\nऐ सभ विवरणक उल्लेख अहाँ अपन कोनो कएल जाइबला प्रश्नमे करू।",
+       "blockedtext": "<strong>अहाँक प्रयोक्तानाम वा अनिकेत प्रतिबन्धित कऽ देल गेल अछि।</strong>\n\nई प्रतिबन्ध $1 द्वारा कएल गेल।\nएकर कारण अछि ''$2'' ।\n\n* प्रतिबन्धक प्रारम्भ: $8\n* प्रतिबन्धक समाप्ति: $6\n* आसन्न प्रतिबन्धसँ प्रभावित: $7\n\nअहाँ $1 सँ सम्पर्क कऽ सकै छी वा दोसर [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धक]]सँ प्रतिबन्धक विषयमे सम्पर्क कऽ सकै छी।\nअहाँ ’ऐ प्रयोक्ताकेँ ई-पत्र दिअ’ सुविधाक प्रयोग नै कऽ सकै छी यावत एकटा मान्य ई-पत्र संकेतक विवरण अहाँक  [[Special:Preferences|खाता विकल्प]]मे नै देल अछि आ अहाँकेँ एकर प्रयोग करबासँ रोकि नै देल गेल हो।\nअहाँक वर्तमान अनिकेत अछि $3, आ प्रतिबन्ध क्रमाङ्क अछि # $5 ।\nई सभ विवरणक उल्लेख अहाँ अपन कोनो कएल जाएबला प्रश्नमे करी।",
+       "autoblockedtext": "अहाँक अनिकेत स्वचालित रूपेँ प्रतिबन्धित कऽ देल गेल अछि कारण एकर प्रयोग कोनो दोसर प्रयोक्ता द्वारा भऽ रहल छल, जे $1 द्वारा प्रतिबन्धतित कएल गेल।\nएकर कारण अछि:\n:<em>$2</em>।\n\n* प्रतिबन्धक प्रारम्भ: $8\n* प्रतिबन्धक समाप्ति: $6\n* आसन्न प्रतिबन्धसँ प्रभावित: $७\n\nअहाँ $1 सँ सम्पर्क कऽ सकै छी वा दोसर [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धक]] सँ प्रतिबन्धक विषयमे सम्पर्क कऽ सकै छी।\nअहाँ मोन राखू जे अहाँ ’ऐ प्रयोक्ताकेँ ई-पत्र दिअ’ सुविधाक प्रयोग नै कऽ सकै छी यावत एकटा मान्य ई-पत्र संकेतक पंजीकरण अहाँक  [[Special:Preferences|प्रयोक्ता विकल्प]] मे नै देल अछि आ अहाँकेँ एकर प्रयोग करबासँ रोकि नै देल गेल हो।\nअहाँक वर्तमान अनिकेत अछि $3, आ प्रतिबन्ध क्रमाङ्क अछि # $5 ।\nई सभ विवरणक उल्लेख अहाँ अपन कोनो कएल जाएबला प्रश्नमे करी।",
        "blockednoreason": "कोनो कारण देल नै अछि।",
        "whitelistedittext": "अहाँकेँ $1पन्ना सम्पादन करबा लेल",
-       "confirmedittext": "पनà¥\8dना à¤¸à¤­à¤\95 à¤¸à¤®à¥\8dपादन à¤\95à¥\87लासà¤\81 à¤ªà¥\82रà¥\8dव à¤\85हाà¤\81 à¤\85पन à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87तà¤\95à¥\87à¤\81 à¤¸à¤¤à¥\8dयापित à¤\95रà¥\82।\nà¤\95à¥\83पा à¤\95ऽ à¤\85पन à¤\88-पतà¥\8dर à¤ªà¤¤à¤¾ à¤¦à¤°à¥\8dà¤\9c à¤\95रà¥\82 à¤\86 à¤¸à¤¤à¥\8dयापित à¤\95रà¥\82 à¤\90 à¤¸à¤\81 [[Special:Preferences|पà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95 à¤ªà¤¸à¤¿à¤¨à¥\8dन à¤¸à¤­]]",
+       "confirmedittext": "पनà¥\8dना à¤¸à¤®à¥\8dपादन à¤\95रà¥\88सà¤\81 à¤ªà¥\82रà¥\8dव à¤\85हाà¤\81 à¤\85पन à¤\88-मà¥\87ल à¤ à¥\87à¤\97ान à¤¸à¤¤à¥\8dयापित à¤\95रà¥\80।\nà¤\95à¥\83पा à¤\95ऽ [[Special:Preferences|पà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95 à¤®à¥\8bनपसनà¥\8dद]]मà¥\87 à¤\9cा à¤\85पन à¤\88-मà¥\87ल à¤ à¥\87à¤\97ान à¤¦à¤°à¥\8dà¤\9c à¤\95रà¥\80 à¤\86 à¤¸à¤¤à¥\8dयापित à¤\95रà¥\80।",
        "nosuchsectiontitle": "एहन कोनो अनुभाग शीर्षक नै अछि",
        "nosuchsectiontext": "अहाँ एहन अनुभागक सम्पादित करबाक प्रयास केलहुँ जे अछि नै।\nअहाँ जखन ई पन्ना देख रहल छलहुँ तखन ई मेटा देल गेल हएत वा दोसर ठाम हटा देल गेल हएत।",
        "loginreqtitle": "सम्प्रवेश आवश्यक",
        "accmailtitle": "कूटशब्द पठा देल गेल।",
        "accmailtext": "एकटा बिना क्रमबला निर्माण पद्धतिसँ कूटशब्दक निर्माण [[User talk:$1|$1]] लेल $2 केँ पठाएल गेल अछि।\n\nऐ खाताक कूटशब्द बदलल जा सकैए ''[[Special:ChangePassword|कूटशब्द बदलू]]'' पन्नापर सम्प्रवेश केलाक बाद।",
        "newarticle": "(नव)",
-       "newarticletext": "à¤\85हाà¤\81 à¤\8fहà¥\87न à¤ªà¤¨à¥\8dनाà¤\95 à¤²à¤¿à¤\82à¤\95à¤\95 à¤\85नà¥\81सरण à¤\95ऽ à¤\86à¤\8fल à¤\9bà¥\80 à¤\9cà¥\87 à¤ªà¤¨à¥\8dना à¤\85à¤\96न à¤¬à¤¨à¤²à¥\87 à¤¨à¥\88 à¤\85à¤\9bि।\nपनà¥\8dना à¤¬à¤¨à¥\87बाà¤\95 à¤²à¥\87ल à¤¨à¥\80à¤\9aाà¤\81à¤\95 à¤¬à¤\95à¥\8dशामà¥\87 à¤\9fाà¤\87प à¤\95à¥\87नाà¤\87 à¤¶à¥\81रà¥\82 à¤\95रà¥\82 (दà¥\87à¤\96à¥\82 [$1  सहायता पन्ना] विषेष जानकारी लेल)।",
+       "newarticletext": "à¤\85हाà¤\81 à¤\8fहà¥\87न à¤ªà¤¨à¥\8dनाà¤\95 à¤²à¤¿à¤\99à¥\8dà¤\95à¤\95 à¤\85नà¥\81सरण à¤\95ऽ à¤\86à¤\8fल à¤\9bà¥\80 à¤\9cà¥\87 à¤ªà¤¨à¥\8dना à¤\85à¤\96न à¤¬à¤¨à¤²à¥\87 à¤¨à¥\88 à¤\85à¤\9bि।\nपनà¥\8dना à¤¬à¤¨à¥\87बाà¤\95 à¤²à¥\87ल à¤¨à¥\80à¤\9aाà¤\81à¤\95 à¤¬à¤\95à¥\8dसामà¥\87 à¤\9fाà¤\87प à¤\95à¥\87नाà¤\8f à¤¶à¥\81रà¥\82 à¤\95रà¥\80 (दà¥\87à¤\96à¥\80 [$1  सहायता पन्ना] विषेष जानकारी लेल)।",
        "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-nopermission": "अखन ऐ पन्नापर कोनो पाठ नै अछि।\nअहाँ [[Special:Search/{{PAGENAME}}|ऐ पन्ना शीर्षक लेल ताकू]]",
-       "missing-revision": "\"{{FULLPAGENAME}}\" पन्ना के अवतरण #$1 मौजूद नई अछि ।\n\nओन त ई एक हट्याल गेल पन्ना के पुराना कडी पे क्लिक करबाक कारण से होएत अछि।\nअधिक जानकारी के लेल आहाँ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटाबै के लॉग] देख सकै अछि।",
-       "userpage-userdoesnotexist": "प्रयोक्ता खाता \"<nowiki>$1</nowiki>\" पंजीकृत नै अछि।\nनिश्चय करू जे की अहाँ ई पन्ना बनेबाक/ सम्पादित करबाक इच्छुक छी।",
-       "userpage-userdoesnotexist-view": "पà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\96ाता \"$1\" à¤ªà¤\82जीकृत नै अछि।",
+       "missing-revision": "\"{{FULLPAGENAME}}\" पन्नाक अवतरण #$1 मौजूद नै अछि ।\n\nओन त ई एक मेटाएल पन्नाक पुराना कडीपर क्लिक करबाक कारण सँ होएत अछि।\nअधिक जानकारीक लेल अहाँ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटाबैक लग] देख सकै छी।",
+       "userpage-userdoesnotexist": "प्रयोक्ता खाता \"$1\" पञ्जीकृत नै अछि।\nनिश्चय करी जे की अहाँ ई पन्ना बनेबाक/ सम्पादित करबाक इच्छुक छी।",
+       "userpage-userdoesnotexist-view": "पà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\96ाता \"$1\" à¤ªà¤\9eà¥\8dजीकृत नै अछि।",
        "blocked-notice-logextract": "ई प्रयोक्ता अखन प्रतिबन्धित अछि।\nअद्यतन प्रतिबन्धित  वृत्तलेख लेखा सन्दर्भ लेल नीचाँ देल अछि:",
        "clearyourcache": "'''टिप्पणी:''' संरक्षणक बाद, अहाँकेँ परिवर्तन देखबा लेल अपन गवेषकक उपस्मृतिकेँ हटबए पड़त।\n''' मोजिल्ला/ फायरफॉक्स/ सफारी:''' दाबि कऽ राखू ''शिफ्ट'' केँ ''पुनर्भारित'' क्लिक करबाक समए, वा दाबू चाहे ''Ctrl-F5'' वा ''Ctrl-R'' (''Command-R'' मैकिनटोशपर);\n'''कन्करर: ''' क्लिक करू ''पुनर्भारित करू'' वा दाबू''F5'';\n'''ओपेरा:''' उपस्मृति खतम करू ''Tools → Preferences'';\n'''इन्टरनेट एक्सप्लोरर:''' दाबि कऽ राखू ''Ctrl'' क्लिक करबा काल ''नवीकरण,'' वा दाबू ''Ctrl-F5'' ।",
-       "usercssyoucanpreview": "''' संकेत:'''  प्रयोग करू \"{{int:पूर्वदृश्य देखाउ}}\" बटन अपन नव सी.एस.एस. संरक्षण जँचबाक लेल।",
-       "userjsyoucanpreview": "''' संकेत:'''  प्रयोग करू \"{{int:पूर्वदृश्य देखाउ}}\" बटन अपन नव जावास्क्रिप्ट संरक्षण जँचबाक लेल।",
+       "usercssyoucanpreview": "<strong>सङ्केत:</strong> सङ्ग्रह करैसँ पहिने अहाँ अपन नव सियसयसक जाँच लेल \"{{int:पूर्वदृश्य देखाउ}}\" बटनक प्रयोग करी।",
+       "userjsyoucanpreview": "<strong>टिप</strong>  प्रयोग करी \"{{int:showpreview}}\" बटन अपन नव जावास्क्रिप्ट संरक्षण जँचबाक लेल।",
        "usercsspreview": "''' मोन राखू जे अहाँ मात्र अपन प्रयोक्ता  सी.एस.एस. क पूर्वदृश्य देख रहल छी।'''\n''' ई अखन धरि संरक्षित नै भऽ सकल!'''",
        "userjspreview": "''' मोन राखू जे अहाँ मात्र अपन प्रयोक्ता  जावास्क्रिप्टक पूर्वदृश्य देख रहल छी।'''\n''' ई अखन धरि संरक्षित नै भऽ सकल!'''",
        "sitecsspreview": "''' मोन राखू जे अहाँ मात्र ऐ  सी.एस.एस. क पूर्वदृश्य देख रहल छी।'''\n''' ई अखन धरि संरक्षित नै भऽ सकल!'''",
        "sitejspreview": "''' मोन राखू जे अहाँ मात्र ऐ  जावास्क्रिप्टक पूर्वदृश्य देख रहल छी।'''\n''' ई अखन धरि संरक्षित नै भऽ सकल!'''",
        "userinvalidcssjstitle": "'''चेतौनी:''' ऐ मे कोनो आवरण \"$1\" नै अछि।\nबनाएल .css आ .js पन्ना लघ्वक्षरक शीर्षकक प्रयोग करैत अछि, जेना {{ns:user}}:Foo/vector.css एकर विरुद्ध {{ns:user}}:Foo/Vector.css ।",
        "updated": "(अद्यतन  कएल)",
-       "note": "'''टिप्पणी:'''",
+       "note": "<strong>टिप्पणी:</strong>",
        "previewnote": "'''मोन राखू ई मातर पूर्वावलोकन छी।'''\nअहाँक परिवर्तन अखन धरि सँचिआएल नै गेल अछि!",
        "continue-editing": "सम्पादन क्षेत्र जाए",
        "previewconflict": "ई पूर्वदृश्य देखबैए उपरका सम्पादन क्षेत्रक पाठ, ई आएत जखन अहाँ संरक्षित करब।",
        "session_fail_preview": "''' दुखी छी! अहाँक सत्रक दत्तांश खतम भऽ गेल तै कारणसँ अहाँक सम्पादनक निपटारा नै भऽ सकल।'''\nफेरसँ प्रयास करू।\nजँ ई फेरसँ काज नै करैए, प्रयोग करू [[Special:UserLogout|निष्क्रमण]] आ फेर सम्प्रवेश करू।",
        "session_fail_preview_html": "''' दुखी छी! हम अहाँक सम्पादनक निष्पादन नै कऽ सकलहुँ कारण सत्रक दत्तांश खतम भऽ गेल।'''\n''कारण {{अन्तर्जाल}} लग काँच एच.टी.एम.एल. दत्तांश सक्रिय छै, पूर्वदृश्य जावास्क्रिप्ट आक्रमणक डरसँ नुकाएल राखल गेल अछि।''\n'''जँ ई वैध सम्पादन प्रयास अछि, कृपा कऽ पुनः प्रयास करू।'''\nजँ ई अखनो काज नै कऽ रहल अछि, प्रयास करू [[Special:UserLogout|निष्क्रमण कऽ रहल छी]] आ फेरसँ सम्प्रवेश।",
        "token_suffix_mismatch": "'''अहाँक सम्पादन अस्वीकार कऽ देल गेल अछि कारण अहाँक ग्राहक प्रेष्यमान अंक विधानक विराम चेन्ह सभकेँ नष्ट कऽ देलन्हि।'''\nई सम्पादन पन्नाक पाठकेँ दूषित होएबासँ बचेबा लेल अमान्य कऽ देल गेल।\nई कखनो काल होइए जखन अहाँ जाल आधारित अनाम दोसरा लेल चल सेवा प्रयुक्त करै छी।",
-       "edit_form_incomplete": "'''सम्पादन आवेदनक किछु भाग वितरक धरि नै पहुँचल; एक बेर फेर देखू जे अहाँक सम्पादन दुरुस्त अछि आ फेरसँ प्रयास करू।'''",
+       "edit_form_incomplete": "<strong>सम्पादन आवेदनक किछु भाग वितरक धरि नै पहुँचल; एक बेर फेर देखी जे अहाँक सम्पादन दुरुस्त अछि आ फेरसँ प्रयास करी।</strong>",
        "editing": "सम्पादन होइए $1",
        "creating": "$1 बनाबी",
        "editingsection": "सम्पादन कऽ रहल छी $1 (खण्ड)",
        "editingcomment": "सम्पादन कऽ रहल छी $1 (नव खण्ड)",
-       "editconflict": "सम्पादन अन्तर: $1",
-       "explainconflict": "à¤\9cà¤\96न à¤\85हाà¤\81 à¤\8fà¤\95र à¤¸à¤®à¥\8dपादन à¤\86रमà¥\8dभ à¤\95à¥\87नà¥\87 à¤°à¤¹à¥\80 à¤¤à¤\96नसà¤\81 à¤\95ियà¥\8b à¤\86न à¤\90 à¤ªà¤¨à¥\8dनाà¤\95à¥\87à¤\81 à¤¬à¤¦à¤²à¤¿ à¤¦à¥\87लà¤\95।\nà¤\89परà¤\95ा à¤ªà¤¾à¤  à¤\95à¥\8dषà¥\87तà¥\8dर à¤\85à¤\96न à¤\89पसà¥\8dथित à¤ªà¤¨à¥\8dनाà¤\95 à¤ªà¤¾à¤  à¤¦à¥\87à¤\96बà¥\88त à¤\85à¤\9bि।\nà¤\85हाà¤\81à¤\95 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¨à¤¿à¤\9aà¥\81लà¤\95ा à¤ªà¤¾à¤  à¤\95à¥\8dषà¥\87तà¥\8dरमà¥\87 à¤¦à¥\87à¤\96ाà¤\8fल à¤\85à¤\9bि।\nà¤\85हाà¤\81à¤\95à¥\87à¤\81 à¤\85पन à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤µà¤°à¥\8dतमान à¤ªà¤¾à¤ à¤®à¥\87 à¤®à¤¿à¤²à¤¾à¤¬à¤½ à¤ªà¤¡à¤¼à¤¤à¥¤\n'''मातà¥\8dर''' \"{{int:savearticle}}\" दबलापर उपरका पाठ क्षेत्रक पाठ संरक्षित हएत।",
+       "editconflict": "सम्पादन अन्तर्विरोध: $1",
+       "explainconflict": "à¤\9cà¤\96न à¤\85हाà¤\81 à¤\8fà¤\95र à¤¸à¤®à¥\8dपादन à¤\86रमà¥\8dभ à¤\95à¥\87नà¥\87 à¤°à¤¹à¥\80 à¤¤à¤\96नसà¤\81 à¤\95ियà¥\8b à¤\86न à¤\90 à¤ªà¤¨à¥\8dनाà¤\95à¥\87à¤\81 à¤¬à¤¦à¤²à¤¿ à¤¦à¥\87लà¤\95।\nà¤\89परà¤\95ा à¤ªà¤¾à¤  à¤\95à¥\8dषà¥\87तà¥\8dर à¤\85à¤\96न à¤\89पसà¥\8dथित à¤ªà¤¨à¥\8dनाà¤\95 à¤ªà¤¾à¤  à¤¦à¥\87à¤\96बà¥\88त à¤\85à¤\9bि।\nà¤\85हाà¤\81à¤\95 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¨à¤¿à¤\9aà¥\81लà¤\95ा à¤ªà¤¾à¤  à¤\95à¥\8dषà¥\87तà¥\8dरमà¥\87 à¤¦à¥\87à¤\96ाà¤\8fल à¤\85à¤\9bि।\nà¤\85हाà¤\81à¤\95à¥\87à¤\81 à¤\85पन à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤µà¤°à¥\8dतमान à¤ªà¤¾à¤ à¤®à¥\87 à¤®à¤¿à¤²à¤¾à¤¬à¤½ à¤ªà¤¡à¤¤à¥¤\n<strong>मातà¥\8dर</strong> \"{{int:savearticle}}\" दबलापर उपरका पाठ क्षेत्रक पाठ संरक्षित हएत।",
        "yourtext": "अहाँक पाठ",
        "storedversion": "पेटारमे राखल संशोधन",
        "nonunicodebrowser": "'''चेतौनी: अहाँक गवेषक सार्वत्रिकाक्षरकूट सहयोगी नै अछि।'''\nएकटा अस्थायी-परोक्ष तंत्रांश अहाँकेँ सुरक्षित रूपेँ पन्नाक सम्पादनमे मदति करत: गएर-अस्की अक्षर सभ षोडशमान पद्धतिमे सम्पादन बक्सामे आएत।",
        "protectedpagewarning": "''' चेतौनी: ई पन्ना संरक्षित अछि से खाली संचालन अधिकारयुक्त प्रयोक्ता एकरा सम्पादित कऽ सकै छथि।'''\nअद्यतन वृतलेख उल्लेख नीचाँ सन्दर्भ लेल देल जा रहल अछि:",
        "semiprotectedpagewarning": "'''चेतौनी:''' ई पन्ना संरक्षित अछि से खाली पंजीकृत प्रयोक्ता एकरा सम्पादित कऽ सकै छथि।\nअद्यतन वृतलेख उल्लेख नीचाँ सन्दर्भ लेल देल जा रहल अछि:",
        "cascadeprotectedwarning": "'''चेतौनी:''' ई पन्ना संरक्षित अछि से खाली संचालन अधिकारयुक्त प्रयोक्ता एकरा सम्पादित कऽ सकै छथि, कारण ई तराउपड़ी संरक्षित {{PLURAL:$1|पन्ना|पन्ना}}  मे शामिल अछि।",
-       "titleprotectedwarning": "'''à¤\9aà¥\87तà¥\8cनà¥\80: à¤\88 à¤ªà¤¨à¥\8dना à¤¸à¤\82रà¤\95à¥\8dषित à¤\85à¤\9bि à¤¸à¥\87 à¤\8fà¤\95रा à¤¬à¤¨à¥\87बा à¤²à¥\87ल [[Special:ListGroupRights|specific rights]] आवश्यक अछि।'''\nनीचाँ ऐ लेल अद्यतन वृत्तलेख उल्लेख देल जा रहल अछि:",
-       "templatesused": "{{PLURAL:$1|नमूना|नमूना सभ}} ऐ पन्नापर प्रयुक्त:",
-       "templatesusedpreview": "{{PLURAL:$1|मास्टरफाइल|सभटा मास्टरफाइल}} used in this preview:ऐ पूर्वप्रदर्शनमे प्रयुक्त :",
-       "templatesusedsection": "{{PLURAL:$1|नमà¥\82ना|नमà¥\82ना à¤¸à¤­}} à¤\90 à¤¸à¤\82वरà¥\8dà¤\97मे प्रयुक्त:",
+       "titleprotectedwarning": "'''à¤\9aà¥\87तà¥\8cनà¥\80: à¤\88 à¤ªà¤¨à¥\8dना à¤¸à¤\82रà¤\95à¥\8dषित à¤\85à¤\9bि à¤\86 à¤\8fà¤\95रा à¤¬à¤¨à¥\87बा à¤²à¥\87ल [[Special:ListGroupRights|विशà¥\87ष à¤\85धिà¤\95ारà¤\95]] आवश्यक अछि।'''\nनीचाँ ऐ लेल अद्यतन वृत्तलेख उल्लेख देल जा रहल अछि:",
+       "templatesused": "ई पन्नापर प्रयुक्त {{PLURAL:$1|आकृति|आकृतिसभ}}:",
+       "templatesusedpreview": "ई पूर्वप्रदर्शनमे प्रयुक्त {{PLURAL:$1|आकृति|आकृतिसभ}}:",
+       "templatesusedsection": "{{PLURAL:$1|à¤\86à¤\95à¥\83ति|à¤\86à¤\95à¥\83तिसभ}} à¤\88 à¤ªà¥\82रà¥\8dवपà¥\8dरदरà¥\8dशनमे प्रयुक्त:",
        "template-protected": "(संरक्षित)",
        "template-semiprotected": "(अर्ध-संरक्षित)",
-       "hiddencategories": "à¤\88 à¤ªà¤¨à¥\8dना à¤¸à¤¦à¤¸à¥\8dय à¤\85à¤\9bि {{PLURAL:$1|1 à¤¨à¥\81à¤\95ाà¤\8fल à¤¸à¤\82वरà¥\8dà¤\97|$1 à¤¨à¥\81à¤\95ाà¤\8fल à¤¸à¤\82वरà¥\8dà¤\97 à¤¸à¤­}}:",
+       "hiddencategories": "à¤\88 à¤ªà¥\83षà¥\8dठ à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित $1 à¤¨à¥\81à¤\95ाà¤\8fल à¤\97à¥\87ल {{PLURAL:$1|शà¥\8dरà¥\87णà¥\80|शà¥\8dरà¥\87णà¥\80सभ}}मà¥\87 à¤¶à¥\8dरà¥\87णà¥\80बदà¥\8dध à¤\85à¤\9bि:",
        "edittools": "<!-- एतए देल गेल पाठ सम्पादन आर अपलोड फारम के निचा देखाओल जाएत। -->",
        "edittools-upload": "-",
-       "nocreatetext": "{{अन्तर्जाल}} नव पन्ना निर्माणक क्षमताकेँ सीमित कऽ देने अछि।\nअहाँ आपस जा सकै छी आ कोनो पन्नाकेँ सम्पादित कऽ सकै छी, वा [[Special:UserLogin|log in or create an account]]",
+       "nocreatetext": "{{SITENAME}} नव पन्ना निर्माणक क्षमताकेँ सीमित कऽ देने अछि।\nअहाँ आपस जा सकै छी आ कोनो पन्नाकेँ सम्पादित कऽ सकै छी, वा [[Special:UserLogin|नयाँ खाता खोली/ प्रवेश करी]]",
        "nocreate-loggedin": "अहाँक नव पन्ना बनेबाक अधिकार नै अछि।",
        "sectioneditnotsupported-title": "अनुभाग सम्पादन समर्थित नै अछि",
        "sectioneditnotsupported-text": "ई पृष्ठ पर अनुभाग सम्पादन समर्थित नै अछि",
        "permissionserrors": "आज्ञा गल्ती",
-       "permissionserrorstext": "अहाँके ऐ लेल अनुमति नै अछि, ऐ ले {{PLURAL:$1|कारण|कारण सभ}}:",
-       "permissionserrorstext-withaction": "अहाँके अनुमति नै अछि $2 लेल, ऐ लेल {{PLURAL:$1|कारण|कारण सभ}}:",
+       "permissionserrorstext": "अहाँके ऐ लेल अनुमति नै अछि, ऐ ले {{PLURAL:$1|कारण|कारणसभ}}:",
+       "permissionserrorstext-withaction": "अहाँके अनुमति नै अछि $2 लेल, ऐ लेल {{PLURAL:$1|कारण|कारणसभ}}सँ:",
        "recreate-moveddeleted-warn": "'''चेतौनी''': अहाँ फेरसँ ओ पन्ना बना रहल छी जे पहिने मेटा देल गेल छै।'''\n\nअहाँ विचारू जे की ई सम्पादन केनाइ उचित अछि।\nऐ पन्नाक मेटाएल बला आ हटाएल वृत्तलेख एतए सुविधा लेल देल जा रहल अछि:",
        "moveddeleted-notice": "ई पन्ना मेटा देल गेल अछि।\nऐ पन्ना लेल मेटाएल आ हटाएल बला वृत्तलेख सन्दर्भ लेल नीचाँ देल गेल अछि।",
        "log-fulllog": "सभटा वृत्तलेख देखी",
        "edit-hook-aborted": "सम्पादन नोकसीसँ खतम भेल।\nई कोनो कारण नै देलक।",
        "edit-gone-missing": "पन्ना अद्यतन नै भऽ सकल।\nलगैए जे ई मेटा देल गेल अछि।",
-       "edit-conflict": "सम्पादन अन्तर",
+       "edit-conflict": "सम्पादन अन्तर्विरोध",
        "edit-no-change": "अहाँक सम्पादनपर ध्यान नै देल गेल, कारण ऐ सँ पाठमे कोनो परिवर्तन नै आएल।",
        "postedit-confirmation-created": "पन्ना निर्माण करल गेल अछि ।",
        "postedit-confirmation-restored": "पन्नाके पुराण स्थितिमे लौने गेल अछि ।",
        "content-json-empty-object": "रिक्त सामग्री",
        "content-json-empty-array": "रिक्त ऐरे",
        "duplicate-args-category": "आकृति कल में डुप्लिकेट तर्कक उपयोग करैत पन्नासभ",
-       "duplicate-args-category-desc": "पनà¥\8dना à¤\9cà¥\87ना à¤¤à¤°à¥\8dà¤\95à¥\8bà¤\82 à¤\95à¥\87à¤\82 à¤¡à¥\81पà¥\8dलिà¤\95à¥\87à¤\9f à¤\95à¥\87 à¤\89पयà¥\8bà¤\97 à¤\95रà¤\88 à¤µà¤¾à¤² à¤\9fà¥\87मà¥\8dपलà¥\87à¤\9f à¤\95à¥\89ल, जेना <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> आर <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
+       "duplicate-args-category-desc": "पनà¥\8dना à¤\9cà¥\87ना à¤¤à¤°à¥\8dà¤\95सभà¤\95à¥\87 à¤¡à¥\81पà¥\8dलिà¤\95à¥\87à¤\9fà¤\95 à¤\89पयà¥\8bà¤\97 à¤\95रà¥\88वाला à¤\86à¤\95à¥\83ति à¤\95ल, जेना <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> आर <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''चेतौनी:''' ई पन्ना बड्ड बेसी महग विभाजक प्रकार्य आह्वान करैत अछि।\n एकरा $2 सँ कम {{PLURAL:$2|call|calls}}, ओतऽ {{PLURAL:$1|ई अछि $1 call|ई सभ अछि $1 calls}}",
        "expensive-parserfunction-category": "बड बेसी महग विभाजक आह्वानबला पन्ना सभ",
        "post-expand-template-inclusion-warning": "'''चेतौनी:''' नमूना लेबाक आकार बड्ड पैघ अछि।\nकिछु नमूना नै लेल जा सकत।",
        "post-expand-template-inclusion-category": "पन्ना सभ जतए नमूना लेबाक आकार बढ़ि गेल",
        "post-expand-template-argument-warning": "'''चेतौनी''' ऐ पन्नामे नै बेशी तँ एकटा एहेन नमूना निरुपक अछि जकर बड्ड पैघ विस्तार आकार छै।\nई निरूपक सभ हटा देल गेल अछि।",
-       "post-expand-template-argument-category": "à¤\9bà¥\8bड़ल à¤¨à¤®à¥\82ना à¤¨à¤¿à¤°à¥\82पà¤\95 à¤¬à¤²à¤¾ à¤ªà¤¨à¥\8dना सभ",
+       "post-expand-template-argument-category": "à¤\9bà¥\8bडल à¤¨à¤®à¥\82ना à¤¨à¤¿à¤°à¥\82पà¤\95 à¤¬à¤²à¤¾ à¤ªà¤¨à¥\8dनासभ",
        "parser-template-loop-warning": "नमूना परिक्रम भेटल: [[$1]]",
        "parser-template-recursion-depth-warning": "नमूना प्रत्यावर्तन गहीर सीमा पार केलक ($1)",
        "language-converter-depth-warning": "भाषान्तर गहीर सीमा पार केलक ($1)",
        "undo-failure": "मध्यवर्ती विरोधी सम्पादनक कारण ऐ सम्पादनकेँ खतम नै कएल जा सकैए।",
        "undo-norev": "ई सम्पादन खतम नै कएला जा सकैए कारण ई अछि नै वा मेटा देल गेल अछि।",
        "undo-nochange": "ऐना लगया की ई सम्पादन कें पहील से पूर्ववत करई देन अछि।",
-       "undo-summary": "$1 संशोधन खतम करू [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])",
+       "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|वार्ता]])द्वारा कएल अन्तर $1 के पूर्ववत कएलक",
        "undo-summary-username-hidden": "नुकाएल गेल प्रयोक्ताद्वारा केल गेल परिवर्तन $1 के पूर्ववत केल गेल",
        "cantcreateaccounttitle": "खाता नै बना सकल",
-       "cantcreateaccount-text": "('''$1''') अनिकेत पतासँ खाता निर्माण प्रतिबन्धित कएल गेल [[User:$3|$3]]।\n$3 द्वारा देल कारण अछि ''$2''",
+       "cantcreateaccount-text": "(<strong>$1</strong>) अनिकेत पतासँ खाता निर्माण प्रतिबन्धित कएल गेल [[User:$3|$3]]।\n$3 द्वारा देल कारण अछि ''$2''",
        "cantcreateaccount-range-text": "<strong>$1</strong> के श्रेणी में आबई वाला आई॰पी पता सऽ, जएमें आहाँ कें आई॰पी पता (<strong>$4</strong>) शामिल अछि, नया खाता के रचना [[User:$3|$3]] द्वारा अवरोधित केल गेल अछि। \n\n$3 द्वारा देल गेल कारण अछि: \"$2\"",
-       "viewpagelogs": "à¤\90 à¤ªà¤¨à¥\8dनाà¤\95 à¤µà¥\83तà¥\8dतलà¥\87à¤\96 à¤¸à¤­ à¤¦à¥\87à¤\96à¥\82",
+       "viewpagelogs": "à¤\88 à¤ªà¤¨à¥\8dनाà¤\95 à¤µà¥\83तà¥\8dतलà¥\87à¤\96सभ à¤¦à¥\87à¤\96à¥\80",
        "nohistory": "ऐ पन्ना लेल कोनो सम्पादन इतिहास नै अछि।",
        "currentrev": "नूतन संशोधन",
        "currentrev-asof": "$1 क समकालिक तखुनका संशोधन",
        "page_first": "पहिल",
        "page_last": "अन्तिम",
        "histlegend": "फाइल तुलना तंत्रांशक चयन: संशोधन तुलनाक रेडियो बक्शाकेँ चिन्हित करू आ एन्टर बटन क्लिक करू वा सभसँ नीचाँक बटन क्लिक करू। <br />\nकहबी: '''({{int:cur}})''' = अद्यतन संशोधनसँ अन्तर, '''({{int:last}})''' = अद्यतनसँ पहिलुका संशोधनसँ अन्तर, '''{{int:minoreditletter}}''' = मामूली सम्पादन।",
-       "history-fieldset-title": "à¤\87तिहास à¤\96à¤\82à¤\98ारà¥\82",
+       "history-fieldset-title": "à¤\87तिहास à¤µà¤¿à¤\9aरण à¤\95रà¥\80",
        "history-show-deleted": "खाली मेटाएल",
        "histfirst": "सभसँ पुरान",
        "histlast": "आइ-काल्हिक",
        "historysize": "({{PLURAL:$1|1 अष्टक|$1 अष्टक}})",
        "historyempty": "(रिक्त)",
        "history-feed-title": "संशोधन इतिहास",
-       "history-feed-description": "à¤\90 पन्नाक विकीपर सम्पादन इतिहास",
+       "history-feed-description": "à¤\88 पन्नाक विकीपर सम्पादन इतिहास",
        "history-feed-item-nocomment": "$2 पर $1",
        "history-feed-empty": "आग्रह कएल पन्ना नै अछि।\nई विकीसँ चाहे मेटा देल गेल अछि, वा एकर नाम बदलि देल गेल अछि।\nप्रयास करू [[Special:Search|searching on the wiki]] सम्बन्धित नव पन्ना सभ लेल।",
        "history-edit-tags": "चुनल गेल अवतरणसभ के ट्याग सम्पादित करी।",
        "rev-deleted-comment": "(सम्पादन इतिहास हटाएल गेल)",
        "rev-deleted-user": "(प्रयोक्तानाम हटाएल गेल)",
        "rev-deleted-event": "(वृतलेख कार्य हटावोल गेल)",
-       "rev-deleted-user-contribs": "[पà¥\8dरयà¥\8bà¤\95à¥\8dतानाम à¤µà¤¾ à¤\85निà¤\95à¥\87त à¤¹à¤\9fाà¤\8fल à¤\97à¥\87ल- à¤¯à¥\8bà¤\97दानमà¥\87 à¤¨à¥\81à¤\95ाà¤\8fल à¤¸à¤®à¥\8dपादित à¤\95रà¥\82]",
+       "rev-deleted-user-contribs": "[पà¥\8dरयà¥\8bà¤\95à¥\8dतानाम à¤µà¤¾ à¤\85निà¤\95à¥\87त à¤¹à¤\9fाà¤\8fल à¤\97à¥\87ल- à¤¯à¥\8bà¤\97दानमà¥\87 à¤¨à¥\81à¤\95ाà¤\8fल à¤¸à¤®à¥\8dपादित à¤\95रà¥\80]",
        "rev-deleted-text-permission": "ऐ पन्नाक संशोधन '''मेटा देल गेल'''।\nवर्णन देखि सकै छी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] मे।",
        "rev-suppressed-text-permission": "ए पृष्ठक अवतरण '''नुकाएल गेल अछि'''।\nअहाँ एकरा देख सकैत छी; विवरण [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} नुकाएल लग] में भेट सकैत अछि।",
        "rev-deleted-text-unhide": "ऐ पन्नाक सम्पादन '''मेटाएल''' गेल।\nवर्णन ताकि सकै छी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] मे।\nअहाँ अखनो [$1 ई संशोधन देखू] जँ अहाँ आगाँ बढ़ऽ चाहै छी।",
        "revdelete-show-file-submit": "हँ",
        "revdelete-selected-text": "[[:$2]] {{PLURAL:$1|क|के}} चयनित अवतरण:",
        "revdelete-selected-file": "[[:$2]] {{PLURAL:$1|क|के}} चयनित फाइल अवतरण:",
-       "logdelete-selected": "{{PLURAL:$1|चुनल वृत्तलेख घटना|चुनल वृत्तलेख घटना सभ}}:",
+       "logdelete-selected": "{{PLURAL:$1|चुनल वृत्तलेख घटना|चुनल वृत्तलेख घटनासभ}}:",
        "revdelete-text-text": "हटाएल गेल अवतरण पृष्ठ इतिहासमें देखाएल जाएत मुदा वोकर सामग्री सार्वजनिक रूपसँ नै देखाएल जा सकएत अछि।",
        "revdelete-text-file": "हटाएल गेल अवतरण पृष्ठ इतिहासमें देखाएल जाएत मुदा वोकर सामग्री सार्वजनिक रूपसँ नै देखाएल जा सकएत अछि।",
        "logdelete-text": "हटाए गेल प्रवेश घटनासभ अखैनो भी लॉग में दिखाबल ज्यात, लेकिन ओकर सामग्री के कुछ भाग के सार्वजनीक करबाक के लेल दुर्गम भ्या जेत।",
-       "revdelete-confirm": "à¤\95à¥\83पा à¤\95ऽ à¤\86शà¥\8dवसà¥\8dत à¤­à¤½ à¤\9cाà¤\89 à¤\9cà¥\87 à¤\85हाà¤\81 à¤\88 à¤\95रऽ à¤\9aाहà¥\88 à¤\9bà¥\80, à¤\85हाà¤\81à¤\95à¥\87à¤\81 à¤\8fà¤\95र à¤ªà¤°à¤¿à¤£à¤¾à¤®à¤\95 à¤\9cनतब à¤\85à¤\9bि, à¤\86 à¤\85हाà¤\81 à¤\8fà¤\95रा [[{{MediaWiki:Policy-url}}|निà¤\85म]] क अनुसार कऽ रहल छी।",
+       "revdelete-confirm": "à¤\95à¥\83पा à¤\95ऽ à¤\86शà¥\8dवसà¥\8dत à¤­à¤½ à¤\9cाà¤\89 à¤\9cà¥\87 à¤\85हाà¤\81 à¤\88 à¤\95रऽ à¤\9aाहà¥\88 à¤\9bà¥\80, à¤\85हाà¤\81à¤\95à¥\87à¤\81 à¤\8fà¤\95र à¤ªà¤°à¤¿à¤£à¤¾à¤®à¤\95 à¤\9cनतब à¤\85à¤\9bि, à¤\86 à¤\85हाà¤\81 à¤\8fà¤\95रा [[{{MediaWiki:Policy-url}}|नियम]] क अनुसार कऽ रहल छी।",
        "revdelete-suppress-text": "दबाबैबला काज '''मात्र''' ऐ सभ स्थितिमे प्रयोग करू:\n* मानहानिक सम्भावनाबला सूचना\n* भ्रमयुक्त व्यक्तिगत सूचना\n*: ''घरक पता आ टेलीफोन नम्बर, सामाजिक सुरक्षा संख्या, आदि।''",
-       "revdelete-legend": "दà¥\83शà¥\8dयतापर à¤ªà¥\8dरतिबनà¥\8dधà¤\95 à¤¸à¥\80मा à¤²à¤\97ाà¤\89",
+       "revdelete-legend": "दà¥\83शà¥\8dयतापर à¤ªà¥\8dरतिबनà¥\8dधà¤\95 à¤¸à¥\80मा à¤²à¤\97ाबà¥\80",
        "revdelete-hide-text": "संशोधन पाठ नुकाउ",
-       "revdelete-hide-image": "सà¤\82à¤\9aिà¤\95ाà¤\95 à¤ªà¤¾à¤  à¤¨à¥\81à¤\95ाà¤\89",
+       "revdelete-hide-image": "सà¤\9eà¥\8dà¤\9aिà¤\95ाà¤\95 à¤ªà¤¾à¤  à¤¨à¥\81à¤\95ाबà¥\80",
        "revdelete-hide-name": "क्रिया आ लक्ष्य नुकाउ",
        "revdelete-hide-comment": "सम्पादन सार नुकाउ",
        "revdelete-hide-user": "सम्पादकक प्रयोक्तानाम/ अनिकेत नुकाउ",
-       "revdelete-hide-restricted": "सà¤\82à¤\9aालà¤\95 à¤\86 à¤¦à¥\8bसरासà¤\81 à¤¦à¤¤à¥\8dताà¤\82श à¤¦à¤¬à¤¾à¤\89",
-       "revdelete-radio-same": "(नà¥\88 à¤¬à¤¦à¤²à¥\82)",
+       "revdelete-hide-restricted": "पà¥\8dरबनà¥\8dधà¤\95 à¤\86 à¤¦à¥\8bसरासà¤\81 à¤¦à¤¤à¥\8dताà¤\82श à¤¨à¥\81à¤\95ाबà¥\80",
+       "revdelete-radio-same": "(नà¥\88 à¤¬à¤¦à¤²à¥\80)",
        "revdelete-radio-set": "हँ",
        "revdelete-radio-unset": "नै",
-       "revdelete-suppress": "सà¤\82à¤\9aालà¤\95 à¤\86 à¤¦à¥\8bसरा à¤²à¥\87ल à¤¦à¤¤à¥\8dताà¤\82श à¤¦à¤¬à¤¾à¤\89",
-       "revdelete-unsuppress": "पà¥\81नरà¥\8dसà¥\8dथापित à¤¸à¤\82शà¥\8bधल à¤²à¥\87ल à¤ªà¥\8dरतिबनà¥\8dध à¤¹à¤\9fाà¤\89",
+       "revdelete-suppress": "पà¥\8dरबनà¥\8dधà¤\95 à¤\86 à¤¦à¥\8bसरा à¤²à¥\87ल à¤¦à¤¤à¥\8dताà¤\82श à¤¨à¥\81à¤\95ाबà¥\80",
+       "revdelete-unsuppress": "पà¥\81नरà¥\8dसà¥\8dथापित à¤¸à¤\82शà¥\8bधन à¤²à¥\87ल à¤ªà¥\8dरतिबनà¥\8dध à¤¹à¤\9fाबà¥\80",
        "revdelete-log": "कारण:",
-       "revdelete-submit": "à¤\95िà¤\9bà¥\81 à¤\9aà¥\81नलपर à¤²à¤¾à¤\97à¥\82 à¤\95रà¥\82{{PLURAL:$1|सà¤\82शà¥\8bधन|सà¤\82शà¥\8bधन à¤¸à¤­}}",
+       "revdelete-submit": "à¤\9aयनित {{PLURAL:$1|सà¤\82सà¥\8bधन|सà¤\82सà¥\8bधनसभ}} à¤ªà¤° à¤²à¤¾à¤\97à¥\82 à¤\95रà¥\80",
        "revdelete-success": "'''संशोधन दृश्यता सफलतापूर्वक अद्यतन कएल गेल।'''",
-       "revdelete-failure": "$1'''संशोधन दृश्यता अद्यतन नै कएल जा सकल:'''",
+       "revdelete-failure": "संशोधन दृश्यता अद्यतन नै कएल जा सकल: $1",
        "logdelete-success": "'''वृत्तलेख दृश्यता सफलतासँ निर्धारित भेल।'''",
        "logdelete-failure": "'''वृत्तलेख दृश्यता निर्धारित नै भऽ सकल।'''$1",
        "revdel-restore": "दृष्टिकुशलता बदली",
        "pagehist": "पन्नाक इतिहास",
        "deletedhist": "मेटाएल इतिहास",
-       "revdelete-hide-current": "तिथि $2, $1 क अनुक्रमकेँ नुकेबा काल भ्रम: ई वर्तमान संशोधन छी।\nई नुकाएल नै जा सकैए।",
+       "revdelete-hide-current": "तिथि $2 के $1 बजे अनुक्रम नुकेबा काल भ्रम: ई वर्तमान संशोधन छी।\nई नुकाएल नै जा सकैए।",
        "revdelete-show-no-access": "तिथि $2, $1क बौस्तुक देखेबामे भ्रम: ई बौस्तु \"प्रतिबन्धित\" चिन्हित कएल गेल अछि।",
        "revdelete-modify-no-access": "तिथि $2, $1क बौस्तुक संशोधनमे भ्रम: ई बौस्तु \"प्रतिबन्धित\" चिन्हित कएल गेल अछि।\nअहाँकेँ एकरा लग लागि नै अछि।",
        "revdelete-modify-missing": "बौस्तुक चेन्ह-संकेत  $1 मे संशोधन भ्रम: ई दत्तनिधिमे नै अछि।",
        "revdelete-reason-dropdown": "*सामान्य मेटेबाक कारण सभ\n** सर्वाधिकारक उल्लंघन\n** अनुचित व्यक्तिगत सूचना\n** सम्भावित मानहानिक सूचना",
        "revdelete-otherreason": "दोसर/ अतिरिक्त कारण:",
        "revdelete-reasonotherlist": "दोसर कारण",
-       "revdelete-edit-reasonlist": "मेटेबाक कारणक सम्पादन करू",
+       "revdelete-edit-reasonlist": "मेटेबाक कारण बदली",
        "revdelete-offender": "संशोधन केनिहार:",
        "suppressionlog": "दबाएलगेल वृत्तलेख",
        "suppressionlogtext": "नीचाँ मेटाएल आ प्रतिबन्धक उल्लेख अछि जे संचालकसँ नुकाएल सामिग्री अछि।\nअखन स्थित प्रभावी प्रतिबन्ध आ अवरोध लेल देखू [[Special:BlockList|IP block list]] ।",
        "nextn": "आगाँ {{PLURAL:$1|$1}}",
        "prev-page": "पहिलुका पृष्ठ",
        "next-page": "अगला पृष्ठ",
-       "prevn-title": "पहिलुका $1 {{PLURAL:$1|परिणाम|परिणाम सभ}}",
-       "nextn-title": "आगाँ $1 {{PLURAL:$1|परिणाम|परिणाम सभ}}",
+       "prevn-title": "पहिलुका $1 {{PLURAL:$1|परिणाम|परिणामसभ}}",
+       "nextn-title": "आगाँ $1 {{PLURAL:$1|परिणाम|परिणामसभ}}",
        "shown-title": "प्रति पन्ना $1 {{PLURAL:$1|परिणाम|परिणामसभ}} देखाउ",
-       "viewprevnext": "दà¥\87à¤\96à¥\82  ($1 {{int:pipe-separator}} $2) ($3)",
-       "searchmenu-exists": "'''ऐ विकीपर एकटा पन्ना अछि \"[[:$1]]\" नामसँ।'''",
+       "viewprevnext": "दà¥\87à¤\96à¥\80 ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-exists": "<strong>ऐ विकीपर एकटा पन्ना अछि \"[[:$1]]\" नामसँ।<strong>{{PLURAL:$2|0=|अन्य भेटल परिणामसभ सेहो देखी}}",
        "searchmenu-new": "''' पन्ना निर्माण \"[[:$1]]\" ऐ विकीपर !'''",
-       "searchprofile-articles": "à¤\85नà¥\81à¤\95à¥\8dरम à¤ªà¤¨à¥\8dना à¤¸à¤­",
+       "searchprofile-articles": "सामà¤\97à¥\8dरà¥\80 à¤ªà¥\83षà¥\8dठ",
        "searchprofile-images": "दृश्य-श्रव्य",
        "searchprofile-everything": "सभटा",
        "searchprofile-advanced": "विशिष्ट",
        "searchprofile-articles-tooltip": "$1 मे ताकी",
        "searchprofile-images-tooltip": "सञ्चिकासभ लेल ताकी",
-       "searchprofile-everything-tooltip": "सभà¤\9fा à¤¸à¤¾à¤®à¤¿à¤\97à¥\8dरà¥\80मà¥\87 à¤¤à¤¾à¤\95à¥\82 (चर्चा पन्ना सहित)",
+       "searchprofile-everything-tooltip": "सभà¤\9fा à¤¸à¤¾à¤®à¤¿à¤\97à¥\8dरà¥\80मà¥\87 à¤¤à¤¾à¤\95à¥\80 (चर्चा पन्ना सहित)",
        "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-nonefound": "अभ्यर्थनासँ मेल खाइत कोनो परिणाम नै भेटल।",
        "powersearch-legend": "विशेष खोज",
        "powersearch-ns": "निर्धारकमे खोज",
-       "powersearch-togglelabel": "à¤\9cाà¤\81à¤\9aà¥\82:",
+       "powersearch-togglelabel": "à¤\9cाà¤\81à¤\9aà¥\80:",
        "powersearch-toggleall": "सभटा",
        "powersearch-togglenone": "कोनो नै",
        "powersearch-remember": "याद राखु भविष्यकऽ खोजीके लेल",
        "search-external": "बाह्य खोज",
-       "searchdisabled": "{{अन्तर्जाल}} खोज बन्न अछि।\nअहाँक गूगलक माध्यमसँ ऐ बीच ताकि सकै छी।\nमोन राखू जे तकर विवरणी {{अन्तर्जाल}} सामिग्री समयातीत भऽ सकैए।",
+       "searchdisabled": "{{SITENAME}} खोज बन्द अछि।\nता अहाँ गूगलक माध्यमसँ ताकि सकै छी।\nमोन राखी जे तकर विवरणी {{SITENAME}} समिग्री समयातीत भऽ सकैए।",
        "search-error": "खोजवाके समय निम्न त्रुटि उत्पन्न भेल: $1",
        "preferences": "विकल्प",
        "mypreferences": "खासमखास",
        "prefsnologintext2": "अपन वरीयतासभके बदलैक लेल कृपया सम्प्रवेश करी।",
        "prefs-skin": "रूप",
        "skin-preview": "पूर्वावलोकन",
-       "datedefault": "à¤\95à¥\8bनà¥\8b à¤®à¥\8bनपसà¤\82द नै",
-       "prefs-labs": "प्रायोगिक गुण सभ",
+       "datedefault": "à¤\95à¥\8bनà¥\8b à¤ªà¤¸à¤¨à¥\8dद नै",
+       "prefs-labs": "प्रायोगिक गुणसभ",
        "prefs-user-pages": "उपयोगकर्ताक पृष्ठ",
        "prefs-personal": "प्रयोक्ता परिचय",
-       "prefs-rc": "हालक परिवर्तन",
+       "prefs-rc": "लà¤\97क परिवर्तन",
        "prefs-watchlist": "साकांक्ष-सूची",
        "prefs-editwatchlist": "साकांक्षसूची बदली",
        "prefs-editwatchlist-label": "अपन साकांक्षसूचीक प्रविष्टिसभ सम्पादित करी:",
        "prefs-misc": "आर",
        "prefs-resetpass": "कूटशब्द बदली",
        "prefs-changeemail": "ई-पत्र संकेत बदलू",
-       "prefs-setemail": "à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त निर्धारित करी",
+       "prefs-setemail": "à¤\88-पतà¥\8dर à¤ à¥\87à¤\97ान निर्धारित करी",
        "prefs-email": "ई-पत्र विकल्पसभ",
        "prefs-rendering": "मुँहकान",
-       "saveprefs": "सà¥\81रà¤\95à¥\8dषित à¤\95रà¥\82",
+       "saveprefs": "सà¤\99à¥\8dà¤\97à¥\8dरह à¤\95रà¥\80",
        "restoreprefs": "सभटा पूर्वनिर्धारित चयनकेँ फेरसँ आनू",
        "prefs-editing": "सम्पादन कऽ रहल छी",
-       "rows": "पाँती सभ",
-       "columns": "स्तम्भ सभ",
+       "rows": "पाँतीसभ",
+       "columns": "स्तम्भसभ",
        "searchresultshead": "ताकी",
        "stub-threshold": "सीमा <a href=\"#\" class=\"stub\">काटल लागि</a> सँचियाएल (अष्टक):",
        "stub-threshold-sample-link": "उदाहरण",
        "prefs-searchoptions": "ताकी",
        "prefs-namespaces": "नामस्थानसभ",
        "default": "पूर्वनिर्धारित",
-       "prefs-files": "सà¤\82à¤\9aिà¤\95ा सभ",
-       "prefs-custom-css": "à¤\96ास à¤¸à¥\80.à¤\8fस.à¤\8fस.",
+       "prefs-files": "सà¤\9eà¥\8dà¤\9aिà¤\95ासभ",
+       "prefs-custom-css": "à¤\96ास à¤¸à¤¿à¤¯à¤¸à¤¯à¤¸",
        "prefs-custom-js": "खास जावास्क्रिप्ट",
        "prefs-common-css-js": "सभ रूप लेल साझी सी.एस.एस./ जावास्क्रिप्ट:",
        "prefs-reset-intro": "अहाँ ऐ पन्नाक प्रयोग अपन विकल्पकेँ पूर्वनिविष्ट रूपेँ जाल पुनर्निधारित करबा लेल कऽ सकै छी।\nई बदलल नै जा सकैए।",
        "prefs-displayrc": "दृश्य विकल्पसभ",
        "prefs-displaywatchlist": "दृश्य विकल्पसभ",
        "prefs-tokenwatchlist": "टोकन",
-       "prefs-diffs": "अन्तर निर्धारक सभ",
+       "prefs-diffs": "अन्तर",
        "prefs-help-prefershttps": "इ प्राथमिकता अहाँके फेर स सम्प्रवेश करलाक बाद प्रभाव पडत।",
        "prefs-tabs-navigation-hint": "सुझाव: अहाँ टैब्स सूचीमे टैब्सके बीच आवागमन करवाक लेल बाम आर दाहिना बागलके कुंजिसभके उपयोग कइर सकैत छी।",
        "userrights": "प्रयोक्ता अधिकारक प्रबन्धन",
        "userrights-user-editname": "एकटा प्रयोक्तानाम लिखी:",
        "editusergroup": "{{GENDER:$1|सदस्य}} समूहसभक सम्पादन करी",
        "editinguser": "सदस्य '''[[User:$1|$1]]''' $2 क अधिकार बदलि\n{{GENDER:$1|सदस्य}}क सदस्य अधिकार बदलल जा रहल अछि <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "पà¥\8dरयà¥\8bà¤\95à¥\8dता à¤¸à¤\82वरà¥\8dà¤\97 à¤¸à¤­à¤\95 à¤¸à¤®à¥\8dपादन à¤\95रà¥\82",
+       "userrights-editusergroup": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¸à¤®à¥\82ह à¤¸à¤®à¥\8dपादित à¤\95रà¥\80",
        "saveusergroups": "{{GENDER:$1|सदस्य}} समूह सङ्ग्रह करी",
        "userrights-groupsmember": "क सदस्य:",
        "userrights-groupsmember-auto": "क जानल सदस्य:",
        "userrights-removed-self": "अहाँ सफलतापूर्वक अपन अधिकार हटा देने छी। अतः अहाँ आब ई पृष्ठ नै देख सकैत छी।",
        "group": "समूह:",
        "group-user": "प्रयोक्तासभ",
-       "group-autoconfirmed": "स्वतःअनुमोदित प्रयोक्ता सभ",
+       "group-autoconfirmed": "स्वतःअनुमोदित प्रयोक्ता",
        "group-bot": "स्वचालक",
        "group-sysop": "प्रबन्धक",
        "group-bureaucrat": "अधिकारी",
        "group-bureaucrat-member": "{{GENDER:$1|प्रशासक}}",
        "group-suppress-member": "{{GENDER:$1|नुकाए वाला}}",
        "grouppage-user": "{{ns:project}}:प्रयोगकर्तासभ",
-       "grouppage-autoconfirmed": "{{ns:project}}:स्वतःअनुमोदित प्रयोक्तासभ",
-       "grouppage-bot": "{{ns:project}}:स्वचालकसभ",
+       "grouppage-autoconfirmed": "{{ns:project}}:स्वतःअनुमोदित प्रयोक्ता",
+       "grouppage-bot": "{{ns:project}}:स्वचालक",
        "grouppage-sysop": "{{ns:project}}:प्रबन्धक",
-       "grouppage-bureaucrat": "{{ns:project}}:अधिकारीसभ",
+       "grouppage-bureaucrat": "{{ns:project}}:अधिकारी",
        "grouppage-suppress": "{{ns:project}}:नुकाबी",
        "right-read": "पन्ना सभ पढ़ू",
        "right-edit": "पन्नासभ सम्पादन करी",
        "right-createtalk": "वार्ता पन्नासभ बनाबी",
        "right-createaccount": "नव प्रयोक्ता खातासभ बनाबी",
        "right-autocreateaccount": "बाहरी खातासँ स्वतः प्रवेश",
-       "right-minoredit": "समà¥\8dपादन à¤¸à¤­à¤\95à¥\87à¤\81 à¤®à¤¾à¤®à¥\82लà¥\80 à¤\9aिनà¥\8dहित à¤\95रà¥\82",
+       "right-minoredit": "समà¥\8dपादन à¤¸à¤­à¤\95à¥\87à¤\81 à¤®à¤¾à¤®à¥\82लà¥\80 à¤\9aिनà¥\8dहित à¤\95रà¥\80",
        "right-move": "पन्ना घसकाबी",
        "right-move-subpages": "पृष्ठ उपपृष्ठसभ सहित घसकाबी",
        "right-move-rootuserpages": "मूल प्रयोक्ता पन्ना घसकाबी",
        "right-upload": "सञ्चिकासभ उपारोपित करी",
        "right-reupload": "वर्तमान सञ्चिकासभक पुनर्लेखन करी",
        "right-reupload-own": "अपन उपारोपित पन्नासभक पुनर्लेखन करी",
-       "right-reupload-shared": "शà¥\8dरवà¥\8dय-दà¥\83शà¥\8dय à¤¸à¤¾à¤\9dà¥\80 à¤¬à¤\96ारà¥\80à¤\95 à¤«à¤¾à¤\87लà¤\95 à¤ªà¥\81नरà¥\8dलà¥\87à¤\96न à¤¸à¥\8dथानà¥\80य à¤°à¥\82पà¥\87à¤\81 à¤\95रà¥\82।",
-       "right-upload_by_url": "सारà¥\8dवतà¥\8dरिà¤\95 à¤µà¤¿à¤­à¤µ à¤¸à¤\82à¤\95à¥\87तसà¤\81 à¤¸à¤\82à¤\9aिà¤\95ा à¤\89पारà¥\8bपित à¤\95रà¥\82",
+       "right-reupload-shared": "शà¥\8dरवà¥\8dय-दà¥\83शà¥\8dय à¤¸à¤¾à¤\9dà¥\80 à¤¬à¤\96ारà¥\80à¤\95 à¤«à¤¾à¤\87लà¤\95 à¤ªà¥\81नरà¥\8dलà¥\87à¤\96न à¤¸à¥\8dथानà¥\80य à¤°à¥\82पà¥\87à¤\81 à¤\95रà¥\80।",
+       "right-upload_by_url": "सारà¥\8dवतà¥\8dरिà¤\95 à¤µà¤¿à¤­à¤µ à¤¸à¤\82à¤\95à¥\87तसà¤\81 à¤¸à¤\82à¤\9aिà¤\95ा à¤\89पारà¥\8bपित à¤\95रà¥\80",
        "right-purge": "जालक उपस्मृतिकेँ बिना स्वीकृतिक पन्नाक लेल खतम करू",
        "right-autoconfirmed": "अर्द्ध-संरक्षित पन्ना सभक सम्पादन करू",
        "right-bot": "स्वचालित प्रक्रियाक रूपमे देखल जाए",
        "right-nominornewtalk": "वार्ता पन्नापर मामूली सम्पादन नव संदेश संसूचक नै आनैए",
        "right-apihighlimits": "ए.पी.आइ. अभ्यर्थनामे पैघ सीमाक प्रयोग करू",
        "right-writeapi": "लेख्य ए.पी.आइ.क प्रयोग",
-       "right-delete": "पनà¥\8dना à¤¸à¤­à¤\95à¥\87à¤\81 à¤®à¥\87à¤\9fाà¤\89",
-       "right-bigdelete": "बà¥\87शà¥\80 à¤\87तिहास à¤¬à¤²à¤¾ à¤ªà¤¨à¥\8dना à¤¸à¤­à¤\95à¥\87à¤\81 à¤®à¥\87à¤\9fाà¤\89",
+       "right-delete": "पनà¥\8dना à¤®à¥\87à¤\9fाबà¥\80",
+       "right-bigdelete": "बà¥\87सà¥\80 à¤\87तिहास à¤­à¤\8fल à¤ªà¤¨à¥\8dना à¤¸à¤­ à¤®à¥\87à¤\9fाबà¥\80",
        "right-deletelogentry": "विशिष्ट लग प्रविष्टिसभके नुकाउ आ देखाउ",
        "right-deleterevision": "निर्धारित संशोधित पन्ना मेटाउ आ फेरसँ आनू",
        "right-deletedhistory": "मेटाएल इतिहास प्रविष्टि देखू, बिना लागिक पाठक",
-       "right-deletedtext": "मà¥\87à¤\9fाà¤\8fल à¤ªà¤¾à¤  à¤\86 à¤¦à¥\82à¤\9fा à¤®à¥\87à¤\9fाà¤\8fल à¤¸à¤\82शà¥\8bधनà¤\95 à¤¬à¥\80à¤\9aà¤\95 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¦à¥\87à¤\96à¥\82",
+       "right-deletedtext": "मà¥\87à¤\9fाà¤\8fल à¤ªà¤¾à¤  à¤\86 à¤¦à¥\82à¤\9fा à¤®à¥\87à¤\9fाà¤\8fल à¤¸à¤\82शà¥\8bधनà¤\95 à¤¬à¥\80à¤\9aà¤\95 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¦à¥\87à¤\96à¥\80",
        "right-browsearchive": "मेटाएल पन्ना ताकी",
        "right-undelete": "पन्ना फेरसँ आनी",
-       "right-suppressrevision": "सà¤\82à¤\9aालà¤\95सà¤\81 à¤¨à¥\81à¤\95ाà¤\8fल à¤¸à¤\82शà¥\8bधनà¤\95à¥\87à¤\81 à¤ªà¥\81नरà¥\80à¤\95à¥\8dषित à¤\95रà¥\82 à¤\86 à¤«à¥\87रसà¤\81 à¤\86नà¥\82",
+       "right-suppressrevision": "सà¤\82à¤\9aालà¤\95सà¤\81 à¤¨à¥\81à¤\95ाà¤\8fल à¤¸à¤\82शà¥\8bधनà¤\95à¥\87à¤\81 à¤ªà¥\81नरà¥\80à¤\95à¥\8dषित à¤\95रà¥\80 à¤\86 à¤«à¥\87रसà¤\81 à¤\86नà¥\80",
        "right-viewsuppressed": "कोनो प्रयोक्ताके नुकाएल संसोधन देखु",
-       "right-suppressionlog": "वà¥\8dयà¤\95à¥\8dतिà¤\97त à¤µà¥\83तà¥\8dतलà¥\87à¤\96 à¤¦à¥\87à¤\96à¥\82",
-       "right-block": "दà¥\8bसर à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95à¥\87à¤\81 à¤¸à¤®à¥\8dपादनसà¤\81 à¤°à¥\8bà¤\95à¥\82",
-       "right-blockemail": "पà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95à¥\87à¤\81 à¤\88-पतà¥\8dर à¤ªà¤ à¥\87बासà¤\81 à¤°à¥\8bà¤\95à¥\82",
+       "right-suppressionlog": "वà¥\8dयà¤\95à¥\8dतिà¤\97त à¤µà¥\83तà¥\8dतलà¥\87à¤\96 à¤¦à¥\87à¤\96à¥\80",
+       "right-block": "दà¥\8bसर à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95à¥\87à¤\81 à¤¸à¤®à¥\8dपादनसà¤\81 à¤°à¥\8bà¤\95à¥\80",
+       "right-blockemail": "पà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95à¥\87à¤\81 à¤\88-पतà¥\8dर à¤ªà¤ à¥\87बासà¤\81 à¤°à¥\8bà¤\95à¥\80",
        "right-hideuser": "एकटा प्रयोक्तानामकेँ प्रतिबन्धित करू, लोकसँ एकरा नुका कऽ",
        "right-ipblock-exempt": "अनिकेत प्रतिबन्ध, स्वचालित प्रतिबन्ध आ परिक्षेत्र प्रतिबन्धकेँ नै मानू",
        "right-unblockself": "स्वयंकेँ प्रतिबन्धसँ हटाउ",
        "right-unwatchedpages": "बिना संचालित पन्ना सभक सूचीकेँ देखू",
        "right-mergehistory": "पन्नाक इतिहास सभकेँ मिज्झर करू",
        "right-userrights": "सभटा प्रयोक्ता अधिकारकेँ सम्पादित करू",
-       "right-userrights-interwiki": "दà¥\8bसर à¤µà¤¿à¤\95à¥\80पर à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95 à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\85धिà¤\95ारà¤\95 à¤¸à¤®à¥\8dपादन à¤\95रà¥\82",
+       "right-userrights-interwiki": "दà¥\8bसर à¤µà¤¿à¤\95à¥\80पर à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95 à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\85धिà¤\95ारà¤\95 à¤¸à¤®à¥\8dपादन à¤\95रà¥\80",
        "right-siteadmin": "दत्तनिधिकेँ प्रतिबन्धित करू आ फेर प्रतिबन्ध हटाउ",
        "right-override-export-depth": "५ परत धरि जा  पन्ना सभ निर्यात, जइमे लागिबला पन्ना सभ शामिल अछि, करू।",
        "right-sendemail": "ई-पत्र दोसर प्रयोक्ता लोकनिकेँ पठाउ",
        "newuserlogpagetext": "ई प्रयोक्ता निर्माणक वृत्तलेख अछि।",
        "rightslog": "प्रयोक्ता अधिकार वृत्तलेख",
        "rightslogtext": "ई प्रयोक्ता अधिकार परिवर्तन सभक वृतलेख छी।",
-       "action-read": "à¤\88 à¤ªà¤¨à¥\8dना à¤ªà¤¢à¤¼à¥\82",
+       "action-read": "à¤\88 à¤ªà¤¨à¥\8dना à¤ªà¤¢à¥\80",
        "action-edit": "ई पन्नाक सम्पादित करी",
-       "action-createpage": "पनà¥\8dना à¤¸à¤­ à¤¬à¤¨à¤¾à¤\89",
+       "action-createpage": "पà¥\83षà¥\8dठ à¤¬à¤¨à¤¾à¤¬à¥\80",
        "action-createtalk": "वार्ता पन्ना बनाबी",
        "action-createaccount": "ई प्रयोक्ता खाता बनाबी",
        "action-history": "पन्नाक इतिहास मिज्झर करी",
        "action-reupload": "ई संचिकाक पुनर्लेखन करू",
        "action-reupload-shared": "ई संचिकाकेँ साझी बखारीमे नजरि नै दिअ",
        "action-upload_by_url": "ई संचिकाकेँ सार्वत्रिक विभव संकेतसँ उपारोपित करू",
-       "action-writeapi": "लेख्य ए.पी.आइ.क प्रयोग करू",
-       "action-delete": "à¤\88 à¤ªà¤¨à¥\8dना à¤®à¥\87à¤\9fाà¤\89",
-       "action-deleterevision": "à¤\88 à¤¸à¤\82शà¥\8bधन à¤®à¥\87à¤\9fाà¤\89",
-       "action-deletedhistory": "à¤\90 à¤ªà¤¨à¥\8dनाà¤\95 à¤®à¥\87à¤\9fाà¤\8fलबला à¤\87तिहास à¤¦à¥\87à¤\96à¥\82",
-       "action-browsearchive": "मà¥\87à¤\9fाà¤\8fल à¤ªà¤¨à¥\8dना à¤¸à¤­à¤\95à¥\87à¤\81 à¤¤à¤¾à¤\95à¥\82",
+       "action-writeapi": "लेख्य एपिआई प्रयोग करी",
+       "action-delete": "à¤\88 à¤ªà¤¨à¥\8dना à¤®à¥\87à¤\9fाबà¥\80",
+       "action-deleterevision": "à¤\88 à¤¸à¤\82शà¥\8bधन à¤®à¥\87à¤\9fाबà¥\80",
+       "action-deletedhistory": "à¤\88 à¤ªà¤¨à¥\8dनाà¤\95 à¤®à¥\87à¤\9fाà¤\8fल à¤\87तिहास à¤¦à¥\87à¤\96à¥\80",
+       "action-browsearchive": "मà¥\87à¤\9fाà¤\8fल à¤ªà¤¨à¥\8dना à¤¤à¤¾à¤\95à¥\80",
        "action-undelete": "ई पन्नाकेँ फेरसँ आनू",
        "action-suppressrevision": "ई नुकाएल संशोधनकेँ पुनरीक्षित आ पुनर्स्थापित करू",
        "action-suppressionlog": "ई व्यक्तिगत वृत्तलेखकेँ देखू",
        "action-userrights": "सभटा प्रयोक्ता अधिकारकेँ सम्पादित करू",
        "action-userrights-interwiki": "दोसर विकीपर प्रयोक्ताक प्रयोक्ता अधिकारक सम्पादन करू",
        "action-siteadmin": "दत्तनिधिकेँ प्रतिबन्धित करू आ फेर प्रतिबन्ध हटाउ",
-       "action-sendemail": "à¤\88-पतà¥\8dर à¤ªà¤ à¤¾à¤\89",
+       "action-sendemail": "à¤\88-पतà¥\8dर à¤ªà¤ à¤¾à¤¬à¥\80",
        "action-editmywatchlist": "काँच साकांक्षसूची संपादित करू",
        "action-viewmywatchlist": "अपन काँच साकांक्षसूची देखु",
        "action-viewmyprivateinfo": "अपन व्यक्तिगत जानकारी देखु",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|अंतिम बेर देखला के बाद स}}",
        "enhancedrc-history": "इतिहास",
        "recentchanges": "लगक परिवर्तनसभ",
-       "recentchanges-legend": "नव à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¸à¤­à¤\95 à¤µà¤¿à¤\95लà¥\8dप à¤¸à¤­",
+       "recentchanges-legend": "नव à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¸à¤®à¥\8dबनà¥\8dधà¥\80 à¤µà¤¿à¤\95लà¥\8dप",
        "recentchanges-summary": "ई पन्नापर विकीमे भेल सभसँ अद्यतन परिवर्तनपर नजरि राखू।",
        "recentchanges-noresult": "इ अवधिके दौरान इ मापदंडके पूर्ण करेत समय कोनो परिवर्तन नै केएल गेल अछि।",
-       "recentchanges-feed-description": "à¤\90 à¤¸à¥\82à¤\9aना-तà¤\82तà¥\8dराà¤\82शमà¥\87 à¤µà¤¿à¤\95à¥\80मà¥\87 à¤­à¥\87ल à¤¸à¤­à¤¸à¤\81 à¤²à¤\97à¤\95 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¤à¤¾à¤\95à¥\82",
+       "recentchanges-feed-description": "à¤\88 à¤¸à¥\82à¤\9aना-तà¤\82तà¥\8dराà¤\82शमà¥\87 à¤µà¤¿à¤\95à¥\80मà¥\87 à¤­à¥\87ल à¤¸à¤­à¤¸à¤\81 à¤²à¤\97à¤\95 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¤à¤¾à¤\95à¥\80।",
        "recentchanges-label-newpage": "ई सम्पादन एकटा नव पन्नाक निर्माण केलक।",
        "recentchanges-label-minor": "ई एकटा लघु सम्पादन छी",
        "recentchanges-label-bot": "ई सम्पादन यान्त्रिक छल।",
        "recentchanges-legend-heading": "<strong>कुञ्जी:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नव पन्नसभक सूची]] सेहो देखी)",
        "rcnotefrom": "नीचाँमे '''$2''' सँ भेल परिवर्तन अछि ('''$1''' धरि देखाएल)।",
-       "rclistfrom": "$3 $2 à¤¸à¤\81 à¤¶à¥\81रà¥\82 à¤­à¥\87ल à¤¨à¤µ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¦à¥\87à¤\96à¥\82",
+       "rclistfrom": "$3 $2 à¤¸à¤\81 à¤¶à¥\81रà¥\82 à¤­à¥\87ल à¤¨à¤µ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¦à¥\87à¤\96à¥\80",
        "rcshowhideminor": "$1 अल्प सम्पादन",
        "rcshowhideminor-show": "देखाबी",
        "rcshowhideminor-hide": "नुकाबी",
        "rcshowhidemine-hide": "नुकाबी",
        "rcshowhidecategorization-show": "देखाबी",
        "rcshowhidecategorization-hide": "नुकाबी",
-       "rclinks": "दà¥\87à¤\96ाà¤\8a à¤\85à¤\82तिम $1 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतà¥\8dतन à¤\85à¤\82तिम $2 à¤¦à¤¿à¤¨à¤®à¥\87<br />$3",
+       "rclinks": "पिà¤\9bला $2 à¤¦à¤¿à¤¨à¤®à¥\87 à¤­à¤\8fल $1 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¦à¥\87à¤\96ाबà¥\80<br />$3",
        "diff": "अन्तर",
        "hist": "इति.",
        "hide": "नुकाबी",
        "newpageletter": "न",
        "boteditletter": "ब",
        "unpatrolledletter": "!",
-       "number_of_watching_users_pageview": "[$1 à¤¦à¥\87à¤\96à¥\88 à¤\85à¤\9bि {{PLURAL:$1|पà¥\8dरयà¥\8bà¤\95à¥\8dता|पà¥\8dरयà¥\8bà¤\95à¥\8dता सभ}}]",
+       "number_of_watching_users_pageview": "[$1 à¤§à¥\8dयान à¤°à¤¾à¤\96à¥\88वाला {{PLURAL:$1|पà¥\8dरयà¥\8bà¤\95à¥\8dता|पà¥\8dरयà¥\8bà¤\95à¥\8dतासभ}}]",
        "rc_categories": "संवर्ग सीमित (\"|\" सँ हटाउ)",
        "rc_categories_any": "कोनो",
        "rc-change-size": "$1",
        "rc-change-size-new": "बदललाक बाद $1 {{PLURAL:$1|बाइट}}",
-       "newsectionsummary": "/* $1 */ à¤¨à¤µ à¤¸à¤\82वरà¥\8dग",
+       "newsectionsummary": "/* $1 */ à¤¨à¤µ à¤\85नà¥\81भाग",
        "rc-enhanced-expand": "वर्णन देखाउ (जावास्क्रिप्ट चाही)",
-       "rc-enhanced-hide": "वरà¥\8dणन à¤¨à¥\81à¤\95ाà¤\89",
+       "rc-enhanced-hide": "विसà¥\8dतà¥\83त à¤\9cानà¤\95ारà¥\80 à¤¨à¥\81à¤\95ाबà¥\80",
        "rc-old-title": "मूल रूप स \"$1\" नाम स बनाएल गेल रह",
        "recentchangeslinked": "सम्बन्धित परिवर्तन",
        "recentchangeslinked-feed": "सम्बन्धित परिवर्तन",
        "recentchangeslinked-toolbox": "सम्बन्धित परिवर्तन",
        "recentchangeslinked-title": "\"$1\" मे भेल परिवर्तन",
        "recentchangeslinked-summary": "ई विशेष पन्नासँ सम्बद्ध पन्ना सभमे (आकि कोनो विशेष वर्गक समूहमे) भेल परिवर्तनक सूची छी ।\n[[Special:Watchlist|your watchlist]]  पर पन्नासभ '''गाढ़''' अछि।",
-       "recentchangeslinked-page": "पन्नाक नाम",
-       "recentchangeslinked-to": "दà¥\87ल à¤ªà¤¨à¥\8dनाà¤\95 à¤¸à¤®à¥\8dबनà¥\8dधà¥\80 à¤ªà¤¨à¥\8dनामà¥\87 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¦à¥\87à¤\96ाà¤\89",
+       "recentchangeslinked-page": "पन्नाक नाम:",
+       "recentchangeslinked-to": "दà¥\87ल à¤ªà¤¨à¥\8dनाà¤\95 à¤¸à¤®à¥\8dबनà¥\8dधà¥\80 à¤ªà¤¨à¥\8dनामà¥\87 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¦à¥\87à¤\96ाबà¥\80",
        "upload": "फाइल अपलोड करी",
        "uploadbtn": "फाइल अपलोड",
-       "reuploaddesc": "à¤\89पारà¥\8bपण à¤°à¤¦à¥\8dद à¤\95रà¥\82 à¤\86 à¤\89पारà¥\8bपण à¤\86वà¥\87दन-पतà¥\8dरपर à¤\98à¥\81रà¥\82।",
+       "reuploaddesc": "à¤\89पारà¥\8bपण à¤°à¤¦à¥\8dद à¤\95रà¥\80 à¤\86 à¤\89पारà¥\8bपण à¤\86वà¥\87दन-पतà¥\8dरपर à¤\9cाà¤\8f।",
        "upload-tryagain": "संशोधित संचिका वर्णन दिअ",
        "uploadnologin": "सम्प्रवेशित नै",
        "uploadnologintext": "अहाँ [[Special:UserLogin|सम्प्रवेशित]] संचिका उपारोपित करबा लेल।",
        "upload-preferred": "मोनपसिन्न संचिका प्रकार:$1 ।",
        "upload-prohibited": "प्रतिबन्धित संचिका प्रकार:$1 ।",
        "uploadlogpage": "उपारोपण वृत्तलेख",
-       "uploadlogpagetext": "नà¥\80à¤\9aाà¤\81 à¤\85दà¥\8dयतन à¤¸à¤\82à¤\9aिà¤\95ा à¤\89पारà¥\8bपणà¤\95 à¤µà¤°à¥\8dणन à¤\85à¤\9bि।\nदà¥\87à¤\96à¥\82 [[Special:NewFiles|नव à¤¸à¤\82चिकाक बखारी]] बेसी स्पष्ट समुच्चा दृश्य लेल।",
-       "filename": "सà¤\82à¤\9aिà¤\95ानाम",
+       "uploadlogpagetext": "नà¥\80à¤\9aाà¤\81 à¤\85दà¥\8dयतन à¤¸à¤\9eà¥\8dà¤\9aिà¤\95ा à¤\89पारà¥\8bपणà¤\95 à¤µà¤°à¥\8dणन à¤\85à¤\9bि।\nदà¥\87à¤\96à¥\80 [[Special:NewFiles|नव à¤¸à¤\9eà¥\8dचिकाक बखारी]] बेसी स्पष्ट समुच्चा दृश्य लेल।",
+       "filename": "सà¤\9eà¥\8dà¤\9aिà¤\95ा नाम",
        "filedesc": "संक्षेप",
        "fileuploadsummary": "संक्षेप:",
-       "filereuploadsummary": "सà¤\82चिका परिवर्तन:",
+       "filereuploadsummary": "सà¤\9eà¥\8dचिका परिवर्तन:",
        "filestatus": "सर्वाधिकारक स्थिति:",
        "filesource": "मूल:",
        "ignorewarning": "चेतौनीपर ध्यान नै दिअ आ संचिका कोनो रूपेँ संरक्षित करू",
        "ignorewarnings": "कोनो चेतौनीपर ध्यान नै दिअ",
-       "minlength1": "सà¤\82à¤\9aिà¤\95ा à¤¨à¤¾à¤® à¤¸à¤­ एक वर्णसँ कम नै हुअए",
+       "minlength1": "सà¤\9eà¥\8dà¤\9aिà¤\95ाà¤\95 à¤¨à¤¾à¤® à¤\95म एक वर्णसँ कम नै हुअए",
        "illegalfilename": "\"$1\" संचिकानाममे वर्ण अछि जे पन्ना शीर्षक लेल मान्य नै अछि।\nकृपा कऽ संचिकाक नाम बदलू आ फेरसँ उपारोपित करू।",
        "filename-toolong": "संचिकानाम 240 बाइटसँ पैघ नै भऽ सकैए।",
        "badfilename": "संचिकानाम बदलि कऽ \"$1\" कएल गेल।",
        "filerevert-legend": "घुराएल संचिका",
        "filerevert-intro": "अहाँ संचिका घुराबैले छी '''[[Media:$1|$1]]''' केँ [$4 संस्करण $3, $2 केँ] लग।",
        "filerevert-comment": "कारण:",
-       "filerevert-defaultcomment": "$2, $1 क संस्करण लग घुरल",
+       "filerevert-defaultcomment": "$2, $1 ($3)क अवतरण पूर्ववत कएलक",
        "filerevert-submit": "फेरसँ वएह",
        "filerevert-success": "'''[[Media:$1|$1]]''' घुराएल गेल [$4 version as of $3, $2] लग।",
        "filerevert-badversion": "ओइ कालक कोनो पुरान स्थानीय संस्करण ऐ संचिकाक नै अछि।",
        "randomredirect": "मिज्झर बदलेनबला लागि",
        "randomredirect-nopages": "नामस्थान \"$1\" मे कोनो बदलेनबला लागि नै अछि।",
        "statistics": "सांख्यिकी",
-       "statistics-header-pages": "पनà¥\8dनाà¤\95 à¤¸à¤¾à¤\82à¤\96à¥\8dयिà¤\95à¥\80",
+       "statistics-header-pages": "पनà¥\8dनाà¤\95 à¤¤à¤¥à¥\8dयाà¤\99à¥\8dà¤\95",
        "statistics-header-edits": "सम्पादन तथ्याङ्क",
        "statistics-header-users": "प्रयोक्ता तथ्याङ्क",
        "statistics-header-hooks": "दोसर तथ्याङ्क",
-       "statistics-articles": "à¤\85नà¥\81à¤\95à¥\8dरम à¤ªà¤¨à¥\8dना à¤¸à¤­",
-       "statistics-pages": "पन्ना सभ",
+       "statistics-articles": "सामà¤\97à¥\8dरà¥\80 à¤ªà¥\83षà¥\8dठ",
+       "statistics-pages": "पन्ना",
        "statistics-pages-desc": "वार्ता पन्ना, बदलेन इत्यादि सहित सभटा विकि पन्ना सभ।",
-       "statistics-files": "à¤\89पारà¥\8bपित à¤¸à¤\82à¤\9aिà¤\95ा à¤¸à¤­",
+       "statistics-files": "à¤\89पारà¥\8bपित à¤¸à¤\9eà¥\8dà¤\9aिà¤\95ा",
        "statistics-edits": "{{SITENAME}} अएबासँ लऽ कऽ भेल पन्ना सम्पादन",
        "statistics-edits-average": "प्रति पन्ना औसत सम्पादन",
        "statistics-users": "पञ्जीकृत [[Special:ListUsers|प्रयोक्ता]]",
        "withoutinterwiki": "बिना भाषा लिङ्कक पन्ना",
        "withoutinterwiki-summary": "ई पन्ना सभ दोसर भाषाक संस्करण सभ दिस संकेत नै करैए।",
        "withoutinterwiki-legend": "उपसर्ग",
-       "withoutinterwiki-submit": "दà¥\87à¤\96ाà¤\89",
+       "withoutinterwiki-submit": "दà¥\87à¤\96ाबà¥\80",
        "fewestrevisions": "एकाध संशोधनबला पन्ना",
        "nbytes": "$1 {{PLURAL:$1|बाइट|बाइट्स}}",
        "ncategories": "{{PLURAL:$1|श्रेणी|श्रेणीसभ}}",
        "nmembers": "$1 {{PLURAL:$1|सदस्य|सदस्यसभ}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|प्रयोक्ता|प्रयोक्तासभ}}",
        "nrevisions": "$1{{PLURAL:$1|संशोधन|संशोधनसभ}}",
-       "nimagelinks": "$1पर प्रयुक्त {{PLURAL:$1|पन्ना|पन्नासभ}}",
-       "ntransclusions": "$1पर प्रयुक्त {{PLURAL:$1|पन्ना|पन्नासभ}}",
+       "nimagelinks": "$1 {{PLURAL:$1|पन्ना|पन्नासभ}} पर प्रयुक्त",
+       "ntransclusions": "$1 {{PLURAL:$1|पन्ना|पन्नासभ}} पर प्रयुक्त",
        "specialpage-empty": "ऐ पन्ना लेल कोनो परिणाम नै अछि।",
        "lonelypages": "अनाथ पन्नासभ",
-       "lonelypagestext": "ई पन्ना सभ ने कोनो {{अन्तर्जाल}} सँ जुडल अछि आ नहिये अन्तर्बाह्य रूपसँ दोसर पन्नमे अछि।",
+       "lonelypagestext": "ई पन्नासभ नै कोनो {{SITENAME}} सँ जुडल अछि आ नहि त अन्तर्बाह्य रूपसँ दोसर पन्नमे अछि।",
        "uncategorizedpages": "अवर्गीकृत पन्नासभ",
        "uncategorizedcategories": "अवर्गीकृत श्रेणीसभ",
        "uncategorizedimages": "अवर्गीकृत सञ्चिकासभ",
        "mostcategories": "सभसँ बेसी श्रेणीबला पन्नासभ",
        "mostimages": "सभसँ बेसी लागिबला सञ्चिकासभ",
        "mostinterwikis": "सर्वाधिक अन्तरविकी जडीभेल पृष्ठसभ",
-       "mostrevisions": "सभसँ बेसी संशोधनबला पन्ना सभ",
+       "mostrevisions": "सभसँ बेसी संशोधनबला पन्ना",
        "prefixindex": "उपसर्गक संग सभटा पृष्ठ",
        "prefixindex-namespace": "उपसर्ग भएल सभ पृष्ठ ($1 नामस्थान)",
        "prefixindex-strip": "सूची में उपसर्ग नुकाउ",
        "shortpages": "पन्ना सभ छाँटू",
        "longpages": "नमगर पन्ना सभ",
        "deadendpages": "एकदमसँ अन्त भऽ जाएबला पन्ना सभ",
-       "deadendpagestext": "ई पन्ना सभ {{अन्तर्जाल}} क दोसर पन्नासँ लागिमे नै रहत।",
-       "protectedpages": "सà¤\82रà¤\95à¥\8dषित à¤ªà¤¨à¥\8dना à¤¸à¤­",
+       "deadendpagestext": "ई पन्ना सभ {{SITENAME}} क दोसर पन्नासँ लागिमे नै रहत।",
+       "protectedpages": "सà¥\81रà¤\95à¥\8dषित à¤ªà¥\83षà¥\8dठ",
        "protectedpages-indef": "अनन्तकालिक सुरक्षा मात्र",
        "protectedpages-cascade": "तराउपड़ी सुरक्षा मात्र",
        "protectedpages-noredirect": "बदलेन नुकाऊँ",
        "listusers-creationsort": "निर्माण तिथिक हिसाबसँ छाँटी",
        "listusers-desc": "अवरोही क्रममे क्रमबद्ध करी",
        "usereditcount": "$1 {{PLURAL:$1|सम्पादन|सम्पादनसभ}}",
-       "usercreated": "{{GENDER:$3|बनैलक|बनैलकिन्ह}} $1 तिथि पर $2 काले",
+       "usercreated": "$1 तिथि पर $2 काले {{GENDER:$3|बनैलक}}",
        "newpages": "नव पन्नासभ",
        "newpages-username": "प्रयोक्तानाम:",
        "ancientpages": "सभसँ पुरान पन्नासभ",
        "nopagetext": "लक्ष्य पन्ना जे अहाँ निर्दिष्ट केने छी से नै अछि।",
        "pager-newer-n": "{{PLURAL:$1|नव 1|नव $1}}",
        "pager-older-n": "{{PLURAL:$1|साबिक 1|साबिक $1}}",
-       "suppress": "नà¤\9cरिपर à¤¨à¥\88 à¤\86à¤\8fल",
+       "suppress": "नà¥\81à¤\95ाबà¥\80",
        "querypage-disabled": "ई विशिष्ट पन्ना कार्य दक्षता लेल अशक्त कएल गेल अछि।",
        "apihelp": "API मद्दत",
        "apihelp-no-such-module": "मोड्युल \"$1\" नै भेटल।",
        "apisandbox-examples": "उदाहरण",
        "apisandbox-results": "परिणाम",
        "apisandbox-request-url-label": "अनुरोध URL:",
-       "apisandbox-request-time": "अनुरोध समय: $1",
+       "apisandbox-request-time": "अनुरोध समय: {{PLURAL:$1|$1 मिसे}}",
        "booksources": "किताबक स्रोत",
        "booksources-search-legend": "किताबक स्रोत ताकी",
        "booksources-isbn": "आइ.एस.बी.एन.:",
        "booksources-text": "नीचाँ दोसर जालस्थलसँ लागि सभक सूची अछि जे नव आ प्रयोग कएल किताब बेचैए, आ ई पोथी सभक विषयमे ओहो सूचना दऽ सकैए जे अहाँ ताकि रहल छी:",
        "booksources-invalid-isbn": "देल आइ.एस.बी.एन. संख्या मान्य नै बुझाइत अछि; कृपा कऽ मूल स्रोतसँ द्वितीयक बनेबा काल भेल भ्रमकेँ जाँचू।",
        "specialloguserlabel": "कर्ता:",
-       "speciallogtitlelabel": "लà¤\95à¥\8dषà¥\8dय (शà¥\80रà¥\8dषà¤\95 à¤µà¤¾ à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता):",
-       "log": "वृत्तलेख सभ",
+       "speciallogtitlelabel": "पà¥\8dरयà¥\8bà¤\9cन (शà¥\80रà¥\8dषà¤\95 à¤\85थवा {{ns:user}}:पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाम):",
+       "log": "वृत्तलेख",
        "all-logs-page": "सभ सार्वजनिक वृत्तलेख",
        "alllogstext": "{{अन्तर्जाल}} क सभटा उपलब्ध वृत्तलेखक संयुक्त दृश्य।\nअहाँ दृश्यकेँ संकीर्ण करबा लेल वृत्तलेखक एकटा प्रकार चुनि सकै छी, प्रयोक्तानाम (ब्रह्मक्षर-लघ्वक्षर विचारणीय), वा प्रभावित पन्ना (एतौ ब्रह्मक्षर-लघ्वक्षर विचारणीय)।",
        "logempty": "वृत्तलेखमे कोनो मेल खाइबला बौस्तु नै।",
        "log-title-wildcard": "खोज शीर्षक सभ ऐ पाठसँ प्रारम्भ",
-       "showhideselectedlogentries": "दà¥\87à¤\96ाà¤\89/ à¤¨à¥\81à¤\95ाà¤\89 à¤\9aयनित à¤²à¤\97 à¤¸à¤­",
+       "showhideselectedlogentries": "दà¥\87à¤\96ाबà¥\80/ à¤¨à¥\81à¤\95ाबà¥\80 à¤\9aयनित à¤²à¤\97",
        "log-edit-tags": "चुनल गेल लग प्रविक्तिसभ एक सम्पादन ट्याग",
        "allpages": "सभ पन्ना",
        "nextpage": "अगिला पन्ना ($1)",
        "allarticles": "सभटा लेख",
        "allinnamespace": "सभटा पन्ना ($1 नामगाम)",
        "allpagessubmit": "जाए",
-       "allpagesprefix": "उपसर्गक संग दृश्य पन्ना सभ:",
+       "allpagesprefix": "उपसर्गक संग दृश्य पन्ना:",
        "allpagesbadtitle": "देल पन्नाक शीर्षक गलत, गलत सम्बन्धित अन्तर-भाषा अन्तर विकी शीर्षक छी। ई एक वा बेशी कलाकार युक्त भऽ सकैए जे शीर्षकमे प्रयुक्त नै कएल जा सकैए।",
        "allpages-bad-ns": "{{SITENAME}} मे \"$1\" नामगाम नै अछि।",
        "allpages-hide-redirects": "पुनर्निर्देश नुकाबी",
        "linksearch-pat": "खोज तरीका:",
        "linksearch-ns": "नामस्थान :",
        "linksearch-ok": "ताकी",
-       "linksearch-text": "ब्रह्मास्त्र जेना \"*.wikipedia.org\" प्रयोग कएल जा सकैए।\nसहायक संविद:$1 (खोजमे ऐमेसँ कोनो नै जोड़ू)।",
+       "linksearch-text": "\"*.wikipedia.org\" जोका वाईल्ड-कार्ड्स प्रयोग कएल जा सकएत अछि।\nकम-सँ-कम \".org\" जोक कोनो उच्च स्तरीय डोमेनक आवश्यकता अछि।<br />\nस्वीकार्य {{PLURAL:$2|प्रोटोकल|प्रोटोकलसभ}}: $1 (यदि कोनो प्रोटोकल नै दएल जाए त http:// क प्रयोग कएल जाएत अछि)",
        "linksearch-line": "$2 सँ $1 क लागि अछि।",
        "linksearch-error": "निमंत्रकनामक प्रारम्भमे ब्रह्मास्त्र आबि सकैए।",
        "listusersfrom": "प्रयोक्ता प्रदर्शन प्रारम्भ भेल:",
        "listusers-blocked": "(प्रतिबन्धित)",
        "activeusers": "सक्रिय प्रयोक्ता सभक सूची",
        "activeusers-intro": "ई ओहेन प्रयोक्ता सभक सूची अछि जे पछिला $1 {{PLURAL:$1|दिन|दिन}} मे किछु सक्रियता देखेने छथि।",
-       "activeusers-count": "$1 {{PLURAL:$1|सम्पादन|सम्पादन सभ}} paChilaa {{PLURAL:$3|दिन|$3 दिन}}",
+       "activeusers-count": "$1 {{PLURAL:$1|सम्पादन}} विगत $3 {{PLURAL:$3|दिन|दिन}}मे",
        "activeusers-from": "प्रयोक्ता प्रदर्शन प्रारम्भ भेल:",
-       "activeusers-hidebots": "सà¥\8dवà¤\9aालन à¤¨à¥\81à¤\95ाà¤\89",
-       "activeusers-hidesysops": "सà¤\82à¤\9aालà¤\95 à¤¨à¥\81à¤\95ाà¤\89",
+       "activeusers-hidebots": "सà¥\8dवà¤\9aालà¤\95 à¤¨à¥\81à¤\95ाबà¥\80",
+       "activeusers-hidesysops": "पà¥\8dरबनà¥\8dधà¤\95 à¤¨à¥\81à¤\95ाबà¥\80",
        "activeusers-noresult": "कोनो प्रयोक्ता नै भेटल",
-       "listgrouprights": "पà¥\8dरयà¥\8bà¤\95à¥\8dता à¤¸à¤\82वरà¥\8dà¤\97 अधिकार",
+       "listgrouprights": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¸à¤®à¥\82ह अधिकार",
        "listgrouprights-summary": "ई सभ प्रयोक्ता संवर्गक एकटा सूची अछि जे ऐ विकीपरपरिभाषित अछि ओकर संसर्गित प्रवेश अधिकारक संग।\nएतए [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] व्यक्तिगत अधिकार लेल भऽ सकैए।",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">देल अधिकार</span>\n* <span class=\"listgrouprights-revoked\">निकालल अधिकार</span>",
-       "listgrouprights-group": "वरà¥\8dà¤\97",
+       "listgrouprights-group": "समà¥\82ह",
        "listgrouprights-rights": "अधिकार",
        "listgrouprights-helppage": "Help: वर्ग अधिकार",
        "listgrouprights-members": "(प्रयोक्ता सूची)",
-       "listgrouprights-addgroup": "जोड़ू {{PLURAL:$2|वर्ग|वर्ग}}: $1",
-       "listgrouprights-removegroup": "निà¤\95ालà¥\82 {{PLURAL:$2|वरà¥\8dà¤\97|वरà¥\8dà¤\97}}: $1",
-       "listgrouprights-addgroup-all": "सभटा वर्ग जोड़ू",
-       "listgrouprights-removegroup-all": "सभटा वर्ग निकालू",
-       "listgrouprights-addgroup-self": "à¤\9cà¥\8bड़à¥\82 {{PLURAL:$2|वरà¥\8dà¤\97|वरà¥\8dà¤\97}} à¤\85पन à¤\96ातामà¥\87: $1",
-       "listgrouprights-removegroup-self": "निà¤\95ालà¥\82 {{PLURAL:$2|वरà¥\8dà¤\97|वरà¥\8dà¤\97}} à¤\85पन à¤\96ातामà¥\87: $1",
+       "listgrouprights-addgroup": "{{PLURAL:$2|समूह}} जोडी: $1",
+       "listgrouprights-removegroup": "समà¥\82ह {{PLURAL:$2|मà¥\87à¤\9fाबà¥\80}}: $1",
+       "listgrouprights-addgroup-all": "सभ समूह जोडी",
+       "listgrouprights-removegroup-all": "सभ समूह मेटाबी",
+       "listgrouprights-addgroup-self": "à¤\85पन à¤\96ातामà¥\87 {{PLURAL:$2|समà¥\82ह|समà¥\82हसभ}} à¤\9cà¥\8bडà¥\80: $1",
+       "listgrouprights-removegroup-self": "à¤\85पन à¤\96ातासà¤\81 {{PLURAL:$2|समà¥\82ह|समà¥\82हसभ}} à¤¹à¤\9fाबà¥\80: $1",
        "listgrouprights-addgroup-self-all": "सभ वर्गकेँ अपन खातामे जोड़ू",
        "listgrouprights-removegroup-self-all": "सभ वर्गकेँ अपन खातासँ निकालू",
        "listgrouprights-namespaceprotection-header": "नामस्थान प्रतिबन्धित",
        "listgrouprights-namespaceprotection-namespace": "नामस्थान",
        "listgrouprights-namespaceprotection-restrictedto": "सांच(सभ) के संपादन करए लेल",
        "trackingcategories": "श्रेणीके ट्रयाक करु",
-       "trackingcategories-msg": "शà¥\8dरà¥\87णà¥\80à¤\95à¥\87 à¤\9fà¥\8dरयाà¤\95 à¤\95रà¥\81",
+       "trackingcategories-msg": "à¤\9aिहà¥\8dनित à¤¶à¥\8dरà¥\87णà¥\80",
        "trackingcategories-name": "सन्देश नाम",
        "trackingcategories-desc": "श्रेणी समावेशीकरण मापदण्ड",
        "trackingcategories-nodesc": "कोनो वर्णन उपलब्ध नै।",
        "emailuser-title-target": "इ {{GENDER:$1|प्रयोक्ता}} के ई-पत्र भेजु।",
        "emailuser-title-notarget": "ई-पत्र प्रयोक्ता",
        "emailpagetext": "अहाँक नीचाँक आवेदन-पत्र ऐ प्रयोक्ताकेँ ई-पत्र संदेश पठेबा लेल प्रयोग कऽ सकै छी।\nई-पत्र जे अहाँ [[Special:Preferences|your user preferences]] मे देलहुँ से ई-पत्र\"एतएसँ\" पतासँ देखाएत, से प्राप्तकर्ता सोझे अहाँकेँ उत्तर देबामे समर्थ हेताह।",
-       "defemailsubject": "{{जालस्थल}} प्रयोक्ता \"$1\" सँ ई-पत्र",
+       "defemailsubject": "{{SITENAME}} प्रयोक्ता \"$1\" सँ ई-पत्र",
        "usermaildisabled": "प्रयोक्ता ई-पत्र अशक्त",
        "usermaildisabledtext": "अहाँ दोसर प्रयोक्ताकेँ ऐ विकीपर ई-पत्र नै पठा सकए छी",
        "noemailtitle": "कोनो ई-पत्र पता नै",
        "noemailtext": "ई पर्योक्ता अपन कोनो मान्य ई-पत्र संकेत नै देने अछि।",
        "nowikiemailtext": "ई प्रयोक्ता दोसर प्रयोक्तासँ ई-पत्र प्राप्त नै करबाक विकल्प चुनने अछि।",
        "emailnotarget": "अस्तित्वहीन वा अमान्य प्राप्तकर्ताक प्रयोक्तानाम",
-       "emailtarget": "पà¥\8dरापà¥\8dतà¤\95रà¥\8dताà¤\95 à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dतानाम à¤¦à¤°à¥\8dà¤\9c à¤\95रà¥\82",
+       "emailtarget": "पà¥\8dरापà¥\8dतà¤\95रà¥\8dताà¤\95 à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dतानाम à¤¦à¤°à¥\8dà¤\9c à¤\95रà¥\80",
        "emailusername": "प्रयोक्तानाम:",
        "emailusernamesubmit": "दिअ",
-       "email-legend": "ई-पत्र दोसर {{जालस्थल}} प्रयोक्ताकेँ पठाउ",
+       "email-legend": "ई-पत्र दोसर {{SITENAME}} प्रयोक्ताके पठाबी",
        "emailfrom": "एतऽसँ:",
        "emailto": "ऐलेल:",
        "emailsubject": "विषय:",
        "emailmessage": "सन्देश:",
        "emailsend": "पठाबी",
-       "emailccme": "हमर à¤¸à¤\82दà¥\87शà¤\95 à¤¦à¥\8dवितà¥\80यà¤\95 à¤¹à¤®à¤° à¤\88-पतà¥\8dरपर à¤ªà¤ à¤¾à¤\89",
+       "emailccme": "हमर à¤¸à¤¨à¥\8dदà¥\87शà¤\95 à¤¦à¥\8dवितà¥\80यà¤\95 à¤¹à¤®à¤° à¤\88-पतà¥\8dरपर à¤ªà¤ à¤¾à¤¬à¥\80",
        "emailccsubject": "अहाँक संदेशक द्वितीयक $1: $2",
        "emailsent": "ई-पत्र पठेलौं",
-       "emailsenttext": "à¤\85हाà¤\81à¤\95 à¤\88-पतà¥\8dर à¤¸à¤\82देश पठाएल गेल।",
-       "emailuserfooter": "à¤\88 à¤\88-पतà¥\8dर $1 à¤¸à¤\81 $2 à¤\95à¥\87à¤\81 \"à¤\88-पतà¥\8dर à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता\" à¤\95à¥\87à¤\81 à¤ªà¤ à¤¾à¤\93ल à¤\97à¥\87ल {{à¤\9cालसथल}} à¤ªà¤°।",
-       "usermessage-summary": "पà¥\8dरणालà¥\80 à¤¸à¤\82दà¥\87श à¤¦à¥\87ल।",
+       "emailsenttext": "à¤\85हाà¤\81à¤\95 à¤\88-पतà¥\8dर à¤¸à¤¨à¥\8dदेश पठाएल गेल।",
+       "emailuserfooter": "à¤\88 à¤\88-मà¥\87ल $1 {{GENDER:$1|दà¥\8dवारा}} {{GENDER:$2|$2}}à¤\95 à¤­à¥\87à¤\9cल à¤\97à¥\87ल à¤\9bल à¤\9cà¥\87à¤\95र à¤²à¥\87ल \"{{int:emailuser}}\" à¤\95ारà¥\8dयà¤\95à¥\87 {{SITENAME}} à¤ªà¤° à¤ªà¥\8dरयà¥\8bà¤\97मà¥\87 à¤²à¤¾à¤¬à¤² à¤\97à¥\87ल à¤\9bल।",
+       "usermessage-summary": "पà¥\8dरणालà¥\80 à¤¸à¤¨à¥\8dदà¥\87श à¤\9bà¥\8bडि à¤°à¤¹à¤² à¤\85à¤\9bि।",
        "usermessage-editor": "प्रणालीक दूत",
        "usermessage-template": "मीडियाविकी:प्रयोक्ता संदेश",
        "watchlist": "साकांक्षसूची",
        "nowatchlist": "अहाँक साकांक्ष-सूचीमे कोनो पन्ना नै अछि।",
        "watchlistanontext": "कृपा कऽ $1 अहाँक साकांक्ष-सूचीकेँ देखबा वा सम्पादित करबा लेल।",
        "watchnologin": "सम्प्रवेशित नै",
-       "addwatch": "साà¤\95ाà¤\82à¤\95à¥\8dष à¤¸à¥\82à¤\9aà¥\80मà¥\87 à¤\9cà¥\8bड़à¥\82",
-       "addedwatchtext": "पनà¥\8dना \"[[:$1]]\" à¤\85हाà¤\81à¤\95 [[Special:Watchlist|साà¤\95ाà¤\82à¤\95à¥\8dष à¤¸à¥\82à¤\9aà¥\80]] à¤®à¥\87 à¤\9cà¥\8bड़ल à¤\97à¥\87ल।\nà¤\90 à¤ªà¤¨à¥\8dनामà¥\87 à¤­à¤µà¤¿à¤·à¥\8dयà¤\95 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\86 à¤\8fà¤\95र à¤¸à¤®à¥\8dबनà¥\8dधित à¤\9aà¥\8cबà¤\9fिया à¤ªà¤¨à¥\8dना à¤\8fतà¤\8f à¤¸à¥\82à¤\9aà¥\80बदà¥\8dध à¤°à¤¹à¤¤, à¤\86 à¤ªà¤¨à¥\8dना [[Special:RecentChanges|हालà¤\95 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन]]मà¥\87 '''à¤\97ाढ़''' à¤¦à¥\87à¤\96ाà¤\8fत , à¤\9cà¤\87सà¤\81 à¤\86सानà¥\80सà¤\81 à¤\8fà¤\95रा à¤\9aिनà¥\8dहल à¤\9cा à¤¸à¤\95त।",
+       "addwatch": "साà¤\95ाà¤\82à¤\95à¥\8dष à¤¸à¥\82à¤\9aà¥\80मà¥\87 à¤\9cà¥\8bडà¥\80",
+       "addedwatchtext": "à¤\85हाà¤\81à¤\95 [[Special:Watchlist|धà¥\8dयानसà¥\82à¤\9aà¥\80]]मà¥\87 \"[[:$1]]\" à¤\86 à¤\8fà¤\95र à¤\9aरà¥\8dà¤\9aा à¤ªà¥\83षà¥\8dठ à¤\9cà¥\8bडि à¤¦à¤\8fल à¤\97à¥\87ल à¤\85à¤\9bि।",
        "addedwatchtext-short": "इ पृष्ठ \"$1\" अहाँ के साकांक्ष सूची मे राखल गेल अछि।",
-       "removewatch": "साà¤\95ाà¤\82à¤\95à¥\8dष à¤¸à¥\82à¤\9aà¥\80सà¤\81 à¤¹à¤\9fाà¤\89",
-       "removedwatchtext": "पनà¥\8dना \"[[:$1]]\" à¤¹à¤\9fाà¤\8fल à¤\97à¥\87ल [[Special:Watchlist|à¤\85हाà¤\81à¤\95 à¤¸à¤¾à¤\95ाà¤\82à¤\95à¥\8dषसà¥\82à¤\9aà¥\80]] à¤¸à¤\81।",
+       "removewatch": "साà¤\95ाà¤\82à¤\95à¥\8dष à¤¸à¥\82à¤\9aà¥\80सà¤\81 à¤¹à¤\9fाबà¥\80",
+       "removedwatchtext": "à¤\85हाà¤\81à¤\95 [[Special:Watchlist|धà¥\8dयानसà¥\82à¤\9aà¥\80]]सà¤\81 \"[[:$1]]\" à¤\86 à¤\8fà¤\95र à¤\9aरà¥\8dà¤\9aा à¤ªà¥\83षà¥\8dठ à¤¹à¤\9fाà¤\8fल à¤\97à¥\87ल à¤\85à¤\9bि।",
        "removedwatchtext-short": "इ पृष्ठ \"$1\" अहाँ के साकांक्ष सूची मे राखल गेल अछि।",
        "watch": "ध्यान राखु",
        "watchthispage": "ऐ पृष्ठपर ध्यान राखू",
-       "unwatch": "à¤\9bà¥\8bड़à¥\82",
-       "unwatchthispage": "दà¥\87à¤\96नाà¤\87 à¤\9bà¥\8bड़à¥\82",
+       "unwatch": "à¤\9bà¥\8bडà¥\80",
+       "unwatchthispage": "दà¥\87à¤\96नाà¤\87 à¤\9bà¥\8bडà¥\80",
        "notanarticle": "कोनो विषय सूची नै",
        "notvisiblerev": "कोनो दोसर प्रयोक्ता द्वारा कएल अन्तिम परिवर्तन मेटा देल गेल",
        "watchlist-details": "{{PLURAL:$1|$1 पन्ना|$1 पन्ना सभ}} अहाँक साकांक्षसूचीमे, चौबटिया पन्ना नै गानल गेल।",
        "wlheader-showupdated": "पन्ना सभ जे अहाँक एतए अन्तिम बेर अएलाक बाद बदलल अछि तकर सूची देल अछि '''गाढ़''' मे",
        "wlnote": "नीचाँ {{PLURAL:$1|is the last change|are the last '''$1''' changes}} अन्तिम {{PLURAL:$2|hour|'''$2''' hours}} $3, $4 जेना।",
        "wlshowlast": "देखाउ अन्तिम $1 घण्टा $2 दिन",
-       "watchlist-options": "साकांक्षसूचीक विकल्प सभ",
+       "watchlist-options": "साकांक्षसूचीक विकल्प",
        "watching": "ताकिमे...",
-       "unwatching": "à¤\9bà¥\8bड़ल ...",
+       "unwatching": "छोडल ...",
        "watcherrortext": "अहाँक साकांक्ष-सूची विकल्प \"$1\" लेल बदलबा काल एकटा भ्रम आएल।",
-       "enotif_reset": "सभ पन्नाकेँ देखल चिन्हित करू",
+       "enotif_reset": "सभ पन्नाके देखल चिन्हित करी",
        "enotif_impersonal_salutation": "{{SITENAME}} प्रयोगकर्ता",
        "enotif_subject_deleted": "{{SITENAME}} पन्ना $1 के {{gender:$2|$2}} हटेलक",
        "enotif_subject_created": "{{SITENAME}} पन्ना $1 को {{gender:$2|$2}} बनेलक",
        "excontent": "विषय छल:\"$1\"",
        "excontentauthor": "पाठ छल:\"$1\" (आ एकमात्र योगदान दैबला छल \"[[Special:Contributions/$2|$2]]\")",
        "exbeforeblank": "खतम होएबाक पहिने पाठ छल:\"$1\"",
-       "delete-confirm": "$1 केँ मेटाउ",
-       "delete-legend": "मà¥\87à¤\9fाà¤\89",
+       "delete-confirm": "$1 के मेटाबी",
+       "delete-legend": "मà¥\87à¤\9fाबà¥\80",
        "historywarning": "'''चेतौनी:''' जे पन्ना अहाँ मेटबैबला छी तकर इतिहास अछि लगभग $1 {{PLURAL:$1|revision|revisions}}:",
        "confirmdeletetext": "अहाँ सभटा इतिहासक संग ऐ पन्नाकेँ हटाबऽ जा रहल छी।\nअहाँ ई सुनिश्चित करू जे अहाँ ई करऽ चाहै छी, अहाँकेँ एकर परिणामक अवगति अछि आ अहाँ ई ऐ [[{{MediaWiki:Policy-url}}|नीति]] क अनुसार कऽ रहल छी।",
        "actioncomplete": "क्रिया पूर्ण",
        "editcomment": "सम्पादन सार छल : <em>$1</em>।",
        "revertpage": "सम्पादन आपस कएल गेल [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) सँ अन्तिम संशोधन धरि एकरा द्वारा [[User:$1|$1]]।",
        "revertpage-nouser": "(प्रयोक्ताक नाम हटा देल गेल अछि) द्वारा केल गेल संपादनकेँ फेरसँ पुरान स्थितिमे आनि कऽ एकर पहिलुक [[User:$1|$1]] सँ बनल संस्करणकेँ फेरसँ ताजा संस्करण बनाऊ।",
-       "rollback-success": "$1 à¤\95à¥\87र à¤¸à¤\82पादन à¤¹à¤\9fाà¤\8a. \n$2 à¤\95à¥\87र à¤¸à¤\82पादित à¤\86à¤\96िरà¥\80 à¤\85वतरण à¤\95 à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रल à¤\97à¥\87ल.",
+       "rollback-success": "$1 à¤\95à¥\87र à¤¸à¤®à¥\8dपादन à¤¹à¤\9fाबà¥\80। \n$2 à¤\95à¥\87र à¤¸à¤®à¥\8dपादित à¤\86à¤\96िरà¥\80 à¤\85वतरणà¤\95 à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रल à¤\97à¥\87ल।",
        "sessionfailure-title": "सत्र विफल भ गेल",
        "sessionfailure": "एहन लागैत अछि जे अहां के लागिन सत्र में कोनो त्रुटि अछि. सत्र अपहरण से बचाबय  सं सावधानीक लेल अहां के अहि क्रियाकलाप क रद्द क देल गेल. अहां पाछां के पृष्ठ पर जौउ आ पृष्ठ के फेर सं लोड क दोबारा कोशिश करू.",
        "protectlogpage": "सुरक्षा लग",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] प्रतिबन्धित कएल गेल।<br />\nदेखू [[Special:BlockList|IP block list]] प्रतिबन्धक पुनरीक्षण लेल।",
        "ipb-blockingself": "अहाँ अपनाकेँ प्रतिबन्धित करैबला छी! अहाँ निश्च्य केने छी जे अहाँ ई करए चाहै छी?",
        "ipb-confirmhideuser": "अहाँ एकटा प्रयोक्ताकेँ जे \"प्रयोक्ता नुकाउ\" विकल्पक संग अछि, प्रतिबन्धित करैबला छी। ई प्रयोक्ताक नाम सभटा सूची आ वृत्तलेखमे दबा देत। की अहाँ निश्चय केने छी जे अहाँ ई करए चाहै छी?",
-       "ipb-edit-dropdown": "प्रतिबन्ध कारण  संपादित करू",
+       "ipb-edit-dropdown": "प्रतिबन्ध कारण सम्पादित करी",
        "ipb-unblock-addr": "प्रतिबन्ध हटाएल $1",
        "ipb-unblock": "प्रयोक्ता वा अनिकेतकें अप्रतिबंधित करू",
        "ipb-blocklist": "अखुनका प्रतिबंधित देखू",
        "blocklist-nousertalk": "अपन वार्ता पन्ना सम्पादित नै कऽ सकब",
        "ipblocklist-empty": "प्रतिबन्धसूची खाली अछि।",
        "ipblocklist-no-results": "आग्रह कएल अनिकेत वा प्रयोक्तानाम प्रतिबन्धित नै कएल गेल।",
-       "blocklink": "पà¥\8dरतिबà¤\82धित",
+       "blocklink": "पà¥\8dरतिबनà¥\8dधित",
        "unblocklink": "नै बारल",
        "change-blocklink": "खण्ड बदलू",
        "contribslink": "योगदान",
        "cant-move-to-user-page": "अहाँकेँ कोनो पन्नाकेँ प्रयोक्ता पन्ना लग घसकेबाक अधिकार नै अछि (प्रयोक्ता उपपन्ना लग छोड़ि कऽ)।",
        "newtitle": "नव शीर्षकपर:",
        "move-watch": "जड़ि पन्ना आ छीप पन्ना देखू",
-       "movepagebtn": "पनà¥\8dना à¤\98सà¤\95ाà¤\89",
+       "movepagebtn": "पनà¥\8dना à¤\98सà¤\95ाबà¥\80",
        "pagemovedsub": "घसकल",
        "movepage-moved": "'''\"$1\" घसकाएल गेल \"$2\"''' पर",
        "movepage-moved-redirect": "एकटा पुनर्निर्देशन बनाओल गेल छै.",
        "movepage-moved-noredirect": "पुनर्निर्देशन नहि बनाओल गेल छै.",
        "articleexists": "ओइ नामक एकटा पन्ना पहिनहियेसँ अछि, वा जे नाम अहाँ चयन केने छी से वांछित नै अछि। \nकृपा कऽ दोसर नामक चयन करू।",
        "cantmove-titleprotected": "नब शीर्षक बनाबै  सें रोकहि के कारण, अहां अहि ठाम पर कोनो आन पृष्ठक ठाम बदलि नहि सकब.",
-       "movetalk": "समà¥\8dबनà¥\8dधित à¤\9aà¥\8cबà¤\9fिया à¤ªà¤¨à¥\8dनाà¤\95à¥\87à¤\81 à¤\98सà¤\95ाà¤\89",
+       "movetalk": "समà¥\8dबनà¥\8dधित à¤µà¤¾à¤°à¥\8dता à¤ªà¥\83षà¥\8dठ à¤¸à¥\87हà¥\8b à¤\98सà¤\95ाबà¥\80",
        "move-subpages": "उपपृष्ठ सेहो लेल जाऊ ($1 धरि)",
        "move-talk-subpages": "वार्ता पृष्ठक उपपृष्ठ लेने जाऊ ($1 धरि)",
        "movepage-page-exists": "पन्ना $1 पहिनहियेसँ अछि आ स्वचालित रूपेँ मेटाएल नै जा सकैए।",
        "export-pagelinks": "लागिबला पन्ना सभकेँ एतेक तह धरि राखू:",
        "allmessages": "प्रणालीक सन्देश",
        "allmessagesname": "नाम",
-       "allmessagesdefault": "पà¥\82रà¥\8dवनिरà¥\8dधारित à¤¸à¤\82देश पाठ",
-       "allmessagescurrent": "à¤\85à¤\96à¥\81नà¤\95ा à¤¸à¤\82देश पाठ",
-       "allmessagestext": "à¤\88 à¤®à¥\80डियाविà¤\95à¥\80 à¤¨à¤¾à¤®à¤¸à¥\8dथानमà¥\87 à¤\89पलबà¥\8dध à¤¸à¤\82सà¥\8dथाà¤\97त à¤¸à¤\82दà¥\87शà¤\95 à¤¸à¥\82à¤\9aà¥\80 à¤\9bà¥\80।\nà¤\95à¥\83पा à¤\95ऽ à¤¦à¥\87à¤\96à¥\82 [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] à¤\86 [https://translatewiki.net translatewiki.net] à¤\9cà¤\81 à¤\85हाà¤\81 à¤®à¥\80डियाविकीक स्थानिकीकरणक मूलक अनुवादमे योगदान करए चाहै छी।",
+       "allmessagesdefault": "पà¥\82रà¥\8dवनिरà¥\8dधारित à¤¸à¤¨à¥\8dदेश पाठ",
+       "allmessagescurrent": "à¤\85à¤\96à¥\81नà¤\95ा à¤¸à¤¨à¥\8dदेश पाठ",
+       "allmessagestext": "à¤\88 à¤®à¤¿à¤¡à¤¿à¤¯à¤¾à¤µà¤¿à¤\95à¥\80 à¤¨à¤¾à¤®à¤¸à¥\8dथानमà¥\87 à¤\89पलबà¥\8dध à¤¸à¤\82सà¥\8dथाà¤\97त à¤¸à¤¨à¥\8dदà¥\87शà¤\95 à¤¸à¥\82à¤\9aà¥\80 à¤\9bà¥\80।\nà¤\95à¥\83पा à¤\95ऽ à¤¦à¥\87à¤\96à¥\80 [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] à¤\86 [https://translatewiki.net translatewiki.net] à¤\9cà¤\81 à¤\85हाà¤\81 à¤®à¤¿डियाविकीक स्थानिकीकरणक मूलक अनुवादमे योगदान करए चाहै छी।",
        "allmessagesnotsupportedDB": "ई पन्ना प्रयोगमे नै आनल जा सकैए कारण '''$wgUseDatabaseMessages''' अशक्त कएल अछि।",
        "allmessages-filter-legend": "चलनी",
        "allmessages-filter": "अपन हिसाबे अनुकूलित कऽ छाँटू:",
        "import-options-wrong": "गलत {{PLURAL:$2|विकल्प}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "दयाल गेल उपसर्ग पन्ना शीर्षक अमान्य अछि ।",
        "import-rootpage-nosubpage": "दयाल गेल उपसर्ग पन्ना \"$1\" के नामस्थान में उप-पन्ना नै बनाबाल जा सकएत अछि ।",
-       "importlogpage": "लà¥\89à¤\97à¤\95 à¤\86यात",
+       "importlogpage": "à¤\86यात à¤¸à¥\82à¤\9aà¥\80",
        "importlogpagetext": "पन्ना सभक प्रशासनिक आयात दोसर विकीक सम्पादन इतिहासक संग।",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|सुधार|सुधार सभ}}",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|सुधार|सुधार सभ}} $2 सँ",
        "tooltip-pt-createaccount": "अहाँक खाता खोलक लेल प्रोत्साहित केल जाएत अछि; मुदा ई अनिवार्य नै छै",
        "tooltip-ca-talk": "विषयसूचीक पन्नाक सम्बन्धमे वर्त्तालाप",
        "tooltip-ca-edit": "ई पन्नाक सम्पादित करी",
-       "tooltip-ca-addsection": "नव à¤\96णà¥\8dड à¤¶à¥\81रà¥\82 à¤\95रà¥\82",
+       "tooltip-ca-addsection": "नव à¤\96णà¥\8dड à¤¶à¥\81रà¥\82 à¤\95रà¥\80",
        "tooltip-ca-viewsource": "ऐ पन्नापर वरदहस्त छै।\nअहाँ एकर जड़ि देख सकै छी।",
        "tooltip-ca-history": "ई पृष्ठक पुरान अवतरण",
        "tooltip-ca-protect": "ऐ पन्नाकेँ बचाउ",
        "tooltip-ca-nstab-media": "मीडिया पृष्ठ देखू",
        "tooltip-ca-nstab-special": "ई एकटा विशिष्ट पन्ना छी, आ अहाँ एकरा सम्पादित नै कऽ सकै छी",
        "tooltip-ca-nstab-project": "परियोजना पन्ना देखू",
-       "tooltip-ca-nstab-image": "पनà¥\8dनाà¤\95 à¤ªà¥\83षà¥\8dठ à¤¦à¥\87à¤\96à¥\82",
-       "tooltip-ca-nstab-mediawiki": "पà¥\8dरणालà¥\80à¤\95 à¤¸à¤\82दà¥\87श à¤¦à¥\87à¤\96à¥\82",
+       "tooltip-ca-nstab-image": "सà¤\9eà¥\8dà¤\9aिà¤\95ाà¤\95 à¤ªà¥\83षà¥\8dठ à¤¦à¥\87à¤\96à¥\80",
+       "tooltip-ca-nstab-mediawiki": "पà¥\8dरणालà¥\80à¤\95 à¤¸à¤¨à¥\8dदà¥\87श à¤¦à¥\87à¤\96à¥\80",
        "tooltip-ca-nstab-template": "नमूना देखू",
        "tooltip-ca-nstab-help": "सहायता पृष्ठ देखू",
        "tooltip-ca-nstab-category": "संवर्ग पन्ना देखू",
        "tooltip-undo": "\"फेरसँ वएह\" सम्पादनकेँ पूर्वस्थितिमे लऽ जाइए आ पूर्वावलोकन अवस्थामे सम्पादन फॉर्म खोलैए। ई सारांशमे कारण जोड़बाक विकल्प दैत अछि।",
        "tooltip-preferences-save": "मोनपसंद के सुरक्षित करू",
        "tooltip-summary": "छोट संक्षेप दिअ",
-       "anonymous": "अज्ञात {{अन्तर्जाल}} क  {{PLURAL:$1|प्रयोक्ता|प्रयोक्ता सभ}}",
-       "siteuser": "{{अन्तर्जाल}} प्रयोक्ता $1",
+       "anonymous": "{{SITENAME}}क अज्ञात {{PLURAL:$1|प्रयोक्ता|प्रयोक्तासभ}}",
+       "siteuser": "{{SITENAME}} प्रयोक्ता $1",
        "anonuser": "{{SITENAME}} नुकायल प्रयोक्ता $1",
-       "lastmodifiedatby": "à¤\88 à¤ªà¤¨à¥\8dना à¤\85à¤\82तिम बेर संवर्धित भेल $2, $1 द्वारा $3।",
+       "lastmodifiedatby": "à¤\88 à¤ªà¤¨à¥\8dना à¤\85नà¥\8dतिम बेर संवर्धित भेल $2, $1 द्वारा $3।",
        "othercontribs": "$1 के काजुक तरहे",
        "others": "दोसर, आन",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|प्रयोगकर्ता}}|प्रयोगकर्ता}} $1",
-       "anonusers": "{{अन्तर्जाल}} अज्ञात {{PLURAL:$2|प्रयोक्ता|प्रयोक्ता सभ}} $1",
+       "anonusers": "{{SITENAME}} अज्ञात {{PLURAL:$2|प्रयोक्ता|प्रयोक्तासभ}} $1",
        "creditspage": "पन्नाक श्रेय",
        "nocredits": "अहि पन्नाक लेल क्रेडिट ज़ानकारी नहि अछि",
        "spamprotectiontitle": "अनिष्ट सन्देश सुरक्षा छन्नी",
        "pageinfo-article-id": "पन्ना आई॰डी॰",
        "pageinfo-language": "पन्ना सामग्री भाषा",
        "pageinfo-content-model": "पन्ना सामग्री के नमूना",
-       "pageinfo-robot-policy": "बà¥\89à¤\9f द्वारा अनुक्रमण",
+       "pageinfo-robot-policy": "बà¥\8bà¤\9fद्वारा अनुक्रमण",
        "pageinfo-robot-index": "मान्य",
        "pageinfo-robot-noindex": "अमान्य",
        "pageinfo-watchers": "जानकारक संख्या",
        "pageinfo-few-watchers": "$1 स कम ध्यान दीए {{PLURAL:$1|वाला}}",
-       "pageinfo-redirects-name": "à¤\87 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87शसभ à¤\95à¥\87 à¤¸à¤\82ख्या",
+       "pageinfo-redirects-name": "à¤\88 à¤ªà¤¨à¥\8dनाà¤\95 à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87शसभ à¤¸à¤\99à¥\8dख्या",
        "pageinfo-subpages-name": "इ पन्ना के उप-पन्ना",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|पुनर्निर्देश}}; $3 {{PLURAL:$3|ग़ैर-पुनर्निर्देश}})",
        "pageinfo-firstuser": "पन्ना सर्जक",
        "pageinfo-category-pages": "पृष्ठ संख्या",
        "pageinfo-category-subcats": "उपसंवर्ग के संख्या",
        "pageinfo-category-files": "फाइल सभके संख्या",
-       "markaspatrolleddiff": "दà¥\87à¤\96ि à¤²à¥\87ल à¤\97à¥\87ल, à¤\8fहन à¤\9aिनà¥\8dह à¤²à¤\97ाà¤\8a",
+       "markaspatrolleddiff": "à¤\9cाà¤\81à¤\9a à¤¸à¤®à¥\8dपनà¥\8dन à¤\95रà¥\80",
        "markaspatrolledtext": "देखि लेल गेल, एहन चिन्ह लगाऊ",
-       "markedaspatrolled": "दà¥\87à¤\96ि à¤²à¥\87ल à¤\97à¥\87ल, à¤\8fहन à¤\9aिनà¥\8dह à¤²à¤\97ाà¤\8a",
-       "markedaspatrolledtext": "[[:$1]]à¤\9aà¥\81नल à¤\97à¥\87ल à¤\85वतरणपर à¤¦à¥\87à¤\96हि à¤\97à¥\87ल à¤\95à¥\87 à¤\9aिनà¥\8dह à¤²à¤\97ायल à¤\97à¥\87ल.",
-       "rcpatroldisabled": "हाल में भेल बदलाव सभ पर नजर राखब बंद क देल गेल अछि.",
+       "markedaspatrolled": "à¤\9cाà¤\81à¤\9a à¤¸à¤®à¥\8dपनà¥\8dन à¤\95रà¥\80",
+       "markedaspatrolledtext": "[[:$1]]à¤\95 à¤\9aयनित à¤\85वतरणà¤\95 à¤\9cाà¤\81à¤\9a à¤¸à¤®à¥\8dपनà¥\8dन à¤­à¥\87ल।",
+       "rcpatroldisabled": "हालमे भेल परिवर्तनक परीक्षण अक्षम अछि",
        "rcpatroldisabledtext": "हाल में भेल बदलाव पर नजरि राखि के सुविधा बंद क देल गेल अछि.",
-       "markedaspatrollederror": "दà¥\87à¤\96 à¤²à¥\87लिय, à¤\8fहन à¤\9aिनà¥\8dह à¤¨à¤¹à¤¿ à¤²à¤\97ा à¤¸à¤\95ब.",
+       "markedaspatrollederror": "à¤\9cाà¤\81à¤\9a à¤¸à¤®à¥\8dपनà¥\8dन à¤¨à¥\88 à¤\95à¤\8fल à¤\9cा à¤¸à¤\95ल",
        "markedaspatrollederrortext": "अहाँ कोनो संशोधनकेँ संचालित निर्दिष्ट करू।",
        "markedaspatrollederror-noautopatrol": "अहाँ अपन कएल संशोधनकेँ संचालित नै कहि सकै छी।",
        "markedaspatrollednotify": "$1 पृष्ठ में कएल गएल ऐ परिवर्तन जाँचल गेल चिन्हासी कएल गेल।",
        "patrol-log-page": "संचालन वृत्तलेख",
        "patrol-log-header": "ई संचालित संशोधन सभक वृत्तलेख छी।",
        "log-show-hide-patrol": "$1 निरीक्षण वृत्तलेख",
-       "log-show-hide-tag": "$1 à¤\9fà¥\88à¤\97 à¤²à¥\89ग",
+       "log-show-hide-tag": "$1 à¤\9fà¥\8dयाà¤\97 à¤²ग",
        "deletedrevision": "पुरान संशोधन $1 हटा देलौं",
        "filedeleteerror-short": "संचिका मेटेबामे भ्रम : $1",
        "filedeleteerror-long": "संचिका मेटेबा काल भ्रम संकेत भेटल:\n$1",
        "filedelete-old-unregistered": "निर्दिष्ट संचिका संशोधन \"$1\" दत्तांशनिधिमे नै अछि।",
        "filedelete-current-unregistered": "निर्दिष्ट संचिका \"$1\" दत्तांशनिधिमे नै अछि।",
        "filedelete-archive-read-only": "पेटार निर्देशिका \"$1\" जालवितरक द्वारा लिखबा योग्य नै अछि।",
-       "previousdiff": "पुरान सम्पादन",
-       "nextdiff": "नव सम्पादन",
+       "previousdiff": "← पुरान सम्पादन",
+       "nextdiff": "नव सम्पादन →",
        "mediawarning": "'''चेतौनी''': ई संचिका प्रकार विषाणु कूटशब्द युक्त रहि सकैए।\nएकरा प्रयोग केलापर अहाँक तंत्रकेँ किछु समझौता करऽ पड़ि सकै छै।",
        "imagemaxsize": "चित्र आकारक सीमा:<br />''(संचिका वर्णन पन्ना लेल)''",
        "thumbsize": "संकुचितचित्र आकार:",
        "newimages-label": "संचिका नाम (वा ओकर अंश):",
        "newimages-showbots": "बोटद्वारा कएल गेल अपलोड देखाऊ",
        "noimages": "किछु देखबा योग्य नै |",
-       "ilsubmit": "ताà¤\95à¥\82",
-       "bydate": "तारà¥\80à¤\96 à¤¸à¤\82",
+       "ilsubmit": "ताà¤\95à¥\80",
+       "bydate": "तिथि à¤\85नà¥\81सार",
        "sp-newimages-showfrom": "$2, $1 सं शुरू होइबला नव संचिका देखाउ",
        "video-dims": "$1, $2 × $3",
        "seconds-abbrev": "$1s",
        "exif-datetime": "संचिका परिवर्तन तिथि आ समए",
        "exif-imagedescription": "चित्र शीर्षक",
        "exif-make": "कैमरा निर्माता",
-       "exif-model": "à¤\95à¥\88मरा मोडल",
+       "exif-model": "à¤\95à¥\8dयामरा मोडल",
        "exif-software": "प्रयुक्त तंत्रांश",
        "exif-artist": "लिखैबला",
        "exif-copyright": "सर्वाधिकारी",
        "confirmemail_needlogin": "अहाँकेँ करए पड़त $1 अपन ई-पत्र-संकेत सत्यापन लेल।",
        "confirmemail_success": "अहाँक ई-पत्र संकेत सत्यापित कएल गेल।\nअहाँ आब [[Special:UserLogin|सम्प्रवेश]]आ विकीक प्रयोग करू।",
        "confirmemail_loggedin": "अहाँक ई-पत्र संकेत आब सत्यापित भऽ गेल।",
-       "confirmemail_subject": "{{जालस्थल}} ई-पत्र संकेत सत्यापन",
+       "confirmemail_subject": "{{SITENAME}} ई-पत्र संकेत सत्यापन",
        "confirmemail_body": "कियो, सम्भवतः अहाँ, अनिकेत $1 सँ,\nखाता \"$2\" पंजीकृत करबेने छथि ऐ ई-पत्र संकेतसँ {{जालस्थल}} पर।\n\nई खाता अहींक छी से सत्यापित करबाक लेल आ अपन ई-पत्र आधारित सेवाक {{जालस्थल}} पर प्रारम्भ लेल, ऐ लागिकेँ अपन गवेषकमे खोलू:\n\n$3\n\nजँ अहाँ ई खाता *नै* पंजीकृत करबेने छी तँ ऐ लागि संगे जाउ\nअपन ई-पत्र सत्यापनकेँ खतम करबा लेल:\n\n$5\n\nई सत्यापन कूटशब्द $4 केँ खतम भऽ जाएत।",
        "confirmemail_body_changed": "कियो, सम्भवतः अहाँ, अनिकेत $1 सँ,\nखाता \"$2\" क ई-पत्र संकेत बदलनेने छथि ऐ  {{जालस्थल}} पर।\n\nई खाता अहींक छी से सत्यापित करबाक लेल आ अपन ई-पत्र आधारित सेवाक {{जालस्थल}} पर प्रारम्भ लेल, ऐ लागिकेँ अपन गवेषकमे खोलू:\n\n$3\n\nजँ अहाँ ई खाता *नै* पंजीकृत करबेने छी तँ ऐ लागि संगे जाउ\nअपन ई-पत्र सत्यापनकेँ खतम करबा लेल:\n\n$5\n\nई सत्यापन कूटशब्द $4 केँ खतम भऽ जाएत।",
        "confirmemail_body_set": "कियो, सम्भवतः अहाँ, अनिकेत $1 सँ,\nखाता \"$2\" क ई-पत्र संकेत पठेने छथि ऐ  {{जालस्थल}} पर।\n\nई खाता अहींक छी से सत्यापित करबाक लेल आ अपन ई-पत्र आधारित सेवाक {{जालस्थल}} पर प्रारम्भ लेल, ऐ लागिकेँ अपन गवेषकमे खोलू:\n\n$3\n\nजँ अहाँ ई खाता *नै* पंजीकृत करबेने छी तँ ऐ लागि संगे जाउ\nअपन ई-पत्र सत्यापनकेँ खतम करबा लेल:\n\n$5\n\nई सत्यापन कूटशब्द $4 केँ खतम भऽ जाएत।",
        "deletedwhileediting": "'''Warning''': अहां जखन सें संपादन शुरू केने छी, ओकर बाद से ई पृष्ठ के मिटा देल गेल अछि.",
        "confirmrecreate": "प्रयोगकर्ता [[User:$1|$1]] ([[User talk:$1|वार्ता]]) अहाँक कारण सहित सम्पादनक बाद ई पन्नाके मेटाए देलक:\n: ''$2''\nकृपा कऽ अहाँ सुनिश्चित करी जे अहाँ ई पन्नाक फेरसँ बनबऽ चाहै छी।",
        "confirmrecreate-noreason": "प्रयोक्ता [[User:$1|$1]] ([[User talk:$1|वार्ता]]) अहाँक सम्पादनक बाद ऐ पन्नाकेँ मेटा देलक| कृपा कऽ अहाँ सुनिश्चित करू जे अहाँ ऐ पन्नाकेँ फेरसँ बनबऽ चाहै छी।",
-       "recreate": "फà¥\87र à¤¸à¥\87à¤\82 à¤¬à¤¨à¤¾à¤\8a",
+       "recreate": "फà¥\87र à¤¸à¤\81 à¤¬à¤¨à¤¾à¤¬à¥\80",
        "confirm_purge_button": "ठीक अछि",
        "confirm-purge-top": "ऐ पन्नाक उपस्मृति खतम कऽ दिअ?",
        "confirm-purge-bottom": "कोनो पन्नाक सफाइ उपस्मृतिकेँ खतम करैए आ अद्यतन संशोधनकेँ अएबाले जोर दैए।",
        "confirm-unwatch-button": "ठीक अछि",
        "confirm-unwatch-top": "ऐ पन्नाकेँ हमर साकांक्ष सूचीसँ हटाउ",
        "quotation-marks": "\"$1\"",
-       "imgmultipageprev": "पहिलुका पृष्ठ",
-       "imgmultipagenext": "अगुलका पृष्ठ",
-       "imgmultigo": "à¤\9cाà¤\8a",
-       "imgmultigoto": "$1 à¤ªà¥\83षà¥\8dठ à¤ªà¤° à¤\9cाà¤\8a",
+       "imgmultipageprev": "← पहिलुका पृष्ठ",
+       "imgmultipagenext": "अगुलका पृष्ठ →",
+       "imgmultigo": "à¤\9cाà¤\8f!",
+       "imgmultigoto": "$1 à¤ªà¥\83षà¥\8dठ à¤ªà¤° à¤\9cाà¤\8f",
        "img-lang-default": "(डिफल्ट भाषा)",
        "img-lang-info": "ई चित्र को $1. $2 में ढालु",
        "img-lang-go": "जाऊ",
        "ascending_abbrev": "asc",
-       "descending_abbrev": "desc",
+       "descending_abbrev": "जानकारी",
        "table_pager_next": "अगला पृष्ठ",
        "table_pager_prev": "पहिलुका पृष्ठ",
-       "table_pager_first": "पहिलà¥\81à¤\95 पृष्ठ",
-       "table_pager_last": "à¤\85à¤\82तिम पृष्ठ",
-       "table_pager_limit": "à¤\8fà¤\95 à¤ªà¥\83षà¥\8dठ à¤ªà¤° $1 à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤¦à¥\87à¤\96ाà¤\8a",
+       "table_pager_first": "पहला पृष्ठ",
+       "table_pager_last": "à¤\85नà¥\8dतिम पृष्ठ",
+       "table_pager_limit": "à¤\8fà¤\95 à¤ªà¥\83षà¥\8dठ à¤ªà¤° $1 à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤¦à¥\87à¤\96ाबà¥\80",
        "table_pager_limit_label": "सामग्री प्रति पृष्ठ",
-       "table_pager_limit_submit": "à¤\9cाà¤\8a",
+       "table_pager_limit_submit": "à¤\9cाà¤\8f",
        "table_pager_empty": "कोनो परिणाम नहि",
        "autosumm-blank": "पृष्ठ के खाली करल गेल",
        "autosumm-replace": "\"$1\" सहित पाठ परिवर्तित भेल",
        "autoredircomment": "[[$1]] के अनुप्रेषित",
-       "autosumm-new": "'$1'संग नब पृष्ठ बनाओल गेल",
+       "autosumm-new": "'$1' संग नब पृष्ठ बनाओल गेल",
        "autosumm-newblank": "खालि पन्ना बनाओल गेल",
        "lag-warn-normal": "$1 सँ नव बदलल गेल {{PLURAL:$1|सेकेण्ड|सेकेण्ड}} ऐ सूचीमे नै देखाएल गेल।",
        "lag-warn-high": "उच्च दत्तनिधि वितरक देरीक कारण, $1 सँ नव परिवर्तन {{PLURAL:$1|सेकेण्ड|सेकेण्ड}} ऐ सूचीमे नै देखाएल जा सकल।",
        "watchlistedit-raw-legend": "काँच साकांक्षसूची संपादित करू",
        "watchlistedit-raw-explain": "अहाँक साकांक्ष-सूचीक शीर्षक सभ नीचाँ देल अछि, आ एकरा सूचीमे दऽ कऽ वा निकालि कऽ सम्पादित कएल जा सकैए;\nप्रति पाँती एक शीर्षक।\nजखन समाप्त भऽ जाए, क्लिक करू \"{{int:Watchlistedit-raw-submit}}\"।\nअहाँ [[Special:EditWatchlist|सामान्य सम्पादन-तंत्रांश प्रयोग करू]] ई सेहो कऽ सकै छी।",
        "watchlistedit-raw-titles": "शीर्षक",
-       "watchlistedit-raw-submit": "साà¤\95ाà¤\82à¤\95à¥\8dषसà¥\82à¤\9aà¥\80 à¤\85दà¥\8dयतन à¤\95रà¥\82",
+       "watchlistedit-raw-submit": "साà¤\95ाà¤\82à¤\95à¥\8dषसà¥\82à¤\9aà¥\80 à¤\85दà¥\8dयतन à¤\95रà¥\80",
        "watchlistedit-raw-done": "अहाँक साकांक्ष-सूची अद्यतन कएल गेल।",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 शीर्षक छल|$1शीर्षक सभ रहए}} जोड़ल गेल:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 शीर्षक छल|$1शीर्षक सभ रहए}} हटाएल गेल:",
        "watchlistedit-clear-removed": "{{PLURAL:$1|1 शीर्षक छल|$1शीर्षक सभ रहए}} हटाएल गेल:",
        "watchlistedit-too-many": "एतेक बहुत रास पन्ना सभ देखावोल जाएत।",
        "watchlisttools-clear": "साकांक्ष-सूची मेटाउ",
-       "watchlisttools-view": "समà¥\8dबनà¥\8dधित à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¸à¤­à¤\95à¥\87à¤\81 à¤¦à¥\87à¤\96à¥\82",
-       "watchlisttools-edit": "साकांक्षसूचीकेँ देखू आ सम्पादित करू",
-       "watchlisttools-raw": "à¤\95ाà¤\81à¤\9a à¤¸à¤¾à¤\95ाà¤\82à¤\95à¥\8dषसà¥\82à¤\9aà¥\80 à¤¸à¤\82पादित à¤\95रà¥\82",
-       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
+       "watchlisttools-view": "समà¥\8dबनà¥\8dधित à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¸à¤­à¤\95à¥\87à¤\81 à¤¦à¥\87à¤\96à¥\80",
+       "watchlisttools-edit": "साकांक्षसूची देखी आ सम्पादित करी",
+       "watchlisttools-raw": "à¤\95ाà¤\81à¤\9a à¤¸à¤¾à¤\95ाà¤\82à¤\95à¥\8dषसà¥\82à¤\9aà¥\80 à¤¸à¤®à¥\8dपादित à¤\95रà¥\80",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|वार्ता]])",
        "duplicate-defaultsort": "'''चेतौनी:''' पूर्वनिर्धारित विन्यास चाभी \"$2\" पहिलुका पूर्वनिर्धारित विन्यास चाभी \"$1\" केँ खतम करैए।",
        "duplicate-displaytitle": "<strong>चेतना:</strong> शीर्षक दिखाबु \"$2\" पूर्व दिखाएल गेल शीर्षक \"$1\" पे हाबी भऽ रहल अछि।",
        "invalid-indicator-name": "<strong>त्रुटि:</strong> पन्ना स्थिति सुचीत <code>नाम</code> गुण खाली नै रहना चाही।",
        "tags-source-extension": "एक्सटेन्सनद्वारा परिभाषित",
        "tags-source-manual": "प्रयोक्तासभ आर बोटद्वारा नियमानुसार लागू",
        "tags-source-none": "आब प्रयोग में नै",
-       "tags-edit": "समà¥\8dपादन à¤\95रà¥\82",
+       "tags-edit": "समà¥\8dपादन à¤\95रà¥\80",
        "tags-delete": "मेटाउ",
        "tags-activate": "सक्रिय करी",
        "tags-deactivate": "निष्क्रिय करी",
-       "tags-hitcount": "$1 {{PLURAL:$1|परिवर्तन|परिवर्तन सभ}}",
+       "tags-hitcount": "$1 {{PLURAL:$1|परिवर्तन|परिवर्तनसभ}}",
        "tags-manage-no-permission": "अहाँकेँ पन्ना घसकेबाक अधिकार नै अछि।",
        "tags-create-heading": "एकटा नयाँ विकि-समूह बनाबु",
        "tags-create-explanation": "पुनः निर्धारित रूप से, नवनिर्मित टैग प्रयोगकर्तासभ आर बॉट के लेल हाजीर राहत।",
        "htmlform-int-toohigh": "जे मान अहाँ देलौं से अधिकतम $1 सँ ऊपर अछि।",
        "htmlform-required": "ई मान चाही",
        "htmlform-submit": "दिअ",
-       "htmlform-reset": "परिवरà¥\8dतन à¤\96तम à¤\95रà¥\82",
+       "htmlform-reset": "परिवरà¥\8dतन à¤ªà¥\81रान à¤¸à¥\8dथिति à¤ªà¤° à¤\86नà¥\80",
        "htmlform-selectorother-other": "आन",
        "htmlform-no": "नै",
        "htmlform-yes": "हँ",
        "htmlform-cloner-delete": "हटाउ",
        "sqlite-has-fts": "$1 पूर्ण-पाठ खोज सहायता युक्त",
        "sqlite-no-fts": "$1 बिन पूर्ण-पाठ खोज सहायताक",
-       "logentry-delete-delete": "$1 {{लिंग:$2|deleted}} page $3",
+       "logentry-delete-delete": "$1 पृष्ठ $3 {{GENDER:$2|मेटौलक}}",
        "logentry-delete-restore": "$1 {{लिंग:$2|restored}} page $3",
        "logentry-delete-event": "$1 {{लिंग:$2|changed}} एकर दृश्य{{PLURAL:$5| एकटा वृत्तलेख|$5 वृत्तलेख}}  $3: $4 केँ",
        "logentry-delete-revision": "$1 {{लिंग:$2|changed}} एकर दृश्य{{PLURAL:$5| एकटा संशोधन|$5 संशोधन}}  पन्ना $3: $4 पर",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|चिन्हित}} संशोधन $4 $3 पन्नाक निरीक्षित",
        "logentry-patrol-patrol-auto": "$1 स्वतः {{GENDER:$2|चिन्हित}} संशोधन $4 $3 पन्नाक निरीक्षित",
        "logentry-newusers-newusers": "$1 {{लिंग:$2|बनाएल}} एकटा प्रयोक्ता खाता",
-       "logentry-newusers-create": "$1 {{लिङ्ग:$2|बनाएल}} एकटा प्रयोक्ता खाता",
+       "logentry-newusers-create": "प्रयोगकर्ता खाता $1 {{GENDER:$2|बनाएल}} गेल",
        "logentry-newusers-create2": "$1 {{लिंग:$2|बनाएल}} {{लिंग:$4|एकटा प्रयोक्ता खाता}} $3",
        "logentry-newusers-byemail": "$1 द्वारा प्रयोक्ता खाता $3 {{GENDER:$2|बनाओल}} गेल आ कूटशब्द ई-पत्र द्वारा भेजल गेल",
        "logentry-newusers-autocreate": "खाता $1 छल {{लिंग:$2|बनाएल}} स्वतः",
        "feedback-error1": "त्रुटि: नै पहचानल गेल परिणाम एपीआईसँ",
        "feedback-error2": "त्रुटि: संपादन विफल भेल",
        "feedback-error3": "त्रुटि:एपीआईसँग कोनो प्रतिक्रिया नै",
-       "feedback-message": "सà¤\82देश:",
+       "feedback-message": "सनà¥\8dदेश:",
        "feedback-subject": "विषय:",
        "feedback-submit": "दिअ",
        "feedback-thanks-title": "धन्यवाद!",
index b1ae6f7..ac4fb0e 100644 (file)
        "badarticleerror": "Ова дејство не може да се спроведе на оваа страница.",
        "cannotdelete": "Страницата или податотеката „$1“ не можеше да се избрише.\nМожеби некој друг веќе ја избришал.",
        "cannotdelete-title": "Не можам да ја избришам страницата „$1“",
-       "delete-hook-aborted": "Ð\91Ñ\80иÑ\88еÑ\9aеÑ\82о Ðµ Ð¿Ñ\80екинаÑ\82о Ñ\81о ÐºÑ\83ка.\nНе е дадено никакво образложение.",
+       "delete-hook-aborted": "Ð\91Ñ\80иÑ\88еÑ\9aеÑ\82о Ðµ Ð¿Ñ\80екинаÑ\82о Ñ\81о Ð¿Ñ\80еÑ\81Ñ\80еÑ\82ник.\nНе е дадено никакво образложение.",
        "no-null-revision": "Не можев да направам нова ништовна преработка на страницата „$1“",
        "badtitle": "Неисправен наслов",
        "badtitletext": "Бараниот наслов е грешен, празен или неисправно поврзан меѓујазичен или меѓупроектен наслов. \nМоже да содржи недопуштени знаци.",
        "changepassword-success": "Вашата лозинка е сменета!",
        "changepassword-throttled": "Имате премногу обиди за најава за кратко време.\nПочекајте $1 пред да се обидете повторно.",
        "botpasswords": "Ботовски лозинки",
+       "botpasswords-summary": "<em>Ботовските лозинки</em> даваат пристап до корисничка сметка преку приложникот без да се користат главните најавни податоци на сметката. Корисничките права може да се ограничени кога се најавувате на овој начин.\n\nДоколку не знаете за што ова би ви послужило, подобро не го правете ова. Никој никогаш не треба да ви побара да направите ваква лозинка и да му ја дадете.",
+       "botpasswords-disabled": "Ботовските лозинки се оневозможени.",
+       "botpasswords-no-central-id": "За да користите ботовски лозинки, мора да сте најавени со централизирана сметка.",
        "botpasswords-existing": "Постоечки ботовски лозинки",
        "botpasswords-createnew": "Направи нова ботовска лозинка",
        "botpasswords-editexisting": "Измени постоечка ботовска лозинка",
        "botpasswords-label-delete": "Избриши",
        "botpasswords-label-resetpassword": "Ставете нова лозинка",
        "botpasswords-label-grants": "Применливи доделувања:",
+       "botpasswords-help-grants": "Секое доделување дава пристап до список до наведени права што веќе ги има корисничката сметка. Повеќе ќе најдете на [[Special:ListGrants|табелата со доделувања]].",
+       "botpasswords-label-restrictions": "Ограничувања на употребата:",
        "botpasswords-label-grants-column": "Доделено",
        "botpasswords-bad-appid": "Името на ботот „$1“ е неважечко.",
+       "botpasswords-insert-failed": "Не успеав да го додадам името на ботот „$1“. Да не е веќе додадено?",
+       "botpasswords-update-failed": "Не успеав да го подновам името на ботот „$1“. Да не е избришано?",
+       "botpasswords-created-title": "Лозинка на ботот е создадена",
+       "botpasswords-created-body": "Лозинката на ботот со име „$1“ на корисникот „$2“ е создадена.",
+       "botpasswords-updated-title": "Лозинката на ботот е изменета",
+       "botpasswords-updated-body": "Лозинката на ботот со име „$1“ на корисникот „$2“ е изменета.",
+       "botpasswords-deleted-title": "Лозинка на ботот е избришана",
+       "botpasswords-deleted-body": "Лозинката на ботот со име „$1“ на корисникот „$2“ е избришана.",
+       "botpasswords-newpassword": "Новата лозинка за најава <strong>$1</strong> е <strong>$2</strong>. <em>Запишете си ја за во иднина.</em>",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider  е недостапен.",
+       "botpasswords-restriction-failed": "Не можете да се најавите поради ограничувањата за лозинки на ботови.",
+       "botpasswords-invalid-name": "Укажаното корисничко име не го содржи одделувачот ботовска лозинка („$1“).",
+       "botpasswords-not-exist": "Корисникот „$1“ нема ботовска лозинка „$2“.",
        "resetpass_forbidden": "Лозинките не може да се менуваат",
+       "resetpass_forbidden-reason": "Лозинките не може да се менуваат: $1",
        "resetpass-no-info": "Мора да сте најавени ако сакате да имате директен пристап до оваа страница.",
        "resetpass-submit-loggedin": "Смени лозинка",
        "resetpass-submit-cancel": "Откажи",
        "passwordreset-emailsentusername": "Ако има соодветна регистрирана е-пошта поврзана со ова корисничко име, тогаш ќе ви биде испратена порака за промена на лозинката.",
        "passwordreset-emailsent-capture": "Испратено е писмо за измена на лозинката (прикажано подолу).",
        "passwordreset-emailerror-capture": "Создадено е писмо за измена на лозинката (прикажано подолу), но не успеав да го испратам на {{GENDER:$2|корисникот}}: $1",
+       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Е-поштата за задавање на нова лозинка|Е-поштата за задавање на нови лозинки}} е испратена. Подолу е {{PLURAL:$1|е прикажано корисничкото име и лозинката|прикажан список на кориснички имиња и лозинки}}.",
+       "passwordreset-emailerror-capture2": "Испраќањето е-пошта на {{GENDER:$2|корисникот}} не успеа: $1 Подолу е {{PLURAL:$3|прикажано корисничкото име и лозинката|прикажан список на кориснички имиња и лозинки}}.",
+       "passwordreset-nocaller": "Мора да се укаже повикувач",
+       "passwordreset-nosuchcaller": "Повикувачот не постои: $1",
+       "passwordreset-ignored": "Менувањето на лозинката не успеа. Можеби не е поставен услужник?",
+       "passwordreset-invalideamil": "Неважечка е-пошта",
+       "passwordreset-nodata": "Немате укажано ни корисничко име, ни е-пошта.",
        "changeemail": "Смени или отстрани е-пошта",
        "changeemail-header": "Пополнете го образецов за да ја смените е-поштата. Ако сакате да ја отстраните адресата од вашата сметка, оставете го празно полето за нова е-пошта.",
        "changeemail-passwordrequired": "Ќе треба да ја внесете лозинката за да ја потврдите измената.",
        "minoredit": "Ова е ситна промена",
        "watchthis": "Набљудувај ја страницава",
        "savearticle": "Зачувај",
+       "savechanges": "Зачувај промени",
+       "publishpage": "Објави ја страницата",
+       "publishchanges": "Објави промени",
        "preview": "Преглед",
        "showpreview": "Преглед",
        "showdiff": "Прикажи промени",
        "accmailtext": "На $2 е спратена е случајно создадена лозинка за [[User talk:$1|$1]] е испратена. Истата може да се смени на страницата ''[[Special:ChangePassword|Менување на лозинка]]'' откако ќе се најавите.",
        "newarticle": "(нова)",
        "newarticletext": "Проследивте врска до страница која не постои.\nЗа да ја создадете страницата, напишете текст во полето подолу ([$1 помош]). Ако сте овде по грешка, само систнете на копчето '''назад''' во вашиот прелистувач.",
-       "anontalkpagetext": "----''Ова е страница за разговор со анонимен корисник кој сè уште не регистрирал корисничка сметка или не ја користи.\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}}|дали насловот се споменува]] во други статии,\nда ги <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} пребарате дневниците],\nили да [{{fullurl:{{FULLPAGENAME}}|action=edit}} ја создадете]</span>.",
        "noarticletext-nopermission": "Таква страница сè уште не постои.\nМожете да проверите [[Special:Search/{{PAGENAME}}|дали насловот се споменува]] во други статии или пак да <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} пребарате поврзаните дневници]</span>, но немате дозвола да ја создадете страницата.",
        "missing-revision": "Не ја пронајдов преработката бр. $1 на страницата со наслов „{{FULLPAGENAME}}“.\n\nОва обично се должи на застарена врска за разлики што води кон избришана страница.\nПовеќе подробности ќе најдете во [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневникот на бришења].",
        "userpage-userdoesnotexist": "Корисничката сметка „<nowiki>$1</nowiki>“ не е регистрирана.\nВе молиме размислете дали навистина сакате да ја создадете/уредите оваа страница.",
        "userpage-userdoesnotexist-view": "Корисничката сметка „$1“ не е регистрирана.",
        "blocked-notice-logextract": "Овој корисник е моментално блокиран.\nПодолу е прикажан последниот дневнички запис:",
-       "clearyourcache": "<strong>Ð\9dапомена:</strong>  Ð\9fо Ð·Ð°Ñ\87Ñ\83вÑ\83ваÑ\9aеÑ\82о Ð¼Ð¾Ñ\80аÑ\82е Ð´Ð° Ð³Ð¾ Ð¸Ñ\81Ñ\87иÑ\81Ñ\82иÑ\82е Ð¼ÐµÑ\93Ñ\83Ñ\81кладоÑ\82 (кеÑ\88) Ð½Ð° Ð¿Ñ\80елиÑ\81Ñ\82Ñ\83ваÑ\87оÑ\82 Ð·Ð° Ð´Ð° Ð¼Ð¾Ð¶ÐµÑ\82е Ð³Ð¸ Ð²Ð¸Ð´Ð¸Ñ\82е Ð¿Ñ\80омениÑ\82е.\n* <strong>Firefox / Safari:</strong> Ð\94Ñ\80жеÑ\82е <em>Shift</em> Ð¸ Ñ\81Ñ\82иÑ\81неÑ\82е Ð½Ð° <em>Ð\9fÑ\80евÑ\87иÑ\82аÑ\98</em> (<em>Reload</em>) Ð¸Ð»Ð¸ Ð¿Ñ\80иÑ\82иÑ\81неÑ\82е <em>Ctrl-F5</em> Ð¸Ð»Ð¸ <em>Ctrl-R</em> (''â\8c\98-R'' Ð½Ð° Mac);\n* <strong>Google Chrome:</strong> Ð\9fÑ\80иÑ\82иÑ\81неÑ\82е <em>Ctrl-Shift-R</em> (<em>â\8c\98-R</em> Ð½Ð° Mac)\n* <strong>Internet Explorer:</strong> Ð\94Ñ\80жеÑ\82е <em>Ctrl</em> Ð´Ð¾Ð´ÐµÐºÐ° Ð¿Ñ\80иÑ\82иÑ\81каÑ\82е Ð½Ð° <em>Refresh</em> Ð¸Ð»Ð¸ Ð¿Ñ\80иÑ\82иÑ\81неÑ\82е <em>Ctrl-F5</em>.\n* <strong>Opera:</strong> Ð\98Ñ\81Ñ\87иÑ\81Ñ\82еÑ\82е Ð³Ð¾ Ð¼ÐµÑ\93Ñ\83Ñ\81кладоÑ\82 Ð²Ð¾ <em>Tools â\86\92 Preferences</em>",
+       "clearyourcache": "<strong>Ð\9dапомена:</strong>  Ð\9fо Ð·Ð°Ñ\87Ñ\83вÑ\83ваÑ\9aеÑ\82о Ð¼Ð¾Ñ\80аÑ\82е Ð´Ð° Ð³Ð¾ Ð¸Ñ\81Ñ\87иÑ\81Ñ\82иÑ\82е Ð¼ÐµÑ\93Ñ\83Ñ\81кладоÑ\82 (кеÑ\88) Ð½Ð° Ð¿Ñ\80елиÑ\81Ñ\82Ñ\83ваÑ\87оÑ\82 Ð·Ð° Ð´Ð° Ð¼Ð¾Ð¶ÐµÑ\82е Ð³Ð¸ Ð²Ð¸Ð´Ð¸Ñ\82е Ð¿Ñ\80омениÑ\82е.\n* <strong>Firefox / Safari:</strong> Ð\94Ñ\80жеÑ\82е <em>Shift</em> Ð¸ Ñ\81Ñ\82иÑ\81неÑ\82е Ð½Ð° <em>Ð\9fÑ\80евÑ\87иÑ\82аÑ\98</em> (<em>Reload</em>) Ð¸Ð»Ð¸ Ð¿Ñ\80иÑ\82иÑ\81неÑ\82е <em>Ctrl-F5</em> Ð¸Ð»Ð¸ <em>Ctrl-R</em> (''â\8c\98-R'' Ð½Ð° Mac);\n* <strong>Google Chrome:</strong> Ð\9fÑ\80иÑ\82иÑ\81неÑ\82е <em>Ctrl-Shift-R</em> (<em>â\8c\98-R</em> Ð½Ð° Mac)\n* <strong>Internet Explorer:</strong> Ð\94Ñ\80жеÑ\82е <em>Ctrl</em> Ð´Ð¾Ð´ÐµÐºÐ° Ð¿Ñ\80иÑ\82иÑ\81каÑ\82е Ð½Ð° <em>Refresh</em> Ð¸Ð»Ð¸ Ð¿Ñ\80иÑ\82иÑ\81неÑ\82е <em>Ctrl-F5</em>.\n* <strong>Opera:</strong> Ð\9fоÑ\98деÑ\82е Ð½Ð° <em>Menu â\86\92 Settings</em> (<em>Opera â\86\92 Preferences</em> Ð½Ð° Ð\9cекинÑ\82оÑ\88), Ð° Ð¿Ð¾Ñ\82оа Ð½Ð° <em>Privacy & security â\86\92 Clear browsing data â\86\92 Cached images and files</em>.",
        "usercssyoucanpreview": "'''Совет:''' Употребете го копчето „{{int:showpreview}}“ за да го испробате вашиот нов CSS пред да зачувате.",
        "userjsyoucanpreview": "'''Совет:''' Употребете го копчето „{{int:showpreview}}“ за да ја испробате вашата нова JavaScript  пред да зачувате.",
        "usercsspreview": "'''Запомнете дека ова е само преглед на вашиот кориснички CSS код, страницата сè уште не е зачувана!'''",
        "previewnote": "'''Имајте предвид дека ова е само преглед.'''\nПромените сè уште не се зачувани!",
        "continue-editing": "Оди на полето за уредување",
        "previewconflict": "Овој преглед прикажува како ќе изгледа текстот внесен во горниот дел откако ќе се зачува страницата.",
-       "session_fail_preview": "'''Жалиме! Не можевме да го обработиме вашето уредување поради загуба на податоци од седницата.'''\nОбидете се повторно.\nАко сè уште не функционира, обидете се да се [[Special:UserLogout|одјавите]] и повторно да се најавите.",
-       "session_fail_preview_html": "'''Жалиме, но Вашето уредување не можеше да се обработи поради загува на податоците од седницата.'''\n\n''{{SITENAME}} има овозможено чист HTML, па прегледот е скриен како мерка за заштита од JavaScript-напади.''\n\n'''Ако ова е разумен обид за уредување, тогаш обидете се повторно.'''\nАко и ова не го реши проблемот, обидете се со [[Special:UserLogout|одјавување]] и повторно најавување.",
+       "session_fail_preview": "За жал, не можев да го обработам уредувањето поради загуба на седнички податоци.\n\nМожеби сте биле одјавени. <strong>Проверете дали сè уште сте најавени и обидете се повторно</strong>.\nАко проблемот продолжи да се јавува, [[Special:UserLogout|одјавете се]] и повторно најавете се, и проверете дали прелистувачот дозволува колачиња од ова мрежно место.",
+       "session_fail_preview_html": "'''Жалиме, но Вашето уредување не можеше да се обработи поради загува на податоците од седницата.'''\n\n''{{SITENAME}} има овозможено чист HTML, па прегледот е скриен како мерка за заштита од JavaScript-напади.''\n\n'''Ако ова е разумен обид за уредување, тогаш обидете се повторно.'''\nАко и ова не го реши проблемот, обидете се со [[Special:UserLogout|одјавување]] и повторно најавување, и проверете дали прелистувачот дозволува колачиња од ова мрежно место.",
        "token_suffix_mismatch": "'''Вашето уредување е одбиено затоа што вашиот пребарувач направил проблеми со интерпукциските знаци во шифрата на уредувањето.\nУредувањето не е прифатено за да се спречи несакана промена на текстот на страницата.\nОва понекогаш се случува кога користите неисправна мрежна анонимна застапничка (proxy) служба.'''",
        "edit_form_incomplete": "'''Некои делови од образецот за уредување не стасаа до опслужувачот. Внимателно проверете дали уреденото не е пореметено и обидете се поввторно.'''",
        "editing": "Уредување на $1",
        "moveddeleted-notice": "Оваа страница била претходно бришена.\nДневникот на бришења и преместувања за оваа страница е прикажан подолу за ваше дополнително информирање.",
        "moveddeleted-notice-recent": "За жал, страницава беше неодамна избришана (во последниве 24 часа).\nПодолу можете да го погледате дневникот на бришење и преместување.",
        "log-fulllog": "Преглед на целиот дневник",
-       "edit-hook-aborted": "УÑ\80едÑ\83ваÑ\9aеÑ\82о Ðµ Ð¿Ñ\80екинаÑ\82о Ñ\81о ÐºÑ\83ка.\nНе е дадено никакво образложение.",
+       "edit-hook-aborted": "УÑ\80едÑ\83ваÑ\9aеÑ\82о Ðµ Ð¿Ñ\80екинаÑ\82о Ñ\81о Ð¿Ñ\80еÑ\81Ñ\80еÑ\82ник.\nНе е дадено никакво образложение.",
        "edit-gone-missing": "Не можев да ја подновам страницата.\nВеројатно е избришана.",
        "edit-conflict": "Спротиставеност во уредувањето.",
        "edit-no-change": "Вашите уредувања беа игнорирани, бидејќи не се направени промени врз текстот.",
        "content-model-css": "CSS",
        "content-json-empty-object": "Празен објект",
        "content-json-empty-array": "Празна низа",
+       "deprecated-self-close-category": "Страници со неважечки самозатворени HTML-ознаки",
+       "deprecated-self-close-category-desc": "Страницава содржи неважечки самозатворени HTML-ознаки, како што се <code>&lt;b/></code> или <code>&lt;span/></code>. Нивното поведение наскоро ќе биде сменето, за да бидат во склад со определбите на HTML5. Ова значи дека се застарени и не треба да се употребуваат во викитекст.",
        "duplicate-args-warning": "<strong>Предупредување:</strong> [[:$1]] го повикува [[:$2]] со повеќе од една вредност за параметарот „$3“. Ќе се употреби само последната вредност.",
        "duplicate-args-category": "Страници што користат дуплирани аргументи во повикувања на шаблони",
        "duplicate-args-category-desc": "Страницава содржи повикувања на шаблони кои се дупликати на аргументи, како што се <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> или <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "revdelete-unsuppress": "Отстрани ограничувања на обновени преработки",
        "revdelete-log": "Причина:",
        "revdelete-submit": "Примени врз {{PLURAL:$1|одбрана преработка|одбрани преработки}}",
-       "revdelete-success": "'''Видливоста на преработката е успешно изменета.'''",
+       "revdelete-success": "Видливоста на преработката е изменета.",
        "revdelete-failure": "'''Видливоста на преработката не можеше да се измени:'''\n$1",
-       "logdelete-success": "'''Успешно нагодување на дневник на видливост.'''",
+       "logdelete-success": "Дневникот на видливост е поставен.",
        "logdelete-failure": "'''Дневникот на видливост не може да биде нагоден:'''\n$1",
        "revdel-restore": "Промена на видливост",
        "pagehist": "Историја на страницата",
        "mergehistory-fail-bad-timestamp": "Временската ознака е неважечка.",
        "mergehistory-fail-invalid-source": "Изворната страница е неважечка.",
        "mergehistory-fail-invalid-dest": "Целната страница е неважечка.",
+       "mergehistory-fail-no-change": "Спојувањето на историјата не спои ниедна преработка. Проверете ја страницата и временските параметри.",
        "mergehistory-fail-permission": "Немате дозвола за да ја споите историјата.",
        "mergehistory-fail-self-merge": "Изворната и целната страница се исти.",
+       "mergehistory-fail-timestamps-overlap": "Изворните преработки се преклопуваат или допаѓаат по целните преработки.",
        "mergehistory-fail-toobig": "Не можам да извршам спојување на историјата бидејќи така ќе се надмине границата од {{PLURAL:$1|една преработка|$1 преработки}}.",
        "mergehistory-no-source": "Изворната страница $1 не постои.",
        "mergehistory-no-destination": "Целната страница $1 не постои.",
        "difference-title-multipage": "$1 и $2: Разлика помеѓу страниците",
        "difference-multipage": "(Разлики помеѓу страници)",
        "lineno": "Ред $1:",
-       "compareselectedversions": "СпоÑ\80еди Ð¸Ð·Ð±Ñ\80ани преработки",
-       "showhideselectedversions": "Ð\9fÑ\80икажи/Ñ\81кÑ\80иÑ\98 Ð¸Ð·Ð±Ñ\80ани преработки",
+       "compareselectedversions": "СпоÑ\80еди Ð³Ð¸ Ð¸Ð·Ð±Ñ\80аниÑ\82е преработки",
+       "showhideselectedversions": "Ð\9fÑ\80икажи/Ñ\81кÑ\80иÑ\98 Ð³Ð¸ Ð¸Ð·Ð±Ñ\80аниÑ\82е преработки",
        "editundo": "откажи",
        "diff-empty": "(нема разлика)",
        "diff-multi-sameuser": "({{PLURAL:$1|Не е прикажана една меѓувремена преработка|Не се прикажани $1 меѓувремени преработки}} од истиот корисник)",
        "search-nonefound-thiswiki": "Нема резултати што одговараат на бараното на ова мрежно место.",
        "powersearch-legend": "Напредно пребарување",
        "powersearch-ns": "Пребарај во следниве именски простори:",
-       "powersearch-togglelabel": "Ð\9eдбеÑ\80и:",
+       "powersearch-togglelabel": "Ð\98збоÑ\80:",
        "powersearch-toggleall": "Сè",
        "powersearch-togglenone": "Ништо",
        "powersearch-remember": "Запoмни го изборот за идни пребарувања",
        "userrights": "Раководење со кориснички права",
        "userrights-lookup-user": "Раководење со кориснички групи",
        "userrights-user-editname": "Внесете корисничко име:",
-       "editusergroup": "Уреди кориснички групи",
+       "editusergroup": "Уреди {{GENDER:$1|кориснички}} групи",
        "editinguser": "Менување на правата на {{GENDER:$1|корисникот}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Уреди ги корисничките групи",
        "saveusergroups": "Зачувај ги {{GENDER:$1|корисничките}} групи",
        "userrights-unchangeable-col": "Групи кои не може да ги промените",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Спротиставеност во измените на корисничките права. Прегледајте ги и потврдете ги.",
-       "userrights-removed-self": "УÑ\81пеÑ\88но Ð³и отстранивте вашите права. Затоа, повеќе немате пристап на страницава.",
+       "userrights-removed-self": "Ð\93и отстранивте вашите права. Затоа, повеќе немате пристап на страницава.",
        "group": "Група:",
        "group-user": "Корисници",
        "group-autoconfirmed": "Автопотврдени корисници",
        "right-createpage": "Создавање на страници (кои не се страници за разговор)",
        "right-createtalk": "Создавање на страници за разговор",
        "right-createaccount": "Создавање на нови кориснички сметки",
+       "right-autocreateaccount": "Автоматска најава со надворешна корисничка сметка",
        "right-minoredit": "Означување на уредувањата како ситни",
        "right-move": "Преместување страници",
        "right-move-subpages": "Преместување на страници со нивните потстраници",
        "right-override-export-depth": "Извезување на страници вклучувајќи поврзани страници со длабочина до 5",
        "right-sendemail": "Испраќање на е-пошта до други корисници",
        "right-passwordreset": "Преглед на пораки по е-пошта за промена на лозинка",
-       "right-managechangetags": "Создавање3 или бришење на [[Special:Tags|ознаки]] од базата",
+       "right-managechangetags": "Создавање и (де)активирање на [[Special:Tags|ознаки]]",
        "right-applychangetags": "Задавање на [[Special:Tags|ознаки]] заедно со направените измени",
        "right-changetags": "Додавате и отстранување на произволни [[Special:Tags|ознаки]] во поединечни преработки и дневнички записи",
-       "grant-generic": "Група права „$1“",
+       "right-deletechangetags": "Бришење [[Special:Tags|ознаки]] од базата",
+       "grant-generic": "Збир права „$1“",
        "grant-group-page-interaction": "Опходување со страници",
        "grant-group-file-interaction": "Опходување со слики и снимки",
        "grant-group-watchlist-interaction": "Опходување со набљудуваните",
        "action-read": "читање на оваа страница",
        "action-edit": "уредување на оваа страница",
        "action-createpage": "создавање страници",
-       "action-createtalk": "создавање страници за разговор",
+       "action-createtalk": "создавање на оваа страница за разговор",
        "action-createaccount": "создај ја оваа корисничка сметка",
+       "action-autocreateaccount": "автоматско создавање на оваа надворешна корисничка сметка",
        "action-history": "преглед на историјата на оваа страница",
        "action-minoredit": "означување на ова уредување како ситно",
        "action-move": "преместување на оваа страница",
        "action-viewmyprivateinfo": "преглед на вашите лични податоци",
        "action-editmyprivateinfo": "уредување на вашите лични податоци",
        "action-editcontentmodel": "уредување на содржинскиот модел на страница",
-       "action-managechangetags": "создавање или бришење на ознаки од базата",
+       "action-managechangetags": "создавање или (де)активирање на ознаки",
        "action-applychangetags": "ставање на ознаки заедно со напревените промени",
        "action-changetags": "додавање и отстранување на произволни ознаки во поединечни преработки и дневнички записи",
+       "action-deletechangetags": "бришење ознаки од базата",
        "nchanges": "$1 {{PLURAL:$1|промена|промени}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|од последната посаета}}",
        "enhancedrc-history": "историја",
        "recentchangeslinked-page": "Име на страницата:",
        "recentchangeslinked-to": "Прикажи ги промените на страниците поврзани со дадената страница",
        "recentchanges-page-added-to-category": "[[:$1]] ставена во категорија",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] и уште [[Special:WhatLinksHere/$1|{{PLURAL:$2|една страница ставена|$2 страници ставеи}}]] во категорија",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] ставена во категорија, [[Special:WhatLinksHere/$1|оваа страница е вклучена во рамките на други страници]]",
        "recentchanges-page-removed-from-category": "[[:$1]] отстранета од категорија",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] Ð¸ Ñ\83Ñ\88Ñ\82е {{PLURAL:$2|една Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¾Ñ\82Ñ\81Ñ\82Ñ\80анеÑ\82а|$2 Ñ\81Ñ\82Ñ\80аниÑ\86и Ð¾Ñ\82Ñ\81Ñ\82Ñ\80анеÑ\82и}} Ð¾Ð´ ÐºÐ°Ñ\82егоÑ\80иÑ\98а",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] Ð¾Ñ\82Ñ\81Ñ\82Ñ\80анеÑ\82а Ð¾Ð´ ÐºÐ°Ñ\82егоÑ\80иÑ\98а, [[Special:WhatLinksHere/$1|оваа Ñ\81Ñ\82Ñ\80аниÑ\86а Ðµ Ð²ÐºÐ»Ñ\83Ñ\87ена Ð²Ð¾ Ñ\80амкиÑ\82е Ð½Ð° Ð´Ñ\80Ñ\83ги Ñ\81Ñ\82Ñ\80аниÑ\86и]]",
        "autochange-username": "Автоматски промени на МедијаВики",
        "upload": "Подигање",
        "uploadbtn": "Подигни",
        "filename-tooshort": "Името на податотеката е прекратко.",
        "filetype-banned": "Овој тип на податотека е забранет.",
        "verification-error": "Оваа податотека не ја помина потврдата успешно.",
-       "hookaborted": "Ð\98змениÑ\82е Ñ\88Ñ\82о Ñ\81акаÑ\82е Ð´Ð° Ð³Ð¸ Ð½Ð°Ð¿Ñ\80авиÑ\82е Ñ\81е Ð¾Ñ\82кажани Ð¾Ð´ ÐºÑ\83ка на додатокот.",
+       "hookaborted": "Ð\98змениÑ\82е Ñ\88Ñ\82о Ñ\81акаÑ\82е Ð´Ð° Ð³Ð¸ Ð½Ð°Ð¿Ñ\80авиÑ\82е Ñ\81е Ð¾Ñ\82кажани Ð¾Ð´ Ð¿Ñ\80еÑ\81Ñ\80еÑ\82ник на додатокот.",
        "illegal-filename": "Такво име за податотеката на е дозволено.",
        "overwrite": "Не е дозволено запишување врз постоечка податотека.",
        "unknown-error": "Се појави непозната грешка.",
        "uploaded-script-svg": "Пронајдов скриптен елемент „$1“ во подигнатата SVG-податотека.",
        "uploaded-hostile-svg": "Пронајдов небезбеден CSS во стилскиот елемент на подигнатата SVG-податотека.",
        "uploaded-event-handler-on-svg": "Задавањето на атрибути <code>$1=\"$2\"</code> за работа со настани не е дозволено за SVG-податотеки.",
-       "uploaded-href-unsafe-target-svg": "Пронајдов href кон небезбедна цел <code>&lt;$1 $2=\"$3\"&gt;</code> во подигнатата SVG-податотека.",
+       "uploaded-href-attribute-svg": "На href-атрибутите во SVG-податотеки им е дозволено да водат само до цели со претставки http:// или https://, кои се наоѓаат на <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-href-unsafe-target-svg": "Пронајдов href кон небезбедни податоци: URI-цел <code>&lt;$1 $2=\"$3\"&gt;</code> во подигнатата SVG-податотека.",
        "uploaded-animate-svg": "Пронајдов ознака „animate“ што може да го менува href, користејќи го атрибутот „from“ <code>&lt;$1 $2=\"$3\"&gt;</code> во подигнатата SVG-податотека.",
        "uploaded-setting-event-handler-svg": "Задавањето на атрибути за работа со настани е спречено. Пронајдов <code>&lt;$1 $2=\"$3\"&gt;</code> во подигнатата SVG-податотека.",
        "uploaded-setting-href-svg": "Употребата на ознаката „set“ tag за ставање на атрибутот „href“ во матичен елемент е спречена.",
        "upload-too-many-redirects": "Оваа URL содржеше премногу пренасочувања",
        "upload-http-error": "Се појави грешка во HTTP: $1.",
        "upload-copy-upload-invalid-domain": "Примероци од подигањата не се достапни на овој домен.",
+       "upload-foreign-cant-upload": "Ова вики не е поставено за подигање на податотеки на бараното надворешно складиште.",
+       "upload-foreign-cant-load-config": "Не можев да ја вчитам поставеноста за подигање податотеки на надворешни складишта.",
+       "upload-dialog-disabled": "Подигањето на податотеки со помош на овој дијалог е оневозможено на ова вики.",
        "upload-dialog-title": "Подигни податотека",
        "upload-dialog-button-cancel": "Откажи",
        "upload-dialog-button-done": "Готово",
        "backend-fail-read": "Не можев да ја прочитам податотеката $1",
        "backend-fail-create": "Не можев да ја запишам податотеката $1.",
        "backend-fail-maxsize": "Не можев да ја запишам податотеката $1 бидејќи е поголема од {{PLURAL:$2|еден бајт|$2 бајти}}.",
-       "backend-fail-readonly": "Складишната основа „$1“ моментално не може да се запишува. Наведената причина гласи: „$2“",
+       "backend-fail-readonly": "Складишната основа „$1“ моментално не може да се запишува. Наведената причина гласи: <em>$2</em>",
        "backend-fail-synced": "Податотеката „$1“ е во состојба недоследна во рамките на внатрешните складишни основи",
        "backend-fail-connect": "Не можев да се поврзам со складишната основа „$1“.",
        "backend-fail-internal": "Се појави непозната грешка во складишната основа „$1“.",
        "apihelp": "Помош со извршникот",
        "apihelp-no-such-module": "Модулот „$1“ не е пронајден.",
        "apisandbox": "Извршнички песочник",
+       "apisandbox-jsonly": "Употребата на овој извршнички песочник бара JavaScript.",
        "apisandbox-api-disabled": "Извршникот е оневозможен на ова мрежно место.",
-       "apisandbox-intro": "Страницава служи за вршење проби со '''Извршник на МедијаВики'''.\n\nПовеќе за употребата на овој извршник ќе најдете во [https://www.mediawiki.org/wiki/API:Main_page неговата документација].  Пример: [https://www.mediawiki.org/wiki/API#A_simple_example преземање на содржината на главната страница].  Одберете дејство за да видите повеќе примери.\n\nИмајте предвид дека она шо го правите на страницава може да се одрази врз викито, иако ова е песочник.",
+       "apisandbox-intro": "Страницава служи за вршење проби со <strong>Извршник на МедијаВики</strong>.\n\nПовеќе за употребата на овој извршник ќе најдете во  [[mw:API:Main page|неговата документација]]. Пример: [https://www.mediawiki.org/wiki/API#A_simple_example преземање на содржината на Главната страница].  Одберете дејство за да видите повеќе примери.\n\nИмајте предвид дека она шо го правите на страницава може да се одрази врз викито, иако ова е песочник.",
+       "apisandbox-fullscreen": "Рашири го полето",
+       "apisandbox-fullscreen-tooltip": "Рашири го полето на песочникот колку што е голем прозорецот на прелистувачот.",
        "apisandbox-unfullscreen": "Прикажи страница",
+       "apisandbox-unfullscreen-tooltip": "Смали го полето на песочникот, за да се покажуваат навигациските врски на МедијаВики.",
        "apisandbox-submit": "Постави барање",
        "apisandbox-reset": "Исчисти",
        "apisandbox-retry": "Пробај пак",
+       "apisandbox-loading": "Вчитувам информации за извршничкиот модул „$1“...",
+       "apisandbox-load-error": "Се појави грешка при вчитувањето на информациите за извршничкиот модул „$1“: $2",
+       "apisandbox-no-parameters": "Извршничкиот модул нема параметри.",
+       "apisandbox-helpurls": "Врски за помош",
        "apisandbox-examples": "Примери",
        "apisandbox-dynamic-parameters": "Дополнителни параметри",
        "apisandbox-dynamic-parameters-add-label": "Додај параметар:",
        "apisandbox-dynamic-parameters-add-placeholder": "Назив на параметарот",
+       "apisandbox-dynamic-error-exists": "Праметарот по име „$1“ веќе постои.",
+       "apisandbox-deprecated-parameters": "Застарени параметри",
+       "apisandbox-fetch-token": "Самопополни ја шифрата",
+       "apisandbox-submit-invalid-fields-title": "Некои полиња се неважечки",
+       "apisandbox-submit-invalid-fields-message": "Исправете ги обележаните полиња и обидете се повторно.",
        "apisandbox-results": "Исход",
+       "apisandbox-sending-request": "Испраќам барање до извршникот...",
+       "apisandbox-loading-results": "Добивам исход од извршникот...",
+       "apisandbox-results-error": "Се појави грешка при вчитувањето на одговорот од барањето до извршникот: $1.",
        "apisandbox-request-url-label": "URL на барањето:",
-       "apisandbox-request-time": "Време за барањето: $1",
+       "apisandbox-request-time": "Време за барањето: {{PLURAL:$1|$1 милисекунда|$1 милисекунди}}",
+       "apisandbox-results-fixtoken": "Исправи ја шифрата и поднеси одново",
+       "apisandbox-results-fixtoken-fail": "Не успеав да ја добијам шифрата „$1“.",
+       "apisandbox-alert-page": "Полињата на страницава се неважечки.",
+       "apisandbox-alert-field": "Вредноста на полево е неважечка.",
        "booksources": "Печатени извори",
        "booksources-search-legend": "Пребарување на извори за книга",
        "booksources-isbn": "ISBN:",
        "log-title-wildcard": "Пребарај наслови кои почнуваат со овој текст",
        "showhideselectedlogentries": "Прикажи/скриј одбрани записи",
        "log-edit-tags": "Измени ознаки на одредени дневнички записи",
-       "checkbox-select": "Ð\9eдбеÑ\80и: $1",
+       "checkbox-select": "Ð\98збоÑ\80: $1",
        "checkbox-all": "Сите",
        "checkbox-none": "Ништо",
        "checkbox-invert": "Избери обратно",
        "trackingcategories-msg": "Следечка категорија",
        "trackingcategories-name": "Назив на пораката",
        "trackingcategories-desc": "Критериуми за вклучување",
+       "restricted-displaytitle-ignored": "Страници со занемарени наслови за приказ",
+       "restricted-displaytitle-ignored-desc": "Страницата има занемарен <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> бидејќи не е истоветен на нејзиниот стварен наслов.",
        "noindex-category-desc": "Роботите не ја индексираат страницава бидејќи го содржи волшебниот збор <code><nowiki>__NOINDEX__</nowiki></code> и се наоѓа во именски простор кајшто е дозволен.",
        "index-category-desc": "Страницата содржи <code><nowiki>__INDEX__</nowiki></code> (и се наоѓа во именски простор кајшто ова е дозволено), па затоа се индексира од роботи, што инаку не би било.",
        "post-expand-template-inclusion-category-desc": "Страницата е поголема од <code>$wgMaxArticleSize</code> по проширувањето на сите шаблони. Затоа, некои шаблони не се проширени.",
        "rollbacklinkcount": "отповикај $1 {{PLURAL:$1|уредување|уредувања}}",
        "rollbacklinkcount-morethan": "отповикај повеќе од $1 {{PLURAL:$1|уредување|уредувања}}",
        "rollbackfailed": "Отповикувањето не успеа",
+       "rollback-missingparam": "Недостасуваат задолжителни параметри за барањето.",
        "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-nouser": "Вратени уредувања од скриен корисник на последната преработка на {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Откажани уредувањата на $1; вратено на последната верзија на $2.",
+       "rollback-success-notify": "Откажани уредувањата на $1;\nвратено на последната преработка на $2. [$3 Пок. промени]",
        "sessionfailure-title": "Седницата не успеа",
        "sessionfailure": "Има проблем со вашата седница;\nоваа дејство е откажано како превентива против преземање седници.\nПритиснете го копчето „назад“ и повторно вчитајте ја страницата од која дојдовте и обидете се повторно.",
        "changecontentmodel": "Промена на содржинскиот модел на страница",
        "sp-contributions-username": "IP-адреса или корисничко име:",
        "sp-contributions-toponly": "Прикажувај само последни преработки",
        "sp-contributions-newonly": "Прикажувај само новосоздадени страници",
+       "sp-contributions-hideminor": "Скриј ситни промени",
        "sp-contributions-submit": "Пребарај",
        "whatlinkshere": "Што води овде",
        "whatlinkshere-title": "Страници со врски што водат до „$1“",
        "import-nonewrevisions": "Не увезов ниедна преработка (сите се веќе присутни или изоставени поради грешки)",
        "xml-error-string": "$1 во ред $2, колона $3 (бајт $4): $5",
        "import-upload": "Подигни XML податоци",
-       "import-token-mismatch": "Загубени на податоците од седницата. Обидете се повторно.",
+       "import-token-mismatch": "Загубени седничките податоци.\n\nМоже да сте биле одјавени. <strong>Проверете дали сè уште сте најавени и обидете се повторно</strong>.\nАко проблемот продолжи да се јавува, [[Special:UserLogout|одјавете се]] и повторно најавете се, и проверете дали прелистувачот дозволува колачиња од ова мрежно место.",
        "import-invalid-interwiki": "Не можам да увезам од наведеното вики.",
        "import-error-edit": "Страницата „$1“ не е увезена бидејќи не ви е дозволено да ја уредувате.",
        "import-error-create": "Страницата „$1“ не е увезена бидејќи не ви е дозволено да ја создадете.",
        "tooltip-ca-nstab-category": "Преглед на категоријата",
        "tooltip-minoredit": "Обележи ја промената како ситна",
        "tooltip-save": "Зачувајте ги промените",
+       "tooltip-publish": "Објавете ги вашите промени",
        "tooltip-preview": "Преглед на промените - ве молиме користете го ова пред зачувување!",
        "tooltip-diff": "Покажи кои промени ги направи во текстот.",
        "tooltip-compareselectedversions": "Видете ја разликата помеѓу двете избрани верзии на оваа страница.",
        "confirmemail_body_set": "Некој, веројатно Вие, од IP-адресата $1,\nна {{SITENAME}} ја внел оваа е-поштенска адреса на сметката „$2“.\n\nЗа да потврдите дека оваа адреса навистина Ви припаѓа Вам и за да ги вклучите\nможностите за е-пошта на {{SITENAME}}, отворете ја следнава врска во прелистувачот:\n\n$3\n\nАко сметката *не* е Ваша, проследете ја следнава врска\nза да ја откажете потврдата:\n\n$5\n\nОвој потврден код истекува во $4.",
        "confirmemail_invalidated": "Потврдата на е-поштенската адреса е откажана",
        "invalidateemail": "Откажување на потврда на е-пошта",
+       "notificationemail_subject_changed": "Е-поштата регистрирана на {{SITENAME}} е сменета",
+       "notificationemail_subject_removed": "Е-поштата регистрирана на {{SITENAME}} е отстранета",
+       "notificationemail_body_changed": "Некој, веројатно вие, од IP-адресата $1,\nја сменил е-поштата на сметката „$2“ на {{SITENAME}} во „$3“.\n\nАко ова не сте вие, веднаш обратете се кај администратор.",
+       "notificationemail_body_removed": "Некој, веројатно вие, од IP-адресата $1,\nја отстранил е-поштата на сметката „$2“ на {{SITENAME}}.\n\nАко ова не сте вие, веднаш обратете се кај администратор.",
        "scarytranscludedisabled": "[Превметнувањето помеѓу викијата е оневозможено]",
        "scarytranscludefailed": "[Преземањето на шаблонот за $1 не успеа]",
        "scarytranscludefailed-httpstatus": "[Преземањето на шаблонот не успеа за $1: HTTP $2]",
        "scarytranscludetoolong": "[Премногу долго URL]",
        "deletedwhileediting": "'''Предупредување''': Оваа страница беше избришана откако почнавте со нејзино уредување!",
-       "confirmrecreate": "Корисникот [[User:$1|$1]] ([[User talk:$1|разговор]]) ја избриша оваа страница откако вие почнавте со уредување заради:\n: ''$2''\nПотврдете дека навистина сакате повторно да ја создадете оваа страница.",
-       "confirmrecreate-noreason": "Корисникот [[User:$1|$1]] ([[User talk:$1|разговор]]) ја избриша страницава откако почнавте да ја уредувате.  Потврдете деак навистина сакате да ја пресоздадете страницата.",
+       "confirmrecreate": "Корисникот [[User:$1|$1]] ([[User talk:$1|разговор]]) {{GENDER:$1|ја избриша}} страницава откако вие почнавте со уредување, со причината:\n: ''$2''\nПотврдете дека навистина сакате да ја пресоздадете страницата.",
+       "confirmrecreate-noreason": "Корисникот [[User:$1|$1]] ([[User talk:$1|разговор]]) {{GENDER:$1|ја избриша}} страницава откако почнавте да ја уредувате.  Потврдете дека навистина сакате да ја пресоздадете страницата.",
        "recreate": "Пресоздај",
        "unit-pixel": "п",
        "confirm_purge_button": "OK",
        "watchlistedit-raw-done": "Вашиот список на набљудувања е подновен.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 наслов беше|$1 наслови беа}} додадени:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Избришан е еден наслов|Избришани се $1 наслови}}:",
-       "watchlistedit-clear-title": "Ð\98Ñ\81Ñ\87иÑ\81Ñ\82ени Ð½Ð°Ð±Ñ\99Ñ\83дÑ\83ваниÑ\82е",
+       "watchlistedit-clear-title": "Ð\98Ñ\81Ñ\87иÑ\81Ñ\82и Ð½Ð°Ð±Ñ\99Ñ\83дÑ\83вани",
        "watchlistedit-clear-legend": "Исчисти набљудувани",
        "watchlistedit-clear-explain": "Сите наслови ќе бидат отстранети од набљудуваните",
        "watchlistedit-clear-titles": "Наслови:",
        "timezone-local": "Месно",
        "duplicate-defaultsort": "Предупредување: Основниот клуч за подредување „$2“ го поништува претходниот основен клуч за подредување „$1“.",
        "duplicate-displaytitle": "<strong>Предупредување:</strong> Приказниот наслов „$2“ го заменува претходнито приказен наслов „$1“.",
+       "restricted-displaytitle": "<strong>Предупредување:</strong> Насловот за приказ „$1“ е занемарен бидејќи не е истоветен на стварниот наслов на страницата.",
        "invalid-indicator-name": "<strong>Грешка:</strong> Атрибутот <code>name</code> што го покажува статусот на страницата не може да биде празен.",
        "version": "Верзија",
        "version-extensions": "Воспоставени додатоци",
        "version-skins": "Воспоставени рува",
        "version-specialpages": "Службени страници",
-       "version-parserhooks": "РаÑ\81Ñ\87ленÑ\83ваÑ\87ки ÐºÑ\83ки",
+       "version-parserhooks": "РаÑ\81Ñ\87ленÑ\83ваÑ\87ки Ð¿Ñ\80еÑ\81Ñ\80еÑ\82ниÑ\86и",
        "version-variables": "Променливи",
        "version-antispam": "Спречување на спам",
        "version-api": "Извршници",
        "version-other": "Друго",
        "version-mediahandlers": "Ракувачи со мултимедијални содржини",
-       "version-hooks": "Ð\9aÑ\83ки",
+       "version-hooks": "Ð\9fÑ\80еÑ\81Ñ\80еÑ\82ник",
        "version-parser-extensiontags": "Ознаки за расчленувачки додатоци",
-       "version-parser-function-hooks": "Ð\9aÑ\83ки на расчленувачки функции",
-       "version-hook-name": "Ð\98ме Ð½Ð° ÐºÑ\83ка",
+       "version-parser-function-hooks": "Ð\9fÑ\80еÑ\81Ñ\80еÑ\82ниÑ\86и на расчленувачки функции",
+       "version-hook-name": "Ð\9dазив Ð½Ð° Ð¿Ñ\80еÑ\81Ñ\80еÑ\82никоÑ\82",
        "version-hook-subscribedby": "Претплатено од",
        "version-version": "($1)",
        "version-no-ext-name": "[нема име]",
        "version-libraries-license": "Лиценца",
        "version-libraries-description": "Опис",
        "version-libraries-authors": "Автори",
-       "redirect": "Ð\9fÑ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aе Ð¿Ð¾ Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еки, ÐºÐ¾Ñ\80иÑ\81ник Ð¸Ð»Ð¸ Ð½Ð°Ð·Ð½Ð°ÐºÐ° Ð½Ð° Ð¿Ñ\80еÑ\80абоÑ\82ка",
-       "redirect-summary": "Оваа службена страница пренасочува кон податотека (се задава името), страница (се задава назнаката на преработката или страницата) или корисничка странца (се задава бројчената назнака на корисникот). Употреба: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] или [[{{#Special:Redirect}}/user/101]].",
+       "redirect": "Ð\9fÑ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aе Ð¿Ð¾ Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82ека, Ñ\81Ñ\82Ñ\80аниÑ\86а, Ð¿Ñ\80еÑ\80абоÑ\82ка Ð¸Ð»Ð¸ Ð½Ð°Ð·Ð½Ð°ÐºÐ° Ð²Ð¾ Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÐ¾Ñ\82",
+       "redirect-summary": "Оваа службена страница пренасочува кон податотека (се задава името), страница (се задава назнаката на преработката или страницата), корисничка странца (се задава бројчената назнака на корисникот) или дневнички запис (се дава назнака на записот). Употреба: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]],  [[{{#Special:Redirect}}/user/101]] или [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Дај",
        "redirect-lookup": "Пребарај:",
        "redirect-value": "Вредност:",
        "tags-delete-not-allowed": "Ознаките зададени од додаток не можат да се бришат освен ако тоа не е изрично дозволено од додатокот.",
        "tags-delete-not-found": "Ознаката „$1“ не постои.",
        "tags-delete-too-many-uses": "Ознаката „$1“ се применува во повеќе од {{PLURAL:$2|една преработка|$2 преработки}}, што значи дека не може да се избрише.",
-       "tags-delete-warnings-after-delete": "Ознаката „$1“ е успешно избришана, но наидов на {{PLURAL:$2|следново предупредување|следниве предупредувања}}:",
+       "tags-delete-warnings-after-delete": "Ознаката „$1“ е избришана, но наидов на {{PLURAL:$2|следново предупредување|следниве предупредувања}}:",
+       "tags-delete-no-permission": "Немате дозвола за бришење на ознаки за промени.",
        "tags-activate-title": "Активирај ознака",
        "tags-activate-question": "На пат сте да ја активирате ознаката „$1“.",
        "tags-activate-reason": "Причина:",
        "feedback-useragent": "Кориснички вршител:",
        "searchsuggest-search": "Пребарување",
        "searchsuggest-containing": "содржи...",
+       "api-error-autoblocked": "Вашата IP-адреса е автоматски блокирана бидејќи ја има користено блокиран корисник.",
        "api-error-badaccess-groups": "Не ви е дозволено да подигате податотеки на ова вики.",
        "api-error-badtoken": "Внатрешна грешка: неисправна шифра.",
+       "api-error-blocked": "Блокирани сте од уредување.",
        "api-error-copyuploaddisabled": "Подигањата со URL се оневозможени на овој опслужувач.",
        "api-error-duplicate": "Веќе {{PLURAL:$1|постои друга податотека|постојат други податотеки}} со истата содржина.",
        "api-error-duplicate-archive": "На мрежното место веќе {{PLURAL:$1|постоела друга податотека|постоеле други податотеки}} со истата содржина, но во меѓувреме {{PLURAL:$1|била избришана|биле избришани}}.",
        "api-error-filetype-banned": "Овој тип на податотека е забранет.",
        "api-error-filetype-banned-type": "$1 не {{PLURAL:$4|е допуштен тип на податотека|се допуштени типови на податотека}}. {{PLURAL:$3|Допуштен е|Допуштени се}} $2.",
        "api-error-filetype-missing": "На податотеката ѝ недостасува наставка.",
-       "api-error-hookaborted": "Ð\98зменаÑ\82а Ñ\88Ñ\82о Ñ\81е Ð¾Ð±Ð¸Ð´Ð¾Ð²Ñ\82е Ð´Ð° Ñ\98а Ð½Ð°Ð¿Ñ\80авиÑ\82е Ðµ Ð¾Ñ\82кажана Ð¾Ð´ ÐºÑ\83ка за наставки.",
+       "api-error-hookaborted": "Ð\98зменаÑ\82а Ñ\88Ñ\82о Ñ\81е Ð¾Ð±Ð¸Ð´Ð¾Ð²Ñ\82е Ð´Ð° Ñ\98а Ð½Ð°Ð¿Ñ\80авиÑ\82е Ðµ Ð¾Ñ\82кажана Ð¾Ð´ Ð¿Ñ\80еÑ\81Ñ\80еÑ\82ник за наставки.",
        "api-error-http": "Внатрешна грешка: не можам да се поврзам со опслужувачот.",
        "api-error-illegal-filename": "Податотеката има недозволено име.",
        "api-error-internal-error": "Внатрешна грешка: нешто тргна наопаку при обработката на она што го подигате на викито.",
        "api-error-nomodule": "Внатрешна грешка: нема зададено модул за подигање.",
        "api-error-ok-but-empty": "Внатрешна грешка: опслужувачот не одговара.",
        "api-error-overwrite": "Презапишувањето врз постоечки податотеки не е дозволено.",
+       "api-error-ratelimited": "Се обидувате да подигнете повеќе податотеки отколку што викито допушта за дадено време.\nОбидете се повторно за неколку минути.",
        "api-error-stashfailed": "Внатрешна грешка: Опслужувачот не успеа да ја складира привремената податотека.",
        "api-error-publishfailed": "Внатрешна грешка: Опслужувачот не успеа да ја објави привремената податотека.",
        "api-error-stasherror": "Се јави грешка при подигањето на податотеката во складот.",
        "api-error-unknownerror": "Непозната грешка: „$1“.",
        "api-error-uploaddisabled": "Подигањето е оневозможено на ова вики.",
        "api-error-verification-error": "Податотеката е оштетена или има погрешна наставка.",
+       "api-error-was-deleted": "Податотека со ова име веќе е подигана и потоа избришана.",
        "duration-seconds": "{{PLURAL:$1|една секунда|$1 секунди}}",
        "duration-minutes": "{{PLURAL:$1|една минута|$1 минути}}",
        "duration-hours": "{{PLURAL:$1|еден час|$1 часа}}",
        "expand_templates_generate_xml": "Прикажи XML-дрво на расчленувањето",
        "expand_templates_generate_rawhtml": "Прикажувај сиров HTML",
        "expand_templates_preview": "Преглед",
-       "expand_templates_preview_fail_html": "<em>Бидејќи {{SITENAME}} има овозможено сиров HTML и се јави губиток на седнички податоци, прегледот е скриен како мерка на претпазливост против напади со JavaScript.</em>\n\n<strong>Ако ова е е легитимен обид за преглед, тогаш обидете се повторно.</strong>\nАко не работи и тогаш, [[Special:UserLogout|одјавете се]] и повторно најавете се.",
+       "expand_templates_preview_fail_html": "<em>Бидејќи {{SITENAME}} има овозможено сиров HTML и се јави губиток на седнички податоци, прегледот е скриен како мерка на претпазливост против напади со JavaScript.</em>\n\n<strong>Ако ова е е легитимен обид за преглед, тогаш обидете се повторно.</strong>\nАко не работи и тогаш, [[Special:UserLogout|одјавете се]] и повторно најавете се и проверете дали прелистувачот дозволува колачиња од ова мрежно место.",
        "expand_templates_preview_fail_html_anon": "<em>Бидејќи {{SITENAME}} има овозможено сиров HTML, а вие не сте најавени, прегледот е скриен како мерка на претпазливост против напади со JavaScript.</em>\n\n<strong>Ако ова е е легитимен обид за преглед, тогаш обидете се повторно.</strong>\nАко не работи и тогаш, [[Special:UserLogout|одјавете се]] и повторно најавете се.",
        "expand_templates_input_missing": "Треба да внесете некаков текст.",
        "pagelanguage": "Менување јазик на страница",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
        "mw-widgets-titleinput-description-new-page": "страницата сè уште не постои",
        "mw-widgets-titleinput-description-redirect": "пренасочување кон $1",
-       "api-error-blacklisted": "Одберете поинаков, описен наслов.",
+       "sessionmanager-tie": "Не можете истовремено да користите повеќе типови барања за заверка: $1.",
        "sessionprovider-generic": "$1 седници",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "седници со колачиња",
+       "sessionprovider-nocookies": "Колачињата може да се оневозможени. Ако е така, овозможете ги, и почнете одново.",
        "randomrootpage": "Случајна основна страница",
        "log-action-filter-block": "Тип на блок:",
        "log-action-filter-contentmodel": "Тип на змена на содржинскиот модел:",
        "log-action-filter-newusers": "Тип на создавање сметка:",
        "log-action-filter-patrol": "Тип на патролирање:",
        "log-action-filter-protect": "Тип на заштита:",
-       "log-action-filter-rights": "Тип на промена во правата",
-       "log-action-filter-suppress": "Тип на скривање",
+       "log-action-filter-rights": "Тип на промена во правата:",
+       "log-action-filter-suppress": "Тип на скривање:",
        "log-action-filter-upload": "Тип на подигање:",
        "log-action-filter-all": "Сите",
        "log-action-filter-block-block": "блокирање",
        "log-action-filter-managetags-activate": "Активирање на ознаки",
        "log-action-filter-managetags-deactivate": "Деактивирање на ознаки",
        "log-action-filter-move-move": "Преместување без запис врз пренасочувања",
+       "log-action-filter-move-move_redir": "Преместување со запис врз пренасочувања",
+       "log-action-filter-newusers-create": "Создавање од анонимен корисник",
+       "log-action-filter-newusers-create2": "Создавање од анонимен корисник",
+       "log-action-filter-newusers-autocreate": "Автоматско создавање",
+       "log-action-filter-newusers-byemail": "Создавање со лозинка испратена по е-пошта",
+       "log-action-filter-patrol-patrol": "Рачна патрола",
+       "log-action-filter-patrol-autopatrol": "Автоматска патрола",
+       "log-action-filter-protect-protect": "Заштита",
+       "log-action-filter-protect-modify": "Измена на заштитата",
+       "log-action-filter-protect-unprotect": "Одзаштита",
+       "log-action-filter-protect-move_prot": "Преместување на заштита",
+       "log-action-filter-rights-rights": "Рачна промена",
+       "log-action-filter-rights-autopromote": "Автоматска промена",
+       "log-action-filter-suppress-event": "Притајување дневник",
+       "log-action-filter-suppress-revision": "Притајување преработка",
+       "log-action-filter-suppress-delete": "Притајување страница",
+       "log-action-filter-suppress-block": "Притајување на корисникот преку блокирање",
+       "log-action-filter-suppress-reblock": "Притајување на корисникот преку преблокирање",
+       "log-action-filter-upload-upload": "Ново подигање",
+       "log-action-filter-upload-overwrite": "Преподигање",
+       "authmanager-authn-not-in-progress": "Заверката не е во тек, или има губиток на седничките податоци. Почнете одново.",
+       "authmanager-authn-no-primary": "Укажаните најавни податоци не можат да се заверат.",
+       "authmanager-authn-no-local-user": "Укажаните најавни податоци не се поврзани со ниеден корисник на ова вики.",
+       "authmanager-authn-no-local-user-link": "Укажаните најавни податоци се важечки, но не се поврзани со ниеден корисник на ова вики. Најавете се на поинаков начин, или создајте нов корисник, што ќе ви даде можност да ги сврзете вашите претходни најавни податоци со таа сметка.",
+       "authmanager-authn-autocreate-failed": "Автоматското создавање на месна сметка не успеа: $1",
+       "authmanager-change-not-supported": "Укажаните најавни податоци не можат да се изменат, бидејќи тогаш ништо нема да ги користи.",
+       "authmanager-create-disabled": "Создавањето на сметки е оневозможено.",
+       "authmanager-create-from-login": "За да направите сметка, пополнете ги полињата подолу.",
+       "authmanager-create-not-in-progress": "Создавањето на сметката не е во тек, или има губиток на седничките податоци. Почнете одново.",
+       "authmanager-create-no-primary": "Укажаните најавни податоци не можат да се употребат во создавање на сметка.",
+       "authmanager-link-no-primary": "Укажаните најавни податоци не можат да се употребат во поврзување на сметка.",
+       "authmanager-link-not-in-progress": "Поврзувањето на сметката не е во тек, или има губиток на седничките податоци. Почнете одново.",
+       "authmanager-authplugin-setpass-failed-title": "Промената на лозинката не успеа",
+       "authmanager-authplugin-setpass-failed-message": "Приклучокот за заверка ја одби промената на лозинката.",
+       "authmanager-authplugin-create-fail": "Приклучокот за заверка го одби создавањето на сметката.",
+       "authmanager-authplugin-setpass-denied": "Приклучокот за заверка не допушта менување на лозинки.",
        "authmanager-authplugin-setpass-bad-domain": "Неважечки домен.",
        "authmanager-autocreate-noperm": "Автоматското создавање на сметки не е дозволено.",
        "authmanager-autocreate-exception": "Автоматското создавање на сметки е привремено оневозможено поради претходни грешки.",
        "authmanager-provider-password": "Заверка со лозинка",
        "authmanager-provider-password-domain": "Заверка со лозинка и домен",
        "authmanager-provider-temporarypassword": "Привремена лозинка",
+       "authprovider-confirmlink-message": "Врз основа на неодамнешните обиди за најава, со вашата сметка можат да се поврзат следниве сметки. Поврзувањето ќе ви овозможи да се најавувате со овие сметки. Изберете кои од нив сакате да ги поврзете.",
+       "authprovider-confirmlink-request-label": "Сметки кои треба да се поврзат",
+       "authprovider-confirmlink-success-line": "$1: Успешно поврзано.",
+       "authprovider-confirmlink-failed": "Поврзувањето на сметката не е целосно успешно: $1",
+       "authprovider-confirmlink-ok-help": "Продолжи да прикажуваш пораки за неуспешно поврзување.",
        "authprovider-resetpass-skip-label": "Прескокни",
-       "authprovider-resetpass-skip-help": "Прескокни го задавањето на нова лозинка."
+       "authprovider-resetpass-skip-help": "Прескокни го задавањето на нова лозинка.",
+       "authform-nosession-login": "Заверката е успешна, но вашиот прелистувач не може да „запомни“ дека сте најавени.\n\n$1",
+       "authform-nosession-signup": "Сметката е создадена, но вашиот прелистувач не може да „запомни“ дека сте најавени.\n\n$1",
+       "authform-newtoken": "Недостасува шифра. $1",
+       "authform-notoken": "Недостасува шифра",
+       "authform-wrongtoken": "Погрешна шифра",
+       "specialpage-securitylevel-not-allowed-title": "Не е дозволено",
+       "specialpage-securitylevel-not-allowed": "За жал, не ви е дозволено да ја користите страницава бидејќи вашиот идентитет не може да се потврди (завери).",
+       "authpage-cannot-login": "Не можам да ја почнам најавата.",
+       "authpage-cannot-login-continue": "Не можам да продолжам со најавата. Најверојатно вашата седница има истечено.",
+       "authpage-cannot-create": "Не можам да го започнам создавањето на сметката.",
+       "authpage-cannot-create-continue": "Не можам да продолжам со создавањето на сметката. Најверојатно вашата седница има истечено.",
+       "authpage-cannot-link": "Не можам да почнам со поврзување на сметката.",
+       "authpage-cannot-link-continue": "Не можам да продолжам со поврзувањето на сметката. Најверојатно вашата седница има истечено.",
+       "cannotauth-not-allowed-title": "Пристапот е одбиен",
+       "cannotauth-not-allowed": "Не ви е дозволено да ја користите страницава",
+       "changecredentials": "Смени најавни податоци",
+       "changecredentials-submit": "Смени најавни податоци",
+       "changecredentials-invalidsubpage": "$1 не претставува важечки тип на најавни податоци.",
+       "changecredentials-success": "Вашите најавни податоци се сменети.",
+       "removecredentials": "Отстрани најавни податоци",
+       "removecredentials-submit": "Отстрани најавни податоци",
+       "removecredentials-invalidsubpage": "$1 не претставува важечки тип на најавни податоци.",
+       "removecredentials-success": "Вашите најавни податоци се отстранети.",
+       "credentialsform-provider": "Тип на најавни податоци:",
+       "credentialsform-account": "Име на сметката:",
+       "cannotlink-no-provider-title": "Нема поврзливи сметки",
+       "cannotlink-no-provider": "Нема поврзливи сметки.",
+       "linkaccounts": "Поврзи сметки",
+       "linkaccounts-success-text": "Сметката е поврзана.",
+       "linkaccounts-submit": "Поврзи сметки",
+       "unlinkaccounts": "Одврзи сметки",
+       "unlinkaccounts-success": "Сметката е одврзана.",
+       "authenticationdatachange-ignored": "Промената на податоците во заверката не е обработена. Можеби не е поставен услужник?"
 }
index ea70e50..1714a3e 100644 (file)
        "protectedpagetext": "हे पान बदल अथवा इतर कृती होऊ नयेत म्हणून सुरक्षित केले आहे.",
        "viewsourcetext": "तुम्ही या पानाचा स्रोत पाहू व प्रत करू शकता.",
        "viewyourtext": "तुम्ही या पानाची,<strong>तुमची संपादने</strong> पाहू शकता व त्याची प्रत करू शकता.",
-       "protectedinterface": "हà¥\87 à¤ªà¤¾à¤¨ à¤¸à¥\89फà¥\8dà¤\9fवà¥\87à¤\85रला à¤\87à¤\82à¤\9fरफà¥\87स à¤²à¥\87à¤\96न à¤ªà¥\81रवतà¥\87, à¤®à¥\8dहणà¥\82न à¤¦à¥\81रà¥\82पयà¥\8bà¤\97 à¤\9fाळणà¥\8dयासाठà¥\80 à¤¸à¤\82रà¤\95à¥\8dषित à¤\95à¥\87लà¥\87लà¥\87 à¤\86हà¥\87.\n\nसरà¥\8dव à¤µà¤¿à¤\95िà¤\82वर, à¤\85नà¥\81वाद à¤\9cà¥\8bडणà¥\8dयाà¤\95रता à¤\95िà¤\82वा à¤¬à¤¦à¤²à¤£à¥\8dयाà¤\95रता à¤\85थवा à¤¶à¥\81दà¥\8dधलà¥\87à¤\96न à¤\9aिà¤\95ितà¥\8dसà¥\87à¤\95रà¥\80ता , à¤\95à¥\83पया [https://translatewiki.net/ translatewiki.net], à¤¯à¤¾ à¤®à¤¿à¤¡à¤¿à¤¯à¤¾à¤µà¤¿à¤\95ि à¤¸à¥\8dथानिà¤\95à¥\80à¤\95रण à¤ªà¥\8dरà¤\95लà¥\8dपावर à¤\9cा.",
+       "protectedinterface": "हà¥\87 à¤ªà¤¾à¤¨ à¤¯à¤¾ à¤µà¤¿à¤\95िवर à¤¸à¤\82à¤\9aà¥\87तनास à¤\86à¤\82तरपà¥\83षà¥\8dठ à¤®à¤\9cà¤\95à¥\82र à¤ªà¥\81रवितà¥\87, à¤®à¥\8dहणà¥\82न à¤¦à¥\81रà¥\82पयà¥\8bà¤\97 à¤\9fाळणà¥\8dयासाठà¥\80 à¤¤à¥\87 à¤¸à¤\82रà¤\95à¥\8dषित à¤\95à¥\87लà¥\87लà¥\87 à¤\86हà¥\87.\n\nसरà¥\8dव à¤µà¤¿à¤\95िà¤\82वर, à¤\85नà¥\81वाद à¤\9cà¥\8bडणà¥\8dयाà¤\95रता à¤\95िà¤\82वा à¤¬à¤¦à¤²à¤£à¥\8dयाà¤\95रता à¤\85थवा à¤¶à¥\81दà¥\8dधलà¥\87à¤\96न à¤\9aिà¤\95ितà¥\8dसà¥\87à¤\95रà¥\80ता , à¤\95à¥\83पया [https://translatewiki.net/ translatewiki.net], à¤¯à¤¾ à¤®à¤¿à¤¡à¤¿à¤¯à¤¾à¤µà¤¿à¤\95ि à¤¸à¥\8dथानिà¤\95à¥\80à¤\95रण à¤ªà¥\8dरà¤\95लà¥\8dपाà¤\9aा à¤µà¤¾à¤ªà¤° à¤\95रा.",
        "editinginterface": "<strong>सावधान</strong>तुम्ही संचेतनाचे (सॉफ्टवेअर) संपर्क माध्यम मजकूर असलेले पान संपादित करित आहात. या पानावरील बदल या विकिवरील इतर सदस्यांच्या सदस्य संपर्क माध्यमाचे स्वरूप बदलू शकते.",
        "translateinterface": "सर्व विकिंवर अनुवाद जोडण्याकरता किंवा बदलण्याकरता, कृपया [https://translatewiki.net/ ट्रांसलेटविकि.नेट]चा वापर करा,जो मिडियाविकिचा स्थानिकीकरण प्रकल्प आहे.",
        "cascadeprotected": "हे पान संपादनांपासून सुरक्षित केल्या गेले आहे, कारण ते खालील {{PLURAL:$1|पानात|पानांमध्ये}} आंतरविन्यासित केलेले आहे,{{PLURAL:$1|जे पान|जी पाने }} निपतन पर्याय सुरु केल्यामुळे सुरक्षित आहेत:\n$2",
        "minoredit": "हा एक छोटा बदल आहे",
        "watchthis": "या लेखावर लक्ष ठेवा",
        "savearticle": "हा लेख साठवा",
+       "savechanges": "बदल जतन करा",
+       "publishchanges": "बदल प्रकाशित करा",
        "preview": "झलक",
        "showpreview": "झलक दाखवा",
        "showdiff": "बदल दाखवा",
        "newarticle": "(नवीन लेख)",
        "newarticletext": "आपण सध्या अस्तित्त्वात नसलेल्या पानाच्या दुव्याचा मागोवा घेत आला आहात.\nहे पान नव्याने तयार करण्यासाठी खालील पेटीत टंकन करणे सुरु करा(अधिक माहितीसाठी [$1 साहाय्य पान] बघा).\n\nजर आपण येथे चुकून आला असाल तर ब्राउझरच्या  <strong>परत</strong>(बॅक) कळीवर टिचकी द्या.",
        "anontalkpagetext": "---- ''हे चर्चापान अशा अज्ञात सदस्यासाठी आहे, ज्यांनी खाते तयार केलेले नाही किंवा त्याचा वापर करत नाहीत. त्यांच्या ओळखीसाठी आम्ही आंतरजाल अंकपत्ता वापरतो आहोत. असा अंकपत्ता बऱ्याच लोकांचा एकच असू शकतो. जर आपण अज्ञात सदस्य असाल आणि आपल्याला काही अप्रासंगिक संदेश मिळाला असेल तर कृपया [[Special:UserLogin| खाते तयार करा]] किंवा [[Special:CreateAccount|सनोंद-प्रवेश करा]] ज्यामुळे, पुढे असे गैरसमज होणार नाहीत.''",
-       "noarticletext": "या à¤²à¥\87à¤\96ात à¤¸à¤§à¥\8dया à¤\95ाहà¥\80हà¥\80 à¤®à¤\9cà¤\95à¥\82र à¤¨à¤¾à¤¹à¥\80.\nतà¥\81मà¥\8dहà¥\80 à¤µà¤¿à¤\95िपà¥\80डियावरà¥\80ल à¤\87तर à¤²à¥\87à¤\96ाà¤\82मधà¥\8dयà¥\87 à¤¯à¤¾ [[Special:Search/{{PAGENAME}}| à¤®à¤¥à¤³à¥\8dयाà¤\9aा à¤¶à¥\8bध à¤\98à¥\87à¤\8a à¤¶à¤\95ता]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} à¤\87तर à¤¨à¥\8bà¤\82दà¥\80 à¤¶à¥\8bधा],\nà¤\95िà¤\82वा à¤¹à¤¾ à¤²à¥\87à¤\96 [{{fullurl:{{FULLPAGENAME}}|action=edit}}सà¤\82पादू शकता]</span>.",
+       "noarticletext": "या à¤²à¥\87à¤\96ात à¤¸à¤§à¥\8dया à¤\95ाहà¥\80हà¥\80 à¤®à¤\9cà¤\95à¥\82र à¤¨à¤¾à¤¹à¥\80.\nतà¥\81मà¥\8dहà¥\80 à¤µà¤¿à¤\95िपà¥\80डियावरà¥\80ल à¤\87तर à¤²à¥\87à¤\96ाà¤\82मधà¥\8dयà¥\87 à¤¯à¤¾ [[Special:Search/{{PAGENAME}}| à¤®à¤¥à¤³à¥\8dयाà¤\9aा à¤¶à¥\8bध à¤\98à¥\87à¤\8a à¤¶à¤\95ता]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} à¤\87तर à¤¨à¥\8bà¤\82दà¥\80 à¤¶à¥\8bधा],\nà¤\95िà¤\82वा à¤¹à¤¾ à¤²à¥\87à¤\96 [{{fullurl:{{FULLPAGENAME}}|action=edit}}तयार à¤\95रू शकता]</span>.",
        "noarticletext-nopermission": "सध्या या लेखात  काहीही मजकूर नाही.\nतुम्ही विकिपीडियावरील इतर लेखांमध्ये [[Special:Search/{{PAGENAME}}| या मथळ्याचा शोध घेऊ शकता]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAME}}}}आपण या लेखाच्या इतर नोंदी शोधा]</span>,परंतु, आपणास हा लेख लिहीण्याची परवानगी देण्यात येउ शकत नाही.",
        "missing-revision": "\"{{FULLPAGENAME}}\" या लेखाचे #$1 हे संस्करण अस्तित्वात नाही.वगळल्या गेलेल्या लेखपानाच्या जुन्या इतिहास-दुव्याचे अनुसरण केल्यामुळे असे होते.याबाबत विस्तृत माहिती  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळलेल्या नोंदी]येथे बघता येईल.",
        "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" सदस्य खात्याची नोंद नाही. कृपया हे पान तुम्ही संपादित किंवा नव्याने तयार करू इच्छिता काय याबद्दल विचार करा.",
        "rightslogtext": "ही सदस्य अधिकारांमधील बदलांची नोंद आहे.",
        "action-read": "हे पान वाचा",
        "action-edit": "हे पान संपादित करा",
-       "action-createpage": "लà¥\87à¤\96 à¤¬à¤¨à¤µा",
-       "action-createtalk": "à¤\9aरà¥\8dà¤\9aा à¤ªà¥\83षà¥\8dठà¥\87 तयार करा",
+       "action-createpage": "हà¥\87 à¤ªà¤¾à¤¨ à¤¤à¤¯à¤¾à¤° à¤\95रा",
+       "action-createtalk": "हà¥\87 à¤\9aरà¥\8dà¤\9aा à¤ªà¥\83षà¥\8dठ तयार करा",
        "action-createaccount": "हे सदस्यखाते तयार करा",
        "action-autocreateaccount": "हे बाह्य सदस्य खाते आपोआप तयार करा",
        "action-history": "या पानाचा इतिहास बघा.",
        "upload-too-many-redirects": "या आंतरजालपत्त्यात खूप पुनर्निर्देशने आहेत",
        "upload-http-error": "एक एचटीटीपी चूक उद्भवली: $1",
        "upload-copy-upload-invalid-domain": "या डोमेनमध्ये प्रत-अपभारणे अनुपलब्ध आहेत.",
+       "upload-dialog-disabled": "हा डायलॉग वापरून  या विकिवर संचिका अपभारण अक्षम केले आहे.",
        "upload-dialog-title": "संचिकेचे अपभारण करा",
        "upload-dialog-button-cancel": "रद्द करा",
        "upload-dialog-button-done": "झाले",
        "apihelp-no-such-module": "मॉड्यूल \"$1\" सापडत नाही.",
        "apisandbox": "एपीआय(API) धूळपाटी",
        "apisandbox-api-disabled": "या संकेतस्थळावर एपीआय अक्षम केला आहे.",
-       "apisandbox-intro": "\"मिडियाविकि वेब सर्व्हीस एपीआय\" वर प्रयोग करण्यासाठी या पानाचा वापर करा. एपीआय वापरण्याच्या अधिक तपशिलासाठी [https://www.mediawiki.org/wiki/API:Main_page एपीआय दस्ताऐवजीकरण] हे पान बघा. उदाहरणार्थ:[https://www.mediawiki.org/wiki/API#A_simple_example मुख्य पानाचा आशय मिळवा]. अधिक उदाहरणे बघण्यास एखादी क्रिया निवडा.\n\n\"याची नोंद घ्या कि ही धूळपाटी असली तरी, या पानावर आपण केलेल्या क्रियांद्वारे विकिवर फेरफार होऊ शकतो.\"",
+       "apisandbox-intro": "<strong>मिडियाविकि वेब सर्व्हीस एपीआय</strong> वर प्रयोग करण्यासाठी या पानाचा वापर करा. एपीआय वापरण्याच्या अधिक तपशिलासाठी  [[mw:API:Main page| एपीआय दस्ताऐवजीकरण]] हे पान बघा. उदाहरणार्थ:[https://www.mediawiki.org/wiki/API#A_simple_example मुख्य पानाचा आशय मिळवा]. अधिक उदाहरणे बघण्यास एखादी क्रिया निवडा.\n\nयाची नोंद घ्या कि ही धूळपाटी असली तरी, या पानावर आपण केलेल्या क्रियांद्वारे विकिवर फेरफार होऊ शकतो.",
        "apisandbox-submit": "विनंती करा",
        "apisandbox-reset": "हटवा",
        "apisandbox-examples": "उदाहरण",
        "whatlinkshere-next": "{{PLURAL:$1|पुढील|पुढील $1}}",
        "whatlinkshere-links": "← दुवे",
        "whatlinkshere-hideredirs": "$1 पुनर्निर्देशने",
-       "whatlinkshere-hidetrans": "$1 à¤\9fà¥\8dरानà¥\8dसà¥\8dà¤\95à¥\8dलà¥\8dयà¥\81à¤\9cनà¥\8dस",
+       "whatlinkshere-hidetrans": "$1 à¤\86à¤\82तरà¥\8dनà¥\8dयास",
        "whatlinkshere-hidelinks": "$1 दुवे",
        "whatlinkshere-hideimages": "$1 संचिका दुवे",
        "whatlinkshere-filters": "गाळण्या",
        "allmessagesname": "नाव",
        "allmessagesdefault": "अविचल संदेश मजकूर",
        "allmessagescurrent": "सध्याचा मजकूर",
-       "allmessagestext": "मà¥\80डियाविà¤\95à¥\80 à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवातà¥\80ल à¤¸à¤°à¥\8dव à¤ªà¥\8dरणालà¥\80 à¤¸à¤\82दà¥\87शाà¤\82à¤\9aà¥\80 à¤¯à¤¾à¤¦à¥\80",
+       "allmessagestext": "मिडियाविà¤\95à¥\80 à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवात à¤\89पलबà¥\8dध à¤¸à¤°à¥\8dव à¤ªà¥\8dरणालà¥\80 à¤¸à¤\82दà¥\87शाà¤\82à¤\9aà¥\80 à¤¹à¥\80 à¤¯à¤¾à¤¦à¥\80 à¤\86हà¥\87. à¤\9cर à¤\86पणास à¤®à¤¿à¤¡à¤¿à¤¯à¤¾à¤µà¤¿à¤\95ि à¤ªà¥\8dरà¤\9cाति à¤¸à¥\8dथानिà¤\95िà¤\95रणात à¤¯à¥\8bà¤\97दान à¤\95रावयाà¤\9aà¥\87 à¤\85सà¥\87ल à¤¤à¤° à¤\95à¥\83पया [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation à¤®à¤¿à¤¡à¤¿à¤¯à¤¾à¤µà¤¿à¤\95ि à¤¸à¥\8dथानिà¤\95à¥\80à¤\95रण] à¤µ [https://translatewiki.net à¤\9fà¥\8dराà¤\82सलà¥\87à¤\9fविà¤\95ि.नà¥\87à¤\9f]  à¤²à¤¾ à¤­à¥\87à¤\9f à¤¦à¥\8dया.",
        "allmessagesnotsupportedDB": "हे पान संपादित करता येत नाही कारण<strong>$wgUseDatabaseMessages</strong>अक्षम  आहे.",
        "allmessages-filter-legend": "गाळक",
        "allmessages-filter": "कस्टमायझेशन स्टेटनुसार गाळणी लावा :",
        "mw-widgets-dateinput-no-date": "कोणताही दिनांक निवडला नाही",
        "mw-widgets-titleinput-description-new-page": "अद्याप पान अस्तित्वात नाही",
        "mw-widgets-titleinput-description-redirect": "$1ला पुनर्निर्देशित करा",
-       "api-error-blacklisted": "कुपया वेगळे वर्णनात्मक शीर्षक निवडा",
        "sessionmanager-tie": "हे एकत्रित करु शकत नाही,बहुविध विनंती अधिप्रमाणन प्रकार:$1",
        "sessionprovider-generic": "$1 सत्रे",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "कुकी-आधारीत सत्रे",
        "sessionprovider-nocookies": "कुकिज अक्षम असू शकतात. याची खात्री करा कि कुकिज सक्षम केल्या आहेत व पुन्हा सुरुवात करा.",
-       "randomrootpage": "अविशिष्ट मूळ पान"
+       "randomrootpage": "अविशिष्ट मूळ पान",
+       "log-action-filter-suppress-block": "रोधामार्फत सदस्य दाबणे"
 }
index bd9d358..f68b227 100644 (file)
        "minoredit": "Ini adalah suntingan kecil",
        "watchthis": "Pantau laman ini",
        "savearticle": "Simpan",
+       "publishpage": "Terbitkan",
+       "publishchanges": "Terbit perubahan",
        "preview": "Pralihat",
        "showpreview": "Paparkan pralihat",
        "showdiff": "Lihat perubahan",
        "mw-widgets-dateinput-no-date": "Tarik belum dipilih",
        "mw-widgets-titleinput-description-new-page": "laman belum wujud",
        "mw-widgets-titleinput-description-redirect": "melencong ke $1",
-       "api-error-blacklisted": "Sila pilih tajuk yang berbeza dan deskriptif.",
        "randomrootpage": "Laman akar rawak"
 }
index c1cf019..9cae000 100644 (file)
        "rightslogtext": "ဤသည်မှာ အသုံးပြုသူအခွင့်အရေးများ၏ ပြောင်းလဲမှုများမှတ်တမ်းဖြစ်သည်။",
        "action-read": "ဤစာမျက်နှာကို ဖတ်ရန်",
        "action-edit": "ဤစာမျက်နှာကို ပြင်ရန်",
-       "action-createpage": "á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\99á\80»á\80¬á\80¸ á\80\85á\80\90á\80\84á\80ºá\80\9bá\80±á\80¸á\80\9eá\80¬းရန်",
-       "action-createtalk": "á\80\86á\80½á\80±á\80¸á\80\94á\80½á\80±á\80¸á\80\81á\80»á\80\80á\80ºá\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\99á\80»á\80¬á\80¸ á\80\85á\80\90á\80\84á\80ºá\80\9bá\80±á\80¸á\80\9eá\80¬းရန်",
+       "action-createpage": "á\80¤á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\80á\80­á\80¯ á\80\96á\80\94á\80ºá\80\90á\80®းရန်",
+       "action-createtalk": "á\80¤á\80\86á\80½á\80±á\80¸á\80\94á\80½á\80±á\80¸á\80\81á\80»á\80\80á\80ºá\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\80á\80­á\80¯ á\80\96á\80\94á\80ºá\80\90á\80®းရန်",
        "action-createaccount": "ဤအသုံးပြုသူအကောင့်ကို ဖန်တီးရန်",
        "action-minoredit": "ဤတည်းဖြတ်မှုကို အရေးမကြီးဟု မှတ်သားရန်",
        "action-move": "ဤစာမျက်နှာကို ရွှေ့ပြောင်းရန်",
        "recentchangeslinked-page": "စာမျက်နှာ အမည် -",
        "recentchangeslinked-to": "ပေးထားသော စာမျက်နှာများအစား လင့်များနှင့် ဆက်စပ်နေသာ စာမျက်နှာများ၏ အပြောင်းအလဲများကို ပြရန်",
        "recentchanges-page-added-to-category": "ကဏ္ဍထဲသို့ [[:$1]] ကို ပေါင်းထည့်ခဲ့သည်",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] á\80\94á\80¾á\80\84á\80·á\80º [[Special:WhatLinksHere/$1|{{PLURAL:$2|á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬ á\80\90á\80\85á\80ºá\80\81á\80¯|á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬ $2 á\80\81á\80¯}}]]á\80\80á\80­á\80¯ á\80\80á\80\8fá\80¹á\80\8dá\80\91á\80²á\80\9eá\80­á\80¯á\80· á\80\95á\80±á\80«á\80\84á\80ºá\80¸á\80\91á\80\8aá\80·á\80ºá\80\81á\80²á\80·á\80\9eá\80\8aá\80º",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] á\80¡á\80¬á\80¸ á\80\80á\80\8fá\80¹á\80\8dá\80\91á\80²á\80\9eá\80­á\80¯á\80· á\80\95á\80±á\80«á\80\84á\80ºá\80¸á\80\91á\80\8aá\80·á\80ºá\80\81á\80²á\80·á\80\95á\80¼á\80®á\80¸á\81\8a [[Special:WhatLinksHere/$1|á\80¤á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\9eá\80\8aá\80º á\80¡á\80\81á\80¼á\80¬á\80¸á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\99á\80»á\80¬á\80¸á\80\91á\80²á\80\90á\80½á\80\84á\80º á\80\95á\80«á\80\9dá\80\84á\80ºá\80\9eá\80\8aá\80º]]",
        "recentchanges-page-removed-from-category": "ကဏ္ဍထဲမှ [[:$1]] ကို ဖယ်ရှားခဲ့သည်",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] á\80\94á\80¾á\80\84á\80·á\80º {{PLURAL:$2|á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬ á\80\90á\80\85á\80ºá\80\81á\80¯|á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬ $2 á\80\81á\80¯}}á\80\80á\80­á\80¯ á\80\80á\80\8fá\80¹á\80\8dá\80\91á\80²á\80\99á\80¾ á\80\96á\80\9aá\80ºá\80\9bá\80¾á\80¬á\80¸á\80\81á\80²á\80·á\80\9eá\80\8aá\80º",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] á\80¡á\80¬á\80¸ á\80\80á\80\8fá\80¹á\80\8dá\80\91á\80²á\80\99á\80¾ á\80\96á\80\9aá\80ºá\80\9bá\80¾á\80¬á\80¸á\80\81á\80²á\80·á\80\95á\80¼á\80®á\80¸á\81\8a [[Special:WhatLinksHere/$1|á\80¤á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\9eá\80\8aá\80º á\80¡á\80\81á\80¼á\80¬á\80¸á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\99á\80»á\80¬á\80¸á\80\91á\80²á\80\90á\80½á\80\84á\80º á\80\95á\80«á\80\9dá\80\84á\80ºá\80\9eá\80\8aá\80º]]",
        "upload": "ဖိုင်​တင်​ရန်​",
        "uploadbtn": "ဖိုင်​တင်​ရန်​",
        "reuploaddesc": "Upload တင်နေခြင်းကို ဖျက်သိမ်းပြီး upload တင်သည့် ပုံစံသို့ ပြန်သွားရန်",
        "whatlinkshere-prev": "{{PLURAL:$1|နောက်သို့|နောက်သို့ $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|ရှေ့သို့|ရှေ့သို့ $1}}",
        "whatlinkshere-links": "← လင့်များ",
-       "whatlinkshere-hideredirs": "ပြန်ညွှန်းများ $1ရန်",
-       "whatlinkshere-hidetrans": "ထည့်သွင်းကူးယူချက် $1 ခု",
-       "whatlinkshere-hidelinks": "လင့် $1 ခု",
+       "whatlinkshere-hideredirs": "ပြန်ညွှန်းများ $1",
+       "whatlinkshere-hidetrans": "ထည့်သွင်းကူးယူချက် $1",
+       "whatlinkshere-hidelinks": "လင့်ခ်များ $1 ခု",
        "whatlinkshere-hideimages": "ဖိုင်အချိတ်အဆက်များ $1 ခု",
        "whatlinkshere-filters": "စိစစ်မှုများ",
        "blockip": "{{GENDER:$1|အသုံးပြုသူ}} ပိတ်ပင်ရန်",
index 8a350a6..cb59019 100644 (file)
        "october-date": "Īcmahtlactlimētztli $1",
        "november-date": "Īcmahtlactlioncēmētztli $1",
        "december-date": "Īcmahtlactliomōmemētztli $1",
-       "pagecategories": "{{PLURAL:$1|Tlaìxmatkàtlàlilòtl|Tlaìxmatkàtlàlilòmë}}",
+       "pagecategories": "{{PLURAL:$1|Tlaìxmatkàyòtlàlilòtl|Tlaìxmatkàyòtlàlilòme}}",
        "category_header": "Tlâkuilòlpiltin ìpan tlaìxmatkàtlàlilòtl \"$1\"",
        "subcategories": "Tlaìxmatkàtlàlilòpilòmë",
        "category-media-header": "Media \"$1\" neneuhcāyōc",
        "category-empty": "''Cah ahtlein inīn neneuhcāyōc.''",
-       "hidden-categories": "{{PLURAL:$1|tlatlàtìlli tlaìxmatkàtlàlilòtl|tlatlàtìltìn tlaìxmatkàtlàlilòmë}}",
+       "hidden-categories": "{{PLURAL:$1|tlatlàtìlli tlaìxmatkàyòtlàlilòtl|tlatlàtìltìn tlaìxmatkàyòtlàlilòme}}",
        "hidden-category-category": "Tlatlàtìlkàtlaìxmatkàtlàlilòmë",
-       "category-subcat-count": "{{PLURAL:$2|Inìn tlaìxmatkàtlàlilòtl kipia san inìn tlaìxmatkàtlàlilòpilli.|Inìn tlaìxmatkàtlàlilòtl {{PLURAL:$1|kipia inìn tlaìxmatkàtlàlilòpilli|kimpia inìn $1 tlaìxmatkàtlàlilòpiltìn}}, ìpan $2.}}",
+       "category-subcat-count": "{{PLURAL:$2|Inìn tlaìxmatkàyòtlàlilòtl kipia san inìn tlaìxmatkàyòtlàlilòpilli.|Inìn tlaìxmatkàyòtlàlilòtl {{PLURAL:$1|kipia inìn tlaìxmatkàyòtlàlilòpilli|kimpia inîke $1 tlaìxmatkàyòtlàlilòpiltìn}}, ìpan $2.}}",
        "category-subcat-count-limited": "Inīn {{PLURAL:$1|neneuhcāyōtzintli cah|$1 neneuhcāyōtzintli cateh}} inīn neneuhcāyōc.",
-       "category-article-count": "{{PLURAL:$2|Inìn tlaìxmatkàtlàlilòtl san kipia|Inìn tlaìxmatkàtlàlilòtl kimpia {{PLURAL:$1|inìn tlaìxtlapalli|inîkë $1 tlaìxtlapaltìn}}, ìwikpa $2.}}",
+       "category-article-count": "{{PLURAL:$2|Inìn tlaìxmatkàyòtlàlilòtl san kipia|Inìn tlaìxmatkàyòtlàlilòtl kimpia {{PLURAL:$1|inìn tlaìxtlapalli|inîke $1 tlaìxtlapaltìn}}, ìwikpa $2.}}",
        "category-article-count-limited": "Inīn {{PLURAL:$1|zāzanilli cah|$1 zāzanilli cateh}} inīn neneuhcāyōc.",
-       "category-file-count": "{{PLURAL:$2|Inìn tlaìxmatkàtlàlilòtl san kipia|Inìn tlaìxmatkàtlalilòtl kimpia {{PLURAL:$1|inìn èwalli|inîkë $1 èwaltìn}}, ìwikpa $2.}}",
+       "category-file-count": "{{PLURAL:$2|Inìn tlaìxmatkàyòtlàlilòtl san kipia|Inìn tlaìxmatkàyòtlalilòtl kimpia {{PLURAL:$1|inìn èwalli|inîke $1 èwaltìn}}, ìwikpa $2.}}",
        "category-file-count-limited": "{{PLURAL:$1|Inìn tlâkuilòlèwalli kä|Inîkë $1 tlâkuilòlèwaltìn katêkë}} ìpan inìn tlaìxmatkàtlàlilòtl.",
        "listingcontinuesabbrev": "niman",
        "about": "Ītechcopa",
        "returnto": "Ximocuepa īhuīc $1.",
        "tagline": "Īhuīcpa {{SITENAME}}",
        "help": "Tēpalēhuiliztli",
-       "search": "Xitlatēmo",
+       "search": "Mà motèmo",
        "searchbutton": "Xictēmo",
        "go": "Xiyauh",
        "searcharticle": "Xiyauh",
        "unprotectthispage": "Xicpatla inīn tlaīxtli ītlapiyaliz",
        "newpage": "Yancuic tlaīxtli",
        "talkpage": "Xictlahto inīn tlaīxtli ītechcopa",
-       "talkpagelinktext": "Zānīlli",
+       "talkpagelinktext": "Nenônòtzalistli",
        "specialpage": "Nònkuâkìskàtlaìxtlapalli",
        "personaltools": "In tlein nitēquitiltilia",
        "articlepage": "Xiquitta in tlamantlaīxtli",
        "mediawikipage": "Xiquitta tlahcuilōltzin zāzanilli",
        "templatepage": "Xiquitta neīxcuītīllaīxtli",
        "viewhelppage": "Xiquitta tēpalēhuiliztli zāzanilli",
-       "categorypage": "Mà mỏta in tlaìxmatkàtlàlilòtlaìxtlapalli",
+       "categorypage": "Mà mỏta in tlaìxmatkàtlàlilòtlaìxtlapalli",
        "viewtalkpage": "Xiquitta tēixnāmiquiliztli zāzanilli",
        "otherlanguages": "Occequīntīn tlahtōlcopa",
        "redirectedfrom": "(Ōmotlacuep īhuīcpa $1)",
        "nstab-mediawiki": "Tlahcuilōltzintli",
        "nstab-template": "Nemachiòtl",
        "nstab-help": "Tèpalèwilistli",
-       "nstab-category": "Tlaìxmatkàtlàlilòtl",
+       "nstab-category": "Tlaìxmatkàtlàlilòtl",
        "mainpage-nstab": "Huēyitlaīxtli",
        "nosuchaction": "Ahmo ia tlachīhualiztli",
        "nosuchspecialpage": "Âmò ka inòn nònkuâkìskàtlaìxtlapalli",
        "search-result-size": "$1 ({{PLURAL:$2|1 tlahtōl|$2 tlahtōltin}})",
        "search-redirect": "(tlacuepaliztli $1)",
        "search-section": "(tlahtōltzintli $1)",
+       "search-category": "(tlaìxmatkàyòtlàlilòtl $1)",
        "search-suggest": "Ahnōceh tiquihtōznequiya: $1",
        "search-interwiki-caption": "Tlachīhualiztli īcnīhuān",
        "search-interwiki-more": "(huehca ōmpa)",
        "withoutinterwiki": "Zāzaniltin ahtle tzonhuiliztli",
        "withoutinterwiki-submit": "Tiquittāz",
        "nbytes": "$1 {{PLURAL:$1|byte}}",
-       "ncategories": "$1 {{PLURAL:$1|tlaìxmatkàtlàlilòtl|tlaìxmatkàtlàlilòmë}}",
+       "ncategories": "$1 {{PLURAL:$1|tlaìxmatkàyòtlàlilòtl|tlaìxmatkàyòtlàlilòme}}",
        "nlinks": "$1 {{PLURAL:$1|tzòwilistli|tzòwilistìn}}",
        "nmembers": "$1 {{PLURAL:$1|tlâkuilòpilli|tlâkuilòpiltìn}}",
        "nrevisions": "$1 {{PLURAL:$1|tlapiyaliztli}}",
        "allarticles": "Mochīntīn tlahcuilōlli",
        "allinnamespace": "Mochīntīn zāzanilli (īpan $1)",
        "allpagessubmit": "Tiyāz",
-       "categories": "Tlaìxmatkàtlàlilòmë",
-       "categoriespagetext": "{{PLURAL:$1|Inìn tlaìxmatkàtlàlilòtl kimpia|Inîkë tlaìxmatkàtlàlilòmë kimpiâkë}} tlaìxtlapaltìn noso medios.\nÂmò monèxtiâkë nikàn in [[Special:UnusedCategories|tlaìxmatkàtlàlilòmë tlèn âmò mokìntekitìltia]].\nNò mà mỏta in tlèn [[Special:WantedCategories|ìpan kineki tlaìxmatkàtlàlilòtl]].",
+       "categories": "Tlaìxmatkàyòtlàlilòme",
+       "categoriespagetext": "{{PLURAL:$1|Inìn tlaìxmatkàyòtlàlilòtl kimpia|Inîke tlaìxmatkàyòtlàlilòme kimpiâke}} tlaìxtlapaltìn noso medios.\nÂmò monèxtiâke nikàn in [[Special:UnusedCategories|tlaìxmatkàyòtlàlilòme tlèn âmò mokìntekitìltia]].\nNò mà mỏta in tlèn [[Special:WantedCategories|ìpan kineki tlaìxmatkàyòtlàlilòtl]].",
        "categoriesfrom": "Mà monèxtìkàn tlaìxmatkàtlàlilòmë tlèn pèwâkë ìka:",
        "linksearch": "Calān tzonhuiliztli tlatemoliztli",
        "linksearch-ns": "Tōcātzin:",
        "move-leave-redirect": "Ticcāhuāz cē tlacuepaliztli",
        "export": "Tiquinnamacāz zāzaniltin",
        "export-submit": "Ticnamacāz",
-       "export-addcattext": "Mà tlatlaìxtlapalwilo ìwikpa tlatlaìxmatkàtlàlilòpa:",
+       "export-addcattext": "Mà tlatlaìxtlapalwilo ìwikpa tlatlaìxmatkàtlàlilòpa:",
        "export-addcat": "Ticcētilīz",
        "export-download": "Ticpiyāz quemeh tlahcuilōlli",
        "export-templates": "Tiquimpiyāz nemachiyōtīlli",
        "tooltip-ca-nstab-mediawiki": "Xiquitta in tlahcuilōltzin",
        "tooltip-ca-nstab-template": "Xiquitta in nemachiyōtīlli",
        "tooltip-ca-nstab-help": "Xiquitta in tēpalēhuiliztli zāzanilli",
-       "tooltip-ca-nstab-category": "Mà mỏta ìtlaìxtlapal in tlaìxmatkàtlàlilòtl",
+       "tooltip-ca-nstab-category": "Mà mỏta ìtlaìxtlapal in tlaìxmatkàtlàlilòtl",
        "tooltip-minoredit": "Ticmachiyōz quemeh tlapatlalitzintli",
        "tooltip-save": "Ticpiyaz mopatlaliz",
        "tooltip-preview": "Xachtopaitta mopatlaliz ¡Timitztlahtlauhtiliah, xicchīhua yēppa mā tiquimpiya!",
        "exif-gpslongitude": "Huehtlatzīncāyōtl",
        "exif-gpsaltitude": "Huehcapancayōtl",
        "exif-gpstimestamp": "GPS cāhuitl (atomic tepozcāhuitl)",
+       "exif-iimcategory": "Tlaìxmatkàyòtlàlilòtl",
        "exif-orientation-1": "Yēctli",
        "exif-meteringmode-255": "Occē",
        "exif-lightsource-1": "Tōnameyōtl",
        "htmlform-selectorother-other": "Occē",
        "rightsnone": "ahtlein",
        "revdelete-summary": "ticpatlāz tlahcuilōltōn",
-       "searchsuggest-search": "Xitlatēmo",
+       "searchsuggest-search": "Mà motèmo",
        "api-error-ok-but-empty": "Tlâtek îtlakawilistli: Âmò tènankilia in tlatèmakani.",
        "api-error-overwrite": "Awel motlâkuilnepanòltis sè èwalli tlèn yi katki.",
        "api-error-stashfailed": "Tlâtek îtlakawilistli: In tlatèmakani awel òkeuh in èwalpanòni.",
index b77439f..9420fe4 100644 (file)
        "linkstoimage": "ē-kha {{PLURAL:$1|ê ia̍h}} ū iōng tio̍h chit ê iáⁿ-siōng:",
        "nolinkstoimage": "Bô poàⁿ ia̍h liân kàu chit tiuⁿ iáⁿ-siōng.",
        "sharedupload-desc-here": "Chit--ê $1--ê tóng-àn ū khó-lêng hō͘ kî-thaⁿ--ê choan-àn ēng tio̍h.\nChia sī chit--ê tóng-àn i--ê [$2 soat-bêng].",
+       "shared-repo-name-wikimediacommons": "Wikimedia Commons",
        "upload-disallowed-here": "你袂使換掉个檔案",
        "mimesearch": "MIME chhiau-chhoē",
        "unwatchedpages": "Bô lâng kàm-sī ê ia̍h",
index 2ec66f6..76e6484 100644 (file)
        "minoredit": "Chisto è nu cagnamiénto piccerillo",
        "watchthis": "Tiene d'uocchio sta paggena",
        "savearticle": "Sarva 'a paggena",
+       "savechanges": "Sarva 'e cagnamiénte",
        "publishpage": "Pubbreca paggena",
+       "publishchanges": "Pubbreca 'e cagnamiente",
        "preview": "Anteprimma",
        "showpreview": "Vire anteprimma",
        "showdiff": "Fa veré 'e cagnamiente",
        "content-model-css": "CSS",
        "content-json-empty-object": "Oggetto abbacante",
        "content-json-empty-array": "Array abbacante",
+       "deprecated-self-close-category": "Paggene ausanno nu tag HTML auto-nchiuse nun valido",
        "duplicate-args-warning": "<strong>Attenziò:</strong> [[:$1]] sta chiammanno [[:$2]] cu cchiù 'e nu volore p' 'o parametro \"$3\". Surtanto ll'urdemo valore s'auserrà.",
        "duplicate-args-category": "Paggene c'ausano argomiente dupprecate dint' 'e chiammate a 'e mudelle",
        "duplicate-args-category-desc": "'A paggena tene chiammate a mudelle c'ausassero argomiente dupprecate, comme p'esempio <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "rightslogtext": "Ccà abbascio sta nu riggistro d' 'e cagnamiente a 'e deritte 'e ll'utente",
        "action-read": "lieggere sta paggena",
        "action-edit": "càgna chesta paggena",
-       "action-createpage": "crìa paggene",
-       "action-createtalk": "crìa chiacchiere 'e paggena",
+       "action-createpage": "crìa sta paggena",
+       "action-createtalk": "crìa sta paggena 'e chiacchiere",
        "action-createaccount": "crìa stu cunto utente",
        "action-autocreateaccount": "automaticamente crèa stu cunto utente 'e fore",
        "action-history": "vide 'a cronologgia 'e sta paggena",
        "upload-http-error": "N'errore HTTP è succiesso: $1",
        "upload-copy-upload-invalid-domain": "Nun è permessa 'a carreca 'e copie 'a chistu dumminio.",
        "upload-foreign-cant-upload": "Stu wiki nun è mpustato pe' puté carrecà 'e file dint' 'o repository 'e file 'e fore addimannato.",
+       "upload-foreign-cant-load-config": "Scassaje a carrecà 'o file 'e mpustaziune p' 'e repositorie 'e fore.",
+       "upload-dialog-disabled": "'A carreca 'e file tramite sta fenesta 'e dialogo è stutata int'a stu wiki.",
        "upload-dialog-title": "Carreca file",
        "upload-dialog-button-cancel": "Canciella",
        "upload-dialog-button-done": "Fatto",
        "sp-contributions-username": "Nnerizzo IP o nomme utente",
        "sp-contributions-toponly": "Facenno vedé sulamente 'e contribbute 'e l'urdeme verziune",
        "sp-contributions-newonly": "Facenno vedé 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-title": "Paggene ca cullegano a $1",
        "mw-widgets-dateinput-no-date": "Nisciuna data scigliuta",
        "mw-widgets-titleinput-description-new-page": "'a pàggene nun esiste ancore",
        "mw-widgets-titleinput-description-redirect": "redirezionate ncopp' a $1",
-       "api-error-blacklisted": "Pe' piacere sciglite nu titolo differente e descrittivo.",
        "sessionmanager-tie": "Nun se ponno cumbinà 'e tipe 'e richiesta 'autenticaziona: $1.",
        "sessionprovider-generic": "$1 sessiune",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sessiune basate ncopp' 'e cookie",
        "log-action-filter-patrol": "Tipo 'e verifica:",
        "log-action-filter-protect": "Tipo 'e protezione:",
        "log-action-filter-rights": "Tipo 'e cagnamiento 'e deritte",
-       "log-action-filter-suppress": "Tipo 'e suppressione",
+       "log-action-filter-suppress": "Tipo 'e suppressione:",
        "log-action-filter-upload": "Tipo 'e carreca:",
        "log-action-filter-all": "Tutte",
        "log-action-filter-block-block": "Blocco",
        "log-action-filter-upload-overwrite": "Recarreca",
        "authmanager-authn-not-in-progress": "L'autenticazione nun è 'ncurzo o 'e date d' 'a sessione so' ghiute pierze. Verite 'accummincià n'ata vota a 'o prencipio.",
        "authmanager-authn-no-primary": "'E credenziale ca s'hanno rato nun se ponno autenticà.",
-       "authmanager-authn-no-local-user": "'E credenziale ca s'hanno rato nun se ponno ffà suoccie a nisciun' 'utente int'a stu wiki."
+       "authmanager-authn-no-local-user": "'E credenziale ca s'hanno rato nun se ponno ffà suoccie a nisciun' 'utente int'a stu wiki.",
+       "authmanager-authn-no-local-user-link": "'E credenziale ca s'hanno rato so buone ma nun songo suoccie a nisciun'utente 'e sta wiki. Trasite 'n modo differente o criate n'utente nuovo, e tenarrite n'opzione pe' puté aunì 'e credenziale 'e primma a chill'utenza.",
+       "authmanager-authn-autocreate-failed": "Criazione automatica 'e n'utenza locale fallita: $1",
+       "authmanager-change-not-supported": "'E credenziale ca s'hanno rato nun se ponno cagnà, dato ca nun fossero ausate 'a nisciuna cosa.",
+       "authmanager-create-disabled": "Criazione 'e cunte stutata",
+       "authmanager-create-from-login": "Pe' puté crià n'utenza vosta, mettite sane sane 'e campe ccà abbascio.",
+       "authmanager-create-not-in-progress": "'A criazione 'e cunte nun è 'ncurzo o 'e date d' 'a sessione so' ghiute pierze. Verite 'accummincià n'ata vota a 'o prencipio.",
+       "authmanager-create-no-primary": "Le credenziali date nun se ponno ausà pe' puté crià n'utenza.",
+       "authmanager-link-no-primary": "'E credenziale date nun se ponno ausà p' 'o cullegamento 'utenza.",
+       "authmanager-link-not-in-progress": "'O cullegamento 'e cunte nun è 'ncurzo o 'e date d' 'a sessione so' ghiute pierze. Verite 'accummincià n'ata vota a 'o prencipio.",
+       "authmanager-authplugin-setpass-failed-title": "'O cagnamento d' 'a password è ghiuto malamente",
+       "authmanager-authplugin-setpass-failed-message": "'O plugin 'autenticazione nun ave lassato 'o cagnamento d' 'a password.",
+       "authmanager-authplugin-create-fail": "'O plugin autenticazione nun lassaie crià ll'utenza.",
+       "authmanager-authplugin-setpass-denied": "'O plugin autenticazione nun premmettesse 'e cagnà 'e password.",
+       "authmanager-authplugin-setpass-bad-domain": "Dominio invalido.",
+       "authmanager-autocreate-noperm": "'A criazione automatica 'e ll'utenza nun fosse premmessa.",
+       "authmanager-autocreate-exception": "Criazione 'e cunte automatica mò mò è stutata pe' bbìa 'e ll'errure precedenti.",
+       "authmanager-userdoesnotexist": "'O cunto utente \"$1\" nun è riggistrato.",
+       "authmanager-userlogin-remembermypassword-help": "Si 'a pasword adda essere arricurdata cchiù a luongo cu rispett'a tutt' 'a durata d' 'a sessione.",
+       "authmanager-username-help": "Nomme utente pe' ll'autenticaziona.",
+       "authmanager-password-help": "Password pe' l'autenticaziona.",
+       "authmanager-domain-help": "Dumminio pe' ffà autenticaziona 'a fore.",
+       "authmanager-retype-help": "Cunferma n'ata vota 'a password.",
+       "authmanager-email-label": "Email",
+       "authmanager-email-help": "Indirizzo email",
+       "authmanager-realname-label": "Nomme overo",
+       "authmanager-realname-help": "Nomme overo 'e ll'utente",
+       "authmanager-provider-password": "Autenticaziona basata ncopp' 'a password",
+       "authmanager-provider-password-domain": "Autenticaziona cu' password e basata ncopp'a nu dominio",
+       "authmanager-provider-temporarypassword": "Password a tiempo determinato",
+       "authprovider-confirmlink-message": "Verenno 'e tentative d'acciesso mò, l'utente ccà putessero avé nu cullegamento c' 'o cunto wiki d' 'o vuosto. A ffà cullegamento premmettesse appiccià 'o sistema 'e trasuta pe' bbìa 'e sti cunte. Pe' piacere sciglite 'e cunte addò vulite fà cullegamento.",
+       "authprovider-confirmlink-request-label": "Cunte ca s'avesser'a cullegà",
+       "authprovider-confirmlink-success-line": "$1: cullegato e apposto.",
+       "authprovider-confirmlink-failed": "'O cullegamento 'e ll'utenza nun è ngarrato sano sano: $1",
+       "authprovider-confirmlink-ok-help": "Cuntinuà aropp'a fà veré 'e mmasciate 'errore 'e cullegamento.",
+       "authprovider-resetpass-skip-label": "Passa 'a vacca",
+       "authprovider-resetpass-skip-help": "Passa 'a vacca 'mpustazion' 'e password.",
+       "authform-nosession-login": "'O prucesso 'autenticazione iette buono, ma 'o navigatóre d' 'o tuojo nun \"s'arricuorda\" si site trasuto/a.",
+       "authform-nosession-signup": "'O cunto è stato criato buono, ma 'o navigatóre d' 'o tuojo nun \"s'arricuorda\" si site trasuto/a.",
+       "authform-newtoken": "Token mancante. $1",
+       "authform-notoken": "Token mancante",
+       "authform-wrongtoken": "Token errato",
+       "specialpage-securitylevel-not-allowed-title": "Nun permesso",
+       "authpage-cannot-login": "Nun se pò accummencià a trasì.",
+       "authpage-cannot-login-continue": "Nun se pò cuntinuà a trasì. 'A sessione vosta fosse scaduta.",
+       "authpage-cannot-create": "Nun se pò accummencià 'a criazione 'utenza."
 }
index 06b9626..73eef2a 100644 (file)
        "password-change-forbidden": "Du kan ikke endre passord på denne wikien.",
        "externaldberror": "Det var en ekstern autentifiseringsfeil, eller du kan ikke oppdatere din eksterne konto.",
        "login": "Logg inn",
+       "login-security": "Bekreft identiteten din",
        "nav-login-createaccount": "Logg inn eller opprett en konto",
        "userlogin": "Logg inn eller opprett en konto",
        "userloginnocreate": "Logg inn",
        "userlogin-resetpassword-link": "Glemt passordet?",
        "userlogin-helplink2": "Hjelp med innlogging",
        "userlogin-loggedin": "Du er allerede logget inn som {{GENDER:$1|$1}}.\nBruk skjemaet nedenfor for å logge inn som en annen bruker.",
+       "userlogin-reauth": "Du må logge inn igjen for å bekrefte at du er {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Opprett ny konto",
        "createacct-emailrequired": "E-postadresse",
        "createacct-emailoptional": "E-postadresse (valgfritt)",
        "createacct-email-ph": "Fyll inn e-postadressen din",
        "createacct-another-email-ph": "Fyll inn epostadressen",
        "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)",
        "createaccountreason": "Årsak:",
        "createacct-reason": "Årsak",
        "createacct-reason-ph": "Hvorfor lager du en annen bruker",
+       "createacct-reason-help": "Beskjed vist i kontoopprettelsesloggen",
        "createacct-submit": "Opprett konto",
        "createacct-another-submit": "Opprett konto",
+       "createacct-continue-submit": "Fortsett kontooppretting",
+       "createacct-another-continue-submit": "Fortsett kontooppretting",
        "createacct-benefit-heading": "{{SITENAME}} er laget av folk som deg.",
        "createacct-benefit-body1": "{{PLURAL:$1|redigering|redigeringer}}",
        "createacct-benefit-body2": "{{PLURAL:$1|side|sider}}",
        "nocookiesnew": "Din brukerkonto er nå opprettet, men du har ikke logget på. {{SITENAME}} bruker informasjonskapsler («cookies») for å logge brukere på og du har slått dem av. Slå dem på for å kunne logge på med ditt nye brukernavn og passord.",
        "nocookieslogin": "{{SITENAME}} bruker informasjonskapsler («cookies») for å logge brukere på og du har slått dem av. Slå dem på og prøv igjen.",
        "nocookiesfornew": "Brukerkontoen ble ikke opprettet siden vi ikke kunne bekrefte dens kilde.\nKontroller at du har aktivert informasjonskapsler, oppdater siden og prøv igjen.",
+       "createacct-loginerror": "Kontoen ble opprettet, men du kunne ikke logges inn automatisk. Gå videre til [[Special:UserLogin|manuell innlogging]].",
        "noname": "Du har ikke oppgitt et gyldig brukernavn.",
-       "loginsuccesstitle": "Du er nå logget inn",
+       "loginsuccesstitle": "Logget inn",
        "loginsuccess": "Du er nå logget inn på {{SITENAME}} som «$1».",
        "nosuchuser": "Det eksisterer ingen bruker ved navn «$1».\nMerk at det skilles mellom store og små bokstaver.\nSjekk stavemåten eller [[Special:CreateAccount|opprett en ny konto]].",
        "nosuchusershort": "Det finnes ingen bruker ved navn «$1». Kontroller stavemåten.",
        "createacct-another-realname-tip": "Det er frivillig å oppgi ditt egentlige navn.\nHvis du velger å oppgi det, vil det blir anvendt for å gi deg som bruker anerkjennelse",
        "pt-login": "Logg inn",
        "pt-login-button": "Logg inn",
+       "pt-login-continue-button": "Fortsett innlogging",
        "pt-createaccount": "Opprett konto",
        "pt-userlogout": "Logg ut",
        "php-mail-error-unknown": "Ukjent feil i PHPs mail()-funksjon",
        "newpassword": "Nytt passord:",
        "retypenew": "Gjenta nytt passord:",
        "resetpass_submit": "Angi passord og logg inn",
-       "changepassword-success": "Passordet ditt ble korrekt endret!",
+       "changepassword-success": "Passordet ditt er endret!",
        "changepassword-throttled": "Du har foretatt for mange nylige innloggingsforsøk.\nVær vennlig å vente $1 før du prøver igjen.",
        "botpasswords": "Robotpassord",
        "botpasswords-summary": "<em>Robotpassord</em> gir tilgang til en brukerkonto via API uten å bruke hovedpassordet til kontoen. Brukerrettighetene kan bli begrenset ved bruk av dette passordet.\n\nHvis du ikke vet om du vil benytte dette, er det sannsynlig at du ikke bør fylle det ut. Det skal ikke være nødvendig for andre personer å be deg om å fylle ut dette for å gi det til de.",
        "botpasswords-invalid-name": "Det angitte brukernavnet inneholder ikke separasjonstegnet for robotpassord (\"$1\").",
        "botpasswords-not-exist": "Brukeren \"$1\" har ikke noe robotpassord for \"$2\".",
        "resetpass_forbidden": "Passord kan ikke endres",
+       "resetpass_forbidden-reason": "Passordene kan ikke endres: $1",
        "resetpass-no-info": "Du må være logget inn for å gå til denne siden direkte",
        "resetpass-submit-loggedin": "Endre passord",
        "resetpass-submit-cancel": "Avbryt",
        "content-model-css": "CSS",
        "content-json-empty-object": "Tomt objekt",
        "content-json-empty-array": "Tom matrise",
+       "deprecated-self-close-category": "Sider som bruker ugyldige, balanserte HTML-tagger.",
+       "deprecated-self-close-category-desc": "Siden inneholder balanserte HTML-tagger slike som <code>&lt;b/></code> or <code>&lt;span/></code>. Oppførselen til disse vil snart endret for å være i samsvar med HTML-spesifikasjonen, og da vil de ikke kunne brukes som wikitekst.",
        "duplicate-args-warning": "<strong>Advarsel:</strong> [[:$1]] kaller [[:$2]] med flere enn en verdi for \"$3\"-parameteren. Bare den sist angitte verdien vil brukes.",
        "duplicate-args-category": "Sider med duplikate argumenter i malkall",
        "duplicate-args-category-desc": "Denne siden inneholder malkall med duplikate parametre, slik som <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> eller <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "trackingcategories-msg": "Sporingskategori",
        "trackingcategories-name": "Beskjednavn",
        "trackingcategories-desc": "Kategori-inklusjonskriterium",
+       "restricted-displaytitle-ignored": "Sider med ignorerte visningstitler",
        "noindex-category-desc": "Denne siden indekseres ikke av roboter fordi den er merket med det magiske ordet <code><nowiki>__NOINDEX__</nowiki></code> og er i navnerom der dette flagget tillates.",
        "index-category-desc": "Denne siden er påført det magiske ordet <code><nowiki>__INDEX__</nowiki></code> (og er i et navnerom hvor flagget er tillatt), og vil derfor bli indeksert av roboter selv når det normalt ikke ville skjedd.",
        "post-expand-template-inclusion-category-desc": "Sidestørrelsen er større enn <code>$wgMaxArticleSize</code> etter at alle maler er utvidet, så noen maler ble ikke utvidet.",
        "feedback-close": "Utført",
        "feedback-external-bug-report-button": "Registrer en teknisk sak",
        "feedback-dialog-title": "Send tilbakemelding",
-       "feedback-dialog-intro": "Du kan benytte det enkle skjemaet under for å gi din tilbakemelding. Kommentaren din vil bli lagt til siden «$1» sammen med ditt brukernavn.",
+       "feedback-dialog-intro": "Bruk det enkle skjemaet under om du vil gi tilbakemelding. Kommentaren din vil bli lagt ut på siden «$1» sammen med brukernavnet ditt.",
        "feedback-error-title": "Feil",
        "feedback-error1": "Feil: Ukjent resultat fra API",
        "feedback-error2": "Feil: Redigering feilet",
        "feedback-message": "Melding:",
        "feedback-subject": "Emne:",
        "feedback-submit": "Send",
-       "feedback-terms": "Jeg er innforstått med at min nettleserinformasjon inkluderer nøyaktig informasjon om versjonen til min nettleser og mitt operativsystem og at dette vil bli delt offentlig sammen med min tilbakemelding.",
-       "feedback-termsofuse": "Jeg godtar å gi tilbakemelding i henhold til brukervilkårene.",
+       "feedback-terms": "Jeg er innforstått med at brukeragentinformasjonen min inkluderer nøyaktig informasjon om versjonen til nettleseren min og operativsystemet mitt, og at dette vil bli delt offentlig sammen med tilbakemeldingen min.",
+       "feedback-termsofuse": "Jeg godtar å gi tilbakemelding i tråd med bruksvilkårene.",
        "feedback-thanks": "Din tilbakemelding til siden \"[ $2  $1 ]\" er sendt. Takk skal du ha!",
        "feedback-thanks-title": "Takk!",
        "feedback-useragent": "Brukeragent",
        "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
        "mw-widgets-titleinput-description-new-page": "siden eksisterer ikke ennå",
        "mw-widgets-titleinput-description-redirect": "omdiriger til $1",
-       "api-error-blacklisted": "Vennligst velg en annen beskrivende tittel.",
        "sessionprovider-generic": "$1 sesjoner",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "informasjons&shy;kapsel-baserte sesjoner",
        "randomrootpage": "Tilfeldig rotside"
index 5910f85..7beefc3 100644 (file)
        "minoredit": "kleine wieziging",
        "watchthis": "volg disse zied",
        "savearticle": "Zied opslaon",
+       "savechanges": "Wiezigingen opslaon",
+       "publishpage": "Zied uutbrengen",
+       "publishchanges": "Wiezigingen uutbrengen",
        "preview": "Naokieken",
        "showpreview": "Bewarking naokieken",
        "showdiff": "Verschil bekieken",
        "content-model-text": "tekste zonder opmaak",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Leeg objekt",
+       "content-json-empty-array": "Lege reeks",
        "expensive-parserfunction-warning": "Waorschuwing: disse zied gebruukt te veule kostbaore parserfunksies.\n\nNoen {{PLURAL:$1|is|bin}} t der $1, terwiel t der minder as $2 {{PLURAL:$2|mut|mutten}} ween.",
        "expensive-parserfunction-category": "Ziejen die te veule kostbaore parserfunksies gebruken",
        "post-expand-template-inclusion-warning": "Waorschuwing: de grootte van de in-evoegden mal is te groot.\nSommigen mallen wörden niet in-evoegd.",
        "history-feed-empty": "De op-evreugen zied besteet niet. t Kan ween dat disse zied vortedaon is of dat t herneumd is. Probeer te [[Special:Search|zeuken]] naor soortgelieke nieje ziejen.",
        "rev-deleted-comment": "(bewarkingsopmarking vortedaon)",
        "rev-deleted-user": "(gebrukersnaam vortedaon)",
-       "rev-deleted-event": "(antekening vortedaon)",
+       "rev-deleted-event": "(logboekregel vortedaon)",
        "rev-deleted-user-contribs": "[gebrukersnaam of IP-adres vortedaon - bewarking verbörgen in biedragen]",
        "rev-deleted-text-permission": "Disse bewarking is '''vortedaon'''.\nAs der meer informasie is, ku'j t vienen in t [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} vortdologboek].",
        "rev-deleted-text-unhide": "Disse bewarking is '''vortedaon'''.\nAs der meer informasie is, ku'j t vienen in t [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} vortdologboek].\nJe kunnen [$1 disse versie bekieken] a'j willen.",
        "revdelete-legend": "Stel versiebeparkingen in:",
        "revdelete-hide-text": "Versietekste",
        "revdelete-hide-image": "Verbarg bestaandsinhoud",
-       "revdelete-hide-name": "Verbarg logboekaksie",
+       "revdelete-hide-name": "Verbarg haandeling en doel",
        "revdelete-hide-comment": "Bewarkingssamenvatting",
        "revdelete-hide-user": "Gebrukersnaam/IP-adres van disse gebruker",
        "revdelete-hide-restricted": "Gegevens veur beheerders en aander volk onderdrokken",
        "revdelete-unsuppress": "Beparkingen veur weerummezetten versies vortdoon",
        "revdelete-log": "Reden:",
        "revdelete-submit": "Toepassen op de ekeuzen {{PLURAL:$1|bewarking|bewarkingen}}",
-       "revdelete-success": "'''De zichtbaorheid van de wieziging is bie-ewörken.'''",
+       "revdelete-success": "De zichtbaorheid van de wieziging is bie-ewörken.",
        "revdelete-failure": "'''De zichtbaorheid veur de wieziging kon niet bie-ewörken wörden:'''\n$1",
-       "logdelete-success": "'''Zichtbaorheid van de gebeurtenisse is suksesvol in-esteld.'''",
+       "logdelete-success": "Zichtbaorheid van de gebeurtenisse is in-esteld.",
        "logdelete-failure": "'''De zichtbaorheid van de logboekregel kon niet in-esteld wörden:'''\n$1",
        "revdel-restore": "Zichtbaorheid wiezigen",
        "pagehist": "Ziedgeschiedenisse",
        "mergehistory-go": "Bekiek bewarkingen die bie mekaar edaon kunnen wörden",
        "mergehistory-submit": "Versies bie mekaar doon",
        "mergehistory-empty": "Der bin gien versies die samenevoegd kunnen wörden.",
-       "mergehistory-done": "$3 {{PLURAL:$3|versie|versies}} van $1 bin suksesvol samenevoegd naor [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|versie|versies}} van $1 {{PLURAL:$3|is|bin}} suksesvol samenevoegd naor [[:$2]].",
        "mergehistory-fail": "Kan gien geschiedenisse samenvoegen, kiek opniej de zied- en tiedparameters nao.",
        "mergehistory-no-source": "Bronzied $1 besteet niet.",
        "mergehistory-no-destination": "Bestemmingszied $1 besteet niet.",
        "badsig": "Ongeldige haandtekening; HTML naokieken.",
        "badsiglength": "Joew haandtekening is te lang.\nt Mut minder as {{PLURAL:$1|letter|letters}} hebben.",
        "yourgender": "Geslacht:",
-       "gender-unknown": "Geet joe niks an",
+       "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.",
        "email": "Privéberichten",
-       "prefs-help-realname": "* Echte naam (niet verplicht): a'j disse opsie invullen zu'w joew echte naam gebruken um erkenning te geven veur joew warkzaamheen.",
+       "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.",
        "userrights": "Gebrukersrechtenbeheer",
        "userrights-lookup-user": "Beheer gebrukersgroepen",
        "userrights-user-editname": "Vul n gebrukersnaam in:",
-       "editusergroup": "Bewark gebrukersgroepen",
+       "editusergroup": "Bewark {{GENDER:$1|gebrukersgroepen}}",
        "editinguser": "Doonde mit t wiezigen van de gebrukersrechten van '''[[User:$1|$1]]''' $2",
        "userrights-editusergroup": "Bewark gebrukersgroep",
        "saveusergroups": "Gebrukergroepen opslaon",
        "rightslogtext": "Dit is n logboek mit veraanderingen van gebrukersrechten",
        "action-read": "disse zied lezen",
        "action-edit": "disse zied bewarken",
-       "action-createpage": "ziejen schrieven",
-       "action-createtalk": "overlegziejen anmaken",
+       "action-createpage": "disse zied anmaken",
+       "action-createtalk": "disse overlegzied anmaken",
        "action-createaccount": "disse gebrukerskonto anmaken",
        "action-minoredit": "disse bewarking as klein markeren",
        "action-move": "disse zied herneumen",
        "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}}",
-       "suppress": "Toezichte",
+       "suppress": "Toezicht",
        "querypage-disabled": "Disse spesiale zied is uutezet um prestasieredens.",
        "apisandbox": "API-zaandkule",
        "booksources": "Boekinformasie",
        "duplicate-defaultsort": "Waorschuwing: de standardsortering \"$2\" krig veurrang veur de sortering \"$1\".",
        "version": "Versie",
        "version-extensions": "Uutbreidingen die installeerd bin",
-       "version-skins": "Vormgevingen",
+       "version-skins": "Geïnstalleerden vormgevingen",
        "version-specialpages": "Spesiale ziejen",
        "version-parserhooks": "Parserhoeken",
        "version-variables": "Variabels",
        "version-entrypoints": "Webadressen veur ingangen",
        "version-entrypoints-header-entrypoint": "Ingang",
        "version-entrypoints-header-url": "Webadres",
-       "redirect": "Deurverwiezen op bestaandsnaam, gebrukersnummer, ziednummer of versienummer",
+       "redirect": "Deurverwiezen op bestaandsnaam, gebrukers-, zied-, versie- of logboekregelnummer",
        "redirect-summary": "Disse spesiale zied verwis deur naor n bestaand (as de bestaandsnaam op-egeven wördt), n zied (as n zied- of versienummer op-egeven wördt) of n gebrukerszied (as t gebrukersnummer op-egeven wördt). Gebruuk: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], of [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Zeuk",
        "redirect-lookup": "Opzeuken:",
        "special-characters-group-khmer": "Khmer",
        "special-characters-title-endash": "liggend streepjen",
        "special-characters-title-emdash": "gedachtenstreepjen",
-       "special-characters-title-minus": "minteken",
-       "api-error-blacklisted": "Kies n aandere, beschrievende naam."
+       "special-characters-title-minus": "minteken"
 }
index 1893d4a..ee99f80 100644 (file)
                        "Nemo bis",
                        "Lemondoge",
                        "Dinosaur918",
-                       "Jdforrester"
+                       "Jdforrester",
+                       "Jeleniccz"
                ]
        },
        "tog-underline": "Koppelingen onderstrepen:",
-       "tog-hideminor": "Kleine wijzigingen verbergen in recente wijzigingen",
+       "tog-hideminor": "Kleine bewerkingen verbergen in recente wijzigingen",
        "tog-hidepatrolled": "Gemarkeerde wijzigingen verbergen in recente wijzigingen",
        "tog-newpageshidepatrolled": "Gemarkeerde pagina's verbergen in de lijst met nieuwe pagina's",
        "tog-hidecategorization": "Categorisatie van pagina's verbergen",
        "password-change-forbidden": "U kunt uw wachtwoord niet wijzigen in deze wiki.",
        "externaldberror": "Er is een fout opgetreden bij het aanmelden bij de database of u hebt geen toestemming uw externe gebruiker bij te werken.",
        "login": "Aanmelden",
+       "login-security": "Uw identiteit controleren",
        "nav-login-createaccount": "Aanmelden / registreren",
        "userlogin": "Aanmelden / registreren",
        "userloginnocreate": "Aanmelden",
        "createacct-another-realname-tip": "Echte naam is optioneel.\nAls u deze opgeeft, wordt deze naam gebruikt worden om u erkenning te geven voor uw werk.",
        "pt-login": "Aanmelden",
        "pt-login-button": "Aanmelden",
+       "pt-login-continue-button": "Doorgaan met aanmelden",
        "pt-createaccount": "Registreren",
        "pt-userlogout": "Afmelden",
        "php-mail-error-unknown": "Er is een onbekende fout opgetreden in de mail()-functie van PHP",
        "botpasswords-invalid-name": "De gebruikersnaam bevat niet het scheidingsteken van het botwachtwoord (\"$1\").",
        "botpasswords-not-exist": "Gebruiker \"$1\" heeft geen botwachtwoord genaamd \"$2\"",
        "resetpass_forbidden": "Wachtwoorden kunnen niet gewijzigd worden",
+       "resetpass_forbidden-reason": "Wachtwoorden kunnen niet gewijzigd worden: $1",
        "resetpass-no-info": "U dient aangemeld zijn voordat u deze pagina kunt gebruiken.",
        "resetpass-submit-loggedin": "Wachtwoord wijzigen",
        "resetpass-submit-cancel": "Annuleren",
        "passwordreset-emailsentusername": "Als er een e-mailadres geregistreerd is voor die gebruikersnaam, dan wordt er een e-mail verzonden om uw wachtwoord opnieuw in te stellen.",
        "passwordreset-emailsent-capture": "Er is een e-mail voor het opnieuw instellen van een wachtwoord verzonden. Deze wordt hieronder weergegeven.",
        "passwordreset-emailerror-capture": "Er is een e-mail voor het opnieuw instellen van een wachtwoord aangemaakt. Deze wordt hieronder weergegeven. Het verzenden naar de {{GENDER:$2|gebruiker}} is mislukt om de volgende reden: $1",
+       "passwordreset-invalideamil": "Ongeldig e-mailadres",
        "changeemail": "E-mailadres wijzigen of verwijderen",
        "changeemail-header": "Vul dit formulier in om uw e-mailadres te wijzigen. Als u het e-mailadres wilt ontkoppelen van uw account, laat het e-mailadres dan leeg als u het formulier opslaat.",
        "changeemail-passwordrequired": "U  moet uw wachtwoord invoeren om deze wijziging te bevestigen.",
        "minoredit": "Dit is een kleine bewerking",
        "watchthis": "Deze pagina volgen",
        "savearticle": "Pagina opslaan",
+       "savechanges": "Wijzigingen opslaan",
        "publishpage": "Pagina publiceren",
+       "publishchanges": "Wijzigingen publiceren",
        "preview": "Voorvertoning",
        "showpreview": "Bewerking ter controle bekijken",
        "showdiff": "Wijzigingen bekijken",
        "content-model-css": "CSS",
        "content-json-empty-object": "Leeg object",
        "content-json-empty-array": "Lege reeks",
+       "deprecated-self-close-category": "Pagina's met ongeldige zelfsluitende HTML-tags",
        "duplicate-args-warning": "<strong>Waarschuwing:</strong> [[:$1]] roept [[:$2]] aan met meer dan één waarde voor de parameter \"$3\". Alleen de laatste waarde wordt gebruikt.",
        "duplicate-args-category": "Pagina's met dubbele sjabloonparameters",
        "duplicate-args-category-desc": "De pagina bevat aanroepen van sjablonen waarin hetzelfde argument meerdere keren wordt gebruikt, bijvoorbeeld <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> of <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "rightslogtext": "Hieronder staan de wijzigingen in gebruikersrechten.",
        "action-read": "deze pagina te bekijken",
        "action-edit": "deze pagina te bewerken",
-       "action-createpage": "pagina's aan te maken",
+       "action-createpage": "deze pagina aan te maken",
        "action-createtalk": "overlegpagina's aan te maken",
        "action-createaccount": "deze gebruiker aan te maken",
        "action-autocreateaccount": "dit externe gebruikersaccount automatisch aanmaken",
        "recentchanges-submit": "Weergeven",
        "rcnotefrom": "Wijzigingen sinds <strong>$3 om $4</strong> (maximaal <strong>$1</strong> {{PLURAL:$1|wijziging|wijzigingen}}).",
        "rclistfrom": "Wijzigingen bekijken vanaf $3 $2",
-       "rcshowhideminor": "Kleine wijzigingen $1",
+       "rcshowhideminor": "Kleine bewerkingen $1",
        "rcshowhideminor-show": "weergeven",
        "rcshowhideminor-hide": "verbergen",
        "rcshowhidebots": "bots $1",
        "undelete-error-long": "Er zijn fouten opgetreden bij het herstellen van het bestand:\n\n$1",
        "undelete-show-file-confirm": "Weet u zeker dat u een verwijderde versie van het bestand \"<nowiki>$1</nowiki>\" van $2 om $3 wilt bekijken?",
        "undelete-show-file-submit": "Ja",
-       "namespace": "Naamruimte:&nbsp;",
+       "namespace": "Naamruimte:",
        "invert": "Selectie omkeren",
        "tooltip-invert": "Selecteer dit om wijzigingen te verbergen in de geselecteerde naamruimte (en de gekoppelde naamruimte indien aangevinkt)",
        "tooltip-whatlinkshere-invert": "Selecteer dit vakje om koppelingen van pagina's in de geselecteerde naamruimte te verbergen.",
        "sp-contributions-username": "IP-adres of gebruikersnaam:",
        "sp-contributions-toponly": "Alleen nieuwste versies weergeven",
        "sp-contributions-newonly": "Alleen nieuwe pagina's weergeven",
+       "sp-contributions-hideminor": "Kleine bewerkingen verbergen",
        "sp-contributions-submit": "Bekijken",
        "whatlinkshere": "Koppelingen naar deze pagina",
        "whatlinkshere-title": "Pagina's die verwijzen naar \"$1\"",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Deze pagina verwijderen uit uw volglijst?",
        "confirm-rollback-button": "OK",
+       "confirm-rollback-top": "Bewerkingen op deze pagina terugdraaien?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← vorige pagina",
        "imgmultipagenext": "volgende pagina →",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
        "mw-widgets-titleinput-description-new-page": "pagina bestaat nog niet",
        "mw-widgets-titleinput-description-redirect": "doorverwijzing naar $1",
-       "api-error-blacklisted": "Kies een andere, beschrijvende naam.",
        "sessionmanager-tie": "Het is niet mogelijk om meerdere authenticatietypen voor verzoeken te combineren: $1.",
        "sessionprovider-generic": "$1-sessies",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "op cookies gebaseerde sessies",
        "log-action-filter-block-unblock": "Opheffing van blokkade",
        "log-action-filter-delete-delete": "Verwijderen van pagina",
        "log-action-filter-delete-restore": "Terugplaatsen van pagina",
+       "log-action-filter-newusers-create": "Aangemaakt door een anonieme gebruiker",
+       "log-action-filter-newusers-create2": "Aangemaakt door een geregistreerde gebruiker",
        "log-action-filter-newusers-autocreate": "Automatische aanmaak",
+       "log-action-filter-newusers-byemail": "Aangemaakt met wachtwoord verzonden via e-mail",
        "log-action-filter-patrol-patrol": "Handmatige markering",
        "log-action-filter-patrol-autopatrol": "Automatische markering",
        "log-action-filter-protect-protect": "Beveiliging",
        "log-action-filter-rights-autopromote": "Automatische aanpassing",
        "log-action-filter-upload-upload": "Nieuwe upload",
        "log-action-filter-upload-overwrite": "Herupload",
-       "authmanager-email-label": "E-mail"
+       "authmanager-authn-autocreate-failed": "Het automatisch aanmaken van een lokaal account is mislukt: $1",
+       "authmanager-create-disabled": "Het aanmaken van accounts is uitgeschakeld.",
+       "authmanager-email-label": "E-mail",
+       "authmanager-email-help": "E-mailadres",
+       "authmanager-realname-label": "Echte naam",
+       "authmanager-realname-help": "Echte naam van de gebruiker",
+       "authmanager-provider-temporarypassword": "Tijdelijk wachtwoord",
+       "authprovider-resetpass-skip-label": "Overslaan",
+       "specialpage-securitylevel-not-allowed-title": "Niet toegestaan"
 }
index e743237..8182a4f 100644 (file)
        "nstab-category": "Kategori",
        "mainpage-nstab": "Hovudside",
        "nosuchaction": "Funksjonen finst ikkje",
-       "nosuchactiontext": "Handlinga som er oppgjeven i adressa er ugyldig.\nDu har kanskje stava adressa feil, eller følgt ei feil lenkja.\nDette kan òg skuldast ein feil i programvara som er nytta av {{SITENAME}}.",
+       "nosuchactiontext": "Handlinga som er oppgjeven i adressa er ugyldig.\nDu har kanskje stava adressa feil, eller følgt ei feil lenkje.\nDette kan òg skuldast ein feil i programvara som er nytta av {{SITENAME}}.",
        "nosuchspecialpage": "Det finst inga slik spesialside",
        "nospecialpagetext": "Du har bede om ei spesialside som ikkje finst. Lista over spesialsider finn du [[Special:SpecialPages|her]].",
        "error": "Feil",
        "sectioneditnotsupported-text": "Endring av bolkar er ikkje støtta på denne sida.",
        "permissionserrors": "Løyvefeil",
        "permissionserrorstext": "Du har ikkje tilgang til å gjere dette, {{PLURAL:$1|grunnen|grunnane}} til det finn du her:",
-       "permissionserrorstext-withaction": "Du har ikkje løyve til å $2 {{PLURAL:$1|på grunn av|av desse grunnane}}:",
+       "permissionserrorstext-withaction": "Du har ikkje løyve til å $2 {{PLURAL:$1|av di|av desse grunnane}}:",
        "recreate-moveddeleted-warn": "'''Åtvaring: Du attopprettar ei side som tidlegare har vorte sletta.'''\n\nDu bør tenkje over om det er høveleg å halde fram med å endre denne sida.\nSletteloggen for sida finn du her:",
        "moveddeleted-notice": "Sida er vorten sletta. Sletteloggen og flytteloggen er viste nedanfor for referanse.",
        "log-fulllog": "Sjå full loggføring",
        "search-relatedarticle": "Relatert",
        "searchrelated": "relatert",
        "searchall": "alle",
-       "showingresults": "Nedanfor er opp til {{PLURAL:$1|'''eitt'''|'''$1'''}} resultat som byrjar med nummer '''$2''' vist{{PLURAL:$1||e}}.",
+       "showingresults": "Nedanfor er opp til {{PLURAL:$1|<strong>eitt</strong>|<strong>$1</strong>}} resultat som byrjar med nummer <strong>$2</strong> vist{{PLURAL:$1||e}}.",
        "search-showingresults": "Resultat <strong>{{PLURAL:$4|$1|$1–$2}}</strong> av <strong>$3</strong>",
        "search-nonefound": "Ingen resultat svarte til førespurnaden.",
        "search-nonefound-thiswiki": "Det var ingen resultat som passa til spørjinga på denne nettstaden.",
        "upload-too-many-redirects": "URL-en inneheldt for mange omdirigeringar",
        "upload-http-error": "Ein HTTP-feil oppstod: $1",
        "upload-copy-upload-invalid-domain": "Kopiopplastingar er ikkje tilgjengelege frå dette domenet.",
+       "upload-dialog-button-cancel": "Bryt av",
        "backend-fail-stream": "Kunne ikkje strøyma fila «$1».",
        "backend-fail-backup": "Kunne ikkje tryggingskopiera fila «$1».",
        "backend-fail-notexists": "Fila $1 finst ikkje.",
        "protect-otherreason": "Anna/ytterlegare årsak:",
        "protect-otherreason-op": "Anna årsak",
        "protect-dropdown": "*Vanlege verneårsaker\n** Gjenteke hærverk\n** Gjenteke spam\n** Endringskrig\n** Side med mange vitjande",
-       "protect-edit-reasonlist": "Endrar verneårsaker",
+       "protect-edit-reasonlist": "Endra verneårsaker",
        "protect-expiry-options": "1 time:1 hour,1 dag:1 day,1 veke:1 week,2 veker:2 weeks,1 månad:1 month,3 månader:3 months,6 månader:6 months,1 år:1 year,endelaus:infinite",
        "restriction-type": "Tilgang:",
        "restriction-level": "Avgrensingsnivå:",
        "api-error-badtoken": "Intern feil: ugild token.",
        "api-error-copyuploaddisabled": "Opplasting etter URL er avslege på tenaren.",
        "api-error-duplicate": "Det finst {{PLURAL:$1|ei anna fil|andre filer}} på nettstaden med same innhaldet.",
-       "api-error-duplicate-archive": "Det fanst {{PLURAL:$1|ei anna fi]|andre file]}} på nettstaden med det same innhaldet, men {{PLURAL:$1|ho|dei}} vart sletta.",
+       "api-error-duplicate-archive": "Det fanst {{PLURAL:$1|ei anna fi|andre file}} på nettstaden med det same innhaldet, men {{PLURAL:$1|ho|dei}} vart sletta.",
        "api-error-empty-file": "Fila du sende var tom.",
        "api-error-emptypage": "Det er ikkje tillate å oppretta nye tomme sider.",
        "api-error-fetchfileerror": "Intern feil: Noko gjekk gale då fila vart henta.",
        "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
        "mw-widgets-titleinput-description-new-page": "sida finst ikkje enno",
        "mw-widgets-titleinput-description-redirect": "omdiriger til $1",
-       "api-error-blacklisted": "Vel eit anna namn som er meir skildrande.",
        "randomrootpage": "Tilfeldig rotsida"
 }
index d404da0..8eb3af7 100644 (file)
        "tog-watchlisthidebots": "Amagar los cambiaments faits pels bòts dins la lista de seguiment",
        "tog-watchlisthideminor": "Amagar las modificacions menoras dins la lista de seguiment",
        "tog-watchlisthideliu": "Amaga, de la lista, las modificacions pels utilizaires connectats",
+       "tog-watchlistreloadautomatically": "Recargar automaticament la lista de seguiment quand las opcions de filtratge son modificadas (JavaScript requesit)",
        "tog-watchlisthideanons": "Amaga, de la lista, las modificacions anonimas",
        "tog-watchlisthidepatrolled": "Amagar las modificacions susvelhadas de la lista de seguiment",
+       "tog-watchlisthidecategorization": "Amagar la categorizacion de las paginas",
        "tog-ccmeonemails": "Me mandar una còpia dels corrièrs electronics que mandi als autres utilizaires",
        "tog-diffonly": "Far pas veire lo contengut de las paginas jos las difs",
        "tog-showhiddencats": "Afichar las categorias amagadas",
-       "tog-norollbackdiff": "Ometre lo diff aprèp l’utilizacion d’un revert",
+       "tog-norollbackdiff": "Afichar pas lo diff aprèp aver revocat",
        "tog-useeditwarning": "M’avisar quand quiti una pagina de modificacion sens publicar los cambiaments",
        "tog-prefershttps": "Utilizar totjorn una connexion securizada en essent connectat",
        "underline-always": "Totjorn",
        "viewhelppage": "Vejatz la pagina d'ajuda",
        "categorypage": "Vejatz la pagina de las categorias",
        "viewtalkpage": "Pagina de discussion",
-       "otherlanguages": "En autras lengas",
+       "otherlanguages": "Dins d'autras lengas",
        "redirectedfrom": "(Redirigit dempuèi $1)",
        "redirectpagesub": "Pagina de redireccion",
        "redirectto": "Redirigir cap a :",
        "createacct-yourpasswordagain": "Confirmatz lo senhal",
        "createacct-yourpasswordagain-ph": "Entratz lo senhal tornarmai",
        "remembermypassword": "Me reconnectar automaticament a las visitas venentas (al maximum $1 {{PLURAL:$1|jorn|jorns}})",
-       "userlogin-remembermypassword": "Gardar ma sesilha activa",
+       "userlogin-remembermypassword": "Gardar ma session activa",
        "userlogin-signwithsecure": "Utilizar una connexion securizada",
        "cannotloginnow-title": "Impossible de se connectar ara",
        "yourdomainname": "Vòstre domeni",
        "nocookieslogin": "{{SITENAME}} utiliza de cookies per la connexion mas avètz los cookies desactivats. Activatz-los e reconnectatz-vos.",
        "nocookiesfornew": "Lo compte d'utilizaire es pas estat creat, perque avèm pas pogut identificar son origina.\nVerificatz qu'avètz activat los cookies, recargatz la pagina e tornatz ensajar.",
        "noname": "Avètz pas picat de nom d'utilizaire valid.",
-       "loginsuccesstitle": "Identificacion capitada.",
+       "loginsuccesstitle": "Connectat",
        "loginsuccess": "Sètz actualament connectat(ada) sus {{SITENAME}} en tant que « $1 ».",
        "nosuchuser": "L'utilizaire « $1 » existís pas.\nLo nom d'utilizaire es sensible a la cassa.\nVerificatz vòstra ortografia, o [[Special:CreateAccount|creatz-vos un compte novèl]].",
        "nosuchusershort": "I a pas de contributor amb lo nom « $1 ». Verificatz l’ortografia.",
        "createaccount-title": "Creacion d'un compte per {{SITENAME}}",
        "createaccount-text": "Qualqu'un a creat un compte per vòstra adreça de corrièr electronic sus {{SITENAME}} ($4) intitolat « $2 », amb per senhal « $3 ». Deuriaz dobrir una sessilha e cambiar, tre ara, aqueste senhal.\n\nIgnoratz aqueste messatge se aqueste compte es estat creat per error.",
        "login-throttled": "Avètz ensajat un tròp grand nombre de connexions darrièrament.\nEsperatz $1 abans d’ensajar tornarmai.",
-       "login-abort-generic": "Vòstra temptativa de connexion a fracassat",
+       "login-abort-generic": "Vòstra temptativa de connexion a fracassat - Anullat",
        "loginlanguagelabel": "Lenga: $1",
        "suspicious-userlogout": "Vòstra demanda de desconnexion es estada refusada perque sembla qu’es estada mandada per un navigador copat o la mesa en cache d’un proxy.",
        "createacct-another-realname-tip": "Lo nom vertadièr es opcional.\nSe decidissètz de lo provesir, serà utilizat per atribuir a l’utilizaire sos trabalhs.",
        "loginreqlink": "connectar",
        "loginreqpagetext": "Vos cal vos $1 per veire las autras paginas.",
        "accmailtitle": "Senhal mandat.",
-       "accmailtext": "Un senhal generat aleatòriament per [[User talk:$1|$1]] es estat mandat a $2.\nLo senhal per aqueste compte novèl pòt èsser cambiat sus la pagina ''[[Special:ChangePassword|Cambiament de senhal]]'' aprèp s'èsser connectat.",
+       "accmailtext": "Un senhal generat aleatòriament per [[User talk:$1|$1]] es estat mandat a $2.\nLo senhal per aqueste compte novèl pòt èsser cambiat sus la pagina ''[[Special:ChangePassword|Cambiament de senhal]]'' aprèp connexion.",
        "newarticle": "(Novèl)",
        "newarticletext": "Avètz seguit un ligam cap a una pagina qu’existís pas encara o qu'es estada [{{fullurl:Special:Log|type=delete&page={{FULLPAGENAMEE}}}} escafada].\nPer crear aquesta pagina, picatz vòstre tèxte dins la bóstia çaijós (podètz consultar [$1 la pagina d’ajuda] per mai d’entresenhas).\nSe sètz arribat(ada) aicí per error, clicatz sul boton '''retorn''' de vòstre navigador.",
        "anontalkpagetext": "---- ''Sètz sus la pagina de discussion d'un utilizaire anonim qu'a pas encara creat un compte o que n'utiliza pas.\nPer aquesta rason, devèm utilizar son adreça IP per l'identificar. Una adreça d'aqueste tipe pòt èsser partejada entre mantun utilizaire. Se sètz un utilizaire anonim e se constatatz que de comentaris que vos concernisson pas vos son estats adreçats, podètz [[Special:CreateAccount|crear un compte]] o [[Special:UserLogin|vos connectar]] per evitar tota confusion venenta amb d’autres contributors anonims.''",
-       "noarticletext": "Pel moment, i a pas cap de tèxte sus aquesta pagina ;\npodètz [[Special:Search/{{PAGENAME}}|aviar una recèrca sul títol d'aqueste títol de pagina]] dins las autras pagina,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} recercar dins las operacions ligadas]\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear aquesta pagina]</span>.",
+       "noarticletext": "Pel moment, i a pas cap de tèxte sus aquesta pagina.\nPodètz [[Special:Search/{{PAGENAME}}|aviar una recèrca sul títol d'aqueste títol de pagina]] dins las autras pagina,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} recercar dins las operacions ligadas],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear aquesta pagina]</span>.",
        "noarticletext-nopermission": "Actualament i a pas cap de tèxte dins aquesta pagina.\nPodètz [[Special:Search/{{PAGENAME}}|far una recèrca sul títol de la pagina]] dins las autras paginas,\no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} recercar dins los jornals associats]</span>.",
        "missing-revision": "La revision n° $1 de la pagina intitulada « {{FULLPAGENAME}} » existís pas.\n\nAquò se produtz en general en seguent un ligam istoric obsolèt cap a una pagina qu'es estada suprimida.\nPodètz trobar mai de detalhs dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de las supressions].",
        "userpage-userdoesnotexist": "Lo compte d'utilizaire « <nowiki>$1</nowiki> » es pas enregistrat. Indicatz se volètz crear o editar aquesta pagina.",
        "previewnote": "'''Remembratz-vos qu'es pas qu'una previsualizacion.'''\nVòstras modificacions son pas encara estadas enregistradas !",
        "continue-editing": "Anar a la zòna de modificacion",
        "previewconflict": "Aquesta previsualizacion fa veire lo tèxte de la bóstia de modificacion superiora coma apareisserà se causissètz de lo salvar.",
-       "session_fail_preview": "'''Podèm pas enregistrar vòstra modificacion a causa d’una pèrda d’informacions concernent vòstra sesilha.\nEnsajatz tornarmai.\nS'aquò fracassa encara, [[Special:UserLogout|desconnectatz-vos]], puèi connectatz-vos tornamai.'''",
-       "session_fail_preview_html": "'''Podèm pas enregistrar vòstra modificacion a causa d’una pèrda d’informacions que concernís vòstra sesilha.'''\n\n''Perque {{SITENAME}} a activat l’HTML brut, la previsualizacion es estada amagada per prevenir un atac per JavaScript.''\n\n'''Se la temptativa de modificacion èra legitima, ensajatz encara.\nS'aquò capita pas un còp de mai, [[Special:UserLogout|desconnectatz-vos]], puèi connectatz-vos tornamai.'''",
+       "session_fail_preview": "O planhèm, podèm pas enregistrar vòstra modificacion a causa d’una pèrda d’informacions a prepaus de vòstra session.\n\nBenlèu que sètz estat desconnectat. <strong>Verificatz que sètz encara connectat e ensajatz tornamai.</strong>\nSe aquò fracassa tornamai, ensajatz en vos [[Special:UserLogout|desconnectant]], puèi en vos reconnectant, e verificatz que vòstre navigador accèpta los cookies d'aqueste site.",
+       "session_fail_preview_html": "O planhèm, podèm pas enregistrar vòstra modificacion a causa d’una pèrda d’informacions que concernís vòstra session.\n\n<em>Perque {{SITENAME}} a activat l’HTML brut, la previsualizacion es estada amagada per prevenir un atac per JavaScript.</em>\n\n<strong>Se la temptativa de modificacion èra legitima, ensajatz encara.</strong>\nS'aquò capita pas un còp de mai, [[Special:UserLogout|desconnectatz-vos]], puèi connectatz-vos tornamai.",
        "token_suffix_mismatch": "'''Vòstra modificacion es pas estada acceptada perque vòstre navigador a mesclat los caractèrs de ponctuacion dins l’identificant d’edicion. La modificacion es estada regetada per empachar la corrupcion del tèxte de l’article. Aqueste problèma se produtz quand utilizatz un mandatari (proxy) anonim problematic.'''",
        "edit_form_incomplete": "'''D'unas partidas del formulari de modificacion an pas atench lo servidor, verificatz que vòstras modificacions son intactas e ensajatz tornarmai.'''",
        "editing": "Modificacion de $1",
        "revdelete-unsuppress": "Levar las restriccions sus las versions restablidas",
        "revdelete-log": "Motiu :",
        "revdelete-submit": "Aplicar {{PLURAL:$1|a la version seleccionada|a las versions seleccionadas}}",
-       "revdelete-success": "'''Visibilitat de las versions mesas a jorn amb succès.'''",
+       "revdelete-success": "Visibilitat de las versions mesa a jorn.",
        "revdelete-failure": "'''La visibilitat de la revision a pas pogut èsser mesa a jorn :'''\n$1",
-       "logdelete-success": "'''Jornal de las visibilitat parametrat amb succès.'''",
+       "logdelete-success": "Visibilitat del jornal modificada.",
        "logdelete-failure": "'''La visibilitat del jornal a pas pogut èsser definida :'''\n$1",
        "revdel-restore": "Modificar la visibilitat",
        "pagehist": "Istoric de la pagina",
        "mergehistory-go": "Veire las edicions fusionablas",
        "mergehistory-submit": "Fusionar las revisions",
        "mergehistory-empty": "Cap de revision pòt pas èsser fusionada.",
-       "mergehistory-done": "$3 {{PLURAL:$3|revision|revisions}} de $1 {{PLURAL:$3|fusionada|fusionadas}} amb succès amb [[:$2]].",
+       "mergehistory-done": "$3 version{{PLURAL:$3||s}} de $1 {{PLURAL:$3|es estada fusionada|son estada fusionadas}} dins [[:$2]].",
        "mergehistory-fail": "Impossible de procedir a la fusion dels istorics. Seleccionatz  tornamai la pagina e mai los paramètres de data.",
        "mergehistory-fail-toobig": "Impossible d’efectuar la fusion de l’istoric perque un nombre de {{PLURAL:$1|revisions}} superior al limit de $1 deuriá èsser desplaçat.",
        "mergehistory-no-source": "La pagina d'origina $1 existís pas.",
        "prefs-watchlist": "Lista de seguiment",
        "prefs-editwatchlist": "Modificar la lista de seguiment",
        "prefs-editwatchlist-label": "Modificar de títols de vòstra lista de seguiment",
+       "prefs-editwatchlist-edit": "Veire e levar de títols de vòstra lista de seguiment",
        "prefs-editwatchlist-raw": "Modificar la lista de seguiment en mòde brut",
        "prefs-editwatchlist-clear": "Escafar la lista de seguiment",
        "prefs-watchlist-days": "Nombre de jorns d'afichar dins la lista de seguiment :",
        "rows": "Rengadas :",
        "columns": "Colomnas :",
        "searchresultshead": "Recèrca",
-       "stub-threshold": "Limit superior pels <a href=\"#\" class=\"stub\">ligams cap als esbòsses</a> (octets) :",
+       "stub-threshold": "Limit pel formatatge dels ligams d’esbòs ($1) :",
        "stub-threshold-disabled": "Desactivat",
        "recentchangesdays": "Nombre de jorns d'afichar dins los darrièrs cambiaments :",
        "recentchangesdays-max": "(maximum $1 {{PLURAL:$1|jorn|jorns}})",
        "rightslogtext": "Aquò es un jornal dels cambiaments d'estatut d’utilizaire.",
        "action-read": "legir aquesta pagina",
        "action-edit": "modificar aquesta pagina",
-       "action-createpage": "crear de paginas",
-       "action-createtalk": "crear de paginas de discussion",
+       "action-createpage": "crear aquesta pagina",
+       "action-createtalk": "crear aquesta pagina de discussion",
        "action-createaccount": "crear aqueste compte d'utilizaire",
        "action-history": "afichar l’istoric d'aquesta pagina",
        "action-minoredit": "marcar aqueste cambiament coma menor",
        "uploadstash": "Cache d'impòrt",
        "uploadstash-clear": "Escafar los fichièrs en cache",
        "uploadstash-nofiles": "Avètz pas de fichièrs en cache d'impòrt.",
-       "uploadstash-errclear": "L'escafament dels fichièrs a fracassat.",
+       "uploadstash-errclear": "La supression dels fichièrs a fracassat.",
        "uploadstash-refresh": "Actualizar la lista dels fichièrs",
        "invalid-chunk-offset": "Offset de segment invalid",
        "img-auth-accessdenied": "Accès refusat",
        "booksources-text": "Vaquí una lista de ligams cap a d’autres sites que vendon de libres nòus e d’ocasion e suls quals trobaretz benlèu d'entresenhas suls obratges que cercatz. {{SITENAME}} es pas ligada a cap d'aquestas societats, a pas l’intencion de ne far la promocion.",
        "booksources-invalid-isbn": "Lo numèro ISBN balhat sembla pas èsser valid ; verificatz s'avètz fait una error al moment de la còpia dempuèi la font.",
        "specialloguserlabel": "Autor :",
-       "speciallogtitlelabel": "Cibla (títol o utilizaire):",
+       "speciallogtitlelabel": "Cibla (títol o {{ns:user}}:nom d'utilizaire) :",
        "log": "Jornals",
        "all-logs-page": "Totas las operacions publicas",
        "alllogstext": "Afichatge combinat de totes los jornals de {{SITENAME}}.\nPodètz restrénher la vista en seleccionant un tipe de jornal, un nom d’utilizaire (cassa sensibla) o una pagina ciblada (idem).",
        "emailccsubject": "Còpia de vòstre messatge a $1 : $2",
        "emailsent": "Messatge mandat",
        "emailsenttext": "Vòstre messatge es estat mandat.",
-       "emailuserfooter": "Aqueste corrièr electronic es estat mandat per « $1 » a « $2 » per la foncion « Mandar un corrièr electronic a l’utilizaire » sus {{SITENAME}}.",
+       "emailuserfooter": "Aqueste corrièr electronic es estat mandat per « $1 » a « $2 » per la foncion « {{int:emailuser}} » sus {{SITENAME}}.",
        "usermessage-summary": "A daissat un messatge de sistèma.",
        "usermessage-editor": "Messatgièr del sistèma",
        "watchlist": "Lista de seguiment",
        "revertpage": "Anullacion de las modificacions de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussion]]) cap a la darrièra version de [[User:$1|$1]]",
        "revertpage-nouser": "Revocacion de las modificacions per un utilizaire amagat a la darrièra version per {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Anullacion de las modificacions de $1 ; retorn a la version de $2.",
-       "sessionfailure-title": "La sesilha a fracassat",
-       "sessionfailure": "Vòstra sesilha de connexion sembla aver de problèmas ;\naquesta accion es estada anullada en prevencion d’un piratatge de sesilha.\nClicatz sus « Precedent » e tornatz cargar la pagina d’ont venètz, puèi ensajatz tornarmai.",
+       "sessionfailure-title": "La session a fracassat",
+       "sessionfailure": "Vòstra session de connexion sembla aver de problèmas ;\naquesta accion es estada anullada en prevencion d’un piratatge de session.\nClicatz sus « Precedent » e tornatz cargar la pagina d’ont venètz, puèi ensajatz tornarmai.",
+       "changecontentmodel": "Modificar lo modèl de contengut d’una pagina",
        "changecontentmodel-title-label": "Títol de la pagina",
        "changecontentmodel-model-label": "Novèl modèl de contengut",
        "changecontentmodel-reason-label": "Motiu :",
        "whatlinkshere-prev": "{{PLURAL:$1|precedent|$1 precedents}}",
        "whatlinkshere-next": "{{PLURAL:$1|seguent|$1 seguents}}",
        "whatlinkshere-links": "← ligams",
-       "whatlinkshere-hideredirs": "$1 redireccions",
-       "whatlinkshere-hidetrans": "$1 transclusions",
+       "whatlinkshere-hideredirs": "$1 las redireccions",
+       "whatlinkshere-hidetrans": "$1 las inclusions",
        "whatlinkshere-hidelinks": "$1 ligams",
        "whatlinkshere-hideimages": "$1 los fichièrs ligats",
        "whatlinkshere-filters": "Filtres",
        "import-nonewrevisions": "Cap de revision pas importada (totas èran ja presentas, o ignoradas del fait d’errors).",
        "xml-error-string": "$1 a la linha $2, col $3 (octet $4) : $5",
        "import-upload": "Impòrt d'un fichier XML",
-       "import-token-mismatch": "Pèrda de las donadas de sesilha. Tornatz ensajar.",
+       "import-token-mismatch": "Pèrda de las donadas de session.\n\nBenlèu que sètz estats desconnectats. <strong>Verificatz que sètz totjorn connectat e reensajatz</strong>.\nSe aquò fonciona totjorn pas, ensajatz de [[Special:UserLogout|vos desconnectar]] e reconnectatz-vos, e verificatz que vòstre navigador accèpta los cookies d'aqueste site.",
        "import-invalid-interwiki": "Impossible d'importar dempuèi lo wiki especificat.",
        "import-error-edit": "La pagina « $1 » es pas estada importada perque sètz pas autorizat a la modificar.",
        "import-error-create": "La pagina « $1 » es pas estada importada perque sètz pas autorizat a la crear.",
        "special-characters-title-endash": "jonhent anglés",
        "special-characters-title-emdash": "jonhent em",
        "special-characters-title-minus": "signe mens",
-       "randomrootpage": "Pagina raiç aleatòria"
+       "randomrootpage": "Pagina raiç aleatòria",
+       "log-action-filter-rights": "Tipe de cambiament de dreits :",
+       "log-action-filter-suppress": "Tipe de supression :",
+       "changecredentials": "Modificar las informacions d’identificacion"
 }
index 18d8a84..750bc46 100644 (file)
        "jumpto": "Siirry",
        "jumptonavigation": "navigatsii",
        "jumptosearch": "eči",
-       "view-pool-error": "Pahakse mielekse palvelimet ollah ylikuormittunnuot täl hetkel. Liijan moni käyttäi oppiu tarkastella tädä sivuu. Vuota kodvaine enne gu opit uvvessah.",
+       "view-pool-error": "Pahakse mielekse palvelimet ollah ylikuormittunnuot täl hetkel. Liijan moni käyttäi oppiu tarkastella tädä sivuu. Vuota kodvaine, enne gu opit uvvessah.\n\n$1",
        "generic-pool-error": "Pahakse mielekse palvelimet ollah ylikuormittunnuot nygöi. Liijan moni käyttäi oppiu tarkastella tädä sivuu.",
        "pool-timeout": "Lukittumizen vuotanduaigu on loppenuhes.",
        "pool-queuefull": "Ečindykyzymykzien tallendustila on täyzi",
        "privacypage": "Project:Luottamuksen periuateh",
        "badaccess": "Ei oigevuksii",
        "badaccess-group0": "Sinul ei ole lubua suorittua tädä toiminduo.",
-       "badaccess-groups": "Tämän toimindon voijah suorittua vai {{PLURAL:$2|täh joukkoh|nämmih joukkoloih}} kuulujat käyttäjät.",
+       "badaccess-groups": "Tämän toimindon voijah suorittua vai {{PLURAL:$2|täh joukkoh|nämmih joukkoloih}}:$1 kuulujat käyttäjät.",
        "versionrequired": "MediiWikis pidäy vähimyölleh versii $1",
        "versionrequiredtext": "MediiWikis pidäy vähimyölleh versii $1 tädä sivuu kaččojes. Kačo [[Special:Version|versii]].",
        "ok": "OK",
        "revdelete-radio-same": "(älä vaihta)",
        "revdelete-radio-set": "Peitetty",
        "revdelete-radio-unset": "Nägövil",
-       "logdelete-success": "'''Tapahtumuhistourien nägyvytty on muutettu.'''",
+       "logdelete-success": "Tapahtumuhistourien nägyvytty on muutettu.",
        "logdelete-failure": "'''Tapahtumuhistourien nägyvytty ei voidu azettua:'''\n$1",
        "revdel-restore": "vaihta nägyvys",
        "pagehist": "Sivuhistourii",
index c0c1588..4f80dee 100644 (file)
        "noname": "ଆପଣ ଗୋଟିଏ ବୈଧ ଇଉଜର ନାମ ଦେଇନାହାନ୍ତି ।",
        "loginsuccesstitle": "ଠିକଭାବେ ଲଗ-ଇନ ହେଲା",
        "loginsuccess": "'''ଆପଣ {{SITENAME}}ରେ \"$1\" ନାମରେ ଲଗ-ଇନ କରିଛନ୍ତି ।'''",
-       "nosuchuser": "\"$1\" à¬¨à¬¾à¬®à¬°à­\87 à¬\95à­\87ହି à¬\9cଣà­\87 à¬¬à¬¿ à¬¸à¬­à­\8dà­\9f à¬¨à¬¾à¬¹à¬¾à¬¨à­\8dତି à¥¤\nà¬\87à¬\89à¬\9cର à¬¨à¬¾à¬® à¬\87à¬\82ରାà¬\9cà­\80 à¬\9bà­\8bà¬\9f à¬\93 à¬¬à¬¡à¬¼ à¬\85à¬\95à­\8dଷର à¬ªà­\8dରତି à¬¸à¬®à­\8dବà­\87ଦନଶà­\80ଳ à¥¤\nà¬\86ପଣ à¬¨à¬¿à¬\9cର à¬¬à¬¨à¬¾à¬¨ à¬ªà¬°à¬\96ି à¬¨à¬¿à¬\85ନà­\8dତà­\81, à¬\85ଥବା [[Special:CreateAccount|ନà­\82à¬\86 à¬\96ାତାà¬\9fିà¬\8f à¬¤à¬¿à¬\86ରି à¬\95ରନà­\8dତà­\81]] à¥¤",
+       "nosuchuser": "\"$1\" ନାମରେ କେହି ଜଣେ ବି ସଭ୍ୟ ନାହାନ୍ତି ।\nଇଉଜର ନାମ ଇଂରାଜୀ ଛୋଟ ଓ ବଡ଼ ଅକ୍ଷର ପ୍ରତି ସମ୍ବେଦନଶୀଳ ।\nବନାନ ପରଖି ନିଅନ୍ତୁ, ଅଥବା [[Special:CreateAccount|ନୂଆ ଖାତାଟିଏ ତିଆରି କରନ୍ତୁ]] ।",
        "nosuchusershort": "\"$1\" ନାମରେ କେହି ଜଣେ ବି ସଭ୍ୟ ନାହାନ୍ତି ।\nଆପଣ ବନାନ ପରଖି ନିଅନ୍ତୁ ।",
        "nouserspecified": "ଆପଣଙ୍କୁ ଇଉଜର ନାମଟିଏ ଦେବାକୁ ପଡ଼ିବ ।",
        "login-userblocked": "ଏହି ସଭ୍ୟଙ୍କୁ ଅଟକାଯାଇଛି । ଲଗ ଇନ କରିବାକୁ ଅନୁମତି ନାହିଁ ।",
        "special-characters-title-endash": "en ଡ୍ୟାସ",
        "special-characters-title-emdash": "em dash",
        "special-characters-title-minus": "ମେନୁଗୁଡିକର ଚିହ୍ନ",
-       "mw-widgets-titleinput-description-redirect": "$1କୁ ପୁନଃପ୍ରେରଣ କରିବେ",
-       "api-error-blacklisted": "ଦୟାକରି ଏକ ଅଲଗା, ବିବରଣୀ ଶିରୋନାମାରେ ରଖିବେ ।"
+       "mw-widgets-titleinput-description-redirect": "$1କୁ ପୁନଃପ୍ରେରଣ କରିବେ"
 }
index 91cefe4..cb9ca86 100644 (file)
@@ -22,7 +22,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Macofe",
-                       "ਪ੍ਰਚਾਰਕ"
+                       "ਪ੍ਰਚਾਰਕ",
+                       "Tow"
                ]
        },
        "tog-underline": "ਲਿੰਕ ਹੇਠ-ਲਾਈਨ:",
        "morenotlisted": "ਇਹ ਸੂਚੀ ਪੂਰੀ ਨਹੀਂ ਹੈ।",
        "mypage": "ਸਫ਼ਾ",
        "mytalk": "ਗੱਲ-ਬਾਤ",
-       "anontalk": "à¨\87ਸ IP à¨²à¨\88 à¨\97ੱਲ-ਬਾਤ",
+       "anontalk": "ਗੱਲ-ਬਾਤ",
        "navigation": "ਫੇਰੀ ਪਾਓ",
        "and": "&#32;ਅਤੇ",
        "qbfind": "ਖੋਜ",
        "tooltip-t-recentchangeslinked": "ਇਸ ਸਫ਼ੇ ਤੋਂ ਲਿੰਕ ਕੀਤੇ ਸਫ਼ਿਆਂ ਵਿਚ ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ",
        "tooltip-feed-rss": "ਇਸ ਸਫ਼ੇ ਲਈ RSS ਫ਼ੀਡ",
        "tooltip-feed-atom": "ਇਸ ਸਫ਼ੇ ਦੀ ਐਟਮ ਫ਼ੀਡ",
-       "tooltip-t-contributions": "ਇਸ ਵਰਤੋਂਕਾਰ ਦੀ ਯੋਗਦਾਨ ਸੂਚੀ",
+       "tooltip-t-contributions": "{{GENDER:$1|}} ਦੀ ਯੋਗਦਾਨ ਸੂਚੀ",
        "tooltip-t-emailuser": "ਇਸ ਵਰਤੋਂਕਾਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ",
        "tooltip-t-upload": "ਫ਼ਾਈਲਾਂ ਅਪਲੋਡ ਕਰੋ",
        "tooltip-t-specialpages": "ਸਾਰੇ ਖ਼ਾਸ ਸਫ਼ਿਆਂ ਦੀ ਲਿਸਟ",
index a229310..4a376c8 100644 (file)
        "listgrouprights-summary": "L'pache-lo ch'est ène lisse d'chés groupes d'uzeus définis édseur ech wiki aveuc chés drouots d'intrèe achuchonnés.<br />I put y avoèr ichi d'eutes [[MediaWiki:Listgrouprights-helppage|informacions]] édseur chés drouots individuèls. ([[{{MediaWiki:Listgrouprights-helppage}}|vir]])",
        "listgrouprights-members": "(lisse éd chés mimbes)",
        "emailuser": "Imèle echl'uzeu-lo",
-       "emailpage": "Imèle dech uzeu",
        "watchlist": "Em lisse à suire",
        "mywatchlist": "M'lisse à suire",
        "watchlistfor2": "Pour $1 $2",
        "block-log-flags-nocreate": "créhachon d'conpte intérdite",
        "movepagetext": "Implouéyez ch'formuloére édsou pou érlonmer éne pache, in déplachant tout sin histoérique vers ch'nouvieu nom. Echl’anthiu tite i varo eune pache éd érdirécchon vers ch'nouvieu tite. Os povez métte à jour oùtonmatiquemint chés érdirécchons à ch'momint-chi qu' pointette vers ch'tite original. <br /> Si os couésiyez éd n'poin l'foaire, os d'vez vérifier toute [[Special:DoubleRedirects|doube érdirécchon]] ou [[Special:BrokenRedirects|bérsiée érdirécchon]].<br /> Vos avez el résponsabilité d'vérifier éq chés loïens continuette éd pointer vers leu déstinnachon prévue.\n\nNotez éq l'pache n'éro '''poin''' déplachée s’il essiste déjo eune pache aveuc ch'nouvieu tite, sauf si l'pache o un histoérique éd canjemints vièrge ,   vide ou est éne simpe érdiréctchn. Cha pérmet d'érlonmer eune pache vers esn posicion d’origine si ch'déplachemint est éne berlure.\n\n'''AFUTE !'''<br />\nCha put provoquer un canjemint radical pi imprévu pou eune pache souvint arbéyée ; vos dvez vos asseurer d’avoér conpérte chés consécanches dvint d'continuer.",
        "movepagetalktext": "L'pache éd pérlache achochonnèe sro oùtonmatiquemint érlonmée aveuc l'pache-lo ''' hormis si: ''' <br />\n*eune pache éd pérlache aveuc un teske essiste aveuc ch'nom-lo piécha, ou\n*os débiffez el casse édzou.\n\nDin chés cas-lo, I feut érlonmer ou ratatouiller l'pache aveuc l'main.",
-       "movearticle": "Déplacer l'pache",
        "newtitle": "Pou un nouvieu tite:",
        "move-watch": "Suire l'pache-lo",
        "movepagebtn": "Déplacer l'pache",
index 1cb5d95..1612248 100644 (file)
        "createacct-email-ph": "Wpisz swój adres e-mail",
        "createacct-another-email-ph": "Podaj adres e-mail",
        "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)",
        "createaccountreason": "Powód:",
        "createacct-reason": "Powód",
        "createacct-reason-ph": "Dlaczego zakładasz kolejne konto",
+       "createacct-reason-help": "Komunikat wyświetlany w rejestrze tworzenia kont",
        "createacct-submit": "Utwórz konto",
        "createacct-another-submit": "Utwórz konto",
+       "createacct-continue-submit": "Kontynuuj tworzenie konta",
        "createacct-another-continue-submit": "Kontynuuj tworzenie konta",
        "createacct-benefit-heading": "{{grammar:B.lp|{{SITENAME}}}} tworzą ludzie tacy jak Ty.",
        "createacct-benefit-body1": "{{PLURAL:$1|edycja|edycje|edycji}}",
        "nocookiesnew": "Konto użytkownika zostało utworzone, ale nie jesteś zalogowany.\n{{SITENAME}} używa ciasteczek do przechowywania informacji o zalogowaniu się.\nMasz obecnie w przeglądarce wyłączoną obsługę ciasteczek.\nŻeby się zalogować, włącz obsługę ciasteczek, następnie podaj nazwę użytkownika i hasło dostępu do swojego konta.",
        "nocookieslogin": "{{SITENAME}} wykorzystuje ciasteczka do przechowywania informacji o zalogowaniu się przez użytkownika.\nMasz obecnie w przeglądarce wyłączoną obsługę ciasteczek.\nSpróbuj ponownie po jej włączeniu.",
        "nocookiesfornew": "Konto użytkownika nie zostało utworzone, ponieważ nie można było potwierdzić jego źródła.\nUpewnij się, że masz włączoną obsługę ciasteczek, przeładuj stronę i spróbuj ponownie.",
+       "createacct-loginerror": "Konto zostało pomyślnie utworzone, ale nie mogłeś zostać zalogowany automatycznie. Proszę, [[Special:UserLogin|zalogować się ręcznie]].",
        "noname": "To nie jest poprawna nazwa użytkownika.",
        "loginsuccesstitle": "Zalogowano",
        "loginsuccess": "'''{{GENDER:|Zalogowałeś się|Zalogowałaś się|Zalogowano}} do {{GRAMMAR:D.lp|{{SITENAME}}}} jako „$1”.'''",
        "changepassword-success": "Twoje hasło zostało zmienione!",
        "changepassword-throttled": "Ostatnio zbyt wiele razy próbowałeś zalogować się na to konto.\nOdczekaj $1, zanim ponowisz próbę.",
        "botpasswords": "Hasła bota",
-       "botpasswords-summary": "<em>Hasła bota</em> pozwalają na dostęp do konta użytkownika za pośrednictwem interfejsu API bez korzystania z danych konta. Uprawnienia uczestnika przy użyciu hasła bota mogą być ograniczone.\n\nJeśli nie wiesz, dlaczego miałbyś je tworzyć, nie powinieneś tego robić. Nikt nie powinien prosić Cię o utworzyć i podanie tego hasła.",
+       "botpasswords-summary": "<em>Hasła bota</em> pozwalają na dostęp do konta użytkownika za pośrednictwem interfejsu API bez korzystania z danych konta. Uprawnienia użytkownika przy użyciu hasła bota mogą być ograniczone.\n\nJeśli nie wiesz, dlaczego miałbyś je tworzyć, nie powinieneś tego robić. Nikt nie powinien prosić Cię o utworzenie i podanie tego hasła.",
        "botpasswords-disabled": "Hasła robotów zostały wyłączone.",
        "botpasswords-no-central-id": "Aby użyć hasła robotów, musisz być zalogowany na koncie uniwersalnym.",
        "botpasswords-existing": "Istniejące hasło bota",
        "botpasswords-label-restrictions": "Ograniczenia użytkowania:",
        "botpasswords-label-grants-column": "Przyznane",
        "botpasswords-bad-appid": "Nazwa bota \"$1\" nie jest prawidłowa.",
+       "botpasswords-insert-failed": "Nie udało się dodać robota o nazwie \"$1\". Czy był już wcześniej dodany?",
+       "botpasswords-update-failed": "Nie udało się zmienić robota o nazwie \"$1\". Czy został usunięty?",
        "botpasswords-created-title": "Hasło bota stworzone",
        "botpasswords-created-body": "Hasło bota \"$1\" użytkownika \"$2\" zostało utworzone.",
        "botpasswords-updated-title": "Hasło bota zaktualizowane",
        "botpasswords-updated-body": "Hasło bota \"$1\" użytkownika \"$2\" zostało zaktualizowane.",
        "botpasswords-deleted-title": "Hasło bota usunięte",
        "botpasswords-deleted-body": "Hasło bota \"$1\" użytkownika \"$2\" zostało usunięte.",
+       "botpasswords-newpassword": "Nowe hasło do zalogowania przez <strong>$1</strong> to <strong>$2</strong>. <em>Proszę je zapisać w celu wykorzystania w przyszłości.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider nie jest dostępne.",
        "botpasswords-restriction-failed": "Logowanie nie powiodło się z powodu ograniczeń na hasło bota.",
+       "botpasswords-invalid-name": "Określona nazwa użytkownika nie zawiera separatora hasła bota (\"$1\").",
        "botpasswords-not-exist": "Użytkownik \"$1\" nie ma hasła dla bota o nazwie \"$2\".",
        "resetpass_forbidden": "Hasła nie mogą zostać zmienione",
        "resetpass_forbidden-reason": "Hasła nie mogą zostać zmienione: $1",
        "resetpass-temp-password": "Tymczasowe hasło:",
        "resetpass-abort-generic": "Zmiana hasła została przerwana przez rozszerzenie.",
        "resetpass-expired": "Twoje hasło wygasło. Proszę ustawić nowe hasło do logowania.",
-       "resetpass-expired-soft": "Twoje hasło wygasło i musi zostać zresetowane. Proszę wybrać nowe hasło albo kliknąć na \"{{int:authprovider-resetpass-skip-label}}\", aby zresetować je później.",
+       "resetpass-expired-soft": "Twoje hasło wygasło i musi zostać zresetowane. Proszę wybrać nowe hasło albo kliknąć na „{{int:authprovider-resetpass-skip-label}}”, aby zresetować je później.",
        "resetpass-validity-soft": "Twoje hasło jest niepoprawne: $1\n\nWybierz teraz nowe hasło albo kliknij „{{int:authprovider-resetpass-skip-label}}”, aby zresetować je później.",
        "passwordreset": "Wyczyść hasło",
        "passwordreset-text-one": "Wypełnij ten formularz, aby otrzymać tymczasowe hasło na email.",
        "passwordreset-emailsentusername": "Jeśli z tym kontem powiązany jest adres e‐mail, zostanie na niego wysłany e-mail do odzyskiwania hasła.",
        "passwordreset-emailsent-capture": "Wyświetlony poniżej e‐mail pozwalający na zresetowanie hasła został wysłany.",
        "passwordreset-emailerror-capture": "Poniżej wyświetlony e‐mail pozwalający na zresetowanie hasła został wygenerowany, ale nie udało się wysłać go do {{GENDER:$2|użytkownika|użytkowniczki}}: $1",
+       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Został wysłany e-mail|Zostały wysłane e-mail}} z informacjami o resetowaniu hasła. {{PLURAL:$1|Użytkownik i hasło jest pokazany|Lista użytkowników i haseł jest pokazana}} poniżej.",
+       "passwordreset-emailerror-capture2": "Wysyłanie e-maila do {{GENDER:$2|użytkownika|użytkowniczki}} nie powiodło się: $1 {{PLURAL:$3|Użytkownik i hasło jest pokazany|Lista użytkowników i haseł jest pokazana}} poniżej.",
+       "passwordreset-nocaller": "Musi być podany wywołujący",
+       "passwordreset-nosuchcaller": "Wywołujący nie istnieje: $1",
        "passwordreset-invalideamil": "Nieprawidłowy adres e-mail",
        "passwordreset-nodata": "Nie podano ani nazwy użytkownika, ani adresu e-mail",
        "changeemail": "Zmiana lub usunięcie adresu e‐mail",
        "minoredit": "To jest drobna zmiana",
        "watchthis": "Obserwuj",
        "savearticle": "Zapisz",
+       "savechanges": "Zapisz zmiany",
        "publishpage": "Opublikuj stronę",
+       "publishchanges": "Opublikuj zmiany",
        "preview": "Podgląd",
        "showpreview": "Pokaż podgląd",
        "showdiff": "Podgląd zmian",
        "accmailtext": "Losowo wygenerowane hasło dla [[User talk:$1|$1]] zostało wysłane do $2.\n\nHasło dla tego nowego konta po zalogowaniu można zmienić na stronie ''[[Special:ChangePassword|zmiana hasła]]''.",
        "newarticle": "(Nowy)",
        "newarticletext": "Brak strony o tym tytule.\nJeśli chcesz ją utworzyć, wpisz treść strony w poniższym polu (więcej informacji odnajdziesz [$1 na stronie pomocy]).\nJeśli utworzenie nowej strony nie było Twoim zamiarem, wciśnij ''Wstecz'' w swojej przeglądarce.",
-       "anontalkpagetext": "---- ''To jest strona dyskusji anonimowego użytkownika – takiego, który nie ma jeszcze swojego konta lub nie chce go w tej chwili używać.\nBy go identyfikować, używamy adresów IP.\nJednak adres IP może być współdzielony przez wielu użytkowników.\nJeśli jesteś anonimowym użytkownikiem i uważasz, że zamieszczone tu komentarze nie są skierowane do Ciebie, [[Special:CreateAccount|utwórz konto]] lub [[Special:UserLogin|zaloguj się]] – dzięki temu unikniesz w przyszłości podobnych nieporozumień.''",
+       "anontalkpagetext": "----\n<em>To jest strona dyskusji anonimowego użytkownika – takiego, który nie ma jeszcze swojego konta lub nie chce go w tej chwili używać.</em>\nBy go identyfikować, używamy adresów IP.\nJednak adres IP może być współdzielony przez wielu użytkowników.\nJeśli jesteś anonimowym użytkownikiem i uważasz, że zamieszczone tu komentarze nie są skierowane do Ciebie, [[Special:CreateAccount|utwórz konto]] lub [[Special:UserLogin|zaloguj się]] – dzięki temu unikniesz w przyszłości podobnych nieporozumień.",
        "noarticletext": "Obecnie ta strona nie ma zawartości.\nMożesz [[Special:Search/{{PAGENAME}}|wyszukać ten tytuł na innych stronach]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} przeszukać rejestr] \nlub [{{fullurl:{{FULLPAGENAME}}|action=edit}} utworzyć tę stronę]</span>.",
        "noarticletext-nopermission": "Ta strona nie posiada jeszcze zawartości.\nMożesz [[Special:Search/{{PAGENAME}}|wyszukać ten tytuł]] w treści innych stron\nlub <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} przeszukać powiązane rejestry]</span>, ale nie masz uprawnień do utworzenia tej strony",
        "missing-revision": "Wersja #$1 strony \"{{FULLPAGENAME}}\" nie istnieje.\n\nZazwyczaj jest to spowodowane przestarzałym linkiem do usuniętej strony. Powód usunięcia znajduje się w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejestrze].",
        "content-model-css": "CSS",
        "content-json-empty-object": "Pusty obiekt",
        "content-json-empty-array": "Pusta tablica",
+       "deprecated-self-close-category": "Strony zawierające nieprawidłowe samozamykające się znaczniki HTML",
+       "deprecated-self-close-category-desc": "Strona zawiera samozamykające się znaczniki HTML, takie jak <code>&lt;b/></code> lub <code>&lt;span/></code>. Ich zachowanie zmieni się na dostosowane do specyfikacji HTML5, więc ich użycie w wikikodzie jest zdeprecjonowane.",
        "duplicate-args-warning": "<strong>Ostrzeżenie:</strong> [[:$1]] wywołuje [[:$2]] z więcej niż jedną wartością dla parametru \"$3\". Tylko ostatnia podana wartość zostanie użyta.",
        "duplicate-args-category": "Strony zawierające wywołania szablonów z parametrami o takich samych nazwach",
        "duplicate-args-category-desc": "Strona zawiera szablony, które używają duplikatów argumentów, jak <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> lub <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "mergehistory-fail-bad-timestamp": "Znacznik czasu jest nieprawidłowy.",
        "mergehistory-fail-invalid-source": "Strona źródłowa jest nieprawidłowa.",
        "mergehistory-fail-invalid-dest": "Strona docelowa jest nieprawidłowa.",
-       "mergehistory-fail-permission": "Brak uprawnień aby połączyć historię.",
+       "mergehistory-fail-permission": "Brak uprawnień, aby połączyć historię.",
        "mergehistory-fail-self-merge": "Strona źródłowa i docelowa są takie same.",
        "mergehistory-fail-toobig": "Nie można połączyć historii, gdyż wymagałoby to przeniesienia więcej niż maksymalnej dopuszczalnej liczby $1 {{PLURAL:$1|wersji}}.",
        "mergehistory-no-source": "Strona źródłowa $1 nie istnieje.",
        "prefs-editwatchlist-raw": "Tekstowy edytor obserwowanych",
        "prefs-editwatchlist-clear": "Wyczyść listę obserwowanych",
        "prefs-watchlist-days": "Liczba dni widocznych na liście obserwowanych:",
-       "prefs-watchlist-days-max": "Maksimum $1 {{PLURAL:$1|dzień|dni}}",
+       "prefs-watchlist-days-max": "Maksymalnie $1 {{PLURAL:$1|dzień|dni}}",
        "prefs-watchlist-edits": "Liczba edycji pokazywanych w rozszerzonej liście obserwowanych:",
        "prefs-watchlist-edits-max": "Maksymalnie 1000",
        "prefs-watchlist-token": "Identyfikator listy obserwowanych:",
        "grant-editprotected": "Edycja stron zabezpieczonych",
        "grant-highvolume": "Masowe edytowanie",
        "grant-oversight": "Ukrywanie użytkowników i wersji stron",
+       "grant-patrol": "Patrolować zmiany w stronach",
        "grant-protect": "Zabezpieczanie i odbezpieczanie stron",
        "grant-rollback": "Wycofywanie zmian na stronach",
        "grant-sendemail": "Wysyłanie e‐maili do innych użytkowników",
        "rightslogtext": "Rejestr zmian uprawnień użytkowników.",
        "action-read": "przeglądania tej strony",
        "action-edit": "edytowania tej strony",
-       "action-createpage": "tworzenia stron",
-       "action-createtalk": "tworzenia stron dyskusji",
+       "action-createpage": "utwórz tę stronę",
+       "action-createtalk": "tworzenia tej strony dyskusji",
        "action-createaccount": "utworzenia tego konta użytkownika",
+       "action-autocreateaccount": "automatycznego utworzenia tego zewnętrznego konta użytkownika",
        "action-history": "przeglądania historii tej strony",
        "action-minoredit": "do oznaczenia tej edycji jako drobna zmiana",
        "action-move": "przeniesienia tej strony",
        "upload-too-many-redirects": "URL zawiera zbyt wiele przekierowań",
        "upload-http-error": "Wystąpił błąd protokołu HTTP – $1",
        "upload-copy-upload-invalid-domain": "Przesyłanie kopii z tej domeny nie jest dostępne.",
+       "upload-foreign-cant-upload": "Ta wiki nie jest skonfigurowana, aby przesyłać pliki do żądanego zewnętrznego repozytorium plików.",
+       "upload-foreign-cant-load-config": "Wczytywanie konfiguracji przesyłania plików do zewnętrznego repozytorium nie powiodło się.",
+       "upload-dialog-disabled": "Przesyłanie plików przy pomocy tego okna jest wyłączone na tej wiki.",
        "upload-dialog-title": "Prześlij plik",
        "upload-dialog-button-cancel": "Anuluj",
        "upload-dialog-button-done": "Gotowe",
        "apisandbox": "Środowisko testowe API",
        "apisandbox-jsonly": "Do korzystania z brudnopisu API wymagany jest JavaScript.",
        "apisandbox-api-disabled": "API jest wyłączone na tej stronie.",
-       "apisandbox-intro": "Użyj tej strony do eksperymentowania z <strong>serwisem API MediaWiki</strong>.\nWięcej szczegółów na temat wykorzystywania API można znaleźć w [[mw:API:Main page|dokumentacji API]]. Przykład: [https://www.mediawiki.org/wiki/API#A_simple_example pobranie zawartości strony głównej]. Wybierz akcję, by zobaczyć więcej przykładów.\n\nZwróć uwagę, że chociaż jest to brudnopis, to działania, które można przeprowadzać na tej stronie, mogą zmienić wiki.",
+       "apisandbox-intro": "Użyj tej strony do eksperymentowania z <strong>serwisem API MediaWiki</strong>.\nWięcej szczegółów na temat wykorzystywania API można znaleźć w [[mw:API:Main page|dokumentacji API]]. Przykład: [https://www.mediawiki.org/wiki/API#A_simple_example pobranie zawartości strony głównej]. Wybierz akcję, by zobaczyć więcej przykładów.\n\nZwróć uwagę, że chociaż jest to środowisko testowe, to działania, które można przeprowadzać na tej stronie, mogą zmienić zawartość wiki.",
        "apisandbox-fullscreen": "Rozszerz panel",
        "apisandbox-fullscreen-tooltip": "Rozszerz panel środowiska testowego, aby zajmował całe okno przeglądarki.",
        "apisandbox-unfullscreen": "Pokaż stronę",
        "apisandbox-request-url-label": "URL zapytania:",
        "apisandbox-request-time": "Czas przetwarzania zapytania: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Popraw token i wyślij ponownie",
+       "apisandbox-results-fixtoken-fail": "Nie udało się pobrać tokena „$1”.",
        "apisandbox-alert-page": "Pola na tej stronie są nieprawidłowe.",
        "apisandbox-alert-field": "Wartość tego pola jest nieprawidłowa.",
        "booksources": "Książki",
        "listgrants": "Uprawnienia",
        "listgrants-grant": "Uprawnienie",
        "listgrants-rights": "Uprawnienie",
-       "trackingcategories": "Śledzenie kategorii",
+       "trackingcategories": "Kategorie śledzące",
        "trackingcategories-summary": "Ta strona zawiera listę kategorii monitorujących wypełnianych automatycznie przez oprogramowanie MediaWiki. Nazwy kategorii można zmienić edytując odpowiednie komunikaty systemowe znajdujące się w przestrzeni nazw {{ns:8}}.",
        "trackingcategories-msg": "Śledzenie kategorii",
        "trackingcategories-name": "Nazwa komunikatu",
        "rollbacklinkcount": "cofnij $1 {{PLURAL:$1|edycję|edycje|edycji}}",
        "rollbacklinkcount-morethan": "cofnij więcej niż $1 {{PLURAL:$1|edycję|edycje|edycji}}",
        "rollbackfailed": "Nie udało się cofnąć zmiany",
+       "rollback-missingparam": "W żądaniu nie podano wymaganych parametrów.",
        "cantrollback": "Nie można cofnąć edycji tego autora, ponieważ jest jedynym autorem tej strony.",
        "alreadyrolled": "Nie można dla strony [[:$1|$1]] cofnąć ostatniej zmiany, którą wykonał [[User:$2|$2]] ([[User talk:$2|dyskusja]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]).\nKtoś inny zdążył już to zrobić lub wprowadził własne poprawki do treści strony.\n\nAutorem ostatniej zmiany jest teraz [[User:$3|$3]] ([[User talk:$3|dyskusja]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Edycję opisał: <em>$1</em>.",
        "revertpage": "Wycofano edycje użytkownika [[Special:Contributions/$2|$2]] ([[User talk:$2|dyskusja]]). Autor przywróconej wersji to [[User:$1|$1]].",
        "revertpage-nouser": "Wycofano edycje ukrytego użytkownika. Autor przywróconej wersji to {{GENDER:$1|[[User:$1|$1]]}}.",
        "rollback-success": "Wycofano edycje użytkownika $1;\nprzywrócono ostatnią wersję autorstwa $2.",
+       "rollback-success-notify": "Wycofano edycje użytkownika $1;\nprzywrócono ostatnią wersję autorstwa $2. [$3 Pokaż zmiany]",
        "sessionfailure-title": "Błąd sesji",
        "sessionfailure": "Wystąpił problem z weryfikacją zalogowania.\nPolecenie zostało anulowane, aby uniknąć przechwycenia sesji.\nNaciśnij „wstecz” w przeglądarce, przeładuj stronę, po czym ponownie wydaj polecenie.",
        "changecontentmodel": "Edycja modelu zawartości strony",
        "changecontentmodel-success-text": "Typ zawartości [[:$1]] został zmieniony.",
        "changecontentmodel-cannot-convert": "Zawartość [[:$1]] nie może być przekształcona do typu $2.",
        "changecontentmodel-nodirectediting": "Model zawartości $1 nie obsługuje bezpośredniego edytowania",
+       "changecontentmodel-emptymodels-text": "Zawartość [[:$1]] nie może być przekształcona do żadnego typu.",
        "log-name-contentmodel": "Rejestr zmian modelu zawartości",
        "log-description-contentmodel": "Wydarzenia związane z modelami zawartości stron",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|zmienił|zmieniła|zmienił(a)}} model zawartości strony $3 z „$4” na „$5”",
        "sp-contributions-username": "Adres IP lub nazwa użytkownika:",
        "sp-contributions-toponly": "Pokaż wyłącznie ostatnie wersje",
        "sp-contributions-newonly": "Pokazuj tylko edycje tworzące nową stronę",
+       "sp-contributions-hideminor": "Ukryj drobne zmiany",
        "sp-contributions-submit": "Szukaj",
        "whatlinkshere": "Linkujące",
        "whatlinkshere-title": "Strony linkujące do „$1”",
        "rcpatroldisabled": "Wyłączono funkcję patrolowania na stronie ostatnich zmian",
        "rcpatroldisabledtext": "Patrolowanie ostatnich zmian jest obecnie wyłączone.",
        "markedaspatrollederror": "Nie można oznaczyć jako „sprawdzone”",
-       "markedaspatrollederrortext": "Musisz wybrać wersję żeby oznaczyć ją jako „sprawdzoną”.",
+       "markedaspatrollederrortext": "Musisz wybrać wersję, żeby oznaczyć ją jako „sprawdzoną”.",
        "markedaspatrollederror-noautopatrol": "Nie masz uprawnień wymaganych do oznaczania swoich edycji jako „sprawdzone”.",
        "markedaspatrollednotify": "Ta zmiana na stronie «$1» została oznaczona jako sprawdzona.",
        "markedaspatrollederrornotify": "Oznaczenie strony jako sprawdzonej nie powiodło się.",
        "size-megabytes": "$1&nbsp;MB",
        "size-gigabytes": "$1&nbsp;GB",
        "lag-warn-normal": "Zmiany nowsze niż $1 {{PLURAL:$1|sekunda|sekundy|sekund}} mogą nie być widoczne na tej liście.",
-       "lag-warn-high": "Z powodu dużego obciążenia serwerów bazy danych, zmiany nowsze niż $1 {{PLURAL:$1|sekunda|sekundy|sekund}} mogą nie być widoczne na tej liście.",
+       "lag-warn-high": "Z powodu dużego obciążenia serwerów bazy danych zmiany nowsze niż $1 {{PLURAL:$1|sekunda|sekundy|sekund}} mogą nie być widoczne na tej liście.",
        "watchlistedit-normal-title": "Edytuj listę obserwowanych stron",
        "watchlistedit-normal-legend": "Usuń strony z listy obserwowanych",
        "watchlistedit-normal-explain": "Poniżej znajduje się lista obserwowanych przez Ciebie stron.\nAby usunąć stronę z listy zaznacz znajdujące się obok niej pole i naciśnij „{{int:Watchlistedit-normal-submit}}”.\nMożesz także skorzystać z [[Special:EditWatchlist/raw|tekstowego edytora listy obserwowanych]].",
        "log-name-managetags": "Rejestr zarządzania znacznikami",
        "log-description-managetags": "Na tej stronie są wymienione zadania związane z zarządzaniem [[Special:Tags|znacznikami]]. Dziennik (log) zawiera tylko działania wykonane ręcznie przez administratora; znaczniki mogą być tworzone lub usuwane przez oprogramowanie wiki bez dodawania wpisów w dzienniku (logu).",
        "logentry-managetags-create": "$1 {{GENDER:$2|utworzył|utworzyła}} znacznik „$4”",
-       "logentry-managetags-delete": "$1 {{GENDER:$2|usunął|usunęła}} znacznik \"$4\" (usunięty z $5 {{PLURAL:$5|wersji lub wpisu dziennika|wersji i/lub wpisów dziennika}})",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|usunął|usunęła}} znacznik „$4” (usunięty z $5 {{PLURAL:$5|wersji lub wpisu dziennika|wersji i/lub wpisów dziennika}})",
        "logentry-managetags-activate": "$1 aktywował{{GENDER:$2||a}} znacznik \"$4\" do korzystania przez uczestników i boty",
        "logentry-managetags-deactivate": "$1 wyłączył{{GENDER:$2||a}} znacznik \"$4\" z korzystania przez uczestników i boty",
        "log-name-tag": "Rejestr znaczników",
        "mw-widgets-dateinput-placeholder-month": "RRRR-MM",
        "mw-widgets-titleinput-description-new-page": "strona jeszcze nie istnieje",
        "mw-widgets-titleinput-description-redirect": "przekierowanie do $1",
-       "api-error-blacklisted": "Wybierz inny, opisowy tytuł.",
        "sessionmanager-tie": "Nie można łączyć kilku rodzajów uwierzytelniania dla zapytania: $1.",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesje na podstawie cookie",
        "sessionprovider-nocookies": "Być może cookies są wyłączone. Upewnij się, że masz włączone cookies i zacznij od nowa.",
        "randomrootpage": "Losowa strona (bez podstron)",
        "log-action-filter-block": "Rodzaj blokady:",
+       "log-action-filter-contentmodel": "Typ modyfikacji modelu zawartości:",
        "log-action-filter-delete": "Rodzaj usunięcia:",
+       "log-action-filter-import": "Typ importu:",
+       "log-action-filter-managetags": "Typ działania zarządzania znacznikami:",
+       "log-action-filter-move": "Typ przeniesienia:",
+       "log-action-filter-newusers": "Typ utworzenia konta:",
        "log-action-filter-patrol": "Rodzaj patrolu:",
        "log-action-filter-protect": "Rodzaj zabezpieczenia:",
-       "log-action-filter-rights": "Typ zmiany uprawień",
+       "log-action-filter-rights": "Typ zmiany uprawień:",
+       "log-action-filter-suppress": "Typ ukrycia:",
        "log-action-filter-upload": "Rodzaj przesłanych:",
        "log-action-filter-all": "Wszystkie",
        "log-action-filter-block-block": "Zablokowanie",
        "log-action-filter-block-reblock": "Zmiana blokady",
        "log-action-filter-block-unblock": "Odblokowanie",
+       "log-action-filter-contentmodel-change": "Zmiana modelu zawartości",
+       "log-action-filter-contentmodel-new": "Utworzenie strony z niestandardowym modelem zawartości",
        "log-action-filter-delete-delete": "Usunięcie strony",
        "log-action-filter-delete-restore": "Odtworzenie strony",
        "log-action-filter-delete-event": "Usunięcie wpisu rejestru",
        "log-action-filter-delete-revision": "Usunięcie wersji",
        "log-action-filter-import-interwiki": "Import transwiki",
+       "log-action-filter-import-upload": "Import poprzez przesłanie XML",
        "log-action-filter-managetags-create": "Utworzenie znacznika",
        "log-action-filter-managetags-delete": "Usunięcie znacznika",
        "log-action-filter-managetags-activate": "Aktywacja znacznika",
        "log-action-filter-managetags-deactivate": "Deaktywacja znacznika",
+       "log-action-filter-move-move": "Przeniesienie bez nadpisania przekierowania",
+       "log-action-filter-move-move_redir": "Przeniesienie ponad przekierowaniem",
+       "log-action-filter-newusers-create": "Utworzenie przez anonimowego użytkownika",
+       "log-action-filter-newusers-create2": "Utworzenie przez zarejestrowanego użytkownika",
+       "log-action-filter-newusers-autocreate": "Automatyczne utworzenie",
+       "log-action-filter-newusers-byemail": "Utworzenie z hasłem przesłanym e-mailem",
        "log-action-filter-patrol-patrol": "Ręczny",
        "log-action-filter-patrol-autopatrol": "Automatyczny",
        "log-action-filter-protect-protect": "Zabezpieczenie",
        "log-action-filter-protect-modify": "Zmiana zabezpieczenia",
        "log-action-filter-protect-unprotect": "Odbezpieczenie",
+       "log-action-filter-protect-move_prot": "Przeniesienie zabezpieczenia",
        "log-action-filter-rights-rights": "Ręczna zmiana",
        "log-action-filter-rights-autopromote": "Automatyczna zmiana",
+       "log-action-filter-suppress-event": "Ukrycie wpisu rejestru",
+       "log-action-filter-suppress-revision": "Ukrycie wersji",
+       "log-action-filter-suppress-delete": "Ukrycie strony",
+       "log-action-filter-suppress-block": "Ukrycie użytkownika poprzez blokadę",
+       "log-action-filter-suppress-reblock": "Ukrycie użytkownika poprzez ponowną blokadę",
        "log-action-filter-upload-upload": "Nowe przesłane",
        "log-action-filter-upload-overwrite": "Przesłane ponownie",
        "authmanager-create-disabled": "Utworzenie konta jest wyłączone.",
        "authmanager-create-from-login": "Aby utworzyć konto, wypełnij poniższe pola.",
        "authmanager-authplugin-setpass-failed-title": "Zmiana hasła nie powiodła się",
+       "authmanager-authplugin-setpass-failed-message": "Wtyczka do uwierzytelniania uniemożliwiła zmianę hasła.",
+       "authmanager-authplugin-create-fail": "Wtyczka do uwierzytelniania uniemożliwiła utworzenie konta.",
        "authmanager-authplugin-setpass-denied": "Wtyczka uwierzytelniania nie zezwala na zmianę haseł.",
        "authmanager-authplugin-setpass-bad-domain": "Niepoprawna domena.",
        "authmanager-autocreate-noperm": "Automatyczne tworzenie konta jest niedozwolone.",
        "authmanager-userdoesnotexist": "Konto użytkownika „$1” nie jest zarejestrowane.",
        "authmanager-username-help": "Nazwa użytkownika dla uwierzytelniania.",
        "authmanager-password-help": "Hasło do uwierzytelniania.",
+       "authmanager-domain-help": "Domena uwierzytelniania zewnętrznego.",
        "authmanager-retype-help": "Ponownie hasło w celu potwierdzenia.",
        "authmanager-email-label": "E-mail",
        "authmanager-email-help": "Adres e‐mail",
+       "authmanager-realname-label": "Imię i nazwisko",
        "authmanager-realname-help": "Prawdziwe imię i nazwisko użytkownika",
        "authmanager-provider-password": "Uwierzytelnianie oparte na haśle",
        "authmanager-provider-password-domain": "Uwierzytelnianie na podstawie hasła i domeny",
        "authmanager-provider-temporarypassword": "Hasło tymczasowe",
+       "authprovider-confirmlink-success-line": "$1: Połączono.",
        "authprovider-resetpass-skip-label": "Pomiń",
        "authprovider-resetpass-skip-help": "Pomiń resetowanie hasła.",
        "authform-newtoken": "Brakujący token. $1",
        "specialpage-securitylevel-not-allowed": "Niestety, nie możesz korzystać z tej strony, ponieważ twoja tożsamość nie może zostać zweryfikowana.",
        "authpage-cannot-login-continue": "Nie można kontynuować logowania. Sesja najprawdopodobniej wygasła.",
        "authpage-cannot-create": "Nie można rozpocząć tworzenie konta.",
+       "authpage-cannot-create-continue": "Nie można kontynuować tworzenia konta. Twoja sesja najprawdopodobniej wygasła.",
        "cannotauth-not-allowed-title": "Brak dostępu",
        "cannotauth-not-allowed": "Nie masz uprawnień, aby skorzystać z tej strony",
        "changecredentials-submit": "Zmień poświadczenia",
        "removecredentials-submit": "Usuń poświadczenia",
-       "credentialsform-account": "Nazwa konta:"
+       "credentialsform-account": "Nazwa konta:",
+       "linkaccounts": "Połącz konta",
+       "linkaccounts-success-text": "Konto zostało połączone.",
+       "linkaccounts-submit": "Połącz konta",
+       "unlinkaccounts": "Odłącz konta",
+       "unlinkaccounts-success": "Konta zostały odłączone."
 }
index db31115..21272c1 100644 (file)
        "tog-showtoolbar": "ایڈٹ ٹولبار وکھاؤ",
        "tog-editondblclick": "صفیاں تے ڈبل کلک کرن تے تبدیلیاں لیاؤ",
        "tog-editsectiononrightclick": "سیکشن سرخی تے تبدیلی لیاؤ سجے کلک نال",
-       "tog-watchcreations": "جیہڑے صفے میں بناندا واں اوہ میری اکھ تھلے لسٹ چ کر دیو",
-       "tog-watchdefault": "جیہڑے صفے میں لکھداں اوہ میری اکھ تھلے لسٹ چ کر دیو",
-       "tog-watchmoves": "جیڈے صفحے میں لے چلداں اوہ میری اکھ تھلے کر دیو",
-       "tog-watchdeletion": "جیڈے صفحے میں مٹانداں اوہ میری اکھ تھلے کر دیو",
+       "tog-watchcreations": "صفے جیہڑے میں بناندا واں تے جیہڑیاں فائیلاں میں چڑھائواں اوہ میری اکھ تھلے لسٹ چ کر دیو",
+       "tog-watchdefault": "جیہڑے صفے تے فائیلاں میں لکھداں اوہ میری اکھ تھلے لسٹ چ کر دیو",
+       "tog-watchmoves": "جیڈے صفحے تے فائیلاں میں لے چلداں اوہ میری اکھ تھلے کر دیو",
+       "tog-watchdeletion": "جیڈے صفحے تے فائیلاں میں مٹانداں اوہ میری اکھ تھلے کر دیو",
+       "tog-watchuploads": "نویائیاں فائیلاں جیہڑیاں میں چڑھائواں اوہ میری اکھ تھلے لسٹ چ کر دیو",
+       "tog-watchrollback": "صفحے جہناں نوں میں واپس کراں اوہ میری اکھ تھلے لسٹ چ کر دیو",
        "tog-minordefault": "ساریاں تبدیلیاں نوں نکا ڈیفالٹ نال دسو۔",
        "tog-previewontop": "ایڈٹ باکس توں پہلے پریویو وکھاؤ",
        "tog-previewonfirst": "پہلی تبدیلی تے پریویو وکھاؤ",
        "tog-watchlisthideliu": "تبدیلیاں نوں لکاؤ اوناں لاگ ان ورتن والیاں کولوں جیہڑے واچلسٹ تے نیں۔",
        "tog-watchlisthideanons": "تبدیلیاں واجلسٹ دے گمنام ورتن والیاں توں لکاؤ",
        "tog-watchlisthidepatrolled": "نکی لکھائی اکھ تھلوں لکاؤ",
+       "tog-watchlisthidecategorization": "صفحیاں دی گٹھ لکائو۔",
        "tog-ccmeonemails": "مینوں اوہناں ای میلاں دیاں کاپیاں بھیجو جیہڑیاں میں دوجیاں نوں بھیجاں۔",
        "tog-diffonly": "تبدیلی توں علاوہ صفحہ نا وکھاؤ",
        "tog-showhiddencats": "لکیاں کیٹاگریاں وکھاؤ",
-       "tog-norollbackdiff": "صفحے دی واپسی تے تبدیلی کڈ دو",
+       "tog-norollbackdiff": "صفحے دی واپسی تے تبدیلی نہ وکھائو",
        "tog-useeditwarning": "جدوں میں کوئی صفحہ تبدیلی کر کے بچاۓ بغیر چھڈن لگاں تے منوں دس دیو",
        "underline-always": "ہمیشہ",
        "underline-never": "کدی وی نئیں",
-       "underline-default": "براؤزر ڈیفالٹ",
+       "underline-default": "سکÛ\8cÙ\86 Û\8cا Ø¨Ø±Ø§Ø¤Ø²Ø± Ú\88Û\8cÙ\81اÙ\84Ù¹",
        "editfont-style": "تبدیلی کرن ویلے دی لکھائی دا خط:",
        "editfont-default": "براؤزر ڈیفالٹ",
        "editfont-monospace": "اکوجۓ حالی تھاں آلا خط",
        "oct": "اکتوبر",
        "nov": "نومبر",
        "dec": "دسمبر",
+       "january-date": "جنوری $1",
+       "february-date": "فروری $1",
+       "march-date": "مارچ $1",
+       "april-date": "اپریل $1",
+       "may-date": "مئی $1",
+       "june-date": "جون $1",
+       "july-date": "جولائی $1",
+       "august-date": "اگست $1",
+       "september-date": "ستمبر $1",
+       "october-date": "اکتوبر $1",
+       "november-date": "نومبر $1",
+       "december-date": "دسمبر $1",
+       "period-am": "AM",
+       "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|گٹھ|گٹھیاں}}",
-       "category_header": "\"$1\" Ú©Û\8cٹاگرÛ\8c وچ صفے",
-       "subcategories": "تھÙ\84Û\92 Ø¢Ù\84Û\8c Ú©Û\8cٹاگرÛ\8c",
-       "category-media-header": "اس \"$1\" Ú©Û\8cٹاگرÛ\8c وچ میڈيا",
-       "category-empty": "''اس Ú©Û\8cٹاگرÛ\8c Ù\88Ú\86 Ú©Ù\88ئÛ\8c ØµÙ\81Ø­Û\81 Û\8cا Ù\85Û\8cÚ\88Û\8cا Ù\85Ù\88جÙ\88د Ù\86Û\81Û\8cÚº۔''",
+       "category_header": "\"$1\" Ú¯Ù¹Ú¾Û\8cاں وچ صفے",
+       "subcategories": "تھÙ\84Û\92 Ø¢Ù\84Û\8c Ú¯Ù¹Ú¾",
+       "category-media-header": "اس \"$1\" Ú¯Ù¹Ú¾ وچ میڈيا",
+       "category-empty": "''اس Ú¯Ù¹Ú¾ Ù\88Ú\86 Ú©Ù\88ئÛ\8c ØµÙ\81Ø­Û\81 Û\8cا Ù\85Û\8cÚ\88Û\8cا Ù\86ئÛ\8c۔''",
        "hidden-categories": "{{PLURAL:$1|چھپی گٹھ|چھپی گٹھیاں}}",
        "hidden-category-category": "لکائیاں گٹھاں",
        "category-subcat-count": "{{PLURAL:$2|اس گٹھ دی صرف اکو تھلے آلی نکی گٹھ اے|اس گٹھ دیاں 2$ چوں   {{PLURAL:$1|نکی گٹھ|$1 نکی گٹھیاں}}}} نیں۔",
        "newwindow": "(نئی ونڈو چ کھولو)",
        "cancel": "مکاؤ",
        "moredotdotdot": "مزید۔۔۔۔",
-       "mypage": "میرا صفہ",
+       "morenotlisted": "ایہ لسٹ پوری نئی۔",
+       "mypage": "صفہ",
        "mytalk": "میریاں گلاں",
-       "anontalk": "اس آئی پی آسطے گل کرو",
+       "anontalk": "گل",
        "navigation": "کھوج",
        "and": "&#32;تے",
        "qbfind": "کھوج",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
        "actions": "کم",
-       "namespaces": "Ù\86اÙ\88اں Ø¯Û\8c Ø¬Ú¯Û\81:",
+       "namespaces": "Ù\86اÙ\88اں Ø¯Û\8c ØªÚ¾Ø§Úº:",
        "variants": "قسماں",
        "navigation-heading": "کھوج پتر",
        "errorpagetitle": "مسئلہ",
        "create-this-page": "اے صفحہ بناؤ",
        "delete": "مٹاؤ",
        "deletethispage": "اے صفحہ مٹاؤ",
+       "undeletethispage": "اس صفحے نوں واپس لیاؤ",
        "undelete_short": "مٹانا واپس {{PLURAL:$1|اکتبدیلی|$1 تبدیلی}}",
        "viewdeleted_short": "ویکھو {{PLURAL:$1|اک مٹائی گئی تبدیلی|$1 مٹائیاں گئیاں تبدیلیاں}}",
        "protect": "بچاؤ",
        "redirectedfrom": "(لیایا گیا $1)",
        "redirectpagesub": "صفحہ ریڈائریکٹ کرو",
        "redirectto": "اگے کرو:",
-       "lastmodifiedat": "This page was last modified on $1, at $2.\nاس صفحے نوں آخری آری $1 تریخ نوں $2 وجے بدلیا گیا۔",
+       "lastmodifiedat": "اس صفحے نوں آخری آری $1 تریخ نوں $2 وجے بدلیا گیا۔",
        "viewcount": "اس صفحے نوں {{PLURAL:$1|اک واری|$1 واری}} کھولیا گیا اے۔",
        "protectedpage": "بجایا صفحہ",
        "jumpto": "جاؤ:",
        "site-atom-feed": "$1 Atom Feed",
        "page-rss-feed": "\"$1\" RSS Feed",
        "page-atom-feed": "\"$1\" Atom Feed",
+       "feed-atom": "ایٹم",
        "red-link-title": "$1 (ایہ صفہ حلے تک نئیں بنایا گیا)",
        "sort-descending": "ونڈ تھلے ول",
        "sort-ascending": "ونڈ اتے ول",
        "nstab-mediawiki": "سنیعا",
        "nstab-template": "سانچہ",
        "nstab-help": "مدد آلا صفہ",
-       "nstab-category": "کیٹاگری",
+       "nstab-category": "گٹھ",
+       "mainpage-nstab": "پہلا صفہ",
        "nosuchaction": "کوئی ایسا کم نئیں",
        "nosuchactiontext": "یو آر ایل نال دسیا کم نئیں ہوےکدا۔\nتساں ہوسکدا اے یو ار ایل غلط ٹائپ کردتی ہووے۔\nایہ اک بگ نوں وی دسدا اے سوفٹویر چ جینوں {{سائٹناں}} نے ورتیا",
        "nosuchspecialpage": "انج دا کوئی خاص صفحہ نئیں",
        "userlogin-yourpassword": "کنجی",
        "userlogin-yourpassword-ph": "کنجی پاؤ",
        "createacct-yourpassword-ph": "کنجی پاؤ",
-       "yourpasswordagain": "کنجی دوبارہ لکھو:",
+       "yourpasswordagain": "کنجی فیر لکھو:",
        "createacct-yourpasswordagain": "کنجی پکی کرو",
        "createacct-yourpasswordagain-ph": "کنجی فیر پاؤ",
        "remembermypassword": "اس براؤزر تے میرا ورتن ناں یاد رکھو ($1 {{PLURAL:$1|دن|دناں}} واسطے)",
        "resetpass_forbidden": "کنجی بدلی نئیں جاسکدی",
        "resetpass-no-info": "تسی لاگ ان ہوکے ای اس صفحے نوں ویکھ سکدے او۔",
        "resetpass-submit-loggedin": "کنجی بدلو",
-       "resetpass-submit-cancel": "ختم",
+       "resetpass-submit-cancel": "مکاؤ",
        "resetpass-wrong-oldpass": "غلط عارضی یا ہلے دی کنجی۔\nتساں نے شاید اپنی کنجی بدل لئی ہوۓ یا عارضی کنجی دی درخواست کیتی ہوۓ۔",
        "resetpass-temp-password": "عارضی کنجی:",
        "passwordreset": "کنجی فیر بناؤ",
        "headline_tip": "دوسرے درجے دی سرخی",
        "nowiki_sample": "فارمیٹ نہ ہوئی لکھائی ایتھے پاؤ",
        "nowiki_tip": "وکی فارمیٹ رھندیو۔",
+       "image_sample": "Example.jpg",
        "image_tip": "وچ مورت لگاؤ",
+       "media_sample": "Example.ogg",
        "media_tip": "فائل دا جوڑ",
        "sig_tip": "تواڈے دستخط ویلے دے نال",
        "hr_tip": "سدھی لکیر",
        "recentchanges-label-plusminus": "صفے دا ناپ اینے بائٹاں نال بدلیا گیا",
        "recentchanges-legend-heading": "<strong>وات:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ایہ وی ویکھو [[Special:NewPages|نویں صفیاں دی لسٹ]])",
+       "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "ہلے تک '''$2''' توں '''$1''' تبدیلیاں تھلے دتیاں گئیاں نیں۔",
        "rclistfrom": "$3 $2 توں ہونے آلیاں نویاں تبدیلیاں وکھاؤ",
        "rcshowhideminor": "$1 معمولی تبدیلیاں",
        "uploadnewversion-linktext": "اس فائل دا نوا ورژن چھڑھاؤ",
        "shared-repo-from": "$1 توں",
        "shared-repo": "اک سانجی ریپوزیٹری",
+       "shared-repo-name-wikimediacommons": "وکیمیڈیا کامنز",
        "upload-disallowed-here": "تسیں ایس فائل تے نہیں لکھ سکدے",
        "filerevert": "$1 واپس",
        "filerevert-legend": "فائل پچھلی حالت چ لے جاؤ",
        "contributions": " $1 ورتن آلے دا حصہ",
        "contributions-title": "$1 دے کم",
        "mycontris": "میرے کم",
+       "anoncontribs": "حصےداری",
        "contribsub2": "$1 آستے ($2)",
        "nocontribs": "ایناں ناپاں نال رلدیاں کوئی تبدیلیاں نئیں لبیاں۔",
        "uctop": "(اتے)",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|ریوین|ریویناں }} $2 توں",
        "javascripttest": "JavaScript ٹیسٹنگ",
        "javascripttest-qunit-intro": "mediawiki.org تے [$1 ٹسٹنگ ڈوکومنٹیشن] ویکھو۔",
-       "tooltip-pt-userpage": "میرا صفہ",
+       "tooltip-pt-userpage": "{{GENDER:|میرا صفہ}}صفہ",
        "tooltip-pt-anonuserpage": "ورتن صفہ IP  پتے لئی تسی تبدیل کر رۓ او۔۔۔",
-       "tooltip-pt-mytalk": "میریاں گلاں",
+       "tooltip-pt-mytalk": "{{GENDER:|Your}} گل بات",
        "tooltip-pt-anontalk": "ایس IP  پتے دیاں تبدیلیاں تے گل بات",
        "tooltip-pt-preferences": "میریاں تانگاں",
        "tooltip-pt-watchlist": "او صفے جنہاں وچ تبدیلیاں تسی ویکھ رہے او",
        "tooltip-pt-mycontris": "میرے کم",
        "tooltip-pt-login": "ایہ بہتر اے کہ لاگ ان ہو جاؤ، فیر وی ایہ لازمی نئیں۔",
        "tooltip-pt-logout": "باہر آؤ",
-       "tooltip-pt-createaccount": "ایہ تواڈے لئی چنگا اے جے تسیں کھاتہ بناؤ تے لاگ ان ہوو؛ پر ایہ لازمی وی نئیں",
+       "tooltip-pt-createaccount": "ایہ تواڈے لئی چنگا اے جے تسیں کھاتہ کھولو تے لاگ ان ہوو؛ پر ایہ لازمی وی نئیں",
        "tooltip-ca-talk": "اس صفے بارے گل بات",
        "tooltip-ca-edit": "اس صفے تے لکھو",
        "tooltip-ca-addsection": "اس گل بات وچ حصہ لے لو۔",
        "tooltip-search-fulltext": "اس شبد نوں صفیاں چ لبو",
        "tooltip-p-logo": "پہلا صفہ",
        "tooltip-n-mainpage": "پہلے صفے نوں ویکھو",
-       "tooltip-n-mainpage-description": "پہلے ورقے تے جاؤ",
+       "tooltip-n-mainpage-description": "پہلے صفے تے جاؤ",
        "tooltip-n-portal": "پربندھ بارے ، تسیں کی کر سکدے او تے کنج کھوج سکدے او",
        "tooltip-n-currentevents": "موجودہ حالات تے پچھلیاں معلومات دیکھو",
        "tooltip-n-recentchanges": "وکی تے نویاں تبدیلیاں۔",
        "tooltip-t-recentchangeslinked": "اس صفے توں جڑے صفیاں چ نویاں تبدیلیاں",
        "tooltip-feed-rss": "RSS feed for this page",
        "tooltip-feed-atom": "Atom feed for this page",
-       "tooltip-t-contributions": "اس ورتن والے دے کم ویکھو",
+       "tooltip-t-contributions": "اس ورتن والے دے کم ویکھو {{GENDER:$1|this user}}",
        "tooltip-t-emailuser": "اس ورتن والے نو ای میل کرو",
        "tooltip-t-upload": "فائل چڑھاؤ",
        "tooltip-t-specialpages": "سارے خاص صفیاں دی اک لسٹ",
        "tooltip-ca-nstab-main": "مواد آلا صفہ ویکھو",
        "tooltip-ca-nstab-user": "ورتن آلے دا صفہ ویکھو",
        "tooltip-ca-nstab-media": "میڈیا آلا صفحہ ویکھو",
-       "tooltip-ca-nstab-special": "ایہ اک خاص صفہ اے، تے ایہ صفہ آپے نئیں لکھ سکدے",
+       "tooltip-ca-nstab-special": "ایہ اک خاص صفہ اے، تے ایہنوں لکھیا نئی جا سکدا۔",
        "tooltip-ca-nstab-project": "وینت دا صفہ ویکھو",
        "tooltip-ca-nstab-image": "فائل دا صفہ ویکھو",
        "tooltip-ca-nstab-mediawiki": "پربندھ سنیعہ ویکھو",
index 25d0bab..f40ed82 100644 (file)
        "resetpass-temp-password": "لنډمهالی پټنوم:",
        "resetpass-abort-generic": "پټنوم بدلون مو د يو شاتاړي لخوا لغوه شوی.",
        "resetpass-expired": "ستاسې د پټنوم وخت پای ته رسېدلی. د ننوتلو لپاره لطفاً خپل ځانته يو نوی پټنوم وټاکئ.",
-       "resetpass-expired-soft": "ستاسې د پټنوم وخت پای ته رسېدلی او بايد بياپرځای شي. لطفاً خپل ځانته يو نوی پټنوم همدا اوس وټاکئ او يا هم د وروسته پرځای کولو لپاره \"{{int:authprovider-resetpass-skip-label}}\" ټک ورکړئ.",
+       "resetpass-expired-soft": "ستاسې د پټنوم وخت پای ته رسېدلی او بايد بياپرځای شي. لطفاً خپل ځان ته يو نوی پټنوم همدا اوس وټاکئ او يا هم د وروسته پرځای کولو لپاره \"{{int:authprovider-resetpass-skip-label}}\" ټک ورکړئ.",
        "resetpass-validity-soft": "ستاسې پټنوم سم نه دی: $1\n\nلطفاً يو نوی پټنوم همدا اوس وټاکئ او يا هم د وروسته پر ځای کولو لپاره په  \"{{int:authprovider-resetpass-skip-label}}\" ټک ورکړئ.",
        "passwordreset": "پټنوم بياپرځايول",
        "passwordreset-text-one": "د برېښليک له لارې د لنډمهاله پټنوم د ترلاسه کولو لپاره دا فورمه ډکه کړئ.",
        "minoredit": "دا يو وړوکی سمون دی",
        "watchthis": "همدا مخ کتل",
        "savearticle": "مخ خوندي کول",
+       "savechanges": "بدلونونه خوندي کول",
        "publishpage": "مخ خپرول",
+       "publishchanges": "بدلونونه خپرول",
        "preview": "مخليدنه",
        "showpreview": "مخليدنه",
        "showdiff": "بدلونونه ښکاره کول",
        "rightslogtext": "دا د کارن رښتو د بدلونونو يو يادښت دی.",
        "action-read": "همدا مخ لوستل",
        "action-edit": "دا مخ سمول",
-       "action-createpage": "Ù\85Ø®Ù\88Ù\86Ù\87 جوړول",
-       "action-createtalk": "د خبرو اترو مخونه جوړول",
+       "action-createpage": "Ù\87Ù\85دا Ù\85Ø® جوړول",
+       "action-createtalk": "د خبرو اترو دا مخ جوړول",
        "action-createaccount": "دا گڼون جوړول",
        "action-history": "د دې مخ پېښليک کتل",
        "action-minoredit": "دا سمون وړوکی په نخښه کول",
index 0c864b5..6589316 100644 (file)
@@ -96,7 +96,9 @@
                        "Luk3",
                        "Ryuu",
                        "Luan",
-                       "Anderson Costa"
+                       "Anderson Costa",
+                       "LucyDiniz",
+                       "Tusca"
                ]
        },
        "tog-underline": "Sublinhar links:",
        "databaseerror-query": "Consulta: $1",
        "databaseerror-function": "Função: $1",
        "databaseerror-error": "Erro: $1",
-       "transaction-duration-limit-exceeded": "Para evitar a criação de lag replicação alta, esta operação foi abortada porque a duração de gravação ($1) excedeu o $2 {{PLURAL:$2|second|seconds}} limite.Se você está mudando muitos itens de uma vez, tente fazer várias operações menores em vez.",
+       "transaction-duration-limit-exceeded": "Para evitar a criação de lag replicação alta, esta operação foi abortada porque a duração de gravação ($1) excedeu o limite de $2 {{PLURAL:$2|segundo|segundos}}. Se você está mudando muitos itens de uma vez, tente fazer várias operações menores em vez disso.",
        "laggedslavemode": "Aviso: a página poderá não conter atualizações recentes.",
        "readonly": "Banco de dados disponível no modo \"somente leitura\"",
        "enterlockreason": "Entre com um motivo para trancá-lo, incluindo uma estimativa de quando poderá novamente ser destrancado",
        "password-change-forbidden": "Você não pode alterar senhas nessa wiki.",
        "externaldberror": "Ocorreu ou um erro no banco de dados durante a autenticação ou não lhe é permitido atualizar a sua conta externa.",
        "login": "Autenticar-se",
+       "login-security": "Verificar sua identidade",
        "nav-login-createaccount": "Entrar / criar conta",
        "userlogin": "Entrar / criar conta",
        "userloginnocreate": "Entrar",
        "noname": "Você não colocou um nome de usuário válido.",
        "loginsuccesstitle": "Autenticado",
        "loginsuccess": "'''Agora você está {{GENDER:autenticado|autenticada}} ao wiki {{SITENAME}} como \"$1\"'''.",
-       "nosuchuser": "Não existe nenhum usuário com o nome \"$1\".\nOs nomes de usuário são sensíveis a letras maiúsculas.\nVerifique o que foi digitado ou [[Special:CreateAccount|crie uma nova conta]].",
+       "nosuchuser": "Não existe nenhum usuário com o nome \"$1\".\nOs nomes de usuário são sensíveis a letras maiúsculas.\nVerifique se digitou corretamente ou [[Special:CreateAccount|crie uma nova conta]].",
        "nosuchusershort": "Não existe um usuário com o nome \"$1\". Verifique o nome que introduziu.",
        "nouserspecified": "Você precisa especificar um nome de usuário.",
        "login-userblocked": "Este usuário está bloqueado. Entrada proibida.",
        "createacct-another-realname-tip": "O nome verdadeiro é opcional.\nSe você optar por fornecê-lo, este nome será utilizado para dar ao usuário a atribuição de seu trabalho.",
        "pt-login": "Entrar",
        "pt-login-button": "Entrar",
+       "pt-login-continue-button": "Continuar conexão",
        "pt-createaccount": "Crie uma conta",
        "pt-userlogout": "Sair",
        "php-mail-error-unknown": "Erro desconhecido na função mail() do PHP",
        "botpasswords-invalid-name": "O nome de usuário especificado não contém o separador de senha de robô (\"$1\").",
        "botpasswords-not-exist": "O usuário \"$1\" não possui uma senha de robô \"$2\".",
        "resetpass_forbidden": "As senhas não podem ser alteradas",
+       "resetpass_forbidden-reason": "Senhas não podem ser alteradas: $1",
        "resetpass-no-info": "Você precisa estar autenticado para acessar esta página diretamente.",
        "resetpass-submit-loggedin": "Alterar senha",
        "resetpass-submit-cancel": "Cancelar",
        "passwordreset-emailsentusername": "Se houver um endereço de email associado a esta conta, ser-lhe-á enviada uma mensagem para redefinir a sua senha.",
        "passwordreset-emailsent-capture": "Foi enviado um e-mail de lembrete, que é mostrado abaixo.",
        "passwordreset-emailerror-capture": "Foi gerado um e-mail de recuperação da senha, conforme mostrado abaixo, mas o envio {{GENDER:$2|ao usuário|à usuária}} falhou. $1",
+       "passwordreset-emailsent-capture2": "A redefinição da senha {{PLURAL:$1|do e-mail|dos e-mails}} foi enviada. {{PLURAL:$1|O nome de usuário e senha|A lista de nomes de usuário e senhas}} encontram-se a seguir.",
        "changeemail": "Alterar ou remover endereço de email",
        "changeemail-header": "Preencha este formulário para alterar seu endereço de e-mail. Se você gostaria de remover a associação de qualquer endereço de e-mail da sua conta, deixe o novo endereço de email em branco quando enviar o formulário.",
        "changeemail-passwordrequired": "Você terá que digitar sua senha para confirmar esta mudança.",
        "right-override-export-depth": "Exportar páginas incluindo páginas ligadas até uma profundidade de 5",
        "right-sendemail": "Enviar email a outros usuários",
        "right-passwordreset": "Ver todos os e-mails de reposição de senhas",
-       "right-managechangetags": "Criar e apagar [[Special:Tags|tags]] na base de dados",
+       "right-managechangetags": "Criar e (des)ativar [[Special:Tags|tags]]",
        "right-applychangetags": "Aplicar [[Special:Tags|etiquetas]] juntamente com as alterações de alguém",
        "right-changetags": "Adicionar e remover [[Special:Tags|etiquetas]] arbitrárias em revisões e ''logs'' individuais",
+       "right-deletechangetags": "Deletar [[Special:Tags|tags]] da base de dados.",
        "grant-generic": "conjunto de direitos \"$1\"",
        "grant-group-page-interaction": "Interagir com páginas",
        "grant-group-file-interaction": "Interagir com multimídia",
        "action-viewmyprivateinfo": "veja suas informações privadas",
        "action-editmyprivateinfo": "modifique suas informações privadas",
        "action-editcontentmodel": "editar o conteudo do modelo de uma pagina",
-       "action-managechangetags": "Criar e apagar etiquetas da base de dados",
+       "action-managechangetags": "Criar e (des)ativar marcações",
        "action-applychangetags": "aplicar etiquetas juntamente com suas alterações",
        "action-changetags": "adicionar e remover etiquetas arbitrárias em revisões e ''logs'' individuais",
+       "action-deletechangetags": "deletar marcações da base de dados",
        "nchanges": "$1 {{PLURAL:$1|alteração|alterações}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde a última visita}}",
        "enhancedrc-history": "histórico",
        "changecontentmodel-reason-label": "Motivo:",
        "changecontentmodel-success-title": "O modelo de conteúdo foi alterado",
        "changecontentmodel-success-text": "O tipo de conteúdo de [[:$1]] foi alterado.",
-       "log-name-contentmodel": "Log de alterações modelo de conteúdo",
+       "log-name-contentmodel": "Log de alterações do modelo de conteúdo",
        "logentry-contentmodel-change-revertlink": "reverter",
        "logentry-contentmodel-change-revert": "reverter",
        "protectlogpage": "Registro de proteção",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "a página ainda não existe",
        "mw-widgets-titleinput-description-redirect": "redirecionar para $1",
-       "api-error-blacklisted": "Por favor, escolha  um título descritivo diferente.",
        "randomrootpage": "Página raiz aleatória"
 }
index ed19d0b..bcf24fd 100644 (file)
        "tog-ccmeonemails": "Enviar-me cópias das mensagens por correio electrónico que eu enviar a outros utilizadores",
        "tog-diffonly": "Não mostrar o conteúdo da página ao comparar duas edições",
        "tog-showhiddencats": "Mostrar categorias ocultas",
-       "tog-norollbackdiff": "Omitir diferenças depois de reverter edições em bloco",
+       "tog-norollbackdiff": "Ocultar diferenças depois de reverter edições em bloco",
        "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",
        "underline-always": "Sempre",
        "databaseerror-query": "Consulta: $1",
        "databaseerror-function": "Função: $1",
        "databaseerror-error": "Erro: $1",
+       "transaction-duration-limit-exceeded": "Para evitar a criação de lag replicação alta, esta operação foi abortada porque a duração de gravação ($1) excedeu o limite de $2 {{PLURAL:$2|segundo|segundos}}. Se está a mudar muitos itens de uma vez, tente fazer várias operações menores em vez disso.",
        "laggedslavemode": "'''Aviso:''' A página pode não conter as atualizações mais recentes.",
        "readonly": "Base de dados bloqueada (limitada a leituras)",
        "enterlockreason": "Introduza um motivo para bloquear, incluindo uma estimativa de quando será desbloqueada",
        "viewyourtext": "Pode ver e copiar o código-fonte das <strong>suas edições</strong> desta página.",
        "protectedinterface": "Esta página fornece o texto da interface ao software, e está protegida para prevenir abusos.",
        "editinginterface": "<strong>Aviso:</strong> Está a editar uma página usada para fornecer texto de interface ao software. Alterações a esta página afetarão a aparência da interface de utilizador para os outros utilizadores.",
-       "translateinterface": "Para traduções, considere utilizar a [https://translatewiki.net/wiki/Main_Page?setlang=pt translatewiki.net], um projeto destinado à tradução do MediaWiki.",
+       "translateinterface": "Para adicionar ou alterar traduções para todas as wikis, considere utilizar a [https://translatewiki.net/wiki/Main_Page?setlang=pt translatewiki.net], um projeto destinado à tradução do MediaWiki.",
        "cascadeprotected": "Esta página foi protegida contra edições por estar transcluída {{PLURAL:$1|na página listada|nas páginas listadas}} a seguir, ({{PLURAL:$1|página essa que está protegida|páginas essas que estão protegidas}} com a opção de proteção \"em cascata\" ativada):\n$2",
        "namespaceprotected": "Não tem permissão para editar páginas no domínio '''$1'''.",
        "customcssprotected": "Não tem permissão para editar esta página de CSS porque esta contém as configurações pessoais de outro utilizador.",
        "password-change-forbidden": "Não pode alterar palavras-passe nesta wiki.",
        "externaldberror": "Ocorreu um erro externo à base de dados durante a autenticação ou não lhe é permitido atualizar a sua conta externa.",
        "login": "Entrar",
+       "login-security": "Verificar a sua identidade",
        "nav-login-createaccount": "Entrar / criar conta",
        "userlogin": "Criar uma conta ou entrar",
        "userloginnocreate": "Entrar",
        "userlogin-resetpassword-link": "Esqueceu-se da sua palavra-passe?",
        "userlogin-helplink2": "Ajuda para iniciar sessão",
        "userlogin-loggedin": "Já está {{GENDER:$1|autenticado|autenticada|autenticado}} com o nome $1.\nUse o formulário abaixo para iniciar sessão com outro nome.",
+       "userlogin-reauth": "Deve iniciar novamente sessão para verificar se é {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Criar outra conta",
        "createacct-emailrequired": "Endereço de correio eletrónico",
        "createacct-emailoptional": "Endereço de correio eletrónico (opcional)",
        "createacct-email-ph": "Digite o seu endereço de correio eletrónico",
        "createacct-another-email-ph": "Digite o endereço de correio eletrónico",
        "createaccountmail": "Usar uma palavra passe aleatória e temporária e enviar 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)",
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Porque está a criar outra conta",
        "createacct-submit": "Crie a sua conta",
        "createacct-another-submit": "Criar conta",
+       "createacct-continue-submit": "Continuar criação de conta",
+       "createacct-another-continue-submit": "Continuar criação de conta",
        "createacct-benefit-heading": "{{SITENAME}} é feito por pessoas como você.",
        "createacct-benefit-body1": "{{PLURAL:$1|edição|edições}}",
        "createacct-benefit-body2": "{{PLURAL:$1|página|páginas}}",
        "noname": "Não especificou um nome de utilizador válido.",
        "loginsuccesstitle": "Autenticação bem sucedida",
        "loginsuccess": "'''Encontra-se agora ligado à {{SITENAME}} como \"$1\"'''.",
-       "nosuchuser": "Não existe nenhum utilizador com o nome \"$1\".\nOs nomes de utilizador são sensíveis à capitalização.\nVerifique a ortografia, ou [[Special:CreateAccount|crie uma nova conta]].",
+       "nosuchuser": "Não existe nenhum utilizador com o nome \"$1\".\nOs nomes de utilizador são sensíveis às letras maiúsculas e minúsculas.\nVerifique a ortografia, ou [[Special:CreateAccount|crie uma nova conta]].",
        "nosuchusershort": "Não existe um utilizador com o nome \"$1\". Verifique o nome que introduziu.",
        "nouserspecified": "Precisa de especificar um nome de utilizador.",
        "login-userblocked": "Este utilizador está bloqueado. Não é permitido o acesso.",
        "createacct-another-realname-tip": "O fornecimento do nome verdadeiro é opcional.\nSe optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu trabalho.",
        "pt-login": "Entrar",
        "pt-login-button": "Entrar",
+       "pt-login-continue-button": "Continuar o início de sessão",
        "pt-createaccount": "Criar uma conta",
        "pt-userlogout": "Sair",
        "php-mail-error-unknown": "Erro desconhecido na função mail() do PHP",
        "botpasswords-newpassword": "A nova palavra-passe para iniciar sessão com <strong>$1</strong> é <strong>$2</strong>. Por favor, recorde-se dela para futura referência.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider não está disponível.",
        "resetpass_forbidden": "Não é possível alterar palavras-passe",
+       "resetpass_forbidden-reason": "As palavras-passe não podem ser alteradas: $1",
        "resetpass-no-info": "Precisa de iniciar sessão para aceder diretamente a esta página.",
        "resetpass-submit-loggedin": "Alterar palavra-passe",
        "resetpass-submit-cancel": "Cancelar",
        "passwordreset-emailsentusername": "Se houver um endereço de correio eletrónico associado a esta conta, ser-lhe-á enviada uma mensagem para redefinir a sua palavra-passe.",
        "passwordreset-emailsent-capture": "Foi enviado um correio eletrónico para recuperação da palavra-passe, que é mostrado abaixo.",
        "passwordreset-emailerror-capture": "Foi gerado um correio eletrónico para redefinição da palavra-passe, mostrado abaixo, mas o seu envio para {{GENDER:$2|o utilizador|a utilizadora}} falhou: $1",
+       "passwordreset-invalideamil": "Correio eletrónico inválido",
+       "passwordreset-nodata": "Não foram fornecidos nome de utilizador(a) nem endereço de correio eletrónico",
        "changeemail": "Alterar ou remover o endereço de correio eletrónico",
        "changeemail-header": "Complete este formulário para alterar o seu endereço de correio eletrónico. Se quer eliminar a associação de qualquer endereço de correio eletrónico com a sua conta, deixe em branco o novo endereço de correio eletrónico ao submeter o formulário.",
        "changeemail-passwordrequired": "Necessita de introduzir a sua palavra-passe para confirmar esta alteração.",
        "minoredit": "Marcar como edição menor",
        "watchthis": "Vigiar esta página",
        "savearticle": "Gravar página",
+       "savechanges": "Gravar alterações",
        "publishpage": "Publicar página",
+       "publishchanges": "Publicar alterações",
        "preview": "Antevisão",
        "showpreview": "Antever resultado",
        "showdiff": "Mostrar alterações",
        "userpage-userdoesnotexist": "A conta \"<nowiki>$1</nowiki>\" não se encontra registada.\nVerifique se deseja realmente criar ou editar esta página, por favor.",
        "userpage-userdoesnotexist-view": "A conta de utilizador \"$1\" não está registada.",
        "blocked-notice-logextract": "Este utilizador está bloqueado.\nPara referência, o último registo de bloqueio é apresentado abaixo:",
-       "clearyourcache": "'''Nota:''' Após gravar, terá de limpar a ''cache'' do seu navegador para ver as alterações.\n*'''Firefox / Safari:''' Pressione ''Shift'' enquanto clica ''Recarregar'', ou pressione ''Ctrl-F5'' ou ''Ctrl-R'' (''⌘-R'' no Mac)\n*'''Google Chrome:''' Pressione ''Ctrl-Shift-R'' (''⌘-Shift-R'' no Mac)\n*'''Internet Explorer:''' Pressione ''Ctrl'' enquanto clica ''Recarregar'', ou pressione ''Ctrl-F5''\n*'''Opera:''' Limpe a ''cache'' em ''Ferramentas → Preferências'' (''Tools → Preferences'')",
+       "clearyourcache": "'''Nota:''' Após gravar, terá de limpar a ''cache'' do seu navegador para ver as alterações.\n*'''Firefox / Safari:''' Pressione ''Shift'' enquanto clica ''Recarregar'', ou pressione ''Ctrl-F5'' ou ''Ctrl-R'' (''⌘-R'' no Mac)\n*'''Google Chrome:''' Pressione ''Ctrl-Shift-R'' (''⌘-Shift-R'' no Mac)\n*'''Internet Explorer:''' Pressione ''Ctrl'' enquanto clica ''Recarregar'', ou pressione ''Ctrl-F5''\n*'''Opera:''' Ir para <em>Menu → Configurações</em> (<em>Opera → Preferências</em> no Mac) e, em seguida, <em>Privacidade e segurança → Limpar dados de navegação → Imagens e ficheiros em cache</em>.",
        "usercssyoucanpreview": "'''Dica:''' Use o botão \"{{int:showpreview}}\" para testar o seu novo CSS antes de gravar.",
        "userjsyoucanpreview": "'''Dica:''' Use o botão \"{{int:showpreview}}\" para testar o seu novo JavaScript antes de gravar.",
        "usercsspreview": "'''Lembre-se de que está apenas a antever o seu CSS particular.\nEste ainda não foi gravado!'''",
        "right-override-export-depth": "Exportar páginas incluindo páginas ligadas até uma profundidade de 5",
        "right-sendemail": "Enviar correio eletrónico a outros utilizadores",
        "right-passwordreset": "Ver mensagens de redefinição da palavra-passe",
-       "right-managechangetags": "Criar e eliminar [[Special:Tags|etiquetas]] da base de dados",
+       "right-managechangetags": "Criar e (des)ativar [[Special:Tags|etiquetas]]",
        "right-applychangetags": "Aplicar [[Special:Tags|etiquetas]] juntamente com as alterações",
        "right-changetags": "Adicionar ou remover [[Special:Tags|etiquetas]] arbitrárias em revisões e entradas de registo individuais",
+       "right-deletechangetags": "Eliminar [[Special:Tags|etiquetas]] da base de dados",
        "grant-generic": "Conjunto de direitos \"$1\"",
        "grant-group-page-interaction": "Interagir com páginas",
        "grant-group-file-interaction": "Interagir com conteúdo multimédia",
        "rightslogtext": "Este é um registo de mudanças nos privilégios dos utilizadores.",
        "action-read": "ler esta página",
        "action-edit": "editar esta página",
-       "action-createpage": "criar páginas",
-       "action-createtalk": "criar páginas de discussão",
+       "action-createpage": "criar esta página",
+       "action-createtalk": "criar esta página de discussão",
        "action-createaccount": "criar esta conta de utilizador",
        "action-autocreateaccount": "criar automaticamente esta conta de utilizador externa",
        "action-history": "ver histórico desta página",
        "action-viewmyprivateinfo": "ver a sua informação privada",
        "action-editmyprivateinfo": "editar a sua informação privada",
        "action-editcontentmodel": "editar o modelo de conteúdo de uma página",
-       "action-managechangetags": "criar e eliminar etiquetas da base de dados",
+       "action-managechangetags": "criar e (des)ativar etiquetas",
        "action-applychangetags": "aplicar etiquetas juntamente com as suas alterações",
        "action-changetags": "adicionar e remover etiquetas arbitrárias em revisões e entradas de registo individuais",
        "nchanges": "$1 {{PLURAL:$1|alteração|alterações}}",
        "uploaded-script-svg": "Encontrou um elemento scriptable no ficheiro \"$1\" SVG carregado.",
        "uploaded-hostile-svg": "Encontrou-se um código CSS não seguro no elemento de estilo do arquivo SVG carregado.",
        "uploaded-event-handler-on-svg": "Não está permitido configurar atributos controladores de eventos <code>$1=\"$2\"</code> nos arquivos SVG.",
+       "uploaded-image-filter-svg": "Foi encontrado um filtro de imagem com a URL: <code>&lt;$1 $2=\"$3\"&gt;</code> no ficheiro SVG carregado.",
        "uploadscriptednamespace": "Este ficheiro SVG contém um domínio que não é permitido \"$1\".",
        "uploadinvalidxml": "Erro detectado na análise do XML do ficheiro carregado.",
        "uploadvirus": "O ficheiro contém um vírus! \nDetalhes: $1",
        "upload-options": "Opções de carregamento",
        "watchthisupload": "Vigiar este ficheiro",
        "filewasdeleted": "Um ficheiro com este nome foi carregado anteriormente e subsequentemente eliminado.\nDeverá verificar o $1 antes de voltar a enviá-lo.",
+       "filename-thumb-name": "Isto parece ser o título de uma miniatura. Por favor, não volte a carregar miniaturas na mesma wiki. Se este não é o caso, corrija o nome do ficheiro por um mais significativo, e que não possua o prefixo de miniatura.",
        "filename-bad-prefix": "O nome do ficheiro que está a enviar começa por '''\"$1\"''', um nome pouco explicativo, normalmente originado de forma automática por câmaras digitais. Escolha um nome de ficheiro mais explicativo, por favor.",
        "filename-prefix-blacklist": " #<!-- deixe esta linha exactamente como está --> <pre>\n# A sintaxe é a seguinte:\n#   * Tudo a partir do carácter \"#\" até ao fim da linha é um comentário\n#   * Todas as linhas não vazias são um prefixo para nomes de ficheiros típicos atribuídos automaticamente por câmaras digitais\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # alguns telefones móveis\nIMG # genérico\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- deixe esta linha exactamente como está -->",
        "upload-proto-error": "Protocolo incorreto",
        "upload-too-many-redirects": "A URL continha demasiados redirecionamentos",
        "upload-http-error": "Ocorreu um erro HTTP: $1",
        "upload-copy-upload-invalid-domain": "Não é possível realizar carregamentos remotos neste domínio.",
+       "upload-foreign-cant-upload": "Esta wiki não está configurada para carregar ficheiros para o repositório externo solicitado.",
        "upload-dialog-title": "Carregar ficheiro",
        "upload-dialog-button-cancel": "Cancelar",
        "upload-dialog-button-done": "Feito",
        "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-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 $1, com o conteúdo passando a estar como na última edição de $2.",
-       "rollback-success-notify": "Foram revertidas as edições de $1 para a última revisão de $2. [$3 Mostrar alterações]",
+       "rollback-success-notify": "Revertidas as edições de $1;\nMudança para a última revisão de $2. [$3 Mostrar alterações]",
        "sessionfailure-title": "Erro de sessão",
        "sessionfailure": "Foram detectados problemas com a sua sessão;\na operação foi cancelada como medida de proteção contra a interceptação de sessões.\nVolte à página anterior, recarregue-a e tente novamente.",
        "changecontentmodel": "Editar o modelo de conteúdo de uma página",
        "sp-contributions-username": "Endereço de IP ou utilizador(a):",
        "sp-contributions-toponly": "Mostrar apenas as edições mais recentes",
        "sp-contributions-newonly": "Mostrar só edições que são criações de páginas",
+       "sp-contributions-hideminor": "Ocultar edições menores",
        "sp-contributions-submit": "Pesquisar",
        "whatlinkshere": "Páginas afluentes",
        "whatlinkshere-title": "Páginas com ligações para \"$1\"",
        "whatlinkshere-links": "← afluentes",
        "whatlinkshere-hideredirs": "$1 redirecionamentos",
        "whatlinkshere-hidetrans": "$1 transclusões",
-       "whatlinkshere-hidelinks": "$1 links",
+       "whatlinkshere-hidelinks": "$1 ligações",
        "whatlinkshere-hideimages": "$1 links para arquivos",
        "whatlinkshere-filters": "Filtros",
        "whatlinkshere-submit": "Ir",
        "tooltip-ca-nstab-category": "Ver a página de categoria",
        "tooltip-minoredit": "Marcar como edição menor",
        "tooltip-save": "Gravar as alterações",
+       "tooltip-publish": "Publicar as suas alterações",
        "tooltip-preview": "Antever as suas alterações. Use antes de gravar, por favor!",
        "tooltip-diff": "Mostrar alterações que fez a este texto.",
        "tooltip-compareselectedversions": "Ver as diferenças entre as duas versões selecionadas desta página.",
        "confirmemail_body_set": "Alguém, provavelmente você a partir do endereço IP $1,\ndefiniu o seu endereço de correio eletrónico como correio da conta \"$2\" em {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de correio eletrónico em {{SITENAME}},\nabra a seguinte ligação no seu navegador:\n\n$3\n\nCaso a conta *não* lhe pertença, abra a seguinte ligação\npara cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
        "confirmemail_invalidated": "Confirmação de endereço de correio eletrónico cancelada",
        "invalidateemail": "Cancelar confirmação do correio eletrónico",
+       "notificationemail_subject_changed": "O endereço de correio eletrónico registado em {{SITENAME}} foi alterado",
+       "notificationemail_subject_removed": "O endereço de correio eletrónico registado em {{SITENAME}} foi removido",
+       "notificationemail_body_changed": "Alguém, provavelmente você, a partir do endereço IP $1, alterou o endereço de correio eletrónico da conta \"$2\" para \"$3\" em {{SITENAME}}.\n\nCaso não tenha alterado, contacte imediatamente um administrador do sítio.",
+       "notificationemail_body_removed": "Alguém, provavelmente você, a partir do endereço IP $1, eliminou o endereço de correio eletrónico da conta \"$2\" em {{SITENAME}}.\n\nCaso não tenha alterado, contacte imediatamente um administrador do sítio.",
        "scarytranscludedisabled": "[Transclusão interwikis foi impossibilitada]",
        "scarytranscludefailed": "[Não foi possível obter a predefinição a partir de $1]",
        "scarytranscludefailed-httpstatus": "[Não foi possível obter a predefinição a partir de $1: HTTP $2]",
        "feedback-useragent": "Agente de utilizador:",
        "searchsuggest-search": "Pesquisa",
        "searchsuggest-containing": "contendo...",
+       "api-error-autoblocked": "O seu endereço de IP foi bloqueado automaticamente, pois foi utilizado por um utilizador bloqueado.",
        "api-error-badaccess-groups": "Não tem permissão para enviar ficheiros para esta wiki.",
        "api-error-badtoken": "Erro interno: Chave incorrecta.",
+       "api-error-blocked": "Foi bloqueado de editar.",
        "api-error-copyuploaddisabled": "O carregamento de ficheiros por URL não foi possibilitado neste servidor.",
        "api-error-duplicate": "Já {{PLURAL:$1|existia outro ficheiro|existiam outros ficheiro}} na wiki com o mesmo conteúdo.",
        "api-error-duplicate-archive": "Já {{PLURAL:$1|estava outro ficheiro|estavam outros ficheiros}} no  site com o mesmo conteúdo, mas {{PLURAL:$1|foi|foram}} eliminados.",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "a página ainda não existe.",
        "mw-widgets-titleinput-description-redirect": "redirecionar para $1",
-       "api-error-blacklisted": "Escolha um título diferente e descritivo, por favor.",
        "sessionprovider-generic": "Sessões $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sessões baseadas em cookie",
        "sessionprovider-nocookies": "Os cookies podem estar desativados. Certifique-se de que os cookies estão ativados e inicie novamente.",
        "log-action-filter-newusers": "Tipo de criação de conta:",
        "log-action-filter-patrol": "Tipo de patrulha:",
        "log-action-filter-protect": "Tipo de proteção:",
-       "log-action-filter-rights": "Tipo de alteração de privilégio",
-       "log-action-filter-suppress": "Tipo de supressão",
+       "log-action-filter-rights": "Tipo de alteração de privilégio:",
+       "log-action-filter-suppress": "Tipo de supressão:",
        "log-action-filter-upload": "Tipo de carregamento:",
        "log-action-filter-all": "Todas",
        "log-action-filter-block-block": "Bloquear",
        "log-action-filter-suppress-event": "Supressão de registo",
        "log-action-filter-suppress-delete": "Supressão de página",
        "log-action-filter-upload-upload": "Novo carregamento",
-       "log-action-filter-upload-overwrite": "Recarregar"
+       "log-action-filter-upload-overwrite": "Recarregar",
+       "authmanager-create-disabled": "A criação de contas está desativada.",
+       "authmanager-create-from-login": "Para criar a sua conta, por favor, preencha os campos abaixo.",
+       "authmanager-authplugin-setpass-bad-domain": "Domínio inválido.",
+       "authmanager-userdoesnotexist": "A conta de utilizador(a) \"$1\" não está registada.",
+       "authmanager-username-help": "Nome de utilizador(a) para autenticação.",
+       "authmanager-password-help": "Palavra-passe para autenticação.",
+       "authmanager-domain-help": "Domínio para a autenticação externa.",
+       "authmanager-retype-help": "A palavra-passe novamente para confirmação.",
+       "authmanager-email-label": "Correio eletrónico",
+       "authmanager-email-help": "Endereço de correio eletrónico",
+       "authmanager-realname-label": "Nome verdadeiro",
+       "authmanager-realname-help": "Nome verdadeiro do(a) utilizador(a)",
+       "authprovider-resetpass-skip-label": "Ignorar",
+       "authpage-cannot-login": "Não é possível iniciar sessão.",
+       "authpage-cannot-login-continue": "Não é possível continuar a iniciar sessão. A sua sessão pode ter expirado.",
+       "authpage-cannot-create": "Não é possível iniciar a criação da conta.",
+       "authpage-cannot-create-continue": "Não é possível continuar a criação da conta. A sua sessão pode ter expirado.",
+       "cannotauth-not-allowed-title": "Permissão negada",
+       "cannotauth-not-allowed": "Não possui permissão para utilizar esta página",
+       "changecredentials": "Alterar credenciais",
+       "changecredentials-submit": "Alterar credenciais",
+       "changecredentials-invalidsubpage": "$1 não é um tipo de credencial válido.",
+       "changecredentials-success": "As suas credenciais foram alteradas.",
+       "removecredentials": "Remover credenciais",
+       "removecredentials-submit": "Remover credenciais",
+       "removecredentials-invalidsubpage": "$1 não é um tipo de credencial válido.",
+       "removecredentials-success": "As suas credenciais foram removidas.",
+       "credentialsform-provider": "Tipo de credenciais:",
+       "credentialsform-account": "Nome da conta:",
+       "cannotlink-no-provider-title": "Não existem contas vinculáveis",
+       "cannotlink-no-provider": "Não existem contas vinculáveis",
+       "linkaccounts": "Associar contas",
+       "linkaccounts-success-text": "A conta foi associada.",
+       "linkaccounts-submit": "Associar contas",
+       "unlinkaccounts": "Desassociar contas",
+       "unlinkaccounts-success": "A conta foi desassociada."
 }
index ec1403e..2182f79 100644 (file)
        "noindex-category": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages with the <nowiki>__NOINDEX__</nowiki> behavior switch are listed.\n\nFor description of this behavior switch see [[mw:Special:MyLanguage/Help:Magic_words#Behavior_switches|MediaWiki]].\n\nSee also:\n* {{msg-mw|Noindex-category-desc}}",
        "broken-file-category": "Name of [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages that embed files that do not exist (\"broken images\") are listed.\n\nSee also:\n* {{msg-mw|Broken-file-category-desc}}",
        "categoryviewer-pagedlinks": "{{Optional}}\nThe pagination links in category viewer. Parameters:\n* $1 - the previous link, uses {{msg-mw|Prevn}}\n* $2 - the next link, uses {{msg-mw|Nextn}}",
+       "category-header-numerals": "{{Optional}}\nA header for all pages whose titles start with a number. This is used on category pages. This should only be translated if your language uses a different method to indicate a range of numbers (other than a dash).\n* $1 - 0 (or localized equivalent)\n* $2 – 9 (or localized equivalent)",
        "about": "{{Identical|About}}",
        "article": "A 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For technical definition of 'content namespaces' see [[mw:Manual:Using_custom_namespaces#Content_namespaces|MediaWiki]].\n\nPossible alternatives to the word 'content' are 'subject matter' or 'wiki subject' or 'wiki purpose'.\n\n{{Identical|Content page}}",
        "newwindow": "Below the edit form, next to \"{{msg-mw|Edithelp}}\".",
        "passwordreset-emailelement": "This is a body of a password reset email to allow them into the system with a new password. Parameters:\n* $1 - the user's login name. This parameter can be used for GENDER.\n* $2 - the temporary password given by the system",
        "passwordreset-emailsentemail": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsent-capture}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
        "passwordreset-emailsentusername": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsent-capture}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
-       "passwordreset-emailsent-capture": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
-       "passwordreset-emailerror-capture": "Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:\n* $1 - error message\n* $2 - username, used for GENDER\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailsent-capture}}",
-       "passwordreset-emailsent-capture2": "Used in [[Special:PasswordReset]].\n\nParameters:\n* $1 - number of accounts notified\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
+       "passwordreset-emailsent-capture": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {{msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
+       "passwordreset-emailerror-capture": "Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:\n* $1 - error message\n* $2 - username, used for GENDER\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {{msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailsent-capture}}",
+       "passwordreset-emailsent-capture2": "Used in [[Special:PasswordReset]].\n\nParameters:\n* $1 - number of accounts notified\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {{msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
        "passwordreset-emailerror-capture2": "Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:\n* $1 - error message\n* $2 - username, used for GENDER\n* $3 - number of accounts notified\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {{msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailsent-capture}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
        "passwordreset-nocaller": "Shown when a password reset was requested but the caller was not provided. This is an internal error.",
        "passwordreset-nosuchcaller": "Shown when a password reset was requested but the username of the caller could not be resolved to a user. This is an internal error.\n\nParameters:\n* $1 - username of the caller",
        "subject": "Used as label for input box in the EditPage page.\n\nSee also:\n* {{msg-mw|Summary}}\n{{Identical|Subject}}",
        "minoredit": "Text above Save page button in editor\n\nSee also:\n* {{msg-mw|Minoredit}}\n* {{msg-mw|Accesskey-minoredit}}\n* {{msg-mw|Tooltip-minoredit}}",
        "watchthis": "Text of checkbox above {{msg-mw|Showpreview}} button in editor.\n\nSee also:\n* {{msg-mw|Watchthis}}\n* {{msg-mw|Accesskey-watch}}\n* {{msg-mw|Tooltip-watch}}\n{{Identical|Watch this page}}",
-       "savearticle": "Text on the Save page button. See also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons.\n\nSee also:\n* {{msg-mw|Savearticle}}\n* {{msg-mw|Accesskey-save}}\n* {{msg-mw|Tooltip-save}}\n{{Identical|Save page}}",
-       "publishpage": "Text on the button to save the changes to the page. It should be an action which is short and makes clear that the effect is immediate and public.\n\nSee also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons.\n\nNote: This i18n is being introduced in advance of usage to provide extra time for translators.\n\nSee also:\n* {{msg-mw|Accesskey-publish}}\n* {{msg-mw|Tooltip-publish}}\n{{Identical|Publish page}}",
+       "savearticle": "Text on the button to create a new page. It should be an action which is short and makes clear that the effect is immediate and public.\n\nSee also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons, and {{msg-mw|savechanges}} for the label for the button when the page is being modified.\n\nSee also:\n* {{msg-mw|Accesskey-publish}}\n* {{msg-mw|Tooltip-publish}}\n{{Identical|Save page}}",
+       "savechanges": "Text on the button to save the changes to an existing page. It should be an action which is short and makes clear that the effect is immediate and public.\n\nSee also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons, and {{msg-mw|savearticle}} for the label for the button when the page is being modified.\n\nNote: This i18n is being introduced in advance of usage to provide extra time for translators.\n\nSee also:\n* {{msg-mw|Accesskey-publish}}\n* {{msg-mw|Tooltip-publish}}\n{{Identical|Save changes}}",
+       "publishpage": "Text on the button to create a new page on a public wiki. It should be an action which is short and makes clear that the effect is immediate and public.\n\nSee also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons, and {{msg-mw|publishchanges}} for the label for the button when the page is being modified.\n\nNote: This i18n is being introduced in advance of usage to provide extra time for translators.\n\nSee also:\n* {{msg-mw|Accesskey-publish}}\n* {{msg-mw|Tooltip-publish}}\n{{Identical|Publish page}}",
+       "publishchanges": "Text on the button to save the changes to an existing page on a public wiki. It should be an action which is short and makes clear that the effect is immediate and public.\n\nSee also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons, and {{msg-mw|publishchanges}} for the label for the button when the page is being created.\n\nNote: This i18n is being introduced in advance of usage to provide extra time for translators.\n\nSee also:\n* {{msg-mw|Accesskey-publish}}\n* {{msg-mw|Tooltip-publish}}\n{{Identical|Publish changes}}",
        "preview": "The title of the Preview page shown after clicking the \"Show preview\" button in the edit page. Since this is a heading, it should probably be translated as a noun and not as a verb.\n\n{{Identical|Preview}}",
        "showpreview": "The text of the button to preview the page you are editing. See also {{msg-mw|showdiff}} and {{msg-mw|savearticle}} for the other buttons.\n\nSee also:\n* {{msg-mw|Showpreview}}\n* {{msg-mw|Accesskey-preview}}\n* {{msg-mw|Tooltip-preview}}\n{{Identical|Show preview}}",
        "showdiff": "Button below the edit page. See also {{msg-mw|Showpreview}} and {{msg-mw|Savearticle}} for the other buttons.\n\nSee also:\n* {{msg-mw|Showdiff}}\n* {{msg-mw|Accesskey-diff}}\n* {{msg-mw|Tooltip-diff}}\n{{Identical|Show change}}",
        "editpage-notsupportedcontentformat-title": "Title of error page shown when using an incompatible format on EditPage.\n\nUsed as title for the following error message:\n* {{msg-mw|Editpage-notsupportedcontentformat-text}}.",
        "editpage-notsupportedcontentformat-text": "Error message shown when using an incompatible format on EditPage.\n\nThe title for this error is {{msg-mw|Editpage-notsupportedcontentformat-title}}.\n\nParameters:\n* $1 - the format id\n* $2 - the content model name",
        "content-model-wikitext": "Name for the wikitext content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
-       "content-model-text": "Name for the plain text content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}\n{{Identical|Plain text}}",
+       "content-model-text": "Name for the plain text content model, used when decribing what type of content a page contains. Plaintext means that the content of the page will be rendered as is like:\n\n<nowiki>This is [[plain text]]. <a href=\"https://www.mediawiki.org/\">Really!</a></nowiki>\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}\n\n{{Identical|Plain text}}",
        "content-model-javascript": "Name for the JavaScript content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
        "content-model-css": "Name for the CSS content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
        "content-model-json": "Name for the JSON content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
        "content-json-empty-object": "Used to represent an object with no properties on a JSON content model page.",
        "content-json-empty-array": "Used to represent an array with no values on a JSON content model page.",
+       "deprecated-self-close-category": "This message is used as a category name for a [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages are placed automatically if they contain invalid self-closed HTML tags, such as <code>&lt;b/></code> or <code>&lt;span/></code>.  The behavior of these will change soon to be consistent with the HTML5 specification, so their use in wikitext is deprecated.",
+       "deprecated-self-close-category-desc": "Invalid self-closed HTML tag category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|deprecated-self-close-category}}",
        "duplicate-args-warning": "If a page calls a template and specifies the same argument more than once, such as <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>, this warning is displayed when previewing.\n\nParameters:\n* $1 - The calling page\n* $2 - The called template\n* $3 - The name of the duplicated argument",
        "duplicate-args-category": "This message is used as a category name for a [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages are placed automatically if they contain template calls that use duplicates of arguments, such as <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "duplicate-args-category-desc": "Duplicate arguments category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Duplicate-args-category}}",
        "upload-copy-upload-invalid-domain": "Error message shown if a user is trying to upload (i.e. copy) a file from a website that is not in $wgCopyUploadsDomains (if set).\n\nSee also:\n* {{msg-mw|http-invalid-url}}\n* {{msg-mw|tmp-create-error}}\n* {{msg-mw|tmp-write-error}}",
        "upload-foreign-cant-upload": "Error message shown when a user is trying to upload a file to foreign repository that is not configured to receive file uploads from current wiki.",
        "upload-foreign-cant-load-config": "Error message shown when a user is trying to upload a file to foreign repository and the foreign wiki is down or otherwise unable to respond to API requests.",
+       "upload-dialog-disabled": "Message shown when the upload dialog functionality is disabled. (This doesn't mean that uploads in general are disabled, only this specific method of uploading.)",
        "upload-dialog-title": "Title of the upload dialog box\n{{Identical|Upload file}}",
        "upload-dialog-button-cancel": "Button to cancel the dialog\n{{Identical|Cancel}}",
        "upload-dialog-button-done": "Button to close the dialog once upload is complete\n{{Identical|Done}}",
        "prefixindex-namespace": "The page title of [[Special:PrefixIndex]] limited to a specific namespace. Similar to {{msg-mw|allinnamespace}}. $1 is the name of the namespace",
        "prefixindex-summary": "{{notranslate}}\n\nThe summary displayed at the top of [[Special:Prefixindex]]. [[mw:Manual:Interface/Special pages summary|MediaWiki manual]].",
        "prefixindex-submit": "Label on submit button in [[Special:PrefixIndex]]\n{{Identical|Show}}",
-       "prefixindex-strip": "Label for a checkbox. If the checkbox is checked, the prefix searched will be removed from the title displayed in the list. Used in [[Special:PrefixIndex]].\n\nSee the following search results:\n* [{{canonicalurl:Special:PrefixIndex|prefix=Doc&namespace=10}} Special:PrefixIndex?prefix=Doc&namespace=10] (prefix NOT stripped)\n* [{{canonicalurl:Special:PrefixIndex|prefix=Doc&namespace=10&stripprefix=1}} Special:PrefixIndex?prefix=Doc&namespace=10&stripprefix=1] (prefix stripped)",
+       "prefixindex-strip": "Label for a checkbox. If the checkbox is checked, the prefix searched (do not confuse with prefix of the namespace) will be removed from the title displayed in the list. Used in [[Special:PrefixIndex]].\n\nSee the following search results:\n* [{{canonicalurl:Special:PrefixIndex|prefix=Doc&namespace=10}} Special:PrefixIndex?prefix=Doc&namespace=10] (prefix NOT stripped)\n* [{{canonicalurl:Special:PrefixIndex|prefix=Doc&namespace=10&stripprefix=1}} Special:PrefixIndex?prefix=Doc&namespace=10&stripprefix=1] (prefix stripped)",
        "shortpages": "{{doc-special|ShortPages}}",
        "shortpages-summary": "{{notranslate}}\nThe summary displayed at the top of [[Special:Shortpages]]. [[mw:Manual:Interface/Special pages summary|mw manual]].",
        "longpages": "{{doc-special|LongPages}}",
        "apisandbox-jsonly": "Displayed as an error message if the browser does not have JavaScript enabled.",
        "apisandbox-api-disabled": "Displayed as an error message if the API is disabled on this site.",
        "apisandbox-intro": "Displayed (from JavaScript) as a header on [[Special:ApiSandbox]].",
-       "apisandbox-fullscreen": "JavaScript button label for enabling full-page mode.",
+       "apisandbox-fullscreen": "JavaScript button label for enabling full-page mode.\n\nSee https://phabricator.wikimedia.org/T129632#2465838 for details.",
        "apisandbox-fullscreen-tooltip": "Tooltip for the {{msg-mw|apisandbox-fullscreen}} button.",
-       "apisandbox-unfullscreen": "JavaScript button label for disabling full-page mode.",
+       "apisandbox-unfullscreen": "JavaScript button label for disabling full-page mode.\n\nSee https://phabricator.wikimedia.org/T129632#2465838 for details.",
        "apisandbox-unfullscreen-tooltip": "Tooltip for the {{msg-mw|apisandbox-unfullscreen}} button.",
        "apisandbox-submit": "JavaScript button label for submitting the request.",
        "apisandbox-reset": "JavaScript button label for clearing the form.\n{{Identical|Clear}}",
        "rollbacklinkcount": "{{doc-actionlink}}\nText of the rollback link showing the number of edits to be rolled back. See also {{msg-mw|rollbacklink}}.\n\nParameters:\n* $1 - the number of edits that will be rolled back. If $1 is over the value of <code>$wgShowRollbackEditCount</code> (default: 10) {{msg-mw|rollbacklinkcount-morethan}} is used.\n\nThe rollback link is displayed with a tooltip {{msg-mw|Tooltip-rollback}}",
        "rollbacklinkcount-morethan": "{{doc-actionlink}}\nText of the rollback link when a greater number of edits is to be rolled back. See also {{msg-mw|rollbacklink}}.\n\nWhen the number of edits rolled back is smaller than [[mw:Special:MyLanguage/Manual:$wgShowRollbackEditCount|$wgShowRollbackEditCount]], {{msg-mw|rollbacklinkcount}} is used instead.\n\nParameters:\n* $1 - number of edits",
        "rollbackfailed": "{{Identical|Rollback}}",
-       "rollback-missingparam": "Used as error message rollback is accessed without the required parameters\n\nSee also:\n* {{msg-mw|Rollbackfailed}}",
+       "rollback-missingparam": "Used as error message that rollback is accessed without the required parameters\n\nSee also:\n* {{msg-mw|Rollbackfailed}}",
        "cantrollback": "Used as error message when rollback fails due to there not being a valid revision to revert back to.\n\nSee also:\n* {{msg-mw|Notvisiblerev}}\n{{Identical|Revert}}\n{{Identical|Rollback}}",
        "alreadyrolled": "Appear when there's rollback and/or edit collision.\n\nRefers to:\n* {{msg-mw|Pipe-separator}}\n* {{msg-mw|Contribslink}}\nParameters:\n* $1 - the page to be rolled back\n* $2 - the editor to be rolled-back of that page\n* $3 - the editor that cause collision\n{{Identical|Rollback}}",
        "editcomment": "Only shown if there is an edit {{msg-mw|Summary}}. Parameters:\n* $1 - the edit summary",
        "revertpage": "Parameters:\n* $1 - username 1\n* $2 - username 2\n* $3 - (Optional) revision ID of the revision reverted to\n* $4 - (Optional) timestamp of the revision reverted to\n* $5 - (Optional) revision ID of the revision reverted from\n* $6 - (Optional) timestamp of the revision reverted from\nSee also:\n* {{msg-mw|Revertpage-nouser}}\n{{Identical|Revert}}",
        "revertpage-nouser": "This is a confirmation message a user sees after reverting, when the username of the version is hidden with RevisionDelete.\n\nIn other cases the message {{msg-mw|Revertpage}} is used.\n\nParameters:\n* $1 - username 1, can be used for GENDER\n* $2 - (Optional) username 2\n* $3 - (Optional) revision ID of the revision reverted to\n* $4 - (Optional) timestamp of the revision reverted to\n* $5 - (Optional) revision ID of the revision reverted from\n* $6 - (Optional) timestamp of the revision reverted from",
        "rollback-success": "This message shows up on screen after successful revert (generally visible only to admins). $1 describes user whose changes have been reverted, $2 describes user which produced version, which replaces reverted version.\n{{Identical|Revert}}\n{{Identical|Rollback}}",
-       "rollback-success-notify": "Notification shown after a successful revert.\n* $1 - User whose changes have been reverted\n* $2 - User that made the edit that was restored\n* $3 - Url to the diff of the rollback\nSee also:\n* {{msg-mw|showdiff}}\n{{Identical|rollback-success}}\n{{Format|jquerymsg}}",
+       "rollback-success-notify": "Notification shown after a successful revert.\n* $1 - User whose changes have been reverted\n* $2 - User that made the edit that was restored\n* $3 - Url to the diff of the rollback\nSee also:\n* {{msg-mw|showdiff}}\n{{related|rollback-success}}\n{{Format|jquerymsg}}",
        "sessionfailure-title": "Used as title of the error message {{msg-mw|Sessionfailure}}.",
        "sessionfailure": "Used as error message.\n\nThe title for this error message is {{msg-mw|Sessionfailure-title}}.",
        "changecontentmodel": "Title of the change content model special page",
        "sp-contributions-username": "This message appears whenever someone requests [[Special:Contributions]].\n{{Identical|IP address or username}}",
        "sp-contributions-toponly": "A checkbox at [[Special:Mycontributions|Special:Contributions]]",
        "sp-contributions-newonly": "Used as checkbox label at [[Special:Mycontributions|Special:Contributions]].\n\n\"page creation\" means the \"first revision\" of a page.\n\nPreceded by {{msg-mw|Sp-contributions-toponly}}.",
+       "sp-contributions-hideminor": "Used as checkbox label at [[Special:Mycontributions|Special:Contributions]].\n\nSee also:\n* {{msg-mw|Tog-hideminor}}",
        "sp-contributions-submit": "{{Identical|Search}}",
        "sp-contributions-explain": "{{optional}}",
        "sp-contributions-footer": "{{ignored}}This is the footer for users that are not anonymous or newbie on [[Special:Contributions]].",
        "metadata-fields": "{{doc-important|Do not translate list items, only translate the text! So leave \"<code>* make</code>\" and the other items exactly as they are.}}\nThe sentences are for explanation only and are not shown to the user.",
        "metadata-langitem": "{{optional}}\nThis is used for constructing the list of translations when a metadata property is translated into multiple languages.\n\nParameters:\n* $1 - the value of the property (in one language)\n* $2 - the language name that this translation is for (or language code if language name cannot be determined)\n* $3 - (Unused) the language code",
        "metadata-langitem-default": "{{optional}}\nSimilar to \"metadata-langitem\" but for the case where a multilingual property has a default specified that does not specify what language the default is in. $1 is the value of the property.",
-       "exif-imagewidth": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Width}}",
-       "exif-imagelength": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Height}}",
+       "exif-imagewidth": "{{exif-qqq}}\n{{Identical|Width}}",
+       "exif-imagelength": "{{exif-qqq}}\n{{Identical|Height}}",
        "exif-bitspersample": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
-       "exif-compression": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis field labels what the compression of the image is. It is commonly seen in Tiff images. It uses messages like {{msg-mw|exif-compression-1}} for the value. [[w:TIFF#TIFF_Compression_Tag]] has information about this field.\n{{Related|Exif-compression}}",
+       "exif-compression": "{{exif-qqq}}\n\nThis field labels what the compression of the image is. It is commonly seen in Tiff images. It uses messages like {{msg-mw|exif-compression-1}} for the value. [[w:TIFF#TIFF Compression Tag]] has information about this field.\n\n{{Related|Exif-compression}}",
        "exif-photometricinterpretation": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
-       "exif-orientation": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nFor specific information on the orientation tag, see http://sylvana.net/jpegcrop/exif_orientation.html\n{{Related|Exif-orientation}}",
+       "exif-orientation": "{{exif-qqq}}\n\nFor specific information on the orientation tag, see http://sylvana.net/jpegcrop/exif_orientation.html\n\n{{Related|Exif-orientation}}",
        "exif-samplesperpixel": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
-       "exif-planarconfiguration": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee also:\n* {{msg-mw|Exif-planarconfiguration}}\n* {{msg-mw|Exif-planarconfiguration-1}}\n* {{msg-mw|Exif-planarconfiguration-2}}",
+       "exif-planarconfiguration": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-planarconfiguration}}\n* {{msg-mw|Exif-planarconfiguration-1}}\n* {{msg-mw|Exif-planarconfiguration-2}}",
        "exif-ycbcrsubsampling": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
-       "exif-ycbcrpositioning": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Related|Exif-ycbcrpositioning}}",
-       "exif-xresolution": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis is the horizontal resolution in either dots/inch or dots/cm.",
-       "exif-yresolution": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis is the vertical resolution in either dots/inch or dots/cm.",
+       "exif-ycbcrpositioning": "{{exif-qqq}}\n{{Related|Exif-ycbcrpositioning}}",
+       "exif-xresolution": "{{exif-qqq}}\n\nThis is the horizontal resolution in either dots/inch or dots/cm.",
+       "exif-yresolution": "{{exif-qqq}}\n\nThis is the vertical resolution in either dots/inch or dots/cm.",
        "exif-stripoffsets": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
        "exif-rowsperstrip": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
        "exif-stripbytecounts": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
        "exif-primarychromaticities": "The chromaticity of the three primary colours of the image. Normally this tag is not necessary, since colour space is specified in the colour space information tag. This should probably be translated it as \"Chromaticity of primary colours\".\n\nExif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
        "exif-ycbcrcoefficients": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
        "exif-referenceblackwhite": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
-       "exif-datetime": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nNote, this message is also used for the XMP:ModifyDate property in XMP metadata. See page 35 of http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf\n\nDatetime is the time that the digital file was last changed.",
-       "exif-imagedescription": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis property is the description or caption of the image. It is used for the exif ImageDescription property, the dc:description property in XMP (see http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf ), and the iptc-iim 2:120 caption/abstract property ( http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf ).\n\nWhen an image has multiple differing descriptions, mediawiki follows the MWG guidelines when deciding which to show (Which typically means Exif takes precedence).",
-       "exif-make": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe Manufacturer of the digital camera (or scanner) that took the photo.",
-       "exif-model": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe model of camera (or scanner) used to take the picture.",
-       "exif-software": "Short for \"The software which was used to create or modify this image\".\n\nThe property can come from the Exif Software tag, PNG software chunk, iptc-iim 2:65 Software field, or XMP's xmp:CreatorTool field.\n\nExif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
-       "exif-artist": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis message labels the author or artist of the work. Usually this means who took the photograph, or who drew the picture. The corresponding value field most commonly contains a single author, however it can contain an ordered (or unordered depending on which metadata standard is used to store the information) list of authors. Sometimes the persons position is prefixed before their name such as \"Photographer, John Smith\". The exif standard recommends multiple authors be specified by \"position, Author 1; position for author 2, Author 2's name\" however this doesn't seem to happen in practice very often. If multiple authors are specified using a non-exif standard, then a billeted (or numbered) list is used.\n\nThis property can be specified by exif Artist tag, XMP's tiff:Artist, XMP's dc:creator, iptc-iim's 2:80 byline, PNG's author textual chunk, PNG's (unofficial) artist textual chunk. XMP's photoshop:AuthorsPosition and iptc 2:85 byline-title can also affect display of this property.\n{{Identical|Author}}",
+       "exif-datetime": "{{exif-qqq}}\n\nNote: this message is also used for the XMP:ModifyDate property in XMP metadata. See page 35 of http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf\n\nDatetime is the time that the digital file was last changed.",
+       "exif-imagedescription": "{{exif-qqq}}\n\nThis property is the description or caption of the image. It is used for the exif ImageDescription property, the dc:description property in XMP (see http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf ), and the iptc-iim 2:120 caption/abstract property ( http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf ).\n\nWhen an image has multiple differing descriptions, mediawiki follows the MWG guidelines when deciding which to show (Which typically means Exif takes precedence).",
+       "exif-make": "{{exif-qqq}}\n\nThe Manufacturer of the digital camera (or scanner) that took the photo.",
+       "exif-model": "{{exif-qqq}}\n\nThis tag specifies the model of camera (or scanner) used to take the picture.",
+       "exif-software": "{{exif-qqq}}\n\nThis tag is short for \"The software which was used to create or modify this image\".\n\nThe property can come from the Exif Software tag, PNG software chunk, iptc-iim 2:65 Software field, or XMP's xmp:CreatorTool field.",
+       "exif-artist": "{{exif-qqq}}\n\nThis message labels the author or artist of the work. Usually this means who took the photograph, or who drew the picture. The corresponding value field most commonly contains a single author, however it can contain an ordered (or unordered depending on which metadata standard is used to store the information) list of authors. Sometimes the persons position is prefixed before their name such as \"Photographer, John Smith\". The exif standard recommends multiple authors be specified by \"position, Author 1; position for author 2, Author 2's name\" however this doesn't seem to happen in practice very often. If multiple authors are specified using a non-exif standard, then a billeted (or numbered) list is used.\n\nThis property can be specified by exif Artist tag, XMP's tiff:Artist, XMP's dc:creator, iptc-iim's 2:80 byline, PNG's author textual chunk, PNG's (unofficial) artist textual chunk. XMP's photoshop:AuthorsPosition and iptc 2:85 byline-title can also affect display of this property.\n\n{{Identical|Author}}",
        "exif-copyright": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nLabel for information contained in exif Copyright tag, XMP dc:rights, IPTC-iim 2:116, or PNG copyright textual chunk.\n\nTypically the copyright statement for the photograph/drawing/video (such as ''(c) 2010 John Smith. Released under GFDL''). Sometimes contains license information. See also {{msg-mw|exif-copyrightowner}}",
-       "exif-exifversion": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nVersion of exif standard photo uses. Typically this is 2.22",
+       "exif-exifversion": "{{exif-qqq}}\n\nVersion of exif standard photo uses. Typically this is 2.22",
        "exif-flashpixversion": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nVersion of flashpix used. Flashpix is a format used for storing some types of metadata in image. It is not as commonly used as EXIF, and mediawiki currently cannot read Flashpix data.",
-       "exif-colorspace": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe colorspace of the photo. This tells the computer how to make the colours in the photo be more true to the original photo. Typical values for this are sRGB or uncalibrated. This only gives information on colour information given in the exif-colorspace property. However, colour information is often stored elsewhere in the photo.\n\nSee also:\n* {{msg-mw|Exif-colorspace}}\n* {{msg-mw|Exif-colorspace-1|optional}}\n* {{msg-mw|Exif-colorspace-65535}}",
-       "exif-componentsconfiguration": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis contains how the information in the picture is stored. This is most commonly Y, Cr, Cb to specify luma, red, blue. RGB is also possible to specify Red, Green, Blue.\n{{Related|Exif-componentsconfiguration}}",
+       "exif-colorspace": "{{exif-qqq}}\n\nThe colorspace of the photo. This tells the computer how to make the colours in the photo be more true to the original photo. Typical values for this are sRGB or uncalibrated. This only gives information on colour information given in the exif-colorspace property. However, colour information is often stored elsewhere in the photo.\n\nSee also:\n* {{msg-mw|Exif-colorspace}}\n* {{msg-mw|Exif-colorspace-1|optional}}\n* {{msg-mw|Exif-colorspace-65535}}",
+       "exif-componentsconfiguration": "{{exif-qqq}}\n\nThis contains how the information in the picture is stored. This is most commonly Y, Cr, Cb to specify luma, red, blue. RGB is also possible to specify Red, Green, Blue.\n\n{{Related|Exif-componentsconfiguration}}",
        "exif-compressedbitsperpixel": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
-       "exif-pixelxdimension": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Image width}}",
+       "exif-pixelxdimension": "{{exif-qqq}}\n{{Identical|Image width}}",
        "exif-pixelydimension": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Image height}}",
-       "exif-usercomment": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nComments by user. Sometimes used like ImageDescription when the ImageDescription contained non-ascii characters. (Technically ImageDescription is supposed to contain ascii characters. In practice utf-8 is used in ImageDescription, so this field isn't used too much.)",
+       "exif-usercomment": "{{exif-qqq}}\n\nComments by user. Sometimes used like ImageDescription when the ImageDescription contained non-ascii characters. (Technically ImageDescription is supposed to contain ascii characters. In practice utf-8 is used in ImageDescription, so this field isn't used too much.)",
        "exif-relatedsoundfile": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSome cameras offer the option to record an audio \"memo\" for the photo they just took. If the user did that, the name of the file is labelled with this message.",
        "exif-datetimeoriginal": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe date and time when the original image data was generated. For example if it was a painting from 1773, scanned in to a computer in 2007, the datetimeoriginal would be 1773 and {{msg-mw|exif-datetimedigitized}} would have the 2007 date.",
        "exif-datetimedigitized": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe date and time when the image was stored as digital data.",
-       "exif-subsectime": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\n'DateTime subseconds' shows the detail of the fraction of a second (1/100s) at which the file was changed, when the tag {{msg-mw|Exif-datetime}} is recorded to the whole second.",
-       "exif-subsectimeoriginal": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis tag shows the detail of the fraction of a second (1/100s) at which the file data was originally generated, when the tag {{msg-mw|Exif-datetimeoriginal}} is recorded to the whole second.",
-       "exif-subsectimedigitized": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis tag shows the detail of the fraction of a second (1/100s) at which the file was stored as digital data, when the tag {{msg-mw|Exif-datetimedigitized}} is recorded to the whole second.",
-       "exif-exposuretime": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe exposure time. Number of (or fraction of) seconds the film was exposed to light. The value for this property is formatted using {{msg-mw|exif-exposuretime-format}}",
-       "exif-exposuretime-format": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nParameters:\n* $1 - the exposure time written as a fraction of a second, for example 1/640 of a second\n* $2 - the exposure time written as a decimal, for example 0.0015625\n\n'sec' is the abbreviation used in English for the unit of time 'second'.",
-       "exif-fnumber": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe [[w:F_number|F number]] is the relative aperture of the camera.",
+       "exif-subsectime": "{{exif-qqq}}\n\n'DateTime subseconds' shows the detail of the fraction of a second (1/100s) at which the file was changed, when the tag {{msg-mw|Exif-datetime}} is recorded to the whole second.",
+       "exif-subsectimeoriginal": "{{exif-qqq}}\n\nThis tag shows the detail of the fraction of a second (1/100s) at which the file data was originally generated, when the tag {{msg-mw|Exif-datetimeoriginal}} is recorded to the whole second.",
+       "exif-subsectimedigitized": "{{exif-qqq}}\n\nThis tag shows the detail of the fraction of a second (1/100s) at which the file was stored as digital data, when the tag {{msg-mw|Exif-datetimedigitized}} is recorded to the whole second.",
+       "exif-exposuretime": "{{exif-qqq}}\n\nThe exposure time. Number of (or fraction of) seconds the film was exposed to light. The value for this property is formatted using {{msg-mw|exif-exposuretime-format}}",
+       "exif-exposuretime-format": "{{exif-qqq}}\n\nParameters:\n* $1 - the exposure time written as a fraction of a second, for example 1/640 of a second\n* $2 - the exposure time written as a decimal, for example 0.0015625\n\n'sec' is the abbreviation used in English for the unit of time 'second'.",
+       "exif-fnumber": "{{exif-qqq}}\n\nThe [[w:F number|F number]] is the relative aperture of the camera.",
        "exif-fnumber-format": "{{optional}}\nExif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nParameters:\n* $1 - a number\nNote:\n* f is the abbreviation used in English for \"f-number\".",
-       "exif-exposureprogram": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nHow the camera figured out what exposure to use. (If it was manually set, if its optimizing for fast shutter speed, etc).\n{{Related|Exif-exposureprogram}}",
+       "exif-exposureprogram": "{{exif-qqq}}\n\nHow the camera figured out what exposure to use. (If it was manually set, if its optimizing for fast shutter speed, etc).\n\n{{Related|Exif-exposureprogram}}",
        "exif-spectralsensitivity": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nHow sensitive each channel (colour) of the photo is to light. This tag is almost never used.",
        "exif-isospeedratings": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe iso speed of the film used in the camera. This is basically a measure of how sensitive the film in the camera is to light.",
        "exif-shutterspeedvalue": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\n[[w:Shutter_speed|Shutter speed]] is the time that the camera shutter is open.\n\nThis is the shutter speed measured in APEX units (negative base 2 log of shutter speed in seconds). See {{msg-mw|exif-exposuretime}} for this property in more traditional units of seconds.",
-       "exif-aperturevalue": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe [[w:Aperture|aperture]] of a camera is the hole through which light shines. This message can be translated 'Aperture width'. Note, this is measured in APEX units which is 2*log<sub>2</sub>(f-number) . See {{msg-mw|exif-fnumber}} for this value in more traditional units.",
+       "exif-aperturevalue": "{{exif-qqq}}\n\nThe [[w:Aperture|aperture]] of a camera is the hole through which light shines. This message can be translated 'Aperture width'. Note, this is measured in APEX units which is 2*log<sub>2</sub>(f-number) . See {{msg-mw|exif-fnumber}} for this value in more traditional units.",
        "exif-brightnessvalue": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nHow intense the illumination of the scene photographed is. Measured in APEX brightness units. See Annex C of Exif standard for details on the measurement system in use.",
        "exif-exposurebiasvalue": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nAnother term for [[w:Exposure_bias|'exposure bias']] is 'exposure compensation'.",
        "exif-maxaperturevalue": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe 'land' in a camera refers possibly to the inner surface of the barrel of the lens. An alternative phrasing for this message could perhaps be 'maximum width of the land aperture'.",
        "exif-subjectdistance": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe subject of a photograph is the person or thing on which the camera focuses. 'Subject distance' is the distance to the subject given in meters.",
-       "exif-meteringmode": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee [[w:Metering_mode|Wikipedia article]] on metering mode.\n{{Related|Exif-meteringmode}}",
-       "exif-lightsource": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Related|Exif-lightsource}}",
-       "exif-flash": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee this [[w:en:Flash_(photography)|Wikipedia article]] for an explanation of the term.\n{{Related|Exif-flash}}\n{{Identical|Flash}}",
+       "exif-meteringmode": "{{exif-qqq}}\n\nSee [[w:Metering mode|Wikipedia article]] on metering mode.\n\n{{Related|Exif-meteringmode}}",
+       "exif-lightsource": "{{exif-qqq}}\n\n{{Related|Exif-lightsource}}",
+       "exif-flash": "{{exif-qqq}}\n\nSee this [[w:en:Flash (photography)|Wikipedia article]] for an explanation of the term.\n\n{{Related|Exif-flash}}\n{{Identical|Flash}}",
        "exif-focallength": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee this [[w:en:Focal_length_(photography)|Wikipedia article]] for an explanation of the term.",
        "exif-focallength-format": "{{optional}}\nExif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nParameters:\n* $1 - a number\nNote:\n* mm is the abbreviation used in English for the unit of measurement of length \"millimeter\".",
-       "exif-subjectarea": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis exif property contains the position of the main subject. The first two numbers is the position of the subject in the picture in pixels from the upper left corner. If a third number is specified, it is a circle centred at the first two numbers. If four numbers are specified, the first two are coordinates of the centre of the subject as before, the third is the width of the rectangle, and the fourth is the height of the rectangle. It is rare for a photo to use this tag.",
+       "exif-subjectarea": "{{exif-qqq}}\n\nThis exif property contains the position of the main subject. The first two numbers is the position of the subject in the picture in pixels from the upper left corner. If a third number is specified, it is a circle centred at the first two numbers. If four numbers are specified, the first two are coordinates of the centre of the subject as before, the third is the width of the rectangle, and the fourth is the height of the rectangle. It is rare for a photo to use this tag.",
        "exif-flashenergy": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nHow bright the flash is in beam candle power seconds.",
        "exif-focalplanexresolution": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nIndicates the number of pixels in the image width (X) direction per FocalPlaneResolutionUnit on the camera focal plane.",
        "exif-focalplaneyresolution": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
-       "exif-focalplaneresolutionunit": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee also:\n* {{msg-mw|Exif-focalplaneresolutionunit-2}}",
+       "exif-focalplaneresolutionunit": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-focalplaneresolutionunit-2}}",
        "exif-subjectlocation": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSame as {{msg-mw|exif-subjectarea}} but only ever has two numbers as a value.",
        "exif-exposureindex": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
-       "exif-sensingmethod": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Related|Exif-sensingmethod}}",
+       "exif-sensingmethod": "{{exif-qqq}}\n{{Related|Exif-sensingmethod}}",
        "exif-filesource": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nDetermines if the image was recorded by a digital camera adhering to DSC standard (which is almost all digital cameras).",
-       "exif-scenetype": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nIf the image is directly photographed (taken by a digital camera).\n\nSee also:\n* {{msg-mw|Exif-scenetype}}\n* {{msg-mw|Exif-scenetype-1}}",
-       "exif-customrendered": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee also Wikipedia on [[w:Image_processing|image processing]].\n\nSee also:\n* {{msg-mw|Exif-customrendered}}\n* {{msg-mw|Exif-customrendered-0}}\n* {{msg-mw|Exif-customrendered-1}}",
-       "exif-exposuremode": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee also Wikipedia on [[w:en:Exposure_(photography)|exposure in photography]]. This tag shows if the photo's exposure was manually set or automatically determined.\n{{Related|Exif-exposuremode}}",
-       "exif-whitebalance": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee also Wikipedia on [[w:Color_balance|color balance]].\n\nSee also:\n* {{msg-mw|Exif-whitebalance}}\n* {{msg-mw|Exif-whitebalance-0}}\n* {{msg-mw|Exif-whitebalance-1}}",
+       "exif-scenetype": "{{exif-qqq}}\n\nThis tag indicates whether the image is directly photographed (taken by a digital camera).\n\nSee also:\n* {{msg-mw|Exif-scenetype}}\n* {{msg-mw|Exif-scenetype-1}}",
+       "exif-customrendered": "{{exif-qqq}}\n\nSee also the Wikipedia article on [[w:Image processing|image processing]].\n\nSee also:\n* {{msg-mw|Exif-customrendered}}\n* {{msg-mw|Exif-customrendered-0}}\n* {{msg-mw|Exif-customrendered-1}}",
+       "exif-exposuremode": "{{exif-qqq}}\n\nThis tag shows if the photo's exposure was manually set or automatically determined. See the Wikipedia article on [[w:en:Exposure (photography)|exposure in photography]] for more details.\n\n{{Related|Exif-exposuremode}}",
+       "exif-whitebalance": "{{exif-qqq}}\n\nSee also the Wikipedia article on [[w:Color balance|color balance]].\n\nSee also:\n* {{msg-mw|Exif-whitebalance}}\n* {{msg-mw|Exif-whitebalance-0}}\n* {{msg-mw|Exif-whitebalance-1}}",
        "exif-digitalzoomratio": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee also Wikipedia on [[w:Digital_zoom|digital zoom]].",
        "exif-focallengthin35mmfilm": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee also Wikipedia on [[w:Focal_length#In_photography|focal length]].",
-       "exif-scenecapturetype": "{{Related|Exif-scenecapturetype}}",
-       "exif-gaincontrol": "Gain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n{{Related|Exif-gaincontrol}}",
-       "exif-contrast": "{{Related|Exif-contrast}}",
-       "exif-saturation": "{{Related|Exif-saturation}}",
-       "exif-sharpness": "{{Related|Exif-sharpness}}",
+       "exif-scenecapturetype": "{{exif-qqq}}\n{{Related|Exif-scenecapturetype}}",
+       "exif-gaincontrol": "{{exif-qqq}}\n\nGain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n\n{{Related|Exif-gaincontrol}}",
+       "exif-contrast": "{{exif-qqq}}\n{{Related|Exif-contrast}}",
+       "exif-saturation": "{{exif-qqq}}\n{{Related|Exif-saturation}}",
+       "exif-sharpness": "{{exif-qqq}}\n{{Related|Exif-sharpness}}",
        "exif-devicesettingdescription": "The section header shown above device settings extracted from a file's EXIF data on the file's page.",
-       "exif-subjectdistancerange": "{{Related|Exif-subjectdistancerange}}",
+       "exif-subjectdistancerange": "{{exif-qqq}}\n{{Related|Exif-subjectdistancerange}}",
        "exif-imageuniqueid": "A unique identifier for the image in the form of a 128-bit hexadecimal string. See http://www.exif.org/Exif2-2.PDF for details on exif properties.",
        "exif-gpsversionid": "Version of the GPS IFD used to store location information. This is usually 2.2.0.0",
-       "exif-gpslatituderef": "In older versions of mediawiki this referred to if the latitude was North or South. This is no longer used in modern versions of mediawiki except for when using a foreign image repository that is using an older version of mediawiki since the information is now contained in {{msg-mw|exif-gpslatitude}}.\n{{Related|Exif-gpslatitude}}",
-       "exif-gpslatitude": "The latitude of the location from where the picture was taken from.\n{{Related|Exif-gpslatitude}}\n{{Identical|Latitude}}",
-       "exif-gpslongituderef": "Same as {{msg-mw|exif-gpslatituderef}} but for longitude.\n\n{{Related|Exif-gpslatitude}}",
-       "exif-gpslongitude": "The longitude of the location from where the picture was taken from.\n{{Related|Exif-gpslatitude}}\n{{Identical|Longitude}}",
+       "exif-gpslatituderef": "{{exif-qqq}}\n\nIn older versions of mediawiki this referred to if the latitude was North or South. This is no longer used in modern versions of mediawiki except for when using a foreign image repository that is using an older version of mediawiki since the information is now contained in {{msg-mw|exif-gpslatitude}}.\n\n{{Related|Exif-gpslatitude}}",
+       "exif-gpslatitude": "{{exif-qqq}}\n\nThe latitude of the location from where the picture was taken from.\n\n{{Related|Exif-gpslatitude}}\n{{Identical|Latitude}}",
+       "exif-gpslongituderef": "{{exif-qqq}}\n\nSame as {{msg-mw|exif-gpslatituderef}} but for longitude.\n\n{{Related|Exif-gpslatitude}}",
+       "exif-gpslongitude": "{{exif-qqq}}\n\nThe longitude of the location from where the picture was taken from.\n\n{{Related|Exif-gpslatitude}}\n{{Identical|Longitude}}",
        "exif-gpsaltituderef": "No longer used except for when using foreign image repository with old version of mediawiki. 0 for above sea level, 1 for below sea level.",
        "exif-gpsaltitude": "Altitude in meters that the image was taken at.",
        "exif-gpstimestamp": "Time (does not include date) that GPS measurement was taken, in UTC. Since often this is at the same time as photo was taken, this is sometimes more reliable than {{msg-mw|exif-datetimeoriginal}}.",
        "exif-gpssatellites": "Label for EXIF information. Indicates the GPS satellites used for measurements.",
-       "exif-gpsstatus": "See also:\n* {{msg-mw|Exif-gpsstatus-a}}\n* {{msg-mw|Exif-gpsstatus-v}}",
-       "exif-gpsmeasuremode": "Is the measurement 2D (latitude and longitude) or 3D (latitude, longitude, and altitude).\n\nSee also:\n* {{msg-mw|Exif-gpsmeasuremode-2}}\n* {{msg-mw|Exif-gpsmeasuremode-3}}",
-       "exif-gpsdop": "How accurate the GPS information is. See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)\n{{Related|Exif-gpsdop}}",
-       "exif-gpsspeedref": "{{Related|Exif-gpsspeed}}",
-       "exif-gpsspeed": "{{Related|Exif-gpsspeed}}",
-       "exif-gpstrackref": "See also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
-       "exif-gpstrack": "See also:\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
-       "exif-gpsimgdirectionref": "See also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
-       "exif-gpsimgdirection": "See also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
+       "exif-gpsstatus": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpsstatus-a}}\n* {{msg-mw|Exif-gpsstatus-v}}",
+       "exif-gpsmeasuremode": "{{exif-qqq}}\n\nThis tag indicates whether the measurement 2D (latitude and longitude) or 3D (latitude, longitude, and altitude).\n\nSee also:\n* {{msg-mw|Exif-gpsmeasuremode-2}}\n* {{msg-mw|Exif-gpsmeasuremode-3}}",
+       "exif-gpsdop": "{{exif-qqq}}\n\nHow accurate the GPS information is. See [[wikipedia:Dilution of precision (GPS)]].\n\n{{Related|Exif-gpsdop}}",
+       "exif-gpsspeedref": "{{exif-qqq}}\n{{Related|Exif-gpsspeed}}",
+       "exif-gpsspeed": "{{exif-qqq}}\n{{Related|Exif-gpsspeed}}",
+       "exif-gpstrackref": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
+       "exif-gpstrack": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
+       "exif-gpsimgdirectionref": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
+       "exif-gpsimgdirection": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
        "exif-gpsmapdatum": "Label for EXIF information. Indicates the geodetic survey data used by the GPS receiver.",
-       "exif-gpsdestlatituderef": "{{Related|Exif-gpslatitude}}",
-       "exif-gpsdestlatitude": "The latitude of the location shown in the picture, if it is different from latitude of the camera location. See {{msg-mw|exif-gpslatitude}}.\n{{Related|Exif-gpslatitude}}\n{{Identical|Latitude}}",
-       "exif-gpsdestlongituderef": "{{Related|Exif-gpslatitude}}",
-       "exif-gpsdestlongitude": "The longitude of the location shown in the picture, if it is different from longitude of the camera location. See {{msg-mw|exif-gpslongitude}}.\n{{Related|Exif-gpslatitude}}\n{{Identical|Longitude}}",
-       "exif-gpsdestbearingref": "See also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}",
-       "exif-gpsdestbearing": "See also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
-       "exif-gpsdestdistanceref": "I think \"reference\" stands for \"unit\". See {{msg-mw|Exif-gpsspeedref}}\n{{Related|Exif-gpsdestdistance}}",
-       "exif-gpsdestdistance": "{{Related|Exif-gpsdestdistance}}",
+       "exif-gpsdestlatituderef": "{{exif-qqq}}\n{{Related|Exif-gpslatitude}}",
+       "exif-gpsdestlatitude": "{{exif-qqq}}\n\nThe latitude of the location shown in the picture, if it is different from latitude of the camera location. See {{msg-mw|exif-gpslatitude}}.\n\n{{Related|Exif-gpslatitude}}\n{{Identical|Latitude}}",
+       "exif-gpsdestlongituderef": "{{exif-qqq}}\n{{Related|Exif-gpslatitude}}",
+       "exif-gpsdestlongitude": "{{exif-qqq}}\n\nThe longitude of the location shown in the picture, if it is different from longitude of the camera location. See {{msg-mw|exif-gpslongitude}}.\n\n{{Related|Exif-gpslatitude}}\n{{Identical|Longitude}}",
+       "exif-gpsdestbearingref": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}",
+       "exif-gpsdestbearing": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
+       "exif-gpsdestdistanceref": "{{exif-qqq}}\n\nIndicates the unit used to express the distance to the destination point. Values are typically \"K\", \"M\" or \"N\", standing for kilometers, miles and nautical miles, respectively. See also {{msg-mw|Exif-gpsspeedref}}.\n\n{{Related|Exif-gpsdestdistance}}",
+       "exif-gpsdestdistance": "{{exif-qqq}}\n{{Related|Exif-gpsdestdistance}}",
        "exif-gpsprocessingmethod": "Label for EXIF information. A character string recording the name of the method used for location finding.",
        "exif-gpsareainformation": "Label for EXIF information. Contains a character string recording the name of the GPS area.",
-       "exif-gpsdatestamp": "Date (does not generally include time unless recorded in XMP) that GPS measurement was taken, in UTC. Since often this is at the same date as photo was taken, this is sometimes more reliable than {{msg-mw|exif-datetimeoriginal}}.",
+       "exif-gpsdatestamp": "{{exif-qqq}}\n\nDate (does not generally include time unless recorded in XMP) that GPS measurement was taken, in UTC. Since often this is at the same date as photo was taken, this is sometimes more reliable than {{msg-mw|exif-datetimeoriginal}}.",
        "exif-gpsdifferential": "Label for EXIF information. Indicates whether differential correction is applied to the GPS receiver.",
        "exif-coordinate-format": "{{optional}}\nFor formatting GPS latitude coordinates. Parameters:\n* $1 - degrees\n* $2 - minutes\n* $3 - seconds (up to two decimal places)\n* $4 - direction (N, S, W, or E)\n* $5 - (Unused) coordinate as a single positive or negative real number",
        "exif-jpegfilecomment": "This is not a true exif tag, but the contents of the JPEG COM segment. This often contains a file source, but can potentially contain any comment about the file. This is similar to {{msg-mw|exif-usercomment}}, {{msg-mw|exif-pngfilecomment}}, and {{msg-mw|exif-giffilecomment}}.",
-       "exif-keywords": "List of keywords for the photograph (or other media).\n\nThis can come from IPTC-iim 2:25 keyword field, or XMP's dc:subject field.\n{{Identical|Keyword}}",
+       "exif-keywords": "{{exif-qqq}}\n\nList of keywords for the photograph (or other media). This can come from IPTC-iim 2:25 keyword field, or XMP's dc:subject field.\n\n{{Identical|Keyword}}",
        "exif-worldregioncreated": "The world region (generally that means continent, but could also include 'World' as a whole) where the media was created.",
-       "exif-countrycreated": "Country that the picture was taken in. Note this is where it was taken, not what country is depicted in the picture.",
+       "exif-countrycreated": "{{exif-qqq}}\n\nCountry that the picture was taken in. Note this is where it was taken, not what country is depicted in the picture.",
        "exif-countrycodecreated": "ISO Code for the country that the picture was taken in. Note this is where it was taken, not what country is depicted in the picture.",
        "exif-provinceorstatecreated": "Province, state, territory, or other secondary political division (bigger than a city, smaller then a country) where that the picture was taken in.  Note this is where it was taken, not what province/state is depicted in the picture.",
        "exif-citycreated": "City that the picture was taken in.  Note this is where it was taken, not what city is depicted in the picture. This is generally only used if different from the city depicted in photo.",
        "exif-provinceorstatedest": "Province, state, territory, or other secondary political division shown.",
        "exif-citydest": "City shown",
        "exif-sublocationdest": "Sub-location of city shown. This could be an address, a street, an area of town, etc.",
-       "exif-objectname": "This is a short name for the image or other media. (As compared to {{msg-mw|exif-imagedescription}} which is a long description of the image).\n\nThis is sometimes an ID number used to identify the photo, or a (short) title of the photo.\n\nThis property is extracted based on XMP's dc:title property ( http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf ), PNG's title keyword ( http://www.w3.org/TR/PNG/#11keywords ), or IPTC-iim 2:05 Object name property ( http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf ).",
+       "exif-objectname": "{{exif-qqq}}\n\nThis is a short name for the image or other media. (As compared to {{msg-mw|exif-imagedescription}} which is a long description of the image).\n\nThis is sometimes an ID number used to identify the photo, or a (short) title of the photo.\n\nThis property is extracted based on XMP's [http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf dc:title property], PNG's [http://www.w3.org/TR/PNG/#11keywords title keyword], or IPTC-iim 2:05 [http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf Object name property].",
        "exif-specialinstructions": "Special instructions for how to use the image/media. This might include embargo notices, or other warnings.\n\nThis is IPTC-iim property 2:40. See http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf for details.",
-       "exif-headline": "A short version of the image caption. The IPTC4XMP standard is clear that \"this is not the same thing as title [ {{msg-mw|exif-objectname}} ]\".\n\nThis is extracted from XMP's photoshop:headline ( http://www.iptc.org/std/photometadata/specification/IPTC-PhotoMetadata-201007_1.pdf ) and IPTC-iim: 2:105 Headline tag ( http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf ).\n{{Identical|Headline}}",
+       "exif-headline": "{{exif-qqq}}\n\nA short version of the image caption. The IPTC4XMP standard is clear that \"this is not the same thing as title [ {{msg-mw|exif-objectname}} ]\".\n\nThis is extracted from [http://www.iptc.org/std/photometadata/specification/IPTC-PhotoMetadata-201007_1.pdf XMP's photoshop:headline] and [http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf IPTC-iim: 2:105 Headline tag].\n\n{{Identical|Headline}}",
        "exif-credit": "Provider/credit.\n\nWho gave us the image. This might be different from the creator of the image. This is IPTC-iim property 2:110",
-       "exif-source": "See IPTC-iim standard 2:115 - http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf.\n\nThis is who originally owned the image (a person, stock photo agency, etc). This does not refer to the image this image is based on.\n{{Identical|Source}}",
+       "exif-source": "{{exif-qqq}}\n\nSee [http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf IPTC-iim standard 2:115].\n\nThis is who originally owned the image (a person, stock photo agency, etc). This does not refer to the image this image is based on.\n\n{{Identical|Source}}",
        "exif-editstatus": "Editorial status of image. This is more intended for use with people making news papers. This denotes whether the image is on the main page, is part of a correction, etc. See 2:07 of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf",
-       "exif-urgency": "Urgency. How urgent this image is. 1 is very urgent, 5 is normal, 8 is  very low priority.\n{{Related|Exif-urgency}}",
+       "exif-urgency": "{{exif-qqq}}\n\nUrgency. How urgent this image is. 1 is very urgent, 5 is normal, 8 is  very low priority.\n\n{{Related|Exif-urgency}}",
        "exif-fixtureidentifier": "Fixture name. Identifies frequently occurring object data, for example a regular column in a news paper.",
        "exif-locationdest": "Full printable name of location.",
        "exif-locationdestcode": "Code of location depicted. Typically this is an ISO country code, but the IPTC-iim standard also defines other codes like XSP for outer space. See appendix D (and tag 2:100) of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf",
        "exif-objectcycle": "Time of day that media is intended for. Either morning only, evening only, or all day. Typically only used for news related things that might only be broadcast at a specific time of day.\n\nSee also:\n* {{msg-mw|Exif-objectcycle-a}}\n* {{msg-mw|Exif-objectcycle-p}}\n* {{msg-mw|Exif-objectcycle-b}}",
        "exif-contact": "Contact information of the person responsible for the image.",
        "exif-writer": "The person who wrote the caption of the image. See Description Writer on page 18 of http://www.iptc.org/std/photometadata/specification/IPTC-PhotoMetadata-201007_1.pdf\n{{Identical|Writer}}",
-       "exif-languagecode": "Language of image/media.\n\nThis is taken from IPTC-iim 2:135 and XMP's dc:language.\n{{Identical|Language}}",
+       "exif-languagecode": "{{exif-qqq}}\n\nLanguage of image/media. This is taken from IPTC-iim 2:135 and XMP's dc:language.\n\n{{Identical|Language}}",
        "exif-iimversion": "IIM version number. Version of information interchange 2:xx records. 4 is current version. 2 is often seen as well. This is the value stored 2:00 field (Note, iptc-iim also stores a model version in 1:00. This version field displays the 2:00 record only)",
-       "exif-iimcategory": "Primary Category of image (or other media). Technically supposed to be limited to 3 characters, however that is not always followed. Some common 3 letter category abbreviations are expanded by mediawiki. Similar to {{msg-mw|exif-keywords}}.\n{{Identical|Category}}",
+       "exif-iimcategory": "{{exif-qqq}}\n\nPrimary Category of image (or other media). Technically supposed to be limited to 3 characters, however that is not always followed. Some common 3 letter category abbreviations are expanded by mediawiki. Similar to {{msg-mw|exif-keywords}}.\n\n{{Identical|Category}}",
        "exif-iimsupplementalcategory": "Supplemental categories. Like {{msg-mw|exif-iimcategory}} but for categories beyond the main one.",
-       "exif-datetimeexpires": "Date after which not to use the image (media). This is often used in news situations were certain things (like forecasts) should not be used after a specified date.",
-       "exif-datetimereleased": "Earliest date the image (media) can be used.\n\nSee 2:30 of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf",
+       "exif-datetimeexpires": "{{exif-qqq}}\n\nDate after which not to use the image (media). This is often used in news situations were certain things (like forecasts) should not be used after a specified date.",
+       "exif-datetimereleased": "{{exif-qqq}}\n\nEarliest date the image (media) can be used.\n\nSee 2:30 of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf",
        "exif-originaltransmissionref": "This is basically a job ID. This could help an individual keep track of for what reason the image was created.\n\nSee Job Id on page 19 of http://www.iptc.org/std/photometadata/specification/IPTC-PhotoMetadata-201007_1.pdf",
-       "exif-identifier": "A formal identifier for the image. Often this is a URL.\n{{Identical|Identifier}}",
+       "exif-identifier": "{{exif-qqq}}\nA formal identifier for the image. Often this is a URL.\n{{Identical|Identifier}}",
        "exif-lens": "Description of lens used. This is taken from aux:Lens XMP property. See http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart2.pdf",
        "exif-serialnumber": "Serial number of camera. See aux:SerialNumber in http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart2.pdf",
        "exif-cameraownername": "Who owns the camera.",
-       "exif-label": "Label given to the image for organizational purposes. This is very similar to {{msg-mw|exif-keywords}}. Label is more used by a person to organize their media, where keywords are used to describe the photo contents itself.\n\nThis property can come from xmp:Label in XMP ( http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf ) or the label textual chunk in PNG.\n{{Identical|Label}}",
-       "exif-datetimemetadata": "Date metadata was last modified. Typically this refers to XMP metadata.",
+       "exif-label": "{{exif-qqq}}\n\nLabel given to the image for organizational purposes. This is very similar to {{msg-mw|exif-keywords}}. Label is more used by a person to organize their media, where keywords are used to describe the photo contents itself.\n\nThis property can come from xmp:Label in XMP ( http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf ) or the label textual chunk in PNG.\n\n{{Identical|Label}}",
+       "exif-datetimemetadata": "{{exif-qqq}}\n\nDate metadata was last modified. Typically this refers to XMP metadata.",
        "exif-nickname": "Short informal name of image. See http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart2.pdf",
        "exif-rating": "This is a rating for how good the image is. The range is between 1 to 5 (5 highest), with an additional option of \"reject\".",
        "exif-rightscertificate": "URL of Rights management certificate. This comes from XMPRights:Certificate property. See http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf",
        "exif-copyrighted": "Copyright status. This is a true or false field showing either Copyrighted or Public Domain. It should be noted that Copyrighted includes freely-licensed works.",
-       "exif-copyrightowner": "Copyright owner. Can have more than one person or entity.",
+       "exif-copyrightowner": "{{exif-qqq}}\n\nCopyright owner. Can have more than one person or entity.",
        "exif-usageterms": "Terms under which you're allowed to use the image/media.",
-       "exif-webstatement": "URL detailing the copyright status of the image, and how you're allowed to use the image. Often this is a link to a creative commons license, however the creative commons people recommend using a page that generally contains specific information about the image, and recommend using {{msg-mw|exif-licenseurl}} for linking to the license. See http://wiki.creativecommons.org/XMP",
+       "exif-webstatement": "{{exif-qqq}}\n\nURL detailing the copyright status of the image, and how you're allowed to use the image. Often this is a link to a creative commons license, however the creative commons people recommend using a page that generally contains specific information about the image, and recommend using {{msg-mw|exif-licenseurl}} for linking to the license. See http://wiki.creativecommons.org/XMP",
        "exif-originaldocumentid": "A unique ID of the original document (image) that this document (image) is based on.",
-       "exif-licenseurl": "URL for copyright license. This is almost always a creative commons license since this information comes from the creative commons namespace of XMP (but could be a link to any type of license). See also {{msg-mw|exif-webstatement}}",
+       "exif-licenseurl": "{{exif-qqq}}\n\nURL for copyright license. This is almost always a creative commons license since this information comes from the creative commons namespace of XMP (but could be a link to any type of license). See also {{msg-mw|exif-webstatement}}",
        "exif-morepermissionsurl": "A URL where you can \"buy\" (or otherwise negotiate) to get more rights for the image.",
        "exif-attributionurl": "A URL that you're supposed to use when re-using the image.",
        "exif-preferredattributionname": "The preferred name to give credit to when re-using this image.",
-       "exif-pngfilecomment": "See also:\n* {{msg-mw|Exif-pngfilecomment}}\n* {{msg-mw|Exif-giffilecomment}}",
-       "exif-disclaimer": "Disclaimer for the image.\n{{Identical|Disclaimer}}",
+       "exif-pngfilecomment": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-pngfilecomment}}\n* {{msg-mw|Exif-giffilecomment}}",
+       "exif-disclaimer": "{{exif-qqq}}\n\nDisclaimer for the image.\n\n{{Identical|Disclaimer}}",
        "exif-contentwarning": "Content warning for the image. For example if the image/media contains violent, sexual or otherwise offensive content.\n\nThis comes from the png warning textual chunk. See http://www.w3.org/TR/PNG/#11keywords",
-       "exif-giffilecomment": "See also:\n* {{msg-mw|Exif-pngfilecomment}}\n* {{msg-mw|Exif-giffilecomment}}",
+       "exif-giffilecomment": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-pngfilecomment}}\n* {{msg-mw|Exif-giffilecomment}}",
        "exif-intellectualgenre": "The \"intellectual genre\" of the image/media item. This typically means the type of item it is, ignoring the actual content of the item. See http://cv.iptc.org/newscodes/genre/ for some examples of the types of values this field might have.",
        "exif-subjectnewscode": "A (or multiple) codes describing the content of the image/media. The code is an 8 digit number representing some sort of category. The code is hierarchical , with the first two digits being a broad category (this broad category is shown to the user. See {{msg-mw|exif-subjectnewscode-value}} for how the value this field labels is shown to user). See http://cv.iptc.org/newscodes/subjectcode for the full list of codes.",
        "exif-scenecode": "IPTC (numeric) scene code. Contains information on what type of scene it is (like panoramic scene, close-up, etc). See http://cv.iptc.org/newscodes/scene/",
        "exif-software-value": "{{notranslate}}\nParameters:\n* $1 - software name",
        "exif-software-version-value": "{{notranslate}}\nParameters:\n* $1 - software name\n* $2 - version number",
        "exif-contact-value": "{{optional}}\nParameters:\n* $1 - email\n* $2 - URL of website\n* $3 - street address\n* $4 - city\n* $5 - region\n* $6 - postal code\n* $7 - country\n* $8 - telephone number\nNote, not all fields are guaranteed to be present, some may be empty strings.",
-       "exif-subjectnewscode-value": "{{Optional}}\nParameters:\n* $1 - numeric IPTC subject news code (one of http://cv.iptc.org/newscodes/subjectcode )\n* $2 - one of 17 broad categories that the code falls into. For example any code starting with 15 has the contents of {{msg-mw|Exif-iimcategory-spo}} for $2.",
-       "exif-compression-1": "{{Related|Exif-compression}}",
+       "exif-subjectnewscode-value": "{{Optional}}\n\n{{exif-qqq}}\n\nParameters:\n* $1 - numeric IPTC subject news code (one of http://cv.iptc.org/newscodes/subjectcode )\n* $2 - one of 17 broad categories that the code falls into. For example any code starting with 15 has the contents of {{msg-mw|Exif-iimcategory-spo}} for $2.",
+       "exif-compression-1": "{{exif-qqq}}\n{{Related|Exif-compression}}",
        "exif-compression-2": "{{Related|Exif-compression}}",
        "exif-compression-3": "{{Related|Exif-compression}}",
        "exif-compression-4": "{{Related|Exif-compression}}",
        "exif-photometricinterpretation-10": "See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
        "exif-photometricinterpretation-32803": "Used mostly by DNG images. See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
        "exif-photometricinterpretation-34892": "Used mostly by DNG images. See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
-       "exif-unknowndate": "Used if the Exif date and time is \"<code>0000:00:00 00:00:00</code>\".\n\nRelated Exif attributes:\n* {{msg-mw|Exif-datetime}}\n* {{msg-mw|Exif-datetimeoriginal}}\n* {{msg-mw|Exif-datetimedigitized}}\n* {{msg-mw|Exif-datetimereleased}}\n* {{msg-mw|Exif-datetimeexpires}}\n* {{msg-mw|Exif-gpsdatestamp}}\n* {{msg-mw|Exif-dc-date}}\n* {{msg-mw|Exif-datetimemetadata}}",
+       "exif-unknowndate": "{{exif-qqq}}\n\nUsed if the Exif date and time is \"<code>0000:00:00 00:00:00</code>\".\n\nRelated Exif attributes:\n* {{msg-mw|Exif-datetime}}\n* {{msg-mw|Exif-datetimeoriginal}}\n* {{msg-mw|Exif-datetimedigitized}}\n* {{msg-mw|Exif-datetimereleased}}\n* {{msg-mw|Exif-datetimeexpires}}\n* {{msg-mw|Exif-gpsdatestamp}}\n* {{msg-mw|Exif-dc-date}}\n* {{msg-mw|Exif-datetimemetadata}}",
        "exif-orientation-1": "0th row: top; 0th column: left\n{{Related|Exif-orientation}}\n{{Identical|Normal}}",
-       "exif-orientation-2": "0th row: top; 0th column: right\n{{Related|Exif-orientation}}",
-       "exif-orientation-3": "0th row: bottom; 0th column: right\n{{Related|Exif-orientation}}",
-       "exif-orientation-4": "0th row: bottom; 0th column: left\n{{Related|Exif-orientation}}",
+       "exif-orientation-2": "{{exif-qqq}}\n\n0th row: top; 0th column: right\n\n{{Related|Exif-orientation}}",
+       "exif-orientation-3": "{{exif-qqq}}\n\n0th row: bottom; 0th column: right\n\n{{Related|Exif-orientation}}",
+       "exif-orientation-4": "{{exif-qqq}}\n\n0th row: bottom; 0th column: left\n\n{{Related|Exif-orientation}}",
        "exif-orientation-5": "0th row: left; 0th column: top\n\nCCW is an abbreviation for counter-clockwise\n{{Related|Exif-orientation}}",
-       "exif-orientation-6": "0th row: right; 0th column: top\n\nCCW is an abbreviation for counter-clockwise.\n{{Related|Exif-orientation}}",
+       "exif-orientation-6": "{{exif-qqq}}\n\n0th row: right; 0th column: top\n\nCCW is an abbreviation for counter-clockwise.\n\n{{Related|Exif-orientation}}",
        "exif-orientation-7": "0th row: right; 0th column: bottom\n\nCW is an abbreviation for clockwise\n{{Related|Exif-orientation}}",
-       "exif-orientation-8": "0th row: left; 0th column: bottom\n\nCW is an abbreviation for clockwise.\n{{Related|Exif-orientation}}",
-       "exif-planarconfiguration-1": "See also:\n* {{msg-mw|Exif-planarconfiguration}}\n* {{msg-mw|Exif-planarconfiguration-1}}\n* {{msg-mw|Exif-planarconfiguration-2}}",
-       "exif-planarconfiguration-2": "See also:\n* {{msg-mw|Exif-planarconfiguration}}\n* {{msg-mw|Exif-planarconfiguration-1}}\n* {{msg-mw|Exif-planarconfiguration-2}}",
+       "exif-orientation-8": "{{exif-qqq}}\n\n0th row: left; 0th column: bottom\n\nCW is an abbreviation for clockwise.\n\n{{Related|Exif-orientation}}",
+       "exif-planarconfiguration-1": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-planarconfiguration}}\n* {{msg-mw|Exif-planarconfiguration-1}}\n* {{msg-mw|Exif-planarconfiguration-2}}",
+       "exif-planarconfiguration-2": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-planarconfiguration}}\n* {{msg-mw|Exif-planarconfiguration-1}}\n* {{msg-mw|Exif-planarconfiguration-2}}",
        "exif-xyresolution-i": "{{Optional}}\nUsed to format {{msg-mw|Exif-xresolution}} and {{msg-mw|Exif-yresolution}} if the unit is dots per inch.\n\nParameters:\n* $1 - the number of dots/in",
        "exif-xyresolution-c": "{{Optional}}\nUsed to format {{msg-mw|Exif-xresolution}} and {{msg-mw|Exif-yresolution}} if the unit is dots per centimeter.\n\nParameters:\n* $1 - the number of dots/cm",
-       "exif-colorspace-1": "{{Optional}}\nIf it uses the standard sRGB colour space.\n\nSee also:\n* {{msg-mw|Exif-colorspace}}\n* {{msg-mw|Exif-colorspace-1|optional}}\n* {{msg-mw|Exif-colorspace-65535}}",
-       "exif-colorspace-65535": "The photograph is not colour calibrated.\n\nSee also:\n* {{msg-mw|Exif-colorspace}}\n* {{msg-mw|Exif-colorspace-1|optional}}\n* {{msg-mw|Exif-colorspace-65535}}",
-       "exif-componentsconfiguration-0": "{{Related|Exif-componentsconfiguration}}",
-       "exif-componentsconfiguration-1": "{{optional}}\n{{Related|Exif-componentsconfiguration}}",
-       "exif-componentsconfiguration-2": "{{optional}}\n{{Related|Exif-componentsconfiguration}}",
-       "exif-componentsconfiguration-3": "{{optional}}\n{{Related|Exif-componentsconfiguration}}",
-       "exif-componentsconfiguration-4": "{{optional}}\n{{Related|Exif-componentsconfiguration}}",
-       "exif-componentsconfiguration-5": "{{optional}}\n{{Related|Exif-componentsconfiguration}}",
-       "exif-componentsconfiguration-6": "{{optional}}\n{{Related|Exif-componentsconfiguration}}",
-       "exif-exposureprogram-0": "{{Related|Exif-exposureprogram}}",
+       "exif-colorspace-1": "{{Optional}}\n{{exif-qqq}}\n\nThis value indicates that the image uses the standard sRGB colour space.\n\nSee also:\n* {{msg-mw|Exif-colorspace}}\n* {{msg-mw|Exif-colorspace-1|optional}}\n* {{msg-mw|Exif-colorspace-65535}}",
+       "exif-colorspace-65535": "{{exif-qqq}}\n\nThis value indicates that the photograph is not colour-calibrated.\n\nSee also:\n* {{msg-mw|Exif-colorspace}}\n* {{msg-mw|Exif-colorspace-1|optional}}\n* {{msg-mw|Exif-colorspace-65535}}",
+       "exif-componentsconfiguration-0": "{{exif-qqq}}\n{{Related|Exif-componentsconfiguration}}",
+       "exif-componentsconfiguration-1": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-componentsconfiguration}}",
+       "exif-componentsconfiguration-2": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-componentsconfiguration}}",
+       "exif-componentsconfiguration-3": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-componentsconfiguration}}",
+       "exif-componentsconfiguration-4": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-componentsconfiguration}}",
+       "exif-componentsconfiguration-5": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-componentsconfiguration}}",
+       "exif-componentsconfiguration-6": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-componentsconfiguration}}",
+       "exif-exposureprogram-0": "{{exif-qqq}}\n{{Related|Exif-exposureprogram}}",
        "exif-exposureprogram-1": "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[[w:Mode_dial|Mode dial]]' for an explanation.\n{{Related|Exif-exposureprogram}}\n{{Identical|Manual}}",
-       "exif-exposureprogram-2": "One of the exposure program types in the table of metadata on image description pages.\n{{Related|Exif-exposureprogram}}",
-       "exif-exposureprogram-3": "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article for a definition of the term [[w:Aperture_priority|aperture priority]].\n{{Related|Exif-exposureprogram}}",
-       "exif-exposureprogram-4": "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article for a definition of the term [[w:Shutter_priority|shutter priority]].\n{{Related|Exif-exposureprogram}}",
+       "exif-exposureprogram-2": "{{exif-qqq}}\n\nOne of the exposure program types in the table of metadata on image description pages.\n\n{{Related|Exif-exposureprogram}}",
+       "exif-exposureprogram-3": "{{exif-qqq}}\n\nOne of the exposure program types in the table of metadata on image description pages. See the Wikipedia article for a definition of the term [[w:Aperture_priority|aperture priority]].\n\n{{Related|Exif-exposureprogram}}",
+       "exif-exposureprogram-4": "{{exif-qqq}}\n\nOne of the exposure program types in the table of metadata on image description pages. See the Wikipedia article for a definition of the term [[w:Shutter_priority|shutter priority]].\n\n{{Related|Exif-exposureprogram}}",
        "exif-exposureprogram-5": "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[[w:Mode_dial|Mode dial]]' for an explanation.\n{{Related|Exif-exposureprogram}}",
        "exif-exposureprogram-6": "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[[w:Mode_dial|Mode dial]]' for an explanation.\n{{Related|Exif-exposureprogram}}",
        "exif-exposureprogram-7": "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[[w:Mode_dial|Mode dial]]' for an explanation.\n{{Related|Exif-exposureprogram}}",
        "exif-subjectdistance-value": "Parameters:\n* $1 - a distance measured in meters. The value can, and usually does, include decimal places.",
        "exif-meteringmode-0": "{{Related|Exif-meteringmode}}\n{{Identical|Unknown}}",
        "exif-meteringmode-1": "{{Related|Exif-meteringmode}}\n{{Identical|Average}}",
-       "exif-meteringmode-2": "{{Related|Exif-meteringmode}}",
-       "exif-meteringmode-3": "{{Related|Exif-meteringmode}}",
-       "exif-meteringmode-4": "{{Related|Exif-meteringmode}}",
-       "exif-meteringmode-5": "{{Related|Exif-meteringmode}}\n{{Identical|Pattern}}",
-       "exif-meteringmode-6": "{{Related|Exif-meteringmode}}",
+       "exif-meteringmode-2": "{{exif-qqq}}\n{{Related|Exif-meteringmode}}",
+       "exif-meteringmode-3": "{{exif-qqq}}\n{{Related|Exif-meteringmode}}",
+       "exif-meteringmode-4": "{{exif-qqq}}\n{{Related|Exif-meteringmode}}",
+       "exif-meteringmode-5": "{{exif-qqq}}\n{{Related|Exif-meteringmode}}\n{{Identical|Pattern}}",
+       "exif-meteringmode-6": "{{exif-qqq}}\n{{Related|Exif-meteringmode}}",
        "exif-meteringmode-255": "{{Identical|Other}}",
        "exif-lightsource-0": "{{Identical|Unknown}}\n{{Related|Exif-lightsource}}",
-       "exif-lightsource-1": "{{Related|Exif-lightsource}}",
-       "exif-lightsource-2": "{{Related|Exif-lightsource}}",
-       "exif-lightsource-3": "{{Related|Exif-lightsource}}",
-       "exif-lightsource-4": "{{Identical|Flash}}\n{{Related|Exif-lightsource}}",
-       "exif-lightsource-9": "{{Related|Exif-lightsource}}",
-       "exif-lightsource-10": "{{Related|Exif-lightsource}}",
-       "exif-lightsource-11": "{{Related|Exif-lightsource}}",
-       "exif-lightsource-12": "{{Related|Exif-lightsource}}",
-       "exif-lightsource-13": "{{Related|Exif-lightsource}}",
-       "exif-lightsource-14": "{{Related|Exif-lightsource}}",
-       "exif-lightsource-15": "{{Related|Exif-lightsource}}",
-       "exif-lightsource-17": "{{Related|Exif-lightsource}}",
-       "exif-lightsource-18": "{{Related|Exif-lightsource}}",
-       "exif-lightsource-19": "{{Related|Exif-lightsource}}",
-       "exif-lightsource-20": "{{optional}}\n{{Related|Exif-lightsource}}",
-       "exif-lightsource-21": "{{optional}}\n{{Related|Exif-lightsource}}",
-       "exif-lightsource-22": "{{optional}}\n{{Related|Exif-lightsource}}",
-       "exif-lightsource-23": "{{optional}}\n{{Related|Exif-lightsource}}",
-       "exif-lightsource-24": "{{Related|Exif-lightsource}}",
-       "exif-lightsource-255": "{{Related|Exif-lightsource}}",
+       "exif-lightsource-1": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+       "exif-lightsource-2": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+       "exif-lightsource-3": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+       "exif-lightsource-4": "{{exif-qqq}}\n{{Identical|Flash}}\n{{Related|Exif-lightsource}}",
+       "exif-lightsource-9": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+       "exif-lightsource-10": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+       "exif-lightsource-11": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+       "exif-lightsource-12": "{{exif-qqq}}\n\nThe \"D\" stands for \"daylight\", as defined in the JIS Z 9112:2012 standard.\n\n{{Related|Exif-lightsource}}",
+       "exif-lightsource-13": "{{exif-qqq}}\n\nThe \"N\" symbol is defined in the JIS Z 9112:2012 standard.\n\n{{Related|Exif-lightsource}}",
+       "exif-lightsource-14": "{{exif-qqq}}\n\nThe \"W\" stands for \"white\", as defined in the JIS Z 9112:2012 standard.\n\n{{Related|Exif-lightsource}}",
+       "exif-lightsource-15": "{{exif-qqq}}\n\nThe \"WW\" stands for \"warm white\", as defined in the JIS Z 9112:2012 standard.\n\n{{Related|Exif-lightsource}}",
+       "exif-lightsource-17": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+       "exif-lightsource-18": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+       "exif-lightsource-19": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+       "exif-lightsource-20": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+       "exif-lightsource-21": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+       "exif-lightsource-22": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+       "exif-lightsource-23": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+       "exif-lightsource-24": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+       "exif-lightsource-255": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
        "exif-flash-fired-0": "{{Related|Exif-flash}}",
        "exif-flash-fired-1": "{{Related|Exif-flash}}",
        "exif-flash-return-0": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\n\"Strobe\" and \"flash\" mean the same here.\n{{Related|Exif-flash}}",
        "exif-flash-mode-3": "{{Related|Exif-flash}}",
        "exif-flash-function-1": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Related|Exif-flash}}",
        "exif-flash-redeye-1": "{{Related|Exif-flash}}",
-       "exif-focalplaneresolutionunit-2": "See also:\n* {{msg-mw|Exif-focalplaneresolutionunit}}",
+       "exif-focalplaneresolutionunit-2": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-focalplaneresolutionunit}}",
        "exif-sensingmethod-1": "{{Related|Exif-sensingmethod}}\n{{Identical|Undefined}}",
        "exif-sensingmethod-2": "{{Related|Exif-sensingmethod}}",
        "exif-sensingmethod-3": "{{Related|Exif-sensingmethod}}",
        "exif-sensingmethod-4": "{{Related|Exif-sensingmethod}}",
        "exif-sensingmethod-5": "''Color sequential'' means, that the three base colors are measured one after another (i.e. the sensor is first measuring red, than green, than blue).\n{{Related|Exif-sensingmethod}}",
-       "exif-sensingmethod-7": "{{Related|Exif-sensingmethod}}",
+       "exif-sensingmethod-7": "{{exif-qqq}}\n{{Related|Exif-sensingmethod}}",
        "exif-sensingmethod-8": "''Color sequential'' means, that the three base colors are measured one after another (i.e. the sensor is first measuring red, than green, than blue).\n{{Related|Exif-sensingmethod}}",
        "exif-filesource-3": "{{optional}}",
        "exif-scenetype-1": "See also:\n* {{msg-mw|Exif-scenetype}}\n* {{msg-mw|Exif-scenetype-1}}",
-       "exif-customrendered-0": "See also:\n* {{msg-mw|Exif-customrendered}}\n* {{msg-mw|Exif-customrendered-0}}\n* {{msg-mw|Exif-customrendered-1}}",
-       "exif-customrendered-1": "See also:\n* {{msg-mw|Exif-customrendered}}\n* {{msg-mw|Exif-customrendered-0}}\n* {{msg-mw|Exif-customrendered-1}}",
-       "exif-exposuremode-0": "{{Related|Exif-exposuremode}}",
-       "exif-exposuremode-1": "{{Related|Exif-exposuremode}}",
-       "exif-exposuremode-2": "A type of exposure mode shown as part of the metadata on image description pages. The Wikipedia article on [[w:Bracketing#Exposure_bracketing|bracketing]] says that 'auto bracket' is a camera exposure setting which automatically takes a series of pictures at slightly different light exposures.\n{{Related|Exif-exposuremode}}",
-       "exif-whitebalance-0": "See also:\n* {{msg-mw|Exif-whitebalance}}\n* {{msg-mw|Exif-whitebalance-0}}\n* {{msg-mw|Exif-whitebalance-1}}",
-       "exif-whitebalance-1": "See also:\n* {{msg-mw|Exif-whitebalance}}\n* {{msg-mw|Exif-whitebalance-0}}\n* {{msg-mw|Exif-whitebalance-1}}",
+       "exif-customrendered-0": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-customrendered}}\n* {{msg-mw|Exif-customrendered-0}}\n* {{msg-mw|Exif-customrendered-1}}",
+       "exif-customrendered-1": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-customrendered}}\n* {{msg-mw|Exif-customrendered-0}}\n* {{msg-mw|Exif-customrendered-1}}",
+       "exif-exposuremode-0": "{{exif-qqq}}\n{{Related|Exif-exposuremode}}",
+       "exif-exposuremode-1": "{{exif-qqq}}\n{{Related|Exif-exposuremode}}",
+       "exif-exposuremode-2": "{{exif-qqq}}\n\nA type of exposure mode shown as part of the metadata on image description pages. The Wikipedia article on [[w:Bracketing#Exposure_bracketing|bracketing]] says that 'auto bracket' is a camera exposure setting which automatically takes a series of pictures at slightly different light exposures.\n\n{{Related|Exif-exposuremode}}",
+       "exif-whitebalance-0": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-whitebalance}}\n* {{msg-mw|Exif-whitebalance-0}}\n* {{msg-mw|Exif-whitebalance-1}}",
+       "exif-whitebalance-1": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-whitebalance}}\n* {{msg-mw|Exif-whitebalance-0}}\n* {{msg-mw|Exif-whitebalance-1}}",
        "exif-scenecapturetype-0": "{{Related|Exif-scenecapturetype}}\n{{Identical|Standard}}",
-       "exif-scenecapturetype-1": "{{Related|Exif-scenecapturetype}}",
-       "exif-scenecapturetype-2": "{{Related|Exif-scenecapturetype}}",
-       "exif-scenecapturetype-3": "{{Related|Exif-scenecapturetype}}",
+       "exif-scenecapturetype-1": "{{exif-qqq}}\n{{Related|Exif-scenecapturetype}}",
+       "exif-scenecapturetype-2": "{{exif-qqq}}\n{{Related|Exif-scenecapturetype}}",
+       "exif-scenecapturetype-3": "{{exif-qqq}}\n{{Related|Exif-scenecapturetype}}",
        "exif-gaincontrol-0": "Gain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n{{Related|Exif-gaincontrol}}\n{{Identical|None}}",
-       "exif-gaincontrol-1": "Gain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n{{Related|Exif-gaincontrol}}",
-       "exif-gaincontrol-2": "Gain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n{{Related|Exif-gaincontrol}}",
-       "exif-gaincontrol-3": "Gain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n{{Related|Exif-gaincontrol}}",
-       "exif-gaincontrol-4": "Gain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n{{Related|Exif-gaincontrol}}",
+       "exif-gaincontrol-1": "{{exif-qqq}}\n\nGain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n\n{{Related|Exif-gaincontrol}}",
+       "exif-gaincontrol-2": "{{exif-qqq}}\n\nGain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n\n{{Related|Exif-gaincontrol}}",
+       "exif-gaincontrol-3": "{{exif-qqq}}\n\nGain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n\n{{Related|Exif-gaincontrol}}",
+       "exif-gaincontrol-4": "{{exif-qqq}}\n\nGain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n\n{{Related|Exif-gaincontrol}}",
        "exif-contrast-0": "{{Related|Exif-contrast}}\n{{Identical|Normal}}",
-       "exif-contrast-1": "{{Related|Exif-contrast}}\n{{Identical|Soft}}",
-       "exif-contrast-2": "{{Related|Exif-contrast}}\n{{Identical|Hard}}",
+       "exif-contrast-1": "{{exif-qqq}}\n{{Related|Exif-contrast}}\n{{Identical|Soft}}",
+       "exif-contrast-2": "{{exif-qqq}}\n{{Related|Exif-contrast}}\n{{Identical|Hard}}",
        "exif-saturation-0": "{{Related|Exif-saturation}}\n{{Identical|Normal}}",
-       "exif-saturation-1": "{{Related|Exif-saturation}}",
-       "exif-saturation-2": "Color saturation in picture EXIF data\n{{Related|Exif-saturation}}",
+       "exif-saturation-1": "{{exif-qqq}}\n{{Related|Exif-saturation}}",
+       "exif-saturation-2": "{{exif-qqq}}\n\nColor saturation in picture EXIF data\n\n{{Related|Exif-saturation}}",
        "exif-sharpness-0": "{{Related|Exif-sharpness}}\n{{Identical|Normal}}",
-       "exif-sharpness-1": "{{Related|Exif-sharpness}}\n{{Identical|Soft}}",
-       "exif-sharpness-2": "{{Related|Exif-sharpness}}\n{{Identical|Hard}}",
+       "exif-sharpness-1": "{{exif-qqq}}\n{{Related|Exif-sharpness}}\n{{Identical|Soft}}",
+       "exif-sharpness-2": "{{exif-qqq}}\n{{Related|Exif-sharpness}}\n{{Identical|Hard}}",
        "exif-subjectdistancerange-0": "{{Related|Exif-subjectdistancerange}}\n{{Identical|Unknown}}",
-       "exif-subjectdistancerange-1": "Macro view is close-up photography. See [[w:Macro_photography|Wikipedia]].\n{{Identical|Macro}}\n{{Related|Exif-subjectdistancerange}}",
-       "exif-subjectdistancerange-2": "{{Related|Exif-subjectdistancerange}}",
-       "exif-subjectdistancerange-3": "{{Related|Exif-subjectdistancerange}}",
-       "exif-gpslatitude-n": "Very rarely used. Only used when using an old version of Mediawiki as a foreign image repo.\n{{Related|Exif-gpslatitude}}",
-       "exif-gpslatitude-s": "Very rarely used. Only used when using an old version of Mediawiki as a foreign image repo.\n{{Related|Exif-gpslatitude}}",
-       "exif-gpslongitude-e": "Very rarely used. Only used when using an old version of Mediawiki as a foreign image repo.\n{{Related|Exif-gpslatitude}}",
-       "exif-gpslongitude-w": "Very rarely used. Only used when using an old version of Mediawiki as a foreign image repo.\n{{Related|Exif-gpslatitude}}",
+       "exif-subjectdistancerange-1": "{{exif-qqq}}\n\nMacro view is close-up photography. See [[w:Macro photography|Wikipedia]].\n\n{{Identical|Macro}}\n{{Related|Exif-subjectdistancerange}}",
+       "exif-subjectdistancerange-2": "{{exif-qqq}}\n{{Related|Exif-subjectdistancerange}}",
+       "exif-subjectdistancerange-3": "{{exif-qqq}}\n{{Related|Exif-subjectdistancerange}}",
+       "exif-gpslatitude-n": "{{exif-qqq}}\n\nVery rarely used. Only used when using an old version of Mediawiki as a foreign image repo.\n\n{{Related|Exif-gpslatitude}}",
+       "exif-gpslatitude-s": "{{exif-qqq}}\n\nVery rarely used. Only used when using an old version of Mediawiki as a foreign image repo.\n\n{{Related|Exif-gpslatitude}}",
+       "exif-gpslongitude-e": "{{exif-qqq}}\n\nVery rarely used. Only used when using an old version of Mediawiki as a foreign image repo.\n\n{{Related|Exif-gpslatitude}}",
+       "exif-gpslongitude-w": "{{exif-qqq}}\n\nVery rarely used. Only used when using an old version of Mediawiki as a foreign image repo.\n\n{{Related|Exif-gpslatitude}}",
        "exif-gpsaltitude-above-sealevel": "Used as GPS Altitude in Exif data. Parameters:\n* $1 - altitude above sea level (in meters)\nSee also:\n* {{msg-mw|Exif-gpsaltitude-below-sealevel}}",
        "exif-gpsaltitude-below-sealevel": "Used as GPS Altitude in Exif data. Parameters:\n* $1 - altitude below sea level (in meters)\nSee also:\n* {{msg-mw|Exif-gpsaltitude-above-sealevel}}",
-       "exif-gpsstatus-a": "See also:\n* {{msg-mw|Exif-gpsstatus}}\n* {{msg-mw|Exif-gpsstatus-v}}",
-       "exif-gpsstatus-v": "See also:\n* {{msg-mw|Exif-gpsstatus}}\n* {{msg-mw|Exif-gpsstatus-a}}",
-       "exif-gpsmeasuremode-2": "Only latitude and longitude recorded, no altitude.\n\nSee also:\n* {{msg-mw|Exif-gpsmeasuremode}}\n* {{msg-mw|Exif-gpsmeasuremode-3}}",
-       "exif-gpsmeasuremode-3": "Latitude, longitude, and altitude recorded.\n\nSee also:\n* {{msg-mw|Exif-gpsmeasuremode}}\n* {{msg-mw|Exif-gpsmeasuremode-2}}",
-       "exif-gpsspeed-k": "{{Related|Exif-gpsspeed}}",
-       "exif-gpsspeed-m": "{{Related|Exif-gpsspeed}}",
-       "exif-gpsspeed-n": "Knots: ''Knot'' is a unit of speed on water used for ships, etc., equal to one nautical mile per hour.\n{{Related|Exif-gpsspeed}}",
-       "exif-gpsdestdistance-k": "{{Related|Exif-gpsdestdistance}}",
-       "exif-gpsdestdistance-m": "{{Related|Exif-gpsdestdistance}}",
-       "exif-gpsdestdistance-n": "{{Related|Exif-gpsdestdistance}}",
+       "exif-gpsstatus-a": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpsstatus}}\n* {{msg-mw|Exif-gpsstatus-v}}",
+       "exif-gpsstatus-v": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpsstatus}}\n* {{msg-mw|Exif-gpsstatus-a}}",
+       "exif-gpsmeasuremode-2": "{{exif-qqq}}\n\nOnly latitude and longitude recorded, no altitude.\n\nSee also:\n* {{msg-mw|Exif-gpsmeasuremode}}\n* {{msg-mw|Exif-gpsmeasuremode-3}}",
+       "exif-gpsmeasuremode-3": "{{exif-qqq}}\n\nLatitude, longitude, and altitude recorded.\n\nSee also:\n* {{msg-mw|Exif-gpsmeasuremode}}\n* {{msg-mw|Exif-gpsmeasuremode-2}}",
+       "exif-gpsspeed-k": "{{exif-qqq}}\n{{Related|Exif-gpsspeed}}",
+       "exif-gpsspeed-m": "{{exif-qqq}}\n{{Related|Exif-gpsspeed}}",
+       "exif-gpsspeed-n": "{{exif-qqq}}\n\n''Knot'' is a unit of speed on water used for ships, etc., equal to one nautical mile per hour.\n\n{{Related|Exif-gpsspeed}}",
+       "exif-gpsdestdistance-k": "{{exif-qqq}}\n{{Related|Exif-gpsdestdistance}}",
+       "exif-gpsdestdistance-m": "{{exif-qqq}}\n{{Related|Exif-gpsdestdistance}}",
+       "exif-gpsdestdistance-n": "{{exif-qqq}}\n{{Related|Exif-gpsdestdistance}}",
        "exif-gpsdop-excellent": "Parameters:\n* $1 - the actual HDOP/PDOP value (less than or equal to 2 for excellent). See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)\n{{Related|Exif-gpsdop}}",
        "exif-gpsdop-good": "Parameters:\n* $1 - the actual HDOP/PDOP value (2-5 for good). See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)\n{{Related|Exif-gpsdop}}",
        "exif-gpsdop-moderate": "Parameters:\n* $1 - the actual HDOP/PDOP value (5-10 for moderate). See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)\n{{Related|Exif-gpsdop}}\n{{Identical|Moderate}}",
-       "exif-gpsdop-fair": "Parameters:\n* $1 - the actual HDOP/PDOP value (10-20 for fair). See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)\n{{Related|Exif-gpsdop}}",
+       "exif-gpsdop-fair": "{{exif-qqq}}\n\nParameters:\n* $1 - the actual HDOP/PDOP value (10-20 for fair). See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)\n\n{{Related|Exif-gpsdop}}",
        "exif-gpsdop-poor": "Parameters:\n* $1 - the actual HDOP/PDOP value (greater than 20 for poor). See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)\n{{Related|Exif-gpsdop}}",
        "exif-objectcycle-a": "Morning only (a is for AM).\n\nSee also:\n* {{msg-mw|Exif-objectcycle}}\n* {{msg-mw|Exif-objectcycle-p}}\n* {{msg-mw|Exif-objectcycle-b}}",
-       "exif-objectcycle-p": "Evening only (p is for PM).\n\nSee also:\n* {{msg-mw|Exif-objectcycle}}\n* {{msg-mw|Exif-objectcycle-a}}\n* {{msg-mw|Exif-objectcycle-b}}",
+       "exif-objectcycle-p": "{{exif-qqq}}\n\nEvening only (p is for PM).\n\nSee also:\n* {{msg-mw|Exif-objectcycle}}\n* {{msg-mw|Exif-objectcycle-a}}\n* {{msg-mw|Exif-objectcycle-b}}",
        "exif-objectcycle-b": "Both morning and evening (b is for both).\n\nSee also:\n* {{msg-mw|Exif-objectcycle}}\n* {{msg-mw|Exif-objectcycle-a}}\n* {{msg-mw|Exif-objectcycle-p}}",
-       "exif-gpsdirection-t": "See also:\n* {{msg-mw|Exif-gpsdirection-m}}",
-       "exif-gpsdirection-m": "See also:\n* {{msg-mw|Exif-gpsdirection-t}}",
-       "exif-ycbcrpositioning-1": "If the Chrominance samples are centered with respect to the Luminance samples.\n{{Related|Exif-ycbcrpositioning}}",
+       "exif-gpsdirection-t": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpsdirection-m}}",
+       "exif-gpsdirection-m": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpsdirection-t}}",
+       "exif-ycbcrpositioning-1": "{{exif-qqq}}\n\nThis tag indicates that the Chrominance samples are centered with respect to the Luminance samples.\n\n{{Related|Exif-ycbcrpositioning}}",
        "exif-ycbcrpositioning-2": "If the Chrominance samples are on top of to the Luminance samples.\nSee: http://www.awaresystems.be/imaging/tiff/tifftags/ycbcrpositioning.html\n{{Related|Exif-ycbcrpositioning}}",
        "exif-dc-contributor": "People who helped make the resource, but are secondary in contribution to the author.\n{{Identical|Contributor}}",
        "exif-dc-coverage": "\"The extent or scope of the resource\" see dc:coverage in http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart2.pdf",
        "exif-iimcategory-evn": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}",
        "exif-iimcategory-hth": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}",
        "exif-iimcategory-hum": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}",
-       "exif-iimcategory-lab": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}\n\n\"Labor\" here refers to all news on labor issues; employment; unemployment; work relations; labor disputes; strikes; legislation; unions; job related issues; government policy. (at least, according to Reuters.)",
+       "exif-iimcategory-lab": "{{exif-qqq}}\n\nDisplayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}\n\n\"Labor\" here refers to all news on labor issues; employment; unemployment; work relations; labor disputes; strikes; legislation; unions; job related issues; government policy. (at least, according to Reuters.)",
        "exif-iimcategory-lif": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}",
        "exif-iimcategory-pol": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}",
        "exif-iimcategory-rel": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}",
        "exif-iimcategory-spo": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}.\n{{Identical|Sport}}",
        "exif-iimcategory-war": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}",
        "exif-iimcategory-wea": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}",
-       "exif-urgency-normal": "Parameters:\n* $1 - numeric priority (aka 5 for normal)\n{{Related|Exif-urgency}}",
-       "exif-urgency-low": "Parameters:\n* $1 - numeric priority (6-8 for low)\n{{Related|Exif-urgency}}",
+       "exif-urgency-normal": "{{exif-qqq}}\n\nParameters:\n* $1 - numeric priority (aka 5 for normal)\n\n{{Related|Exif-urgency}}",
+       "exif-urgency-low": "{{exif-qqq}}\n\nParameters:\n* $1 - numeric priority (6-8 for low)\n\n{{Related|Exif-urgency}}",
        "exif-urgency-high": "Parameters:\n* $1 - numeric priority (1-4 for high)\n{{Related|Exif-urgency}}",
        "exif-urgency-other": "Parameters:\n* $1 - numeric priority. Most specs define 0 and 9 to either be reserved or not allowed. However the exiftool documentation defines 0 to be reserved and 9 to be user-defined priority.\n{{Related|Exif-urgency}}",
        "namespacesall": "In special page [[Special:WhatLinksHere]]. Drop-down box option for namespace.\n\n{{Identical|All}}",
        "confirmemail_body_set": "This is used in a confirmation email sent when a contact email address is set.\n\nSee also [[MediaWiki:Confirmemail body changed]].\n\nParameters:\n* $1 - the IP address of the user that set the email address\n* $2 - the name of the user\n* $3 - a URL to [[Special:ConfirmEmail]]\n* $4 - a time and date (duplicated by $6 and $7)\n* $5 - a URL to [[Special:InvalidateEmail]]\n* $6 - (Optional) a date\n* $7 - (Optional) a time\n{{Related|Confirmemail body}}",
        "confirmemail_invalidated": "This is the text of the special page [[Special:InvalidateEmail|InvalidateEmail]] (with the title in {{msg-mw|Invalidateemail}}) where user goes if he chooses the cancel e-mail confirmation link from the confirmation e-mail.",
        "invalidateemail": "This is the '''name of the special page''' where user goes if he chooses the cancel e-mail confirmation link from the confirmation e-mail.",
-       "notificationemail_subject_changed": "Subject of the email sent on the previously registered email address notifying them about the change in the registered email address.",
-       "notificationemail_subject_removed": "Subject of the email sent on the previously registered email address notifying them about the removal of the registered email address.",
+       "notificationemail_subject_changed": "Subject of the email sent to the previously registered email address notifying them about the change in the registered email address.",
+       "notificationemail_subject_removed": "Subject of the email sent to the previously registered email address notifying them about the removal of the registered email address.",
        "notificationemail_body_changed": "Body of the email sent on the previously registered email address notifying them about the change in the registered email address.",
        "notificationemail_body_removed": "Body of the email sent on the previously registered email address notifying them about the removal of the registered email address.",
        "scarytranscludedisabled": "Shown when scary transclusion is disabled.",
        "mw-widgets-dateinput-placeholder-month": "Placeholder displayed in a date input field when it's empty, representing a date format with 4 digits for year and 2 digits for month, separated with hyphens (without a day). This should be uppercase, if possible, and must not include any additional explanations. If there is no good way to translate it, make this message blank.",
        "mw-widgets-titleinput-description-new-page": "Description label for a new page in the title input widget.",
        "mw-widgets-titleinput-description-redirect": "Description label for a redirect in the title input widget.",
-       "api-error-blacklisted": "Used as error message.\n\nFollowed by the link {{msg-mw|Mwe-upwiz-feedback-blacklist-info-prompt}}.",
        "sessionmanager-tie": "Used as an error message when multiple session sources are tied in priority.\n\nParameters:\n* $1 - List of dession type descriptions, from messages like {{msg-mw|sessionprovider-mediawiki-session-cookiesessionprovider}}.",
        "sessionprovider-generic": "Used to create a generic session type description when one isn't provided via the proper message. Should be phrased to make sense when added to a message such as {{msg-mw|cannotloginnow-text}}.\n\nParameters:\n* $1 - PHP classname.",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "Description of the sessions provided by the CookieSessionProvider class, which use HTTP cookies. Should be phrased to make sense when added to a message such as {{msg-mw|cannotloginnow-text}}.",
        "linkaccounts-submit": "Text of the main submit button on [[Special:LinkAccounts]] (when there is one)",
        "unlinkaccounts": "Title of the special page [[Special:UnlinkAccounts]] which allows the user to remove linked remote accounts.",
        "unlinkaccounts-success": "Account unlinking form success message",
-       "authenticationdatachange-ignored": "Shown when authentication data change was unsuccessful due to configuration problems."
+       "authenticationdatachange-ignored": "Shown when authentication data change was unsuccessful due to configuration problems.\n\nCf. e.g. {{msg-mw|Passwordreset-ignored}}."
 }
index 2256026..6de7ea2 100644 (file)
        "blocklogentry": "[[$1]]-ta chay pachakaman wichkarka: $2 $3",
        "unblocklogentry": "$1 rurakpa wichkayta kishpichirka",
        "block-log-flags-nocreate": "Mushuk rurak shutipa kamayta wichkashkami",
-       "movearticle": "Kay pankama mushuk shutita karapana:",
        "newtitle": "Kay mushuk shutiman",
        "move-watch": "Kay ishkay pankakunata rikukuna",
        "movepagebtn": "Kay pankaman mushuk shutita karapana:",
index 3f092a0..a611838 100644 (file)
@@ -92,7 +92,8 @@
                        "Lemondoge",
                        "SamGold",
                        "Jdforrester",
-                       "Jack who built the house"
+                       "Jack who built the house",
+                       "Cat1987"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "category-empty": "''Эта категория в данный момент пуста.''",
        "hidden-categories": "{{PLURAL:$1|1=Скрытая категория|Скрытые категории}}",
        "hidden-category-category": "Скрытые категории",
-       "category-subcat-count": "{{PLURAL:$2|1=ЭÑ\82а ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ñ\81одеÑ\80жиÑ\82 Ñ\82олÑ\8cко Ñ\81ледÑ\83Ñ\8eÑ\89Ñ\83Ñ\8e Ð¿Ð¾Ð´ÐºÐ°Ñ\82егоÑ\80иÑ\8e.|Ð\92 Ñ\8dÑ\82ой ÐºÐ°Ñ\82егоÑ\80ии Ð¾Ñ\82обÑ\80ажаеÑ\82Ñ\81Ñ\8f $1 {{PLURAL:$1|подкаÑ\82егоÑ\80иÑ\8f|подкаÑ\82егоÑ\80ий|подкаÑ\82егоÑ\80ии}} из имеющихся $2.}}",
+       "category-subcat-count": "{{PLURAL:$2|1=ЭÑ\82а ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ñ\81одеÑ\80жиÑ\82 Ñ\82олÑ\8cко Ñ\81ледÑ\83Ñ\8eÑ\89Ñ\83Ñ\8e Ð¿Ð¾Ð´ÐºÐ°Ñ\82егоÑ\80иÑ\8e.|Ð\92 Ñ\8dÑ\82ой ÐºÐ°Ñ\82егоÑ\80ии Ð¾Ñ\82обÑ\80ажаеÑ\82Ñ\81Ñ\8f $1 {{PLURAL:$1|подкаÑ\82егоÑ\80иÑ\8f|подкаÑ\82егоÑ\80ии|подкаÑ\82егоÑ\80ий}} из имеющихся $2.}}",
        "category-subcat-count-limited": "В этой категории {{PLURAL:$1|$1 подкатегория|$1 подкатегории|$1 подкатегорий}}.",
        "category-article-count": "{{PLURAL:$2|1=Эта категория содержит единственную страницу.|{{PLURAL:$1|Показана $1 страница|Показаны $1 страницы|Показано $1 страниц}} из $2, {{PLURAL:$2|находящейся|находящихся}} в данной категории.}}",
        "category-article-count-limited": "В этой категории {{PLURAL:$1|$1 страница|$1 страницы|$1 страниц|1=только одна страница}}.",
        "poolcounter-usage-error": "Ошибка использования: $1",
        "aboutsite": "Описание {{grammar:genitive|{{SITENAME}}}}",
        "aboutpage": "Project:Описание",
-       "copyright": "СодеÑ\80жимое доступно по лицензии $1 (если не указано иное).",
+       "copyright": "СодеÑ\80жание доступно по лицензии $1 (если не указано иное).",
        "copyrightpage": "{{ns:project}}:Авторские права",
        "currentevents": "Текущие события",
        "currentevents-url": "Project:Текущие события",
        "perfcached": "Следующие данные взяты из кэша и могут не учитывать последних изменений. В кэше хранится не более $1 {{PLURAL:$1|записи|записей}}.",
        "perfcachedts": "Следующие данные взяты из кэша, последний раз он обновлялся в $1. В кэше хранится не более $4 {{PLURAL:$4|записи|записей}}.",
        "querypage-no-updates": "Обновление этой страницы сейчас отключено.\nПредставленные здесь данные не будут обновляться.",
-       "viewsource": "Просмотр",
+       "viewsource": "Просмотр вики-текста",
        "viewsource-title": "Просмотр исходного текста страницы $1",
        "actionthrottled": "Ограничение по скорости",
        "actionthrottledtext": "Для борьбы со спамом было установлено ограничение на максимальное число попыток выполнения этого действия в короткий промежуток времени — и вы исчерпали этот лимит. Пожалуйста, повторите попытку через несколько минут.",
        "yourdomainname": "Ваш домен:",
        "password-change-forbidden": "Вы не можете изменить пароль в этой вики.",
        "externaldberror": "Произошла ошибка при аутентификации с помощью внешней базы данных или у вас недостаточно прав для внесения изменений в свою внешнюю учётную запись.",
-       "login": "Ð\9fÑ\80едÑ\81Ñ\82авиÑ\82Ñ\8cÑ\81Ñ\8f Ñ\81иÑ\81Ñ\82еме",
+       "login": "Ð\92ойÑ\82и",
        "login-security": "Подтвердите свою личность",
        "nav-login-createaccount": "Представиться / зарегистрироваться",
        "userlogin": "Представиться или зарегистрироваться",
-       "userloginnocreate": "Ð\9fÑ\80едÑ\81Ñ\82авиÑ\82Ñ\8cÑ\81Ñ\8f",
+       "userloginnocreate": "Ð\92ойÑ\82и",
        "logout": "Завершение сеанса",
        "userlogout": "Завершение сеанса",
        "notloggedin": "Вы не представились системе",
        "passwordreset": "Сброс пароля",
        "passwordreset-text-one": "Заполните эту форму, чтобы сбросить свой пароль.",
        "passwordreset-text-many": "{{PLURAL:$1|Заполните одно из полей для получения временного пароля по электронной почте.}}",
-       "passwordreset-disabled": "СбÑ\80оÑ\81Ñ\8b Ð¿Ð°Ñ\80олÑ\8f Ð¾Ñ\82клÑ\8eÑ\87енÑ\8b Ð½Ð° Ñ\8dÑ\82ой Ð²Ð¸ÐºÐ¸.",
+       "passwordreset-disabled": "СбÑ\80оÑ\81Ñ\8b Ð¿Ð°Ñ\80олÑ\8f Ð² Ñ\8dÑ\82ой Ð²Ð¸ÐºÐ¸ Ð¾Ñ\82клÑ\8eÑ\87енÑ\8b.",
        "passwordreset-emaildisabled": "Функции электронной почты отключены в этой вики.",
        "passwordreset-username": "Имя участника:",
        "passwordreset-domain": "Домен:",
        "passwordreset-emailsent-capture": "Отправлено электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже.",
        "passwordreset-emailerror-capture": "Было создано электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже, однако его не удалось отправить {{GENDER:$2|участнику|участнице}} по следующей причине: $1",
        "passwordreset-emailsent-capture2": "{{PLURAL:$1|Письмо|Письма}} для сброса пароля {{PLURAL:$1|было отправлено|были отправлены}}. {{PLURAL:$1|Логин и пароль показаны|Список логинов и паролей показан}} ниже.",
+       "passwordreset-emailerror-capture2": "Отправка {{GENDER:$2|участнику}} письма по электронной почте не удалась: $1 В {{PLURAL:$3|логин и пароль показаны|список логинов и паролей показан}} ниже.",
        "passwordreset-invalideamil": "Недопустимый адрес электронной почты",
+       "passwordreset-nodata": "Ни имя участника, ни адрес электронной почты не были предоставлены",
        "changeemail": "Изменить или удалить адрес электронной почты",
        "changeemail-header": "Заполните эту форму, чтобы изменить свой адрес электронной почты. Если вы хотите отвязать свой адрес электронной почты от учётной записи, то при заполнении формы оставьте пустым поле нового адреса электронной почты.",
        "changeemail-passwordrequired": "Чтобы подтвердить это изменение, вам нужно будет ввести свой пароль.",
        "summary": "Описание изменений:",
        "subject": "Тема/заголовок:",
        "minoredit": "Малое изменение",
-       "watchthis": "Ð\92клÑ\8eÑ\87иÑ\82Ñ\8c Ñ\8dÑ\82Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ð² Ñ\81пиÑ\81ок Ð½Ð°Ð±Ð»Ñ\8eдениÑ\8f",
+       "watchthis": "СледиÑ\82Ñ\8c Ð·Ð° Ñ\8dÑ\82ой Ñ\81Ñ\82Ñ\80аниÑ\86ей",
        "savearticle": "Записать страницу",
+       "savechanges": "Сохранить изменения",
        "publishpage": "издавать страницу",
+       "publishchanges": "Опубликовать изменения",
        "preview": "Предпросмотр",
        "showpreview": "Предварительный просмотр",
        "showdiff": "Внесённые изменения",
        "nosuchsectiontitle": "Невозможно найти раздел",
        "nosuchsectiontext": "Вы пытаетесь редактировать несуществующий раздел.\nВозможно, он был перемещён или удалён, пока вы просматривали эту страницу.",
        "loginreqtitle": "Требуется авторизация",
-       "loginreqlink": "пÑ\80едÑ\81Ñ\82авиÑ\82Ñ\8cÑ\81Ñ\8f",
+       "loginreqlink": "войÑ\82и",
        "loginreqpagetext": "Вы должны $1, чтобы просмотреть другие страницы.",
        "accmailtitle": "Пароль выслан",
        "accmailtext": "Сгенерированный случайным образом пароль для [[User talk:$1|$1]] выслан на адрес $2.\n\nПосле авторизации можно будет сменить пароль для этой учётной записи на ''[[Special:ChangePassword|специальной странице смены пароля]]''.",
        "content-model-css": "CSS",
        "content-json-empty-object": "Пустой объект",
        "content-json-empty-array": "Пустой массив",
+       "deprecated-self-close-category": "Страницы, использующие недопустимые самозакрывающеся HTML-теги",
+       "deprecated-self-close-category-desc": "Страница содержит недопустимые самозакрывающиеся HTML-теги, такие как <code>&lt;b/></code> или <code>&lt;span/></code>. Правила поведения относительно них скоро изменятся, чтобы соответствовать спецификации HTML5, так что использование этих устаревших тегов в тексте нежелательно.",
        "duplicate-args-warning": "<strong>Внимание:</strong> [[:$1]] вызывает [[:$2]] с более чем одним значением параметра «$3». Будет использовано только последнее указанное значение.",
        "duplicate-args-category": "Страницы, использующие повторяющиеся аргументы в вызовах шаблонов",
        "duplicate-args-category-desc": "Страницы, содержащие вызовы шаблонов, использующие повторяющиеся аргументы, такие как <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> или <code><nowiki>{{foo|bar|1=bar}}</nowiki></code>.",
        "searchall": "все",
        "showingresults": "Ниже {{PLURAL:$1|1=показан <strong>1</strong> результат|показан  <strong>$1</strong> результат|показано <strong>$1</strong> результата|показаны <strong>$1</strong> результатов}}, начиная с № <strong>$2</strong>.",
        "showingresultsinrange": "Ниже показано до {{PLURAL:$1|<strong>1</strong> результата|<strong>$1</strong> результата|<strong>$1</strong> результатов}} в диапазоне от <strong>$2</strong> до <strong>$3</strong>.",
-       "search-showingresults": "{{PLURAL:$4|Результат <strong>$1</strong> из <strong>$3</strong>|Результаты <strong>$1 — $2</strong> из <strong>$3</strong>}}",
+       "search-showingresults": "{{PLURAL:$4|1=Результат <strong>$1</strong> из <strong>$3</strong>|Результаты <strong>$1—$2</strong> из <strong>$3</strong>}}",
        "search-nonefound": "Соответствий запросу не найдено.",
        "search-nonefound-thiswiki": "Нет результатов, соответствующих запросу на этом сайте.",
        "powersearch-legend": "Расширенный поиск",
        "userrights-groupsmember-auto": "Неявно состоит в группах:",
        "userrights-groups-help": "Вы можете изменить группы, в которые входит этот участник.\n* Если около названия группы стоит отметка, значит участник входит в эту группу.\n* Если отметка не стоит — участник не относится к соответствующей группе.\n* Знак * отмечает, что вы не сможете удалить участника из группы, если добавите его в неё, или наоборот.",
        "userrights-reason": "Причина:",
-       "userrights-no-interwiki": "У Ð²Ð°Ñ\81 Ð½ÐµÑ\82 Ñ\80азÑ\80еÑ\88ениÑ\8f Ð¸Ð·Ð¼ÐµÐ½Ñ\8fÑ\82Ñ\8c Ð¿Ñ\80ава Ñ\83Ñ\87аÑ\81Ñ\82ников Ð½Ð° других вики.",
+       "userrights-no-interwiki": "У Ð²Ð°Ñ\81 Ð½ÐµÑ\82 Ñ\80азÑ\80еÑ\88ениÑ\8f Ð¸Ð·Ð¼ÐµÐ½Ñ\8fÑ\82Ñ\8c Ð¿Ñ\80ава Ñ\83Ñ\87аÑ\81Ñ\82ников Ð² других вики.",
        "userrights-nodatabase": "База данных $1 не существует или расположена не локально.",
        "userrights-nologin": "Вы должны [[Special:UserLogin|представиться системе]] с учётной записи администратора, чтобы присваивать права участникам.",
        "userrights-notallowed": "У вас нет разрешения добавлять и удалять права участников.",
        "right-protect": "изменение уровня защиты страниц и правка каскадно защищённых страниц",
        "right-editprotected": "правка страниц, защищённых как «{{int:protect-level-sysop}}»",
        "right-editsemiprotected": "правка страниц, защищённых как «{{int:protect-level-autoconfirmed}}»",
-       "right-editcontentmodel": "Редактирование контентной модели страницы",
+       "right-editcontentmodel": "редактирование контентной модели страницы",
        "right-editinterface": "изменение пользовательского интерфейса",
        "right-editusercssjs": "правка CSS- и JS-файлов других участников",
        "right-editusercss": "правка CSS-файлов других участников",
        "right-override-export-depth": "экспортирование страниц, включая связанные страницы с глубиной до 5",
        "right-sendemail": "отправка электронной почты другим участникам",
        "right-passwordreset": "просмотр электронных писем с изменением пароля",
-       "right-managechangetags": "Создание и (де)активация [[Special:Tags|меток]]",
+       "right-managechangetags": "создание и (де)активация [[Special:Tags|меток]]",
        "right-applychangetags": "применение [[Special:Tags|меток]] вместе со своими правками",
        "right-changetags": "добавление и удаление произвольных [[Special:Tags|меток]] на отдельных правках и записях в журнале",
-       "right-deletechangetags": "Удаление [[Special:Tags|меток]] из базы данных",
+       "right-deletechangetags": "удаление [[Special:Tags|меток]] из базы данных",
        "grant-generic": "Набор прав «$1»",
        "grant-group-page-interaction": "Взаимодействие со страницами",
        "grant-group-file-interaction": "Взаимодействие с медиафайлами",
        "rightslogtext": "Это журнал изменений прав участника.",
        "action-read": "чтение этой страницы",
        "action-edit": "редактирование этой страницы",
-       "action-createpage": "Ñ\81оздание Ñ\81Ñ\82Ñ\80аниÑ\86",
-       "action-createtalk": "Ñ\81оздание Ñ\81Ñ\82Ñ\80аниÑ\86 Ð¾Ð±Ñ\81Ñ\83ждений",
+       "action-createpage": "Ñ\81оздание Ñ\8dÑ\82ой Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b",
+       "action-createtalk": "Ñ\81оздание Ñ\8dÑ\82ой Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð¾Ð±Ñ\81Ñ\83ждениÑ\8f",
        "action-createaccount": "создание этой учётной записи",
        "action-autocreateaccount": "автоматический вход с помощью внешней учётной записи участника",
        "action-history": "просмотр истории этой страницы",
        "hide": "Скрыть",
        "show": "Показать",
        "minoreditletter": "м",
-       "newpageletter": "Ð\9d",
+       "newpageletter": "н",
        "boteditletter": "б",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|наблюдающий участник|наблюдающих участника|наблюдающих участников}}]",
        "upload-http-error": "Произошла ошибка HTTP: $1",
        "upload-copy-upload-invalid-domain": "Копирование загрузок не доступно в этом домене.",
        "upload-foreign-cant-upload": "Эта вики не настроена для загрузки файлов на запрошенный сторонний файловый репозиторий.",
+       "upload-foreign-cant-load-config": "Не удалось загрузить конфигурацию загрузки файлов на внешнее хранилище файлов.",
+       "upload-dialog-disabled": "На этом вики-сайте отключена возможность загрузки файлов с помощью этого диалогового окна.",
        "upload-dialog-title": "Загрузить файл",
        "upload-dialog-button-cancel": "Отменить",
        "upload-dialog-button-done": "Готово",
        "trackingcategories-msg": "Отслеживающая категория",
        "trackingcategories-name": "Имя сообщения",
        "trackingcategories-desc": "Критерий включения в категорию",
+       "restricted-displaytitle-ignored": "Страницы с игнорируемыми отображаемыми названиями",
+       "restricted-displaytitle-ignored-desc": "На странице есть игнорируемый <code><nowiki>{{DISPLAYTITLE}}</nowiki></code>, поскольку он не соответствует реальному названию страницы.",
        "noindex-category-desc": "Страница не индексируются поисковыми роботами, потому что на ней имеется «волшебное слово» <code><nowiki>__NOINDEX__</nowiki></code>, и она находится в пространстве имён, где разрешён этот флаг).",
        "index-category-desc": "На странице имеется «волшебное слово» <nowiki>__INDEX__</nowiki> (и страница находится в пространстве имён, где разрешён этот флаг), поэтому она индексируются поисковыми роботами в тех случаях, когда этого обычно не происходит.",
        "post-expand-template-inclusion-category-desc": "Размер страницы станет больше <code>$wgMaxArticleSize</code> после показа всех шаблонов, поэтому некоторые из них не были показаны полностью.",
        "addedwatchtext": "Страница «[[:$1]]» вместе с её обсуждением были добавлены в ваш [[Special:Watchlist|список наблюдения]].",
        "addedwatchtext-short": "Страница «$1» была добавлена в ваш список наблюдения.",
        "removewatch": "Удалить из списка наблюдения",
-       "removedwatchtext": "Статья «[[:$1]]» и её страница обсуждения были удалены из вашего [[Special:Watchlist|списка наблюдения]].",
+       "removedwatchtext": "Страница «[[:$1]]» вместе с её обсуждением были удалены из вашего [[Special:Watchlist|списка наблюдения]].",
        "removedwatchtext-short": "Страница «$1» была удалена из вашего списка наблюдения.",
        "watch": "Следить",
        "watchthispage": "Наблюдать за этой страницей",
        "notvisiblerev": "Версия была удалена",
        "watchlist-details": "В вашем списке наблюдения $1 {{PLURAL:$1|страница|страницы|страниц}}, не считая страниц обсуждений.",
        "wlheader-enotif": "Уведомления по эл. почте включены.",
-       "wlheader-showupdated": "Страницы, изменившиеся с вашего последнего их посещения, выделены '''жирным''' шрифтом.",
+       "wlheader-showupdated": "СÑ\82Ñ\80аниÑ\86Ñ\8b, Ð¸Ð·Ð¼ÐµÐ½Ð¸Ð²Ñ\88иеÑ\81Ñ\8f Ñ\81 Ð²Ð°Ñ\88его Ð¿Ð¾Ñ\81леднего Ð¸Ñ\85 Ð¿Ð¾Ñ\81еÑ\89ениÑ\8f, Ð²Ñ\8bделенÑ\8b '''полÑ\83жиÑ\80нÑ\8bм''' Ñ\88Ñ\80иÑ\84Ñ\82ом.",
        "wlnote": "Ниже {{PLURAL:$1|показано последнее изменение|показаны <strong>$1</strong> последние изменения|показаны <strong>$1</strong> последних изменений}} за {{PLURAL:$2|последний час|последние <strong>$2</strong> часа|последние <strong>$2</strong> часов}}, по состоянию на $3 $4.",
        "wlshowlast": "Показать за последние $1 часов $2 дней",
        "watchlist-hide": "Скрыть",
        "rollbacklinkcount": "откатить $1 {{PLURAL:$1|правку|правки|правок}}",
        "rollbacklinkcount-morethan": "откатить больше, чем $1 {{PLURAL:$1|правку|правки|правок}}",
        "rollbackfailed": "Ошибка при совершении отката",
+       "rollback-missingparam": "Отсутствуют обязательные параметры по запросу.",
        "cantrollback": "Невозможно откатить изменения. Последним, кто вносил изменения, был единственный автор этой страницы.",
        "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-nouser": "Правки (имя участника скрыто) откачены к версии {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Откачены правки $1; возврат к версии $2.",
+       "rollback-success-notify": "Откачены правки $1; возврат к последней версии $2. [$3 Показать изменения]",
        "sessionfailure-title": "Ошибка сеанса",
        "sessionfailure": "Похоже, возникли проблемы с текущим сеансом работы;\nэто действие было отменено в целях предотвращения «захвата сеанса».\nПожалуйста, нажмите кнопку «Назад» и перезагрузите страницу, с которой вы пришли.",
        "changecontentmodel": "Редактирование контентной модели страницы",
        "sp-contributions-username": "IP-адрес или имя участника:",
        "sp-contributions-toponly": "Показывать только правки, являющиеся последними версиями",
        "sp-contributions-newonly": "Показывать только правки, являющиеся созданием страниц",
+       "sp-contributions-hideminor": "Скрыть малые правки",
        "sp-contributions-submit": "Найти",
        "whatlinkshere": "Ссылки сюда",
        "whatlinkshere-title": "Страницы, ссылающиеся на «$1»",
        "cant-move-category-page": "У вас нет разрешения переименовывать страницы категорий.",
        "cant-move-to-category-page": "У вас нет разрешения переименовывать страницы в страницу категории.",
        "newtitle": "Новое название:",
-       "move-watch": "Ð\92клÑ\8eÑ\87иÑ\82Ñ\8c Ñ\8dÑ\82Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ð² Ñ\81пиÑ\81ок Ð½Ð°Ð±Ð»Ñ\8eдениÑ\8f",
+       "move-watch": "Ð\94обавиÑ\82Ñ\8c Ð² Ñ\81пиÑ\81ок Ð½Ð°Ð±Ð»Ñ\8eдениÑ\8f Ð¸Ñ\81Ñ\85однÑ\83Ñ\8e Ð¸ Ñ\86елевÑ\83Ñ\8e Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b",
        "movepagebtn": "Переименовать страницу",
        "pagemovedsub": "Страница переименована",
        "movepage-moved": "'''Страница «$1» переименована в «$2»'''",
        "tooltip-ca-undelete": "Восстановить исправления страницы, сделанные до того, как она была удалена",
        "tooltip-ca-move": "Переименовать страницу",
        "tooltip-ca-watch": "Добавить эту страницу в ваш список наблюдения",
-       "tooltip-ca-unwatch": "Удалить эту страницу из вашего списка наблюдения",
+       "tooltip-ca-unwatch": "Удалить эту страницу из своего списка наблюдения",
        "tooltip-search": "Искать в {{grammar:prepositional|{{SITENAME}}}}",
        "tooltip-search-go": "Перейти к странице, имеющей в точности такое название",
        "tooltip-search-fulltext": "Найти страницы, содержащие указанный текст",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
        "mw-widgets-titleinput-description-new-page": "страница ещё не существует",
        "mw-widgets-titleinput-description-redirect": "перенаправление на $1",
-       "api-error-blacklisted": "Пожалуйста, выберите другое, более понятное название.",
        "sessionmanager-tie": "Невозможно использовать одновременно несколько типов проверки подлинности запроса: $1.",
        "sessionprovider-generic": "$1 сессий",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "сессий на основе куки",
        "log-action-filter-newusers": "Тип создания учётной записи:",
        "log-action-filter-patrol": "Тип патрулирования:",
        "log-action-filter-protect": "Тип защиты:",
-       "log-action-filter-rights": "Тип изменения прав",
-       "log-action-filter-suppress": "Тип сокрытия",
+       "log-action-filter-rights": "Тип изменения прав:",
+       "log-action-filter-suppress": "Тип сокрытия:",
        "log-action-filter-upload": "Тип загрузки:",
        "log-action-filter-all": "Все",
        "log-action-filter-block-block": "Блокировка",
        "log-action-filter-suppress-reblock": "Сокрытие пользователя через повторное блокирование",
        "log-action-filter-upload-upload": "Новая загрузка",
        "log-action-filter-upload-overwrite": "Повторно загрузить",
+       "authmanager-authn-no-primary": "Предоставленные учётные данные не могут быть проверены на подлинность.",
+       "authmanager-authn-no-local-user": "Предоставленные учётные данные не связаны ни с одним участником этой вики.",
+       "authmanager-authn-no-local-user-link": "Предоставленные учётные данные корректны, но не связаны ни с одни участником этой вики. Войдите с помощью какого-то другого способа или создайте новую учётную запись, и у вас появится возможность привязать свои предыдущие учётные данные к этой учетной записи.",
        "authmanager-authn-autocreate-failed": "Автоматическое создание локальной учётной записи не удалось: $1",
        "authmanager-create-disabled": "Создание учётных записей отключено.",
+       "authmanager-create-from-login": "Чтобы создать учётную запись, пожалуйста, заполните приведённые ниже поля.",
+       "authmanager-create-not-in-progress": "Создание учётной записи не выполняется или данные сессии были утеряны. Пожалуйста, начните снова с самого начала.",
+       "authmanager-create-no-primary": "Предоставленные учётные данные не могут быть использованы для создания учётной записи.",
+       "authmanager-link-no-primary": "Предоставленные учётные данные не могут быть использованы для связывания учётных записей.",
+       "authmanager-link-not-in-progress": "Связывание учётной записи не выполняется или данные сессии были утеряны. Пожалуйста, начните снова с самого начала.",
        "authmanager-authplugin-setpass-failed-title": "Ошибка изменения пароля",
+       "authmanager-authplugin-setpass-failed-message": "Плагин аутентификации запрещает смену пароля.",
+       "authmanager-authplugin-create-fail": "Плагин аутентификации запрещает создание учётных записей.",
+       "authmanager-authplugin-setpass-denied": "Плагин аутентификации не позволяет изменять пароли.",
        "authmanager-authplugin-setpass-bad-domain": "Неверный домен.",
+       "authmanager-autocreate-noperm": "Автоматическое создание учётных записей не разрешено.",
        "authmanager-autocreate-exception": "Автоматическое создание учётной записи временно отключено из-за предыдущих ошибок.",
        "authmanager-userdoesnotexist": "Не зарегистрировано учётной записи «$1».",
+       "authmanager-username-help": "Имя участника для проверки подлинности.",
+       "authmanager-password-help": "Пароль для проверки подлинности.",
        "authmanager-domain-help": "Домен для внешней аутентификации.",
+       "authmanager-retype-help": "Ещё раз пароль для подтверждения.",
        "authmanager-email-label": "Электронная почта",
        "authmanager-email-help": "Адрес электронной почты",
        "authmanager-realname-label": "Настоящее имя",
        "authmanager-realname-help": "Настоящее имя участника",
        "authmanager-provider-password": "Аутентификация на основе пароля",
+       "authmanager-provider-password-domain": "Проверка подлинности на основе пароля и домена",
        "authmanager-provider-temporarypassword": "Временный пароль",
+       "authprovider-confirmlink-option": "$1 ($2)",
+       "authprovider-confirmlink-request-label": "Учётные записи, которые должны быть связаны",
+       "authprovider-confirmlink-success-line": "$1: успешно связан.",
+       "authprovider-confirmlink-failed-line": "$1: $2",
+       "authprovider-confirmlink-failed": "Удалось связать не все учётные записи: $1",
+       "authprovider-confirmlink-ok-help": "Продолжать после вывода сообщений об ошибках связывания.",
        "authprovider-resetpass-skip-label": "Пропустить",
        "authprovider-resetpass-skip-help": "Пропустить сброс пароля.",
+       "authform-nosession-login": "Проверка подлинности прошла успешно, но ваш браузер не сможет «запомнить», что вы вошли.\n\n$1",
+       "authform-nosession-signup": "Учётная запись была создана, но ваш браузер не сможет «запомнить», что вы вошли.\n\n$1",
        "authform-newtoken": "Отсутствует токен. $1",
+       "authform-notoken": "Отсутствует токен",
        "authform-wrongtoken": "Неверный токен",
+       "specialpage-securitylevel-not-allowed-title": "Не разрешено",
+       "specialpage-securitylevel-not-allowed": "Извините, вам не можете использовать эту страницу, поскольку ваша личность не может быть проверена.",
+       "authpage-cannot-login": "Невозможно продолжить вход в учётную запись.",
+       "authpage-cannot-login-continue": "Невозможно продолжить вход в учётную запись. Скорее всего, время вашей сессии истекло.",
+       "authpage-cannot-create": "Невозможно продолжить создание учётной записи.",
+       "authpage-cannot-create-continue": "Невозможно продолжить создание учётной записи. Скорее всего, время вашей сессии истекло.",
+       "authpage-cannot-link": "Невозможно начать связывание учётной записи.",
+       "authpage-cannot-link-continue": "Невозможно продолжить связывание учётной записи. Скорее всего, время вашей сессии истекло.",
        "cannotauth-not-allowed-title": "Доступ запрещён",
        "cannotauth-not-allowed": "Вы не можете использовать эту страницу",
        "changecredentials": "Изменение учётных данных",
        "changecredentials-success": "Ваши учётные данные были изменены.",
        "removecredentials": "Удалить учётные данные",
        "removecredentials-submit": "Удалить учётные данные",
+       "removecredentials-invalidsubpage": "$1 является недопустимым типом учётных данных.",
        "removecredentials-success": "Ваши учётные данные были удалены.",
        "credentialsform-provider": "Тип учётных данных:",
        "credentialsform-account": "Имя учётной записи:",
+       "cannotlink-no-provider-title": "Нет связываемых учётных записей",
+       "cannotlink-no-provider": "Нет связываемых учётных записей.",
        "linkaccounts": "Связать учётные записи",
        "linkaccounts-success-text": "Учетная запись была связана.",
        "linkaccounts-submit": "Связать учётные записи",
index 8ddb3d7..643d165 100644 (file)
        "category_header": "\"$1\" категория ыстатыйалара",
        "subcategories": "Субкатегориялар",
        "category-media-header": "\"$1\" категория билэлэрэ",
-       "category-empty": "''Бу категорияҕа билигин туох да суох.''",
+       "category-empty": "<em>Бу категорияҕа билигин туох да суох.</em>",
        "hidden-categories": "{{PLURAL:$1|Кистэммит категория|Кистэммит категориялар}}",
        "hidden-category-category": "Кистэммит категориялар",
        "category-subcat-count": "{{PLURAL:$2|Бу категория манна көстүбүт субкатегориялаах.|$2 категорияттан {{PLURAL:$1|субкатегорията|$1 субкатегориялара}} көрдөрүлүннүлэр.}}",
        "about": "Бу туһунан",
        "article": "Ыстатыйа",
        "newwindow": "(атын түннүккэ арыллар)",
-       "cancel": "Ð\90лÒ\95аÑ\81",
+       "cancel": "СалÒ\95аама",
        "moredotdotdot": "Өссө...",
        "morenotlisted": "Бу тиһик толорута суох.",
        "mypage": "Сирэй",
        "searcharticle": "Көрдөр",
        "history": "Устуоруйата",
        "history_short": "Устуоруйа",
-       "updatedmarker": "Кэнники киириим кэнниттэн уларыйыылар",
+       "updatedmarker": "тиһэх киириим кэнниттэн уларыйбыт",
        "printableversion": "Бэчээттииргэ аналлаах барыл",
        "permalink": "Куруук баар сигэ",
        "print": "Бэчээттээ",
        "unprotectthispage": "Бу сирэй көмүскэлин уларыт",
        "newpage": "Саҥа сирэй",
        "talkpage": "Бу сирэйи ырыт",
-       "talkpagelinktext": "Ырытыы",
+       "talkpagelinktext": "ырытыы",
        "specialpage": "Анал сирэй",
        "personaltools": "Тус бэйэ туттар тэриллэрэ",
        "articlepage": "Ыстатыйаны көр",
        "pool-servererror": "Пул ааҕааччытын сулууспата үлэлээбэт($1).",
        "poolcounter-usage-error": "Туһаныы алҕаһа: $1",
        "aboutsite": "{{SITENAME}} туһунан",
-       "aboutpage": "Project:туһунан",
+       "aboutpage": "Project:Бу туһунан",
        "copyright": "Маны туһанары $1 лиссиэнсийэ көҥүллүүр (атын ыйыллыбытах буоллаҕына).",
-       "copyrightpage": "{{ns:project}}:баÑ\81 Ð±Ð¸Ð»Ð¸Ð¸Ñ\82Ñ\8d",
+       "copyrightpage": "{{ns:project}}:Ð\91аÑ\81 Ð±Ð¸Ð»Ð¸Ð¸",
        "currentevents": "Туох буола турара",
        "currentevents-url": "Project:Сонуннар",
        "disclaimers": "Бүк охсунуу",
        "helppage-top-gethelp": "Көмө",
        "mainpage": "Сүрүн сирэй",
        "mainpage-description": "Сүрүн сирэй",
-       "policy-url": "Project:Сиэрэ",
+       "policy-url": "Project:Сиэр-туом",
        "portal": "Түмсүү сирэ",
-       "portal-url": "Project:Ð\9aиÑ\81Ñ\82Ñ\8dÑ\8dһин Ñ\81иÑ\8dрэ",
+       "portal-url": "Project:ТүмÑ\81Ò¯Ò¯ Ñ\81ирэ",
        "privacy": "Кистээһин сиэрэ",
        "privacypage": "Project:Кистээһин сиэрэ",
        "badaccess": "Сатаан киирбэтэ",
        "versionrequired": "MediaWiki $1 -с барыла ирдэнэр",
        "versionrequiredtext": "Бу сирэйи туттарга MediaWiki $1 -с барыла наада. [[Special:Version|Барыллар тустарынан сирэйи]] көр.",
        "ok": "Сөп",
-       "retrievedfrom": "\"$1\" -н кэллэ",
-       "youhavenewmessages": "$1 ($2) кэллэ",
+       "retrievedfrom": "Төрдө — «$1»",
+       "youhavenewmessages": "$1 ($2) кэллэ.",
        "youhavenewmessagesfromusers": "Маны $1 {{PLURAL:$3|соҕотох кыттааччыттан|$3 кыттааччыттан}} туппуккун ($2).",
        "youhavenewmessagesmanyusers": "Маны $1 элбэх кыттааччыттан туппуккун ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|саҥа этии|999=саҥа этии}}",
        "confirmable-yes": "Сөп",
        "confirmable-no": "Суох",
        "thisisdeleted": "$1 көрдөрөбүн эбэтэр хостуубун дуу?",
-       "viewdeleted": "$1 көрдөрөбүн?",
+       "viewdeleted": "$1 - көрөҕүн дуо?",
        "restorelink": "{{PLURAL:$1|биир сотторуллубут көннөрүү|$1 сотторуллубут көннөрүүлэр}}",
        "feedlinks": "Маннык:",
        "feed-invalid": "Суруттарыыга анаммыт ханаал сыыһа тииптээх.",
        "nosuchaction": "Маннык дьайыы суох",
        "nosuchactiontext": "Бу URL-га баар дьайыы сыыһалаах.\nБаҕар URL суруйарга алҕаһаабытыҥ буолуо эбэтэр сыыһалаах сигэннэн тахсыбытыҥ буолуо.\n{{SITENAME}} бэйэтин сыыһата эмиэ буолуон сөп.",
        "nosuchspecialpage": "Маннык анал сирэй суох",
-       "nospecialpagetext": "Аналлаах сирэйи сыыһа көрдөөтүҥ,  [[Special:SpecialPages|манна]] аналлаах сирэйдэр испииһэктэрин булуоххун сөп.",
+       "nospecialpagetext": "<strong>Көрдөөбүт сирэйиҥ суох эбит.</strong>\n\n[[Special:SpecialPages|Аналлаах сирэйдэр испииһэктэрэ]].",
        "error": "Алҕас",
        "databaseerror": "Билии олоҕор сыыһа",
        "databaseerror-text": "Билии олоҕор алҕас таҕыста.\nБырагыраамма алҕаһа буолуон сөп.",
        "databaseerror-query": "Ыйытык: $1",
        "databaseerror-function": "Функция: $1",
        "databaseerror-error": "Алҕас: $1",
-       "transaction-duration-limit-exceeded": "\nРепликация оҥорорго улахан лаг мэһэйдээбэтин туһугар транзакция тохтотуллубута, сурутуу уһуна ($1) ($2){{PLURAL:$2|}}лимиты таһынан ааһарын быһыытынан.\nЭн  биир олорууга хас да элэмиэни уларытар буоллаххына, ол оннугар элбэх улахана суох операциялары оҥорорго холонон көрүҥ.",
-       "laggedslavemode": "Болҕой: Бу сирэй бүтэһик уларытыылара суох буолуон сөп",
+       "transaction-duration-limit-exceeded": "Репликация оҥорорго улахан лаг мэһэйдээбэтин туһугар транзакция тохтотулунна, сурутуу ($1) уһуна ($2){{PLURAL:$2|сөкүүндэ}} лимиты таһынан ааһарын быһыытынан.\nХас да элэмиэни күргүөмүнэн уларытар буоллаххына, ол оннугар биирдиилээн уларытан көр.",
+       "laggedslavemode": "<strong>Болҕой:</strong> Бу сирэй бүтэһик уларытыылара суох буолуон сөп.",
        "readonly": "Билии олоҕун уларытар бобуллубут",
        "enterlockreason": "Уларытыыны бобуу төрүөтүн уонна төһө өр бобулларын ый.",
-       "readonlytext": "Билии олоҕор билигин саҥа киллэриилэр уонна атын уларытыылар бобуллубуттар, бука былааннаммыт көрүү-истии үлэлэр буолалларыттан.\nОну боппут сүрүннээччи маннык сурук хаалларбыт: $1",
+       "readonlytext": "Билии олоҕор билигин саҥа киллэриилэр уонна атын уларытыылар бобуллубуттар, бука былааннаммыт көрүү-истии үлэлэр буолалларыттан буолуо.\n\nОну боппут дьаһабыл маннык быһаарыы сурук хаалларбыт: $1",
        "missing-article": "Көрдөөбүт тиэкиһиҥ манна көстүбэтэ: «$1» $2.\n\nМаннык үксүн сотуллубут сирэй историятыгар тиэрдэр эргэрбит сигэнииттэн тахсааччы.\n\nАтын биричиинэ дии саныыр буоллаххына бырагыраамма сыыһата буолуон сөп.\nОччоҕо [[Special:ListUsers/sysop|администраатарга]] биллэрэриҥ буоллар (URLын умнаайаҕын).",
        "missingarticle-rev": "(#-с торум: $1)",
        "missingarticle-diff": "(Уратыта: $1, $2)",
index ce87370..7b57f55 100644 (file)
@@ -97,8 +97,8 @@
        "october-gen": "O̠ḱ́ṭo̠bo̠r",
        "november-gen": "Nove̠mbo̠r",
        "december-gen": "December",
-       "jan": "Jạn",
-       "feb": "Febr",
+       "jan": "Jạnuari",
+       "feb": "Phebuari",
        "mar": "Ma̠r",
        "apr": "Epr",
        "may": "Me",
        "sep": "Seṕ",
        "oct": "Okṭ",
        "nov": "No̠v",
-       "dec": "Dis",
+       "dec": "Disembor",
        "pagecategories": "{{PLURAL:$1|Bivag|Bivagko}}",
        "category_header": "Sakam korenaḱ rokom sokom \"$1\"",
        "subcategories": "Huḍiń rokom sokomko",
        "cancel": "Badme",
        "moredotdotdot": "Aema",
        "mypage": "In̕aḱ sakam",
-       "mytalk": "Iñaḱ́ ro̠ṛ",
+       "mytalk": "Galmarao",
        "anontalk": "Nui baṅ ńutumanić beoharićaḱ galmarao sakam",
-       "navigation": "Ñamme",
+       "navigation": "Ạcurbaṛa",
        "and": "&#31;ar",
        "qbfind": "N̕am",
        "qbbrowse": "Sendra",
        "faq": "Baḍae kupuliko",
        "faqpage": "Project:FAQ",
        "actions": "Kạmi",
-       "namespaces": "Ñutum jaiga",
+       "namespaces": "Ńutum reaḱ ṭhai",
        "variants": "Etaḱko",
+       "navigation-heading": "Ạcurbaṛa minu",
        "errorpagetitle": "vul",
        "returnto": "$1 te ruar-rok' me",
        "tagline": "Oka khoć",
        "history": "Sakam reaḱ jạṛ",
        "history_short": "Jạṛ",
        "updatedmarker": "Ińaḱ mucạt hiripor khon nitaḱ halot",
-       "printableversion": "Chapai lekan version",
-       "permalink": "Terejuge joṛao",
+       "printableversion": "Chapa sodorḱ bharson",
+       "permalink": "Tirejuge joṛao",
        "print": "Chapa",
        "view": "Udukme",
-       "edit": "So̠mpado̠n",
+       "view-foreign": "$1 re ńelme",
+       "edit": "Toṅge",
        "create": "Tearme",
        "editthispage": "Noa sakam joṛaome",
        "create-this-page": "Noa sakam benao me",
        "personaltools": "Nijaḱ jontropạti",
        "articlepage": "Menaḱ sakam uduḱme",
        "talk": "Galmarao",
-       "views": "Ñel koyoḱ",
-       "toolbox": "Jontopạti baḱso",
+       "views": "Ńelogoḱ",
+       "toolbox": "Jontropạti",
        "userpage": "Laṛcaṛićaḱ sakam uduḱme",
        "projectpage": "Porjakṭ sakam uduḱme",
        "imagepage": "Rẽt sakam uduḱme",
        "otherlanguages": "Eṭagak pạrsi",
        "redirectedfrom": "$1 khon ạcur heć akana",
        "redirectpagesub": "Bań sojhe sakam",
+       "redirectto": "Ar hõ udugoḱakana:",
        "lastmodifiedat": "Noa sakam do sạjao hoena $1, $2 te",
        "viewcount": "Noa sakamdo {{PLURAL:$1 dhom $1 dhom}} udug hoena.",
        "protectedpage": "Rukhíạ sakamko",
-       "jumpto": "Calaḱme :",
+       "jumpto": "Donme :",
        "jumptonavigation": "Ñamme",
        "jumptosearch": "Sendra",
        "view-pool-error": "Ikạkańmẽ, sarvarre nitoḱ do aḍi cap menaḱa.\nẠḍi aema beoharko noa sakam ńel lạgit́ko kurumuṭueda.\nNãwate noa sakam ńel kurumuṭuy lạgit́te dayakate mit́ghạṛi tạṅgiymẽ.\n$1",
        "mainpage": "Mukhiạ Sakam",
        "mainpage-description": "Mukhiạ sakam",
        "policy-url": "Project:Ritiniti",
-       "portal": "Khũṭ boloḱ ho̠r",
-       "portal-url": "Project: Khũṭ bolokt họr",
-       "privacy": "Nijaḱ eḱtear",
+       "portal": "Gusṭi bolon hor",
+       "portal-url": "Projeṭ: Gusṭ bolon hor",
+       "privacy": "Oku eḱtear",
        "privacypage": "Project: Nijaḱ eḱteạr",
        "badaccess": "Ektiạr vul",
        "badaccess-group0": "Am do oka kạmi lạgit́em aroj akat́, ona kạmi purạo lạgit́te ạidạri do bạnuḱa.",
        "retrievedfrom": "\"$1\" khon ñam ạgui",
        "youhavenewmessages": "Amaḱ do $1 ($2) menaḱa",
        "youhavenewmessagesmulti": "Amaḱ nãwã mesagko do $1 menaḱa",
-       "editsection": "So̠mpado̠n",
-       "editold": "So̠mpado̠n",
+       "editsection": "Tońge",
+       "editold": "Toṅge",
        "viewsourceold": "Ńamoḱ jayga",
        "editlink": "Tońge",
        "viewsourcelink": "vitrireaḱ́ jo̠to̠ ńelme",
-       "editsectionhint": "Sapṛao dhara: $1",
+       "editsectionhint": "Toṅge dhara: $1",
        "toc": "Menaḱaḱko",
        "showtoc": "Uduḱme",
        "hidetoc": "uku, Danaṅ",
        "nstab-main": "Sakam",
        "nstab-user": "Laṛcaṛicaḱ sakam",
        "nstab-media": "Midiạ sakam",
-       "nstab-special": "Jạruṛ pata",
+       "nstab-special": "Osokayteaḱ sakam",
        "nstab-project": "Porject reaḱ sakam",
-       "nstab-image": "Fail",
+       "nstab-image": "Phayel",
        "nstab-mediawiki": "Mesag",
        "nstab-template": "Sajao sakam",
        "nstab-help": "Goṛo sakam",
        "nstab-category": "Juṛu ko",
+       "mainpage-nstab": "Mukhiạ sakam",
        "nosuchaction": "Noṅkanaḱ kạmi bạnuḱa",
        "nosuchactiontext": "Noa URL re goṭa akan kạmi do ạnlekate baṅkana.\nAm do paseć mit́ṭen vul joṛaoem emakada se URL oltem vul akada.\nNoa do noṅkanaḱ menkana je {{SITENAME}} sayeṭre beoharen sofṭower re mit́ṭen vul menaḱa.",
        "nosuchspecialpage": "Noṅkanaḱ asokay sakam do banuḱa",
        "welcomeuser": "Johar",
        "welcomecreation-msg": "Amaḱ ekaunṭ do̠ jhićena. Amaḱ pạsindko bodol alom hiṛińa.",
        "yourname": "Beoboharicaḱ ńutum",
+       "userlogin-yourname": "Beoharićaḱ ńutum:",
        "userlogin-yourname-ph": "Amaḱ beohar ńutum emme.",
        "yourpassword": "Uku namber",
+       "userlogin-yourpassword": "Uku nambar",
+       "userlogin-yourpassword-ph": "Amaḱ uku nambar emme",
+       "createacct-yourpassword-ph": "Uku namber emme",
        "yourpasswordagain": "Arhõ oku namber olme",
+       "createacct-yourpasswordagain": "Uku nambar sãyãḱme",
+       "createacct-yourpasswordagain-ph": "Uku nambar arhõ emme",
        "remembermypassword": "Mitṭen khon bạṛti khata reaḱ cạbi disạ dohoḱma (Jạsti $1 {{PLURAL:$1 din reaḱ din reaḱ}} lạgit)",
+       "userlogin-remembermypassword": "Bolo thirege dohokạńme",
        "yourdomainname": "Amaḱ ḍomen:",
        "externaldberror": "Hoe daṛeyaḱa jahan bahre reaḱ jacaeaḱ ḍaṭabes vul hoeakana se amaḱ bahre reaḱ ekaunṭ do nahaḱ halot aguire ạidạri bạnuḱa.",
        "login": "bolok' duar",
        "logout": "Bahre oḍoń",
        "userlogout": "Bahre oḍoń",
        "notloggedin": "Bhitri baṅ bolokana",
+       "userlogin-noaccount": "Cet́ accountge banuḱtama?",
+       "userlogin-joinproject": "Seledoḱ {{SITENAME}}",
        "nologin": "Amaḱ do cet́ wikipeḍiare ekaunṭ banuḱtama? Ado '''$1'''",
        "nologinlink": "account tear me",
        "createaccount": "Ṭhai benaome",
        "gotaccount": "Amaḱ do cet́ miṭten ekaunṭ tear menaḱtama? $1 tearmẽ.",
        "gotaccountlink": "Bhitri bolon",
        "userlogin-resetlink": "Amaḱ boloḱ talam cạbi sanamem hiṛińkeda?",
+       "userlogin-resetpassword-link": "Amaḱ uku nambarem hiṛiń akada?",
+       "userlogin-helplink2": "Bolon khạtir go̠ṛo̠",
+       "createacct-emailoptional": "Email ṭhikana (iccha lekate)",
+       "createacct-email-ph": "Amaḱ e-mail ṭhikana emme",
        "createaccountmail": "E-mail hotete",
        "createaccountreason": "Karon",
+       "createacct-submit": "Amaḱ account tearme",
+       "createacct-benefit-heading": "{{SITENAME}} am lekan hoṛ hotete tear akan.",
+       "createacct-benefit-body1": "{{PLURAL:$1|joṛao|joṛaoko}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|sakam|sakamko}}",
+       "createacct-benefit-body3": "nahaḱ {{PLURAL:$1|kamiạ|kạmiako}}",
        "badretype": "Am do okaṭaḱ oku nambarkom em keda ona do baṅ milạolena.",
        "userexists": "Laṛcaṛicaḱ ńutum em hoyena ona do beohar hoyakana.\nDayakatet́ eṭagaḱ ńutum bachaome.",
        "loginerror": "Bhitri bolok do vulgea",
        "createaccount-text": "Okoe co am lạgit́te mitṭen ekaunṭko amaḱ e-mail ṭhikạna lạgit {{SITENAME}} re ($4) ńutum \"$2\", oku nambar \"$3\".\nAm do mesagem baṅ daṛeyaḱa, judi noa ekaunṭ do vulge benaolen khan.",
        "login-throttled": "Am do mitghạri lahare por por aema dhao boloḱem kurumuṭu keda.\nArhõ kurumuṭue lahare dayakate thoṛagan tạṅgiemẽ.",
        "login-abort-generic": "Amaḱ bhitri boloḱ do baṅ hoylena - batena.",
-       "loginlanguagelabel": "katha: $1",
+       "loginlanguagelabel": "Pạrsi: $1",
+       "pt-login": "Bolok' duar",
+       "pt-login-button": "Bolon",
+       "pt-createaccount": "Ṭhai benaome",
+       "pt-userlogout": "Bahre oḍoń",
        "user-mail-no-addy": "Jahan e-mail ṭhikana bạgi kate e-mail kul kurumuṭu hoena.",
        "changepassword": "Uku nombor bodolme",
        "resetpass_header": "Ekaunṭ oku namber bodol",
        "passwordreset-email": "E-mail ṭhikạna:",
        "passwordreset-emailtitle": "{{SITENAME}} sayeṭre beoharićaḱ purạo thutiko",
        "passwordreset-emailelement": "Beoharićaḱ ńutum: \n$1\n\nMit́ ghạṛi lạgit uku nambar: \n$2",
-       "passwordreset-emailsent": "Mitṭen disạ ruaṛ e-mail do kulena.",
+       "passwordreset-emailsentemail": "Mitṭen disạ ruaṛ e-mail do kulena.",
        "passwordreset-emailsent-capture": "Mit́ṭen disạ ruaṛaḱ e-mail dokulena, oka do latarre ńeloḱ kana.",
        "passwordreset-emailerror-capture": "Disạ ruạṛ oco lạgit́te mit́ṭen e-mail tear hoelena, oka do latarre udugoḱkana, menkhan $1 beoharić ṭhen  ṭhen baṅ kul hoe akana.",
        "changeemail": "E-mail ṭhikạna do bodolme",
-       "changeemail-text": "Amaḱ e-mail ṭhikạna bodol lạgit́te noa forom purao me. Am do noa sariyaḱ lạgit́te amaḱ oku nambar em jạruṛtama.",
+       "changeemail-header": "Ekaunṭ e-mail ṭhikạna do bodolme",
        "changeemail-no-info": "Noa sakam sojhete laṛcaṛ lạgit́te am do bhitri boloḱ hoyoḱtama.",
        "changeemail-oldemail": "Nitaḱ e-mail ṭhikạna:",
        "changeemail-newemail": "Nãwã e-mail ṭhikạna:",
        "preview": "Ńel, Unuduḱ",
        "showpreview": "Unuduḱ",
        "showdiff": "Bodolko ńeloḱma",
-       "anoneditwarning": "'''Sabdhan:''' amdo begor logkatem bolowakana.\nAmaḱ IP ṭhikana do noa sakam sompadon jạṛre rekorḍoḱa.",
+       "anoneditwarning": "Husiạr: amdo nit́hõ bam boloakana.\nJudil am nonḍem toṅge lekhan amaḱ IP ṭhikana do noa sakamre ol tahẽna.",
        "anonpreviewwarning": "\"Am do bhitri bam bolo akana. Noa sakamre amaḱ kạmiko jạre IP ṭhiikạ̣nare rukhiyạ ḱa.\"",
        "missingcommenttext": "Daya kate amaḱ menaḱ katha latare olmẽ.",
        "summary-preview": "Guṭ katha unuduḱ:",
        "accmailtext": "[[User talk:$1 $1]] lạgit́te aćte benaoen uku nambar do $2 kul hoena.\nBhitri bolo kateḱ noa nãwã ekaunṭ lạgit uku nambar \"[[Special:ChangePassword Change password]]\" sakam khonem bodol daṛyakya.",
        "newarticle": "(Nãwa)",
        "newarticletext": "Am do oka mitṭen joṛaoem pańja akada, onaṭak do bạnuḱa.\nOna sakam tear lạgit́te, latar reaḱ baksore ol ehoṕmẽ (arhõ jạsti baḍae lạgit́te [$1 help page] pańjaemẽ).\nAm do judi nonḍe vulkatem heć akan khan, tobe amaḱ sendrakore '''back''' baṭon linmẽ.",
-       "noarticletext": "Nitoḱ noa sakamre do ol bạnuḱa.\n\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page]</span>.",
+       "noarticletext": "Nitoḱ noa sakamre do cet́olge bạnuḱa.\n\nAm menlekhan eṭaḱ sakamkore [[Special:Search/{{PAGENAME}}|search for this page title]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page]</span>.",
        "noarticletext-nopermission": "Noa sakamre do nitoḱ o̠l banuḱa.\n\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,\nor <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>.",
        "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" ńutuman jahãe beoharićaḱ ekaunṭ do baṅ resṭri hoeakana. Daya kate biḍạo katet́ ńelmẽ noa sakam do benoa/sompadonem menet́ kana se baṅ.",
        "userpage-userdoesnotexist-view": "Beoharićaḱ \"$1\" ekaunṭ do baṅ resṭire akana.",
        "currentrev": "Mucạt nãwã aroe",
        "currentrev-asof": "Mucạt nãwã aroy",
        "revisionasof": "Nãwã aro sakam $1 leka",
-       "revision-info": "Ńel/pańja ruạṛ $1 khon $2",
+       "revision-info": "Revision as of $1 by {{GENDER:$6|$2}}$7",
        "previousrevision": "Pạhilaḱ paṛhao ruạṛ",
        "nextrevision": "nãwate n'el ruar",
        "currentrevisionlink": "Nitoḱaḱ nãwa aroy",
        "rev-deleted-user": "(laṛcaṛić ńutum ocoḱena)",
        "rev-deleted-event": "(Log kạmi do ocog hoena)",
        "rev-deleted-user-contribs": "[Beoharićaḱ ńutum se IP ṭhikạna do ocog hoena - kạmi khon sompadon do uku hoe akana]",
-       "rev-delundel": "ńeloḱ/danaṅ",
+       "rev-delundel": "Juḍawaḱko ńel",
        "rev-showdeleted": "Uduḱme",
        "revisiondelete": "Get giḍi/nãwã aro baṅ getgiḍi",
        "revdelete-show-file-submit": "Hẽ",
        "lineno": "Sạr $1:",
        "compareselectedversions": "Noa barea nãwã bachawanaḱ talare tolonayme",
        "editundo": "ruạṛ",
-       "searchresults": "Se̠ndra fo̠l",
+       "searchresults": "Se̠ndra pho̠l",
        "searchresults-title": "\"$1\"  renaḱ Sẽndra  phol",
        "prevn": "Laha reaḱ {{PLURAL:$1|$1}}",
        "nextn": "Táyom teaḱ {{PLURAL:$1|$1}}",
        "search-interwiki-default": "$1 folko:",
        "search-interwiki-more": "(Arhõ)",
        "searchrelated": "songenko",
-       "searchall": "Sanam",
+       "searchall": "Sanamaḱ",
        "search-nonefound": "Kupuli leka roṛruạṛ bạnuḱa",
        "powersearch-togglelabel": "Sendra",
        "powersearch-toggleall": "Sanamaḱ",
        "powersearch-togglenone": "Okaṭaḱ hõ baṅ",
        "preferences": "Pạsindko",
-       "mypreferences": "Iñaḱ pạsindko",
+       "mypreferences": "Pạsindko",
        "prefs-skin": "Harta",
        "skin-preview": "Ńel, Unuduḱ",
        "datedefault": "Pạsind banuḱa",
        "email": "E-mail",
        "prefs-help-email": "E-mail ṭhikana do bạṛtitege, menkhan uku namber nãwãte benao jạruṛa, am do amaḱ uku nomborem hiṛiń keda.",
        "prefs-help-email-others": "Am são e-mail hotete jogajog dohoy lạgitte mitṭen joṛao se amaḱ katha roṛaḱ sakam bachao jońme.\nAmaḱ e-mail ṭhikạna do bań cabaḱa tinre onko do ko beohara",
-       "email-address-validity-valid": "E-mail ṭhikạna do jewetge ńamena",
-       "email-address-validity-invalid": "Amaḱ jewet e-mail ṭhkạna emmẽ",
        "userrights": "Beoharićaḱ laṛcaṛ ektiạrko",
        "userrights-lookup-user": "Beoharkoaḱ gãotako laṛcaṛ",
        "userrights-user-editname": "Beoharićaḱ ńutum emmẽ",
        "newuserlogpage": "Laṛcaṛićaḱ tear cạbi",
        "action-edit": "noa sakam joṛao",
        "nchanges": "$1 {{PLURAL:$1 bodol bodolko}}",
+       "enhancedrc-history": "Jạṛ",
        "recentchanges": "Nãwã bo̠do̠lko",
        "recentchanges-legend": "Nahaḱ bodol teaḱko",
        "recentchanges-summary": "Noa sakamre wiki reaḱ joto khon nãwã bodolko paṅjaṅjaymẽ.",
        "recentchanges-feed-description": "Noa feedre wiki reaḱ joto khon nãwã bodolko paṅjaymẽ",
        "recentchanges-label-newpage": "Noa sompadon do nãwã mint́ṭen sakame tearkeda",
-       "recentchanges-label-minor": "Noado hudiń mạchi sompadonkana",
-       "recentchanges-label-bot": "Noa sompadon do bot darate purauena",
+       "recentchanges-label-minor": "Noado hudiń mạchi toṅge",
+       "recentchanges-label-bot": "Noa toṅge do bot hotete purauena",
        "recentchanges-label-unpatrolled": "Noa sompadon do ńit́ hạbić baṅ ńel ńamakana",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (arhõ ńelme [[Asokaete:Nãwã sakamko |nãwã sakamko reaḱ lisṭi]])",
        "rcnotefrom": "$2 habić bodolak ko do latare ńeloḱkana",
        "rclistfrom": "Nãwã  bodolko uduḱme $3 $2 khon ehoṕkate",
-       "rcshowhideminor": "$1 kaṭic culuń tońge",
+       "rcshowhideminor": "$1 kaṭic culuń tońgeko",
+       "rcshowhideminor-show": "Uduḱme",
+       "rcshowhideminor-hide": "Danaṅ",
        "rcshowhidebots": " boṭko $1",
-       "rcshowhideliu": "Beoharićaḱ boloḱ $1",
+       "rcshowhidebots-show": "Uduḱme",
+       "rcshowhidebots-hide": "Danaṅ",
+       "rcshowhideliu": "Regisṭari beoharićko $1",
+       "rcshowhideliu-hide": "Danaṅ",
        "rcshowhideanons": "$1 Nũtum bańa bebohariḱ",
+       "rcshowhideanons-show": "Uduḱme",
+       "rcshowhideanons-hide": "Danaṅ",
        "rcshowhidepatr": "$1 Biḍạen sompadonko",
-       "rcshowhidemine": "$1 ińaḱ tońge",
+       "rcshowhidemine": "$1 ińaḱ tońgeko",
+       "rcshowhidemine-show": "Uduḱme",
+       "rcshowhidemine-hide": "Danaṅ",
        "rclinks": "$2 din lahare $1 bodol unuduḱme <br />$3",
        "diff": "Judạ",
        "hist": "Jạr",
        "hide": "Danaṅ",
-       "show": "Udugme",
+       "show": "Udume",
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
+       "rc-change-size-new": "$1 {{PLURAL:$1|bayiṭ|bayiṭ}} Bodol tayomte",
        "rc-enhanced-expand": "Purạote uduḱ",
        "rc-enhanced-hide": "Purạo cuku",
        "recentchangeslinked": "Sãotenaḱ bodolko",
        "recentchangeslinked-summary": "Noa do ona tạlika kana oka do nebetarge bodol hoyakan oka do asokayte hatao akan sakam khon.\n\n[[Special:Watchlist|your watchlist]] renaḱ sakamko do '''bold''' .",
        "recentchangeslinked-page": "sakạm ńutum",
        "recentchangeslinked-to": "Joṛaoaḱ sakamre ńel ocoyme emaḱ sakam bạgi katet",
-       "upload": "Fael aploḍme",
+       "upload": "Phayel aploḍme",
        "uploadbtn": "Rẽt rakabmẽ",
        "uploadlogpage": "Chạbi do uthạome",
        "filename": "Rẽt ńutum",
        "listfiles_name": "Ńutum",
        "listfiles_user": "Beoharić, Laṛcaṛic",
        "file-anchor-link": "Re̕t",
-       "filehist": "Fael renaḱ Jạṛ",
+       "filehist": "Phayel reaḱ Jạṛ",
        "filehist-help": "date re click me/somóy re click me fail reak obostha nel lagit",
        "filehist-deleteall": "Joto get giḍi",
        "filehist-deleteone": "Get giḍi",
        "filehist-user": "Laṛcaṛić",
        "filehist-dimensions": "Maṕ",
        "filehist-comment": "Roṛ",
-       "imagelinks": "Fael bebohar",
+       "imagelinks": "Phayel bebohar",
        "linkstoimage": "Latar reaḱ {{PLURAL:$1 sakam $1 sakam}} khon noa rẽtre joṛao menaḱa:",
        "nolinkstoimage": "Nonḍe do noa são joṛao sakam banuka",
        "sharedupload-desc-here": "Noa rẽt do nonḍe khon-  $1 ar paseć eṭaḱaḱ porjekṭko beoharakana.\nNoa reaḱ pasnao katha [$2 rẽt pasnao sakam] latare emena",
+       "upload-disallowed-here": "Am do noa phayel cetanre bam ol daṛẽaḱa",
        "randompage": "Joṛao sakam",
        "statistics": "Halot",
        "statistics-pages": "Sakamko",
        "pager-older-n": "{{PLURAL:$1 arhõ mare 1ṭen arhõ mare $1ṭen}}",
        "booksources": "Puthi ńamoḱ ṭhại/jayga",
        "booksources-search-legend": "Puthi reak ṭhai sendrayme",
+       "booksources-search": "Sendra",
        "log": "Cạbiko",
        "allpages": "joto sakam",
        "allarticles": "Sanam sakam",
        "emailmessage": "Mesag",
        "emailsend": "Kulmẽ",
        "watchlist": "Inak' n'el ko",
-       "mywatchlist": "Iñak jagarna tạlikạ",
+       "mywatchlist": "Ńeloḱgoḱ tạlika",
        "watchlistfor2": "$1 ($2) lạ̣gitte",
        "watch": "Ńelme",
        "unwatch": "bang nelok' a",
        "namespace": "Ńutum reaḱ ṭhai",
        "invert": "Seć bachao",
        "blanknamespace": "Mukhiạ̣",
-       "contributions": "Beharićaḱ Kạmiko",
+       "contributions": "{{GENDER:$1|Beoharićaḱ }} Kạmiko",
        "contributions-title": "$1 Beoharićaḱ kạmiko",
        "mycontris": "Ińaḱ kạmiko",
+       "anoncontribs": "Ińaḱ kạmiko",
        "contribsub2": "$1 ($2) lạgitte",
        "uctop": "(coṭ utạr)",
        "month": "Cando khon (ar etohopreaḱ)",
        "whatlinkshere-prev": "{{PLURAL:$1 Laha reaḱ Laha reaḱ$1ṭen}}",
        "whatlinkshere-next": "{{PLURAL:$1 |Laha renaḱ | Laha renaḱko $1}}",
        "whatlinkshere-links": "Joṛaoko",
-       "whatlinkshere-hideredirs": "$1 acurgeya",
-       "whatlinkshere-hidetrans": "$1 ṭarnskuleson uduḱme",
-       "whatlinkshere-hidelinks": "$1 joṛao",
+       "whatlinkshere-hideredirs": "$1 arhõ unuduḱ",
+       "whatlinkshere-hidetrans": "Selet́ $1",
+       "whatlinkshere-hidelinks": "$1 joṛaoko",
        "whatlinkshere-hideimages": "$1 Chubi joṛaoko",
        "whatlinkshere-filters": "Sapha",
        "block": "Beoharić esedem",
        "thumbnail-more": "Lạṭui mẽ",
        "thumbnail_error": "Benawakan unuduḱ kạṭuṕ do baṅ ṭhika: $1",
        "import-upload-filename": "Rẽt ńutum",
-       "tooltip-pt-userpage": "Amaḱ́ bebo̠harić sakam",
-       "tooltip-pt-mytalk": "Amaḱ katha ro̠ṛrenaḱ́ sakam",
-       "tooltip-pt-preferences": "Amaḱ pạsindko",
+       "tooltip-pt-userpage": "{{GENDER:|am beoharićaḱ}} sakam",
+       "tooltip-pt-mytalk": "{{GENDER:|Amaḱ}} ro̠ṛreaḱ́ sakam",
+       "tooltip-pt-preferences": "{{GENDER:|Amaḱ}} pạsindko",
        "tooltip-pt-watchlist": "Sakam tạlika okaṭak̕katet́ am do nãwã aroy lạgitem ńeleḱkan",
-       "tooltip-pt-mycontris": "Amaḱ kạmi reaḱ tạlika",
-       "tooltip-pt-login": "Am do log in lagit́ metao am kana; menkhan noa do jarur bań kana",
+       "tooltip-pt-mycontris": "Mit́ṭen lisṭ {{GENDER:|amaḱ}} kạmiko reaḱ",
+       "tooltip-pt-login": "Am do boloḱ lagit́te udgạoiń emamkana; Nonḍe boloḱ unạḱ jarur do bań kana",
        "tooltip-pt-logout": "O̠nḍo̠ńme",
+       "tooltip-pt-createaccount": "Am do mit́ṭen hisạb jhić katet́ boloniń metamkana, tobe joborjosti katet́ do baṅ.",
        "tooltip-ca-talk": "Galmãrao bhitri renaḱ sakam lạgit́",
-       "tooltip-ca-edit": "Noa sakam em edit daṛeaḱ. Daya kateć save laha re preview batton bebohar me.",
+       "tooltip-ca-edit": "Noa sakam joṛaome",
        "tooltip-ca-addsection": "Nãwã sekson sạrdi",
        "tooltip-ca-viewsource": "Noa sakam do poṭom gea\nOna te source em ńel daṛeaḱ",
        "tooltip-ca-history": "Noa sakam renaḱ calao parom ńel ruạṛ",
        "tooltip-n-mainpage-description": "Mukhiạ sakamre calaḱme",
        "tooltip-n-portal": "Niạ pro̠je̠ḱ́ṭreaḱ Biso̠yko, Cet́em ceka daṛia,Okare̠ sendra ñamoḱ́a",
        "tooltip-n-currentevents": "Nitaḱ events re jos hudis ńãm me",
-       "tooltip-n-recentchanges": "Uiki nãhaḱ palaṭrenaḱ́ tạlikạ",
+       "tooltip-n-recentchanges": "Uikire nãhaḱ bodolko reaḱ tạlikạ",
        "tooltip-n-randompage": "Ãr hõ sakam ko agui mẽ",
        "tooltip-n-help": "Sendra ñamreaḱ jayga",
        "tooltip-t-whatlinkshere": "Sanam wiki sakam renaḱ list ar link do nonde",
        "tooltip-t-recentchangeslinked": "Noa sakam re nitaḱ bodol akan sakam renaḱ linked",
-       "tooltip-feed-atom": "Noa sakam lạgit́ atom jomaḱ",
+       "tooltip-feed-atom": "Noa sakam lạgit́ atom phiḍ",
        "tooltip-t-contributions": "Beoharićak kami reaḱ tạ̣lika",
        "tooltip-t-emailuser": "Nui beoharić mitṭen e-mail kulayme",
-       "tooltip-t-upload": "Failko aploḍ̣me",
+       "tooltip-t-upload": "Phayelko aploḍ̣me",
        "tooltip-t-specialpages": "Jạruṛ patakureaḱ tạlikạ",
        "tooltip-t-print": "Printoḱ lekan sakam",
        "tooltip-t-permalink": "Terejuge joṛaokam ñel sakam",
        "tooltip-ca-nstab-main": "Bahal sakam ńel me",
        "tooltip-ca-nstab-user": "Beoharićaḱ sakam uduḱme",
-       "tooltip-ca-nstab-special": "Noa do nij/bises sakam kana, amem menle rehõ bam joṛao dareaḱa",
-       "tooltip-ca-nstab-project": "project page nel' me",
+       "tooltip-ca-nstab-special": "Noa do mit́ṭen bises sakam kana, ar noa do bam joṛao daṛẽaḱa",
+       "tooltip-ca-nstab-project": "projeṭ sakam ńelmẽ",
        "tooltip-ca-nstab-image": "Fael sakam ńel",
        "tooltip-ca-nstab-template": "Forom uduḱme",
        "tooltip-ca-nstab-help": "Goṛo sakam ńelmẽ",
        "tooltip-preferences-save": "Pạsindko rukhiyaymẽ",
        "tooltip-summary": "Khaṭote guṭ katha bhoraome",
        "others": "Eṭagaḱko",
+       "simpleantispam-label": "Enṭi espam ńel\nDo <strong>not</strong> noa purạome!",
        "pageinfo-header-edits": "Toṅgeko",
        "pageinfo-watchers": "Ńeńelkoaḱ nombor",
-       "previousdiff": "mareak' kamiko",
+       "pageinfo-toolboxlink": "Sakam reaḱ baḍaejońaḱko",
+       "previousdiff": "Marenaḱ toṅgeko",
        "nextdiff": "Nãwã joṛao",
        "file-info-size": "$1 x $2 pixels, file size: $3, MIME type: $4",
        "file-nohires": "Aema resulation nondḍe banuḱa",
        "svg-long-desc": "SVG rẽt, normalte $1 x $2 pixels, rẽt sayej: $3",
-       "show-big-image": "Purạo resulation",
+       "show-big-image": "Mukhiạ phayel",
+       "show-big-image-preview": "Noa ńeloḱ akar do:$1",
+       "show-big-image-other": "Eman teaḱ {{PLURAL:$2|resolution|resolutions}}: $1",
+       "show-big-image-size": "$1 X $2 Pikcel",
        "ilsubmit": "Sendra",
        "bad_image_list": "Format do latar re leka",
        "metadata": "Meṭa khobor",
        "exif-imagewidth": "Ganḍe",
        "exif-imagelength": "Usul",
        "exif-datetime": "Rẽt bodol reaḱ tạrikh ar okte",
+       "exif-make": "Kemera tearić",
+       "exif-model": "Kemera model",
+       "exif-software": "Beoharen Software",
        "exif-artist": "Onoliạ",
+       "exif-exifversion": "Exif bharson",
+       "exif-colorspace": "Roṅcoṅ dhạrti",
        "namespacesall": "sanam",
        "monthsall": "Sanamak",
        "watchlisttools-view": "Jońgṛao bodolaḱko ńel",
        "watchlisttools-edit": "Ńelok tạlika ńel ar joṛao",
        "watchlisttools-raw": "Baṇ purạo akan ńelok tạlika purạomẽ",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|galmarao]])",
        "duplicate-defaultsort": "'''Sontoroḱmẽ:''' ḍifolṭ sajao reaḱ cạbi: $2 lahare ḍifolṭ sajao reaḱ sakam: ''$1'' e bae luturaḱ kana.",
-       "specialpages": "Jạruṛ patako",
+       "specialpages": "Osokayteaḱ sakamko",
        "external_image_whitelist": "#Noa sakam do cet leka menaḱa oṅkage dohoemẽ\n#Sanam okte re jạhiren kuṭrạ latar re (khạli hạtiń //talare) bạisạomẽ\n#Noako do bahre reaḱ (hotlinked) chubi reaḱ URL saõte milạo hoyoḱa\n#Okako milạḱa, onako do chubi lekate udugoḱa, baṅkhan do khali chubi joṛao udugoḱa\n#Noa layen reaḱ ehoṕre # menaḱa ona layenko menko hisapte beohar hoyoḱka\n#Noa do kas-baṅ rimjhạoaḱge\n#Noa dag cetanre regex kuṭrạ bạsạomẽ. Noa layen cetleka menaḱa oṅkage dohoemẽ</pre>",
-       "tag-filter": "[[Special:Tags|Tag]] saphay:"
+       "tag-filter": "[[Special:Tags|Tag]] saphay:",
+       "logentry-move-move": "$1 beoharić $3 sakam do $4 ńutumre {{GENDER:$2|ạcạr}} akada",
+       "logentry-newusers-create": "Beoharićaḱ hisạb khata $1 do jhićena",
+       "logentry-upload-upload": "$1 {{GENDER:$2|rakaṕ akadae}} $3",
+       "searchsuggest-search": "Se̠ndra"
 }
index f01ac02..b85a4d5 100644 (file)
        "october-date": "$1 October",
        "november-date": "$1 November",
        "december-date": "$1 Dezember",
+       "period-am": "AM",
+       "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Categerie|Categeries}}",
        "category_header": "Pages in categerie \"$1\"",
        "subcategories": "Subcategeries",
        "morenotlisted": "This leet isna complete.",
        "mypage": "Ma page",
        "mytalk": "Ma tauk",
-       "anontalk": "Tauk fer this IP address",
+       "anontalk": "Tauk",
        "navigation": "Navigation",
        "and": "&#32;n",
        "qbfind": "Fynd",
        "pool-queuefull": "Pool line is ful",
        "pool-errorunknown": "Onknawn mistak.",
        "pool-servererror": "The puil coonter service is na available ($1).",
+       "poolcounter-usage-error": "Uisage error: $1",
        "aboutsite": "Aneat {{SITENAME}}",
        "aboutpage": "Project:Aneat",
        "copyright": "Content is available unner $1 onless itherwise noted.",
        "nstab-template": "Template",
        "nstab-help": "Help page",
        "nstab-category": "Categerie",
+       "mainpage-nstab": "Main page",
        "nosuchaction": "Nae sic action",
        "nosuchactiontext": "The action speceefieed bi the URL isna recognised\nYe micht hae mistyped the URL, or follaed ae wrang link\nThis micht forby be caused bi ae bug in the saffware uised bi {{SITENAME}}.",
        "nosuchspecialpage": "Nae sic byordinar page",
        "missingarticle-rev": "(reveesion#: $1)",
        "missingarticle-diff": "(Diff: $1, $2)",
        "readonly_lag": "The database haes been autaematiclie lockit while the sclave database servers catch up tae the maister",
+       "nonwrite-api-promise-error": "The 'Promise-Non-Write-API-Action' HTTP header wis sent but the request wis tae an API write module.",
        "internalerror": "Internal mistak",
        "internalerror_info": "Internal mistak: $1",
+       "internalerror-fatal-exception": "Fatal exception o teep \"$1\"",
        "filecopyerror": "Cuidna copie file \"$1\" til \"$2\".",
        "filerenameerror": "Cuidna rename file \"$1\" til \"$2\".",
        "filedeleteerror": "Cuidna delyte file \"$1\".",
        "virus-scanfailed": "the scan failed (code $1)",
        "virus-unknownscanner": "onken't antivirus:",
        "logouttext": "<strong>Ye'r nou loggit oot.</strong>\n\nMynd that some pages micht continue tae be displeyed aes gif ye were still loggit in, til ye clear yer brouser cache.",
+       "cannotlogoutnow-title": "Canna log oot nou",
        "welcomeuser": "Weelcome, $1!",
        "welcomecreation-msg": "Yer accoont haes been cræftit.\nYe can chynge yer {{SITENAME}} [[Special:Preferences|preeferences]] gif ye like.",
        "yourname": "Uisername:",
        "remembermypassword": "Mynd ma login oan this brouser (fer $1 {{PLURAL:$1|day|days}} at the maist)",
        "userlogin-remembermypassword": "Keep me loggit in",
        "userlogin-signwithsecure": "Uise secure connection",
+       "cannotloginnow-title": "Canna log in nou",
        "yourdomainname": "Yer domain:",
        "password-change-forbidden": "Ye canna chynge passwords oan this wiki.",
        "externaldberror": "Aither thaur wis aen external authentication database mistak, or ye'r naw permitit tae update yer external accoont.",
        "login": "Log in",
+       "login-security": "Verify yer identity",
        "nav-login-createaccount": "Log in / cræft aen accoont",
        "userlogin": "Cræft aen accoont or log in",
        "userloginnocreate": "Log in.",
        "userlogin-resetpassword-link": "Fergot yer password?",
        "userlogin-helplink2": "Heelp wi loggin in",
        "userlogin-loggedin": "Ye'r awreadie loggit in as {{GENDER:$1|$1}}.\nUise the form ablow tae log in as anither uiser.",
+       "userlogin-reauth": "Ye must log in again tae verify that ye are {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Mak anither accoont",
        "createacct-emailrequired": "Wab-mail address",
        "createacct-emailoptional": "Wab-mail address (optional)",
        "createaccountreason": "Raison:",
        "createacct-reason": "Raison",
        "createacct-reason-ph": "Why ar ye creating anither accoont",
+       "createacct-reason-help": "Message shawn in the accoont creation log",
        "createacct-submit": "Mak yer accoont",
        "createacct-another-submit": "Mak anither accoont",
+       "createacct-continue-submit": "Continue accoont creation",
+       "createacct-another-continue-submit": "Continue accoont creation",
        "createacct-benefit-heading": "{{SITENAME}} is makit bi fowk like ye.",
        "createacct-benefit-body1": "{{PLURAL:$1|eidit|eidits}}",
        "createacct-benefit-body2": "{{PLURAL:$1|page|pages}}.",
        "createacct-benefit-body3": "recent {{PLURAL:$1|contreebuter|contreebuters}}",
        "badretype": "The passwairds ye entered dinna match.",
+       "usernameinprogress": "An accoont creation for this uiser name is already in progress.\nPlease wait.",
        "userexists": "The uiser name ye entered is awreadie in uiss. Please chuise ae different name.",
        "loginerror": "Login mistak",
        "createacct-error": "Accoont cræftin mistak",
        "nocookieslogin": "{{SITENAME}} uises cookies tae log in uisers. Ye hae cookies disabled. Please enable thaim an gie it anither shot.",
        "nocookiesfornew": "The uiser accoont wisna cræftit, aes we couda confirm its soorce.\nEnsure that ye have cookies enabled, relaid this page n gie it anither shote.",
        "noname": "Ye'v na speceefie'd ae valid uisername.",
-       "loginsuccesstitle": "Login fine",
+       "loginsuccesstitle": "Logged in",
        "loginsuccess": "<strong>Ye're nou loggit in tae {{SITENAME}} aes \"$1\".</strong>",
-       "nosuchuser": "Thaur's nae sic uiser aes \"$1\".\nUiser names ar case-sensiteeve.\nCheck yer speelin, or [[Special:CreateAccount|mak ae new accoont]].",
+       "nosuchuser": "Thare is no uiser bi the name \"$1\".\nUisernames are case sensitive.\nCheck yer spellin, or [[Special:CreateAccount|create a new accoont]].",
        "nosuchusershort": "Thaur's nae sic uiser aes \"$1\". Check yer spellin.",
        "nouserspecified": "Ye hae tae merk up ae uisername.",
        "login-userblocked": "Uiser \"$1\" is blockit. Log-in naw permitit.",
        "wrongpassword": "The passwaird ye entered is wrang. Please gie it anither shot.",
        "wrongpasswordempty": "The passwaird ye entered is blank. Please gie it anither shot.",
        "passwordtooshort": "Yer password is ower short.\nIt maun hae at laest {{PLURAL:$1|1 chairacter|$1 chairacters}}.",
+       "passwordtoolong": "Passwirds canna be langer nor {{PLURAL:$1|1 character|$1 characters}}.",
        "password-name-match": "Yer passwaird maun be different fae yer uisername.",
        "password-login-forbidden": "The uise o this uisername n passwaird haes been ferbidden.",
        "mailmypassword": "Reset password",
        "createacct-another-realname-tip": "Real name is aen optie.\nGif ye chuise tae provide it, this will be uised fer giein the uiser attreebution fer their wark.",
        "pt-login": "Log in",
        "pt-login-button": "Log in",
+       "pt-login-continue-button": "Continue login",
        "pt-createaccount": "Mak accoont",
        "pt-userlogout": "Log oot",
        "php-mail-error-unknown": "Onken't mistak in PHP's mail() function.",
        "recentchangeslinked-summary": "This is ae leet o chynges makit recentlie til pages linked fae ae speceefied page (or til memmers o ae speceefied categerie).\nPages oan [[Special:Watchlist|yer watchleet]] ar <strong>baud</strong.",
        "recentchangeslinked-page": "Page name:",
        "recentchangeslinked-to": "Shaw chynges til pages linked til the gien page instead",
+       "recentchanges-page-added-to-category": "[[:$1]] addit tae category",
+       "recentchanges-page-removed-from-category": "[[:$1]] remuived frae category",
        "upload": "Uplaid file",
        "uploadbtn": "Uplaid file",
        "reuploaddesc": "Gang back til the uplaid form.",
        "querypage-disabled": "This speecial page is disablit fer performance raisons.",
        "apihelp": "API help",
        "apihelp-no-such-module": "Module \"$1\" wis no foond.",
+       "apisandbox-loading": "Laidin information for API module \"$1\"...",
+       "apisandbox-load-error": "An error occurred while laidin information for API module \"$1\": $2",
        "booksources": "Buik soorces",
        "booksources-search-legend": "Rake fer buik soorces",
        "booksources-search": "Rake",
        "logempty": "Nae matchin eetems in log.",
        "log-title-wildcard": "Rake titles stairtin wi this tex",
        "showhideselectedlogentries": "Chynge veesibeelitie o selectit log entries",
+       "log-edit-tags": "Eedit tags o selectit log entries",
        "allpages": "Aw pages",
        "nextpage": "Neis page ($1)",
        "prevpage": "Aforegaun page ($1)",
        "rollback-success": "Reverted eedits b $1;\nchynged back til the laist reveesion bi $2.",
        "sessionfailure-title": "Session failure",
        "sessionfailure": "Thaur seems tae be ae proablem wi yer login session;\nthis action haes been canceled aes ae precaution again session hijackin.\nGang back til the preeveeoos page, relaid that page n than gie it anither gae.",
+       "log-name-contentmodel": "Content model chynge log",
        "protectlogpage": "Fend log",
        "protectlogtext": "Ablow is ae leet o chynges til page protections.\nSee the [[Special:ProtectedPages|protected pages leet]] fer the leet o currently operational page protections.",
        "protectedarticle": "protectit \"[[$1]]\"",
        "patrol-log-page": "Patrow log",
        "patrol-log-header": "This is ae log o patrowed reveesions.",
        "log-show-hide-patrol": "$1 patrow log",
+       "log-show-hide-tag": "$1 tag log",
        "deletedrevision": "Delytit auld reveesion $1.",
        "filedeleteerror-short": "Mistak delytin file: $1",
        "filedeleteerror-long": "mistaks were encoontered while delytin the file:\n\n$1",
        "tags-active-no": "Naw",
        "tags-edit": "eedit",
        "tags-hitcount": "$1 {{PLURAL:$1|chynge|chynges}}",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Selectit log event|Selectit log events}}:",
+       "tags-edit-logentry-legend": "Add or remuive tags frae {{PLURAL:$1|this log entry|aw $1 log entries}}",
+       "tags-edit-logentry-submit": "Apply chynges tae {{PLURAL:$1|this log entry|$1 log entries}}",
        "comparepages": "Compare pages",
        "compare-page1": "Page 1",
        "compare-page2": "Page 2",
        "logentry-upload-upload": "$1 {{GENDER:$2|uplaidit}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|uplaidit}} ae new version o $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|uplaidit}} $3",
+       "log-name-managetags": "Tag management log",
+       "log-description-managetags": "This page leets management tasks relatit tae [[Special:Tags|tags]]. The log conteens anly actions carried oot manually bi an admeenistrator; tags mey be creatit or deletit bi the wiki saftware wioot an entry bein recordit in this log.",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|deletit}} the tag \"$4\" (remuived frae $5 {{PLURAL:$5|reveesion or log entry|reveesions an/or log entries}})",
+       "log-name-tag": "Tag log",
        "rightsnone": "(nane)",
        "revdelete-summary": "eedit the ootline",
        "feedback-adding": "Eikin feedback til page...",
        "pagelang-select-lang": "Pick yer leid",
        "right-pagelang": "Chynge page leid",
        "action-pagelang": "chynge the page leid",
-       "log-name-pagelang": "Chynge leid log",
+       "log-name-pagelang": "Leid chynge log",
        "log-description-pagelang": "This is ae log o chynges in page leids.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|chynged}} page leid fer $3 fae $4 tae $5.",
        "default-skin-not-found": "Whoops! The defaut skin fer yer wiki, defined in <code dir=\"ltr\">$wgDefaultSkin</code> aes <code>$1</code>, is no available.\n\nYer instawation seems tae incluid the follaein skins. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] fer information oan hou tae enable thaim n chuise the defaut.\n\n$2\n\n; Gif ye'v juist instawed MediaWiki:\n: Ye proabablie instawed it fae git, or directlie fae the soorce code uisin some ither method. This is expectie. Gie instawin some skins fae [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] ae shot, bi:\n:* Dounlaidin the [https://www.mediawiki.org/wiki/Download tarball installer], this comes wi several skins n extensions. Ye can than capie n paste the <code>skins/</code> directerie fae this.\n:* Dounlaidin indiveedual skin tarballs frae [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clonin one of the <code>mediawiki/skins/*</code> repositries bi wa o git intae the <code dir=\"ltr\">skins/</code> directerie o yer MediaWiki instawation.\n: Daein this shoudna interfere wi yer git repositrie gif ye'r ae MediaWiki deveeloper.\n\n; Gif ye,v juist upgradit MediaWiki:\n: MediaWiki 1.24 n newer nae langer enables instawed skins autæmateeclie (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Ye can paste the follaein lines intae <code>LocalSettings.php</code> tae enable aw nou installed skins:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Gif ye'v juist modified <code>LocalSettings.php</code>:\n: Double-check the skin names fer typos.",
        "json-error-recursion": "Yin or mair recurseeve references in the value tae be encoded",
        "json-error-inf-or-nan": "Yin or mair NAN or INF values in the value tae be encoded",
        "json-error-unsupported-type": "Ae value o ae type that canna be encoded wis gien",
-       "special-characters-group-ipa": "IPA"
+       "special-characters-group-ipa": "IPA",
+       "log-action-filter-delete-event": "Log deletion",
+       "log-action-filter-suppress-event": "Log suppression",
+       "authmanager-authn-no-local-user-link": "The supplee'd credentials are valid but are nae associatit wi ony uiser on this wiki. Login in a different way, or create a new uiser, an ye will hae an option tae airtin yer previous credentials tae that accoont.",
+       "authform-nosession-login": "The authentication wis successfu, but yer brouser canna \"remember\" bein logged in.\n\n$1",
+       "authpage-cannot-login": "Unable tae stairt login.",
+       "authpage-cannot-login-continue": "Unable tae continue login. Yer session maist likly timed oot."
 }
index 63217b1..15d45cf 100644 (file)
        "nocookiesnew": "يُوزر کاتو کلي چڪو، پر توهان لاگ اِن نہ ٿيا آهيو. يُوزرس کي لاگ اِن ڪرڻ لاءِ {{SITENAME}} ڪوڪيز استعمال ڪندي آهي. توهان ڪوڪيز کي ناڪاره بڻائي رکيو آهي. لاگ اِن ٿيڻ لاءِ ڪوڪيز کي ڪارائتو بڻايو.",
        "nocookieslogin": "يُوزرس کي لاگ اِن ڪرڻ لاءِ {{SITENAME}} ڪوڪيز استعمال ڪندي آهي. توهان ڪوڪيز کي ناڪاره بڻائي رکيو آهي. لاگ اِن ٿيڻ لاءِ ڪوڪيز کي ڪارائتو بڻايو.",
        "noname": "توهان جو ڄاڻايل يُوزرنانءُ ناقابل ڪار آهي.",
-       "loginsuccesstitle": "لاگ اِن ڪامياب",
+       "loginsuccesstitle": "لاگ اِن ٿيل",
        "loginsuccess": "'''هاڻي توهان {{SITENAME}} تي بطور \"$1\" لاگ اِن ٿيل آهيو.'''",
-       "nosuchuser": "\"$1\" نالي سان ڪو بہ يوزر نہ آهي.  \"$1\".\n ننڍن وڏن اکرن ۾ امتياز ڪرڻ لازمي آهي. \nهِجي چڪاسيو،يا [[Special:CreateAccount|نئون کاتو تخليق ڪريو]]",
+       "nosuchuser": "\"$1\" نالي سان ڪو بہ يوزر نہ آهي.\nننڍن وڏن اکرن ۾ امتياز ڪرڻ لازمي آهي. \nهِجي چڪاسيو، يا [[Special:CreateAccount|نئون کاتو تخليق ڪريو]]",
        "nosuchusershort": "\"$1\" نالي ڪو بہ يُوزر ناهي.\nهِجي جي پڪ ڪندا.",
        "nouserspecified": "توهان کي ڪو يوزرنانءُ ڄاڻائڻو پوندو.",
        "login-userblocked": "هيءُ يُوزر بندشيل آهي. لاگ اِن جي اجازت نہ ٿي ڏجي.",
        "newpassword": "نئون ڳجھو لفظ:",
        "retypenew": "نئون ڳجھو لفظ ٻيهر ٽائيپ ڪندا:",
        "resetpass_submit": "ڳجھو لفظ طَي ڪريو ۽ لاگ اِن ٿيو",
-       "changepassword-success": "توهان جو ڳجھو لفظ ڪاميابيءَ سان بدلايو ويو!",
+       "changepassword-success": "توهان جو ڳجھولفظ بدلايو ويو آھي!",
        "changepassword-throttled": "توهان تازو ئي لاگ اِن ٿيڻ جون هيڪانديون گھڻيون ڪوششون ڪيون آهن. مهرباني ڪري $1 لاءِ ترسي پوءِ وري ڪوشش ڪريو.",
        "botpasswords-label-create": "سرجيو",
        "botpasswords-label-update": "تجديد",
        "resetpass-no-info": "هيءُ صفحو پڙهڻ لاءِ لاگ اِن ٿيڻ ضروري آهي.",
        "resetpass-submit-loggedin": "ڳجھو لفظ بدلايو",
        "resetpass-submit-cancel": "رد",
-       "resetpass-wrong-oldpass": "ناقابل ڪار هاڻوڪو يا عارضي ڳجھو لفظ. \nتوهان پنهنجو ڳجھو لفظ اڳ ۾ ئي بدلائي چڪا آهيو يا نئين ڳجھي لفظ لاءِ درخواست ڏئي چڪا آهيو.",
+       "resetpass-wrong-oldpass": "ناقابل ڪار هاڻوڪو يا عارضي ڳجھولفظ. \nتوهان پنهنجو ڳجھو لفظ اڳ ۾ ئي بدلائي چڪا آهيو يا نئين ڳجھي لفظ لاءِ درخواست ڏئي چڪا آهيو.",
        "resetpass-recycled": "مهرباني ڪري پنهنجي هاڻوڪي ڳجھي لفظ کان ڪو مختلف ڳجھو لفظ چونڊيو.",
        "resetpass-temp-emailed": "توهان برق ٽپال ذريعي اماڻيل عارضي ڳجھي لفظ سان لاگ اِن ٿيا آهيو. لاگ اِن کي مڪمل ڪرڻ لاءِ توهان کي هتي نئون ڳجھو لفظ طَي ڪرڻو ئي پوندو:",
        "resetpass-temp-password": "عارضي ڳجھو لفظ:",
        "accmailtitle": "ڳجھو لفظ اماڻجي چڪو.",
        "newarticle": "(نئون)",
        "newarticletext": "توهان اهڙي صفحي جو ڳنڍڻو وٺي هتي پهتا آهيو، جيڪو اڃا وجود نہ ٿو رکي. اهڙو صفحو جوڙڻ لاءِ هيٺين باڪس ۾ ٽائيپ ڪرڻ شروع ڪريو (وڌيڪ ڄاڻڻ لاءِ [$1 امدادي صفحو] ڏسندا). جي توهان هتي غلطيءَ ۾ اچي ويا آهيو تہ رڳو پنهنجي جهانگُوءَ جو '''back''' بٽڻ ڪلڪ ڪندا.",
-       "noarticletext": "في‌الوقت هن صفحي اندر ڪو بہ ٽيڪسٽ نہ آهي. توهان ٻين صفحن ۾ [[Special:Search/{{PAGENAME}}|search ساڳي عنوان جي ڳولا]] ڪري سگھو ٿا.  \n\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} لاڳاپيل لاگس ۾ ڳوليو]،\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} هيءُ صفحو ترميميو]</span>.",
+       "noarticletext": "في‌الوقت هن صفحي اندر ڪو بہ ٽيڪسٽ نہ آهي.\nتوهان ٻين صفحن ۾ [[Special:Search/{{PAGENAME}}|search ساڳي عنوان جي ڳولا]] ڪري سگھو ٿا،  \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} لاڳاپيل لاگس ۾ ڳوليو]،\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} هيءُ صفحو ترميميو]</span>.",
        "userpage-userdoesnotexist-view": "يُوزر کاتو $1 درج ٿيل نہ آهي.",
        "blocked-notice-logextract": "هيءَ يُوزر في‌الحال بندشيل آهي. تازو بندش لاگ حوالي طور پيش ڪجي ٿو:",
        "updated": "(تجديديل)",
        "search-relatedarticle": "لاڳاپيل",
        "searchrelated": "لاڳاپيل",
        "searchall": "سڀ",
+       "search-showingresults": "{{PLURAL:$4|نتيجو <strong>$1</strong> of <strong>$3</strong>|نتيجا <strong>$1 - $2</strong> of <strong>$3</strong>}}",
        "search-nonefound": "توهان جي ڳولا جي نتيجي ۾ ڪجھہ بہ ڪو نہ لڌو.",
        "powersearch-legend": "اعليٰ ڳولا",
        "powersearch-togglelabel": "چڪاسيو:",
        "userrights": "يُوزر حقن جو بندوبست",
        "userrights-lookup-user": "يوزر گروپَ سنڀاليو",
        "userrights-user-editname": "يُوزرنانءُ ڄاڻايو:",
-       "editusergroup": "يوزر گروپَ سنواريو",
+       "editusergroup": "{{GENDER:$1|يوزر}} گروھ ترميميو",
        "userrights-editusergroup": "يوزر گروپَ سنواريو",
-       "saveusergroups": "يوزر گروپَ سنڀاليو",
+       "saveusergroups": "{{GENDER:$1|يوزر}} گروھ سانڍيو",
        "userrights-groupsmember": "برڪن:",
        "userrights-groupsmember-auto": "رڪن واجبي:",
        "userrights-reason": "سبب:",
        "rightslog": "يُوزر حق لاگ",
        "action-read": "هي صفحو پڙهو",
        "action-edit": "هن صفحي کي سسنواريو",
-       "action-createpage": "صفحا تخليق ڪريو",
-       "action-createtalk": "مباحثي صفحا تخليق ڪريو",
+       "action-createpage": "ھي صفحو تخليق ڪريو",
+       "action-createtalk": "ھي مباحثي صفحو تخليق ڪريو",
        "action-createaccount": "هي يوزر کاتو تخليق ڪريو",
        "action-history": "هن صفحي جي سوانح ڏسو",
        "action-minoredit": "هن ترميم کي معمولي طور نشان لڳايو",
        "whatlinkshere-prev": "{{PLURAL:$1|پويون|پويون $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|اڳيون|اڳيان $1}}",
        "whatlinkshere-links": "← ڳنڍڻا",
-       "whatlinkshere-hideredirs": "$1 چورجي ٿو",
+       "whatlinkshere-hideredirs": "$1 چوري ٿو",
        "whatlinkshere-hidelinks": "$1 ڳنڍڻا",
        "whatlinkshere-filters": "ڇاڻيون",
        "whatlinkshere-submit": "هلو",
        "import-upload-filename": "فائيل نانءُ:",
        "import-comment": "تاثر:",
        "importlogpage": "درآمد لاگ",
-       "tooltip-pt-userpage": "توهان جو تعارفي صفحو",
-       "tooltip-pt-mytalk": "توهان جو مباحثي صفحو",
-       "tooltip-pt-preferences": "منهنجون ترجيحات",
+       "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-emailuser": "هن يُوزر کي برق ٽپال اماڻيو",
+       "tooltip-t-contributions": "{{GENDER:$1|ھن يوزر}} جي ڀاڱيدارين جي فھرست",
+       "tooltip-t-emailuser": "{{GENDER:$1|ھن يوزر}} ڏانھن ايميل موڪليو",
        "tooltip-t-upload": "فائيل چاڙهيو",
        "tooltip-t-specialpages": "سڀني خاص صفحن جي فهرست",
        "tooltip-t-print": "هن صفحي جو ڇاپائتو پرت",
        "tags-activate-submit": "فعاليو",
        "tags-deactivate-title": "ٽيگ کي غير فعال ڪريو",
        "tags-deactivate-reason": "سبب:",
-       "tags-edit-existing-tags-none": "\"ڪو بہ نہ\"",
+       "tags-edit-existing-tags-none": "<em>ڪو بہ نہ</em>",
        "tags-edit-new-tags": "نوان ٽيگس:",
        "tags-edit-reason": "سبب:",
        "compare-page1": "صفحو 1",
        "special-characters-group-thai": "ٿائي",
        "mw-widgets-dateinput-no-date": "ڪا بہ تاريخ نہ چونڊيل",
        "mw-widgets-titleinput-description-new-page": "اڃا اهو صفحو وجود نہ ٿو رکي",
-       "mw-widgets-titleinput-description-redirect": "$1 ڏانهن چوريل",
-       "api-error-blacklisted": "براءِ مهرباني ڪو مختلف، تشريحي عنوان چونڊيو."
+       "mw-widgets-titleinput-description-redirect": "$1 ڏانهن چوريل"
 }
index cf0dcd3..5d38477 100644 (file)
        "metadata-help": "ئەی پەڕگە زانیاری فرەێگ لەتێیە، ک گەھا دۊردۊن (camera) یا ئسکەنێر (scanner) خستۊە سەری. ئەگەر پەڕگەگە لە حاڵەتە سەرەتاییەگەیەو دەسکاری کریاۊد، گاھەس بڕێگ لە وردەکاریەیل، زانیارەگان وێنە گووڕیاێەگە وە تەواوی نیشان نەدەن.",
        "metadata-fields": "کاڵگەگان (fields) میتادەیتاێ وێنە ک لە ئەی پەیامە وەڕزارەو کریانە، کاتێگ جەدوەل میتادەیتا کووکریاێ بوود لە پەڕەی وێنە نیشان دەریەن.\nکاڵگەگان تر لە حاڵەتی بنەڕەتی شاریاێن.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagedescription": "ناونیشان وێنە",
-       "exif-pixelydimension": "بەرزی وێنە",
        "exif-flash": "فلەش",
        "exif-keywords": "کلیل‌وشەیل",
        "exif-writer": "نۊسەر",
index 75624c0..9d36abb 100644 (file)
        "title-invalid-interwiki": "ႁူဝ်ၶေႃႈ ၼႃႈလိၵ်ႈ ဢၼ်တုၵ်းယွၼ်းမႃးၼၼ်ႉ မၼ်းပႃးဝႆႉ ႁဵင်းၵွင်ႉ တူဝ်ၼႂ်းဝီႇၶီႇ ဢၼ်ဢမ်ႇၸၢင်ႈဢဝ်ၸႂ်ႉလႆႈ တႃႇႁူဝ်ၶေႃႈ။",
        "title-invalid-talk-namespace": "ႁူဝ်ၶေႃႈၼႃႈလိၵ်ႈ ဢၼ်တုၵ်းယွၼ်းမႃးၼၼ်ႉ မၼ်းမၢႆထိုင်ၸူး ၼႃႈလိၵ်ႈဢုပ်ႇဢူဝ်း ဢၼ်ဢမ်ႇၸၢင်ႈ မီးလႆႈၼၼ်ႉ။",
        "title-invalid-characters": "ႁူဝ်ၶေႃႈ ၼႃႈလိၵ်ႈ ဢၼ်တုၵ်းယွၼ်းမႃးၼၼ်ႉ မၼ်းၶဝ်ႈပႃးဝႆႉ တူဝ်လိၵ်ႈ ဢၼ်ဢမ်ႇ ၸႂ်ႉလႆႈ : \"$1\"",
+       "title-invalid-magic-tilde": "ႁူဝ်ၶေႃႈၼႃႈလိၵ်ႈ ဢၼ်တုၵ်းယွၼ်းမႃးဝႆႉၼၼ်ႉ မၼ်းပႃးဝႆႉ ၶႅပ်းႁၢင်ႈသၢႆသွႆႉ ဢၼ်ဢမ်ႇၸၢင်ႈၸႂ်ႉလႆႈၼၼ်ႉ။\n\n(<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "ႁူဝ်ၶေႃႈၼႃႈလိၵ်ႈ ဢၼ်တုၵ်းယွၼ်းမႃးၼၼ်ႉ မၼ်းႁႅင်ႉယၢဝ်းၼႃႇၽႅဝ်။ မၼ်းတေဢမ်ႇလႆႈ ယၢဝ်းလိူဝ် $1 {{PLURAL:$1|byte|bytes}} တီႈၼႂ်း UTF-8 encoding။",
+       "title-invalid-leading-colon": "ႁူဝ်ၶေႃႈၼႃႈလိၵ်ႈ ဢၼ်တုၵ်းယွၼ်းဝႆႉၼၼ်ႉ တီႈတႄႇမၼ်း ပႃးဝႆႉ မၢႆၶႅၼ်ႈ ဢၼ်ဢမ်ႇ ၸၢင်ႈၸႂ်ႉလႆႈၼၼ်ႉ။",
        "viewsource": "တူၺ်း ငဝ်ႈငႃႇ",
        "viewsource-title": "တူၺ်းငဝ်ႈငႃႇ တွၼ်ႈတႃႇ $1",
        "protectedpagetext": "ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇႁႄႉၵင်ႈဝႆႉ တႃႇၵႅတ်ႇၶႄ လွင်ႈမူၼ်ႉမႄး ဢမ်ႇၼၼ် လွင်ႈႁဵတ်းသၢင်ႈ တၢင်ႇၸိူဝ်း",
        "customjsprotected": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇၶႂၢင်းပၼ် တွၼ်ႈတႃႇမႄးထတ်း ၼႃႈလိၵ်ႈ JavaScript ဢၼ်ၼႆႉ။ ယွၼ်ႉပိူဝ်ႈဝႃႈ မၼ်းပႃးဝႆႉ ၵၢၼ်တင်ႈ လွင်ႈသုၼ်ႇတူဝ် ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၵေႃႉဢေႃႈ။",
        "mycustomcssprotected": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇၶႂၢင်းပၼ် တွၼ်ႈတႃႇမႄးထတ်း ၼႃႈလိၵ်ႈ CSS ဢၼ်ၼႆႉ။",
        "mycustomjsprotected": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇၶႂၢင်းပၼ် တွၼ်ႈတႃႇမႄးထတ်း ၼႃႈလိၵ်ႈ JavaScript ဢၼ်ၼႆႉ။",
+       "myprivateinfoprotected": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇ တွၼ်ႈတႃႇတေမႄးထတ်း ​လွၼ်ႉၶၢဝ်ႇသုၼ်ႇတူဝ်ၸဝ်ႈၵဝ်ႇ။",
+       "mypreferencesprotected": "ၸဝ်ႈၵဝ်ႇဢမ်ႇမီးသုၼ်ႇ တွၼ်ႈတႃႇမႄးထတ်း ငဝ်ႈၵုမ်းပိူင်ၸဝ်ႈၵဝ်ႇ။",
        "ns-specialprotected": "ၼႃႈလိၵ်ႈၶိုၵ်ႉတွၼ်းၸိူဝ်းၼႆႉ တေဢမ်ႇၸၢင်ႈ မႄးထတ်းလႆႈ",
        "titleprotected": "ႁူဝ်ၶေႃႈဢၼ်ၼႆႉၼႆႉ ထုၵ်ႇ ၽူႈၸႂ်ႉတိုဝ်း [[User:$1|$1]] ၵေႃႉၼႆႉ ႁႄႉၵင်ႈဝႆႉ။ လွင်ႈတၢင်း ဢၼ်မၼ်းပၼ်ဝႆႉတႄႉ <em>$2</em>.",
+       "filereadonlyerror": "ဢမ်ႇၸၢင်ႈမူၼ်ႉမႄး ၾၢႆႇ \"$1\" ၼႆႉ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ ယွင်ၾႆႇ \"$2\" ၼႆႉ မၼ်းပဵၼ် လၢႆးငၢၼ်းတွၼ်ႈတႃႇ လူဢၼ်လဵဝ်ၵူၺ်း။\n\nဢၼ်ပဵၼ် ၽူႈၵုမ်းပိူင်သၢင်ႈ ၵေႃႉဢၼ်လႆႈၶတ်းဝႆႉၼႆႉ မၼ်းသပ်းလႅင်းဝႆႉဝႃႈ : \"$3\".",
+       "invalidtitle-knownnamespace": "ႁူဝ်ၶေႃႈ ၽိတ်းပိူင်ႈဝႆႉ ၸွမ်းၼင်ႇ လွၵ်းၸိုဝ်ႈ \"$2\" လႄႈ တူဝ်လိၵ်ႈ \"$3\"",
+       "invalidtitle-unknownnamespace": "ႁူဝ်ၶေႃႈ ၽိတ်းပိူင်ႈဝႆႉ ၸွမ်းၼင်ႇ ဢမ်ႇလႆႈႁူႉ တၢင်းၼမ်လွၵ်းၸိုဝ်ႈ $1 လႄႈ တူဝ်လိၵ်ႈ \"$2\"",
        "exception-nologin": "ဢမ်ႇလႆႈၶဝ်ႈဝႆ့",
        "cannotlogoutnow-title": "ဢမ်ႇၸၢင်ႈ လွၵ်ႉဢွၵ်ႇ ယၢမ်းလဵဝ်",
        "cannotlogoutnow-text": "တေဢမ်ႇၸၢင်ႈ လွၵ်ႉၶဝ်ႈ ၽွင်းမိူဝ်ႈၸႂ်ႉ $1",
index 06b6740..3c18dc9 100644 (file)
        "password-change-forbidden": "Na tem wikiju ne morete spreminjati gesel.",
        "externaldberror": "Pri potrjevanju istovetnosti je prišlo do notranje napake ali pa za osveževanje zunanjega računa nimate dovoljenja.",
        "login": "Prijava",
+       "login-security": "Potrdite svojo identiteto",
        "nav-login-createaccount": "Prijavite se / registrirajte se",
        "userlogin": "Prijavite se / registrirajte se",
        "userloginnocreate": "Prijava",
        "userlogin-resetpassword-link": "Ste pozabili svoje geslo?",
        "userlogin-helplink2": "Pomoč pri prijavi",
        "userlogin-loggedin": "Prijavljeni ste že kot {{GENDER:$1|$1}}.\nUporabite spodnji obrazec, da se prijavite kot drug uporabnik.",
+       "userlogin-reauth": "Ponovno se morate prijaviti, da potrditev, da ste {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Ustvari drug račun",
        "createacct-emailrequired": "E-poštni naslov",
        "createacct-emailoptional": "E-poštni naslov (izbirno)",
        "createacct-email-ph": "Vnesite svoj e-poštni naslov",
        "createacct-another-email-ph": "Vnesite e-poštni naslov",
        "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)",
        "createaccountreason": "Razlog:",
        "createacct-reason": "Razlog",
        "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",
        "createacct-another-submit": "Ustvarite račun",
+       "createacct-continue-submit": "Nadaljuj z ustvarjanjem računa",
+       "createacct-another-continue-submit": "Nadaljuj z ustvarjanjem računa",
        "createacct-benefit-heading": "{{GRAMMAR:tožilnik|{{SITENAME}}}} ustvarjajo ljudje, kot ste vi.",
        "createacct-benefit-body1": "{{PLURAL:$1|urejanje|urejanji|urejanja|urejanj}}",
        "createacct-benefit-body2": "{{PLURAL:$1|stran|strani}}",
        "nocookiesnew": "Uporabniški račun je ustvarjen, vendar niste prijavljeni.\n{{SITENAME}} za prijavo uporabnikov uporablja piškotke, ki pa so pri vas onemogočeni.\nProsimo, omogočite jih, nato pa se s svojim uporabniškim imenom in geslom ponovno prijavite.",
        "nocookieslogin": "{{SITENAME}} za prijavljanje uporabnikov uporablja piškotke.\nKer jih imate onemogočene, vas prosimo, da jih omogočite in se ponovno prijavite.",
        "nocookiesfornew": "Uporabniški račun ni bil ustvarjen, ker nismo mogli potrditi njegovega izvora.\nPoskrbite, da imate omogočene piškotke, osvežite to stran in poskusite znova.",
+       "createacct-loginerror": "Račun ste uspešno ustvarili, vendar vas nismo mogli samodejno prijaviti. Prosimo, nadaljujte z [[Special:UserLogin|ročno prijavo]].",
        "noname": "Niste vnesli veljavnega uporabniškega imena.",
        "loginsuccesstitle": "Sedaj ste prijavljeni",
        "loginsuccess": "'''Zdaj ste prijavljeni v {{GRAMMAR:tožilnik|{{SITENAME}}}} kot »$1«.'''",
        "createacct-another-realname-tip": "Pravo ime ni obvezno.\nČe se ga odločite navesti, bo uporabljeno za priznavanje uporabnikovega dela.",
        "pt-login": "Prijava",
        "pt-login-button": "Prijava",
+       "pt-login-continue-button": "Nadaljuj s prijavo",
        "pt-createaccount": "Ustvari račun",
        "pt-userlogout": "Odjava",
        "php-mail-error-unknown": "Neznana napaka v funkciji PHP mail()",
        "botpasswords-invalid-name": "Navedeno uporabniško ime ne vsebuje ločila za geslo bota (»$1«).",
        "botpasswords-not-exist": "Uporabnik »$1« nima gesla bota z imenom »$2«.",
        "resetpass_forbidden": "Gesla ne morete spremeniti",
+       "resetpass_forbidden-reason": "Gesel nismo mogli spremeniti: $1",
        "resetpass-no-info": "Za neposreden dostop do te strani morate biti prijavljeni.",
        "resetpass-submit-loggedin": "Spremenite geslo",
        "resetpass-submit-cancel": "Prekliči",
        "passwordreset-emailsentusername": "Če obstaja e-poštni naslov, povezan s tem uporabniškim imenom, vam bomo poslali e-pošto za postavitev gesla.",
        "passwordreset-emailsent-capture": "Poslali smo e-pošto za ponastavitev gesla, ki je prikazana spodaj.",
        "passwordreset-emailerror-capture": "Ustvarili smo e-pošto za ponastavitev gesla, ki je prikazana spodaj, vendar pa pošiljanje {{GENDER:$2|uporabniku|uporabnici}} ni uspelo: $1",
+       "passwordreset-emailsent-capture2": "Poslali smo {{PLURAL:$1|e-pošto|e-pošti|e-pošte}} za ponastavitev gesla. {{PLURAL:$1|Uporabniško ime in geslo sta navedena spodaj.|Seznam uporabniških imen in gesel je naveden spodaj.}}",
+       "passwordreset-emailerror-capture2": "Pošiljanje e-pošte {{GENDER:$2|uporabniku|uporabnici}} je spodletelo: $1 {{PLURAL:$3|Uporabniško ime in geslo sta navedena spodaj.|Seznam uporabniških imen in gesel je naveden spodaj.}}",
+       "passwordreset-nocaller": "Podati morate klicatelja",
+       "passwordreset-nosuchcaller": "Klicatelj ne obstaja: $1",
+       "passwordreset-ignored": "Ponastavitve gesla nismo izvedli. Morda ni nastavljen noben ponudnik?",
+       "passwordreset-invalideamil": "Neveljavni e-poštni naslov",
+       "passwordreset-nodata": "Navedli niste ne uporabniškega imena ne e-poštnega naslova",
        "changeemail": "Sprememba ali odstranitev e-poštnega naslova",
        "changeemail-header": "Izpolnite obrazec za spremembo vašega e-poštnega naslova. Če želite s svojega računa odstraniti povezavo s katerim koli e-poštnim naslovom, pustite polje za nov e-poštni naslov med potrjevanje obrazca prazno.",
        "changeemail-passwordrequired": "Za potrditev spremembe boste morali vnesti svoje geslo.",
        "minoredit": "manjše urejanje",
        "watchthis": "Opazuj članek",
        "savearticle": "Shrani stran",
+       "savechanges": "Shrani spremembe",
        "publishpage": "Objavi stran",
+       "publishchanges": "Objavi spremembe",
        "preview": "Predogled",
        "showpreview": "Prikaži predogled",
        "showdiff": "Prikaži spremembe",
        "content-model-css": "CSS",
        "content-json-empty-object": "Prazen objekt",
        "content-json-empty-array": "Prazno polje",
+       "deprecated-self-close-category": "Strani, ki uporabljajo neveljavne samozaključljive oznake HTML",
+       "deprecated-self-close-category-desc": "Stran uporablja neveljavne samozaključljive oznake HTML, kot sta <code>&lt;b/></code> ali <code>&lt;span/></code>. Njihovo vedenje se bo kmalu spremenilo, da bo v skladu s specifikacijo HTML5, zato njihova uporaba v wikibesedilu ni zaželena.",
        "duplicate-args-warning": "<strong>Opozorilo:</strong> [[:$1]] kliče [[:$2]] z več kot eno vrednostjo za parameter »$3«. Uporabili bomo samo zadnjo navedeno vrednost.",
        "duplicate-args-category": "Strani s podvojenimi argumenti v klicih predlog",
        "duplicate-args-category-desc": "Stran vsebuje klice predlog, ki vsebujejo dvojnike argumentov, kot sta <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ali <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "rightslogtext": "Prikazan je dnevnik sprememb uporabniških pravic.",
        "action-read": "branje te strani",
        "action-edit": "urejanje te strani",
-       "action-createpage": "ustvarjenje strani",
-       "action-createtalk": "ustvarjanje pogovornih strani",
+       "action-createpage": "ustvarjenje te strani",
+       "action-createtalk": "ustvarjanje te pogovorne strani",
        "action-createaccount": "registracija tega uporabniškega računa",
        "action-autocreateaccount": "samodejno ustvarjanje zunanjega uporabniškega računa",
        "action-history": "ogled zgodovine strani",
        "upload-http-error": "Prišlo je do napake HTTP: $1",
        "upload-copy-upload-invalid-domain": "Nalaganje kopij s te domene ni možno.",
        "upload-foreign-cant-upload": "Wiki ni konfiguriran za nalaganje datotek z zahtevanega tujega skladišča datotek.",
+       "upload-foreign-cant-load-config": "Nismo uspeli naložiti konfiguracije nalaganja datotek za zunanje skladišče datotek.",
+       "upload-dialog-disabled": "Nalaganj datotek z uporabo tega obrazca je na wikiju onemogočeno.",
        "upload-dialog-title": "Naloži datoteko",
        "upload-dialog-button-cancel": "Prekliči",
        "upload-dialog-button-done": "Končano",
        "trackingcategories-msg": "Sledilna kategorija",
        "trackingcategories-name": "Ime sporočila",
        "trackingcategories-desc": "Merila za vključitev v kategorijo",
+       "restricted-displaytitle-ignored": "Strani s prezrtimi prikaznimi naslovi",
+       "restricted-displaytitle-ignored-desc": "Stran ima prezrt <code><nowiki>{{DISPLAYTITLE}}</nowiki></code>, saj ni enak dejanskemu naslovu strani.",
        "noindex-category-desc": "Stran vsebuje čarobno besedo <code><nowiki>__NOINDEX__</nowiki></code> (in je v imenskem prostoru, ki dovoljuje to oznako) in posledično je roboti ne indeksirajo.",
        "index-category-desc": "Stran vsebuje čarobno besedo <code><nowiki>__INDEX__</nowiki></code> (in je v imenskem prostoru, ki dovoljuje to oznako) in posledično jo roboti indeksirajo, čeprav je drugače ne bi.",
        "post-expand-template-inclusion-category-desc": "Velikost strani je po razširitvi vseh predlog več kot <code>$wgMaxArticleSize</code>, zato nekaterih predlog nismo razširili.",
        "rollbacklinkcount": "vrni $1 {{PLURAL:$1|urejanje|urejanji|urejanja|urejanj}}",
        "rollbacklinkcount-morethan": "vrni več kot $1 {{PLURAL:$1|urejanje|urejanji|urejanja|urejanj}}",
        "rollbackfailed": "Vrnitev ni uspela",
+       "rollback-missingparam": "Pri zahtevi manjkajo zahtevani parametri.",
        "cantrollback": "Urejanja ne morem vrniti; zadnji urejevalec je hkrati edini.",
        "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-nouser": "vrnitev sprememb skritega uporabnika na zadnjo redakcijo {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Razveljavljene spremembe uporabnika $1;\nvrnjeno na urejanje uporabnika $2.",
+       "rollback-success-notify": "Povrnili smo urejanja $1;\nspremenjeno nazaj na zadnjo redakcijo $2. [$3 Prikaži spremembe]",
        "sessionfailure-title": "Neuspeh seje",
        "sessionfailure": "Vaša prijava ni uspela; da bi preprečili ugrabitev seje, je bilo dejanje preklicano. Prosimo, izberite »Nazaj« in ponovno naložite stran, s katere prihajate, nato poskusite znova.",
        "changecontentmodel": "Spremeni model vsebine strani",
        "sp-contributions-username": "IP-naslov ali uporabniško ime:",
        "sp-contributions-toponly": "Prikaži samo vrhnje redakcije",
        "sp-contributions-newonly": "Prikaži samo urejanja, ki so ustvarila nove strani",
+       "sp-contributions-hideminor": "Skrij manjša urejanja",
        "sp-contributions-submit": "Išči",
        "whatlinkshere": "Kaj se povezuje sem",
        "whatlinkshere-title": "Strani, ki se povezujejo na $1",
        "confirm-watch-top": "Dodam stran na vaš spisek nadzorov?",
        "confirm-unwatch-button": "V redu",
        "confirm-unwatch-top": "Odstranim stran z vašega spiska nadzorov?",
+       "confirm-rollback-button": "V redu",
+       "confirm-rollback-top": "Povrnemo urejanja te strani?",
        "percent": "$1&#160;%",
        "quotation-marks": "»$1«",
        "imgmultipageprev": "← prejšnja stran",
        "mw-widgets-dateinput-placeholder-month": "LLLL-MM",
        "mw-widgets-titleinput-description-new-page": "stran še ne obstaja",
        "mw-widgets-titleinput-description-redirect": "preusmeritev na $1",
-       "api-error-blacklisted": "Prosimo, izberite drugačen, opisen naslov.",
        "sessionmanager-tie": "Ne morem združiti več vrst overitvenih zahtev: $1.",
        "sessionprovider-generic": "sej $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sej, ki temeljijo na piškotkih",
        "log-action-filter-newusers": "Vrsta ustvarjanja računa:",
        "log-action-filter-patrol": "Vrsta nadzora:",
        "log-action-filter-protect": "Vrsta zaščite:",
-       "log-action-filter-rights": "Vrsta spremembe pravic",
-       "log-action-filter-suppress": "Vrsta zatrtja",
+       "log-action-filter-rights": "Vrsta spremembe pravic:",
+       "log-action-filter-suppress": "Vrsta zatrtja:",
        "log-action-filter-upload": "Vrsta nalaganja:",
        "log-action-filter-all": "Vse",
        "log-action-filter-block-block": "Blokada",
        "log-action-filter-suppress-block": "Zatrtje uporabnika z blokado",
        "log-action-filter-suppress-reblock": "Zatrtje uporabnika s ponovno blokado",
        "log-action-filter-upload-upload": "Novo nalaganje",
-       "log-action-filter-upload-overwrite": "Ponovno nalaganje"
+       "log-action-filter-upload-overwrite": "Ponovno nalaganje",
+       "authmanager-authn-not-in-progress": "Overjanje ni v teku ali pa smo izgubili podatke seje. Prosimo, pričnite znova od začetka.",
+       "authmanager-authn-no-primary": "Navedenih poverilnic nismo mogli overiti.",
+       "authmanager-authn-no-local-user": "Navedene poverilnice niso povezane z nobenim uporabnikom na wikiju.",
+       "authmanager-authn-no-local-user-link": "Navedene poverilnice so veljavne, vendar niso povezane z nobenim uporabnikom na wikiju. Prijavite se na drug način ali ustvarite novega uporabnika in vaše prejšnje poverilnice boste lahko povezali s tem računom.",
+       "authmanager-authn-autocreate-failed": "Samodejno ustvarjanje lokalnega računa je spodletelo: $1",
+       "authmanager-change-not-supported": "Navedenih poverilnic nismo mogli spremeniti, saj jih ne bi nič uporabljalo.",
+       "authmanager-create-disabled": "Ustvarjanje računov je onemogočeno.",
+       "authmanager-create-from-login": "Da ustvarite svoj račun, prosimo, izpolnite spodnja polja.",
+       "authmanager-create-not-in-progress": "Ustvarjanje računa ni v teku ali pa smo izgubili podatke seje. Prosimo, pričnite znova od začetka.",
+       "authmanager-create-no-primary": "Navedenih poverilnic ne moremo uporabiti za ustvarjanje računa.",
+       "authmanager-link-no-primary": "Navedenih poverilnic ne moremo uporabiti za povezovanje računa.",
+       "authmanager-link-not-in-progress": "Povezovanje računa ni v teku ali pa smo izgubili podatke seje. Prosimo, pričnite znova od začetka.",
+       "authmanager-authplugin-setpass-failed-title": "Sprememba gesla je spodletela",
+       "authmanager-authplugin-setpass-failed-message": "Vtičnik za overitev je zavrnil spremembo gesla.",
+       "authmanager-authplugin-create-fail": "Vtičnik za overitev je zavrnil ustvarjanje računa.",
+       "authmanager-authplugin-setpass-denied": "Vtičnik za overitev ne dovoljuje spreminjanje gesel.",
+       "authmanager-authplugin-setpass-bad-domain": "Neveljavna domena.",
+       "authmanager-autocreate-noperm": "Samodejno ustvarjanje računov ni dovoljeno.",
+       "authmanager-autocreate-exception": "Samodejno ustvarjanje računov smo začasno onemogočili zaradi predhodnih napak.",
+       "authmanager-userdoesnotexist": "Uporabniški račun »$1« ni registriran.",
+       "authmanager-userlogin-remembermypassword-help": "Ali naj si geslo zapomnimo dlje, kot traja seja.",
+       "authmanager-username-help": "Uporabniško ime za overjanje.",
+       "authmanager-password-help": "Geslo za overjanje.",
+       "authmanager-domain-help": "Domena za zunanje overjanje.",
+       "authmanager-retype-help": "Geslo ponovno za potrditev.",
+       "authmanager-email-label": "E-pošta",
+       "authmanager-email-help": "E-poštni naslov",
+       "authmanager-realname-label": "Pravo ime",
+       "authmanager-realname-help": "Pravo ime uporabnika",
+       "authmanager-provider-password": "Overjanje, ki temelji na geslu",
+       "authmanager-provider-password-domain": "Overjanje, ki temelji na geslu in domeni",
+       "authmanager-provider-temporarypassword": "Začasno geslo",
+       "authprovider-confirmlink-message": "Na podlagi vaših nedavnih poskusov prijave lahko naslednje račune povežemo z vašim wikiračunom. Povezovanje omogoča prijavo prek teh računov. Prosimo, izberite, katere želite povezati.",
+       "authprovider-confirmlink-request-label": "Računi, ki naj bodo povezani",
+       "authprovider-confirmlink-success-line": "$1: Uspešno povezan",
+       "authprovider-confirmlink-failed": "Povezovanje računov ni uspelo v celoti: $1",
+       "authprovider-confirmlink-ok-help": "Nadaljuj po prikazu sporočil o spodletelih povezovanjih.",
+       "authprovider-resetpass-skip-label": "Preskoči",
+       "authprovider-resetpass-skip-help": "Preskoči ponastavljanje gesla.",
+       "authform-nosession-login": "Overjanje je bilo uspešno, vendar si vaš brskalnik ne more »zapomniti« prijave.\n\n$1",
+       "authform-nosession-signup": "Račun smo ustvarili, vendar si vaš brskalnik ne more »zapomniti« prijave.\n\n$1",
+       "authform-newtoken": "Manjka žeton. $1",
+       "authform-notoken": "Manjka žeton",
+       "authform-wrongtoken": "Napačen žeton",
+       "specialpage-securitylevel-not-allowed-title": "Ni dovoljeno",
+       "specialpage-securitylevel-not-allowed": "Oprostite, vendar te strani ne morete uporabljati, saj vaše identitete nismo mogli preveriti.",
+       "authpage-cannot-login": "Ne moremo pričeti prijave.",
+       "authpage-cannot-login-continue": "Ne moremo nadaljevati s prijavo. Vaša seja je najverjetneje potekla.",
+       "authpage-cannot-create": "Ne moremo pričeti ustvarjanja računa.",
+       "authpage-cannot-create-continue": "Ne moremo nadaljevati z ustvarjanjem računa. Vaša seja je najverjetneje potekla.",
+       "authpage-cannot-link": "Ne moremo pričeti povezovanja računa.",
+       "authpage-cannot-link-continue": "Ne moremo nadaljevati s povezovanjem računov. Vaša seja je najverjetneje potekla.",
+       "cannotauth-not-allowed-title": "Dovoljenje je zavrnjeno",
+       "cannotauth-not-allowed": "Nimate dovoljenja za uporabo te strani",
+       "changecredentials": "Spremeni poverilnice",
+       "changecredentials-submit": "Spremeni poverilnice",
+       "changecredentials-invalidsubpage": "$1 ni veljavna vrsta poverilnic.",
+       "changecredentials-success": "Vaše poverilnice smo spremenili.",
+       "removecredentials": "Odstrani poverilnice",
+       "removecredentials-submit": "Odstrani poverilnice",
+       "removecredentials-invalidsubpage": "$1 ni veljavna vrsta poverilnic.",
+       "removecredentials-success": "Vaše poverilnice smo odstranili.",
+       "credentialsform-provider": "Vrsta poverilnic:",
+       "credentialsform-account": "Ime račun:",
+       "cannotlink-no-provider-title": "Ni računov za povezati",
+       "cannotlink-no-provider": "Ni računov za povezati.",
+       "linkaccounts": "Poveži račune",
+       "linkaccounts-success-text": "Račun smo povezali.",
+       "linkaccounts-submit": "Poveži račune",
+       "unlinkaccounts": "Razveži račune",
+       "unlinkaccounts-success": "Račun smo razvezali.",
+       "authenticationdatachange-ignored": "Sprememba overitvenih podatkov ni bila obdelana. Morda ni bil konfiguriran noben ponudnik?"
 }
index af0fb55..a49e46a 100644 (file)
        "minoredit": "Ky është një redaktim i vogël",
        "watchthis": "Vëzhgoje këtë faqe",
        "savearticle": "Kryej ndryshimet",
+       "publishpage": "Publiko faqen",
        "preview": "Shqyrto",
        "showpreview": "Shfaq për shqyrtim",
        "showdiff": "Trego ndryshimet",
        "feedback-subject": "Subjekti:",
        "feedback-submit": "Dërgo",
        "feedback-thanks": "Faleminderit! Përshtypja juaj është postuar në faqen \"[$2 $1]\".",
+       "feedback-thanks-title": "Ju faleminderit!",
        "searchsuggest-search": "Kërko",
        "searchsuggest-containing": "përmban ...",
        "api-error-badaccess-groups": "Ju nuk lejoheni të ngarkoni skeda në këtë wiki.",
index fe67320..7c78a48 100644 (file)
        "noemail": "Не постоји имејл адреса за {{GENDER:$1|корисника|корисницу}} $1.",
        "noemailcreate": "Морате навести исправну имејл адресу.",
        "passwordsent": "Нова лозинка је послата на имејл адресу {{GENDER:$1|корисника|кориснице|корисника}} $1.\nПријавите се пошто је примите.",
-       "blocked-mailpassword": "Ð\92аÑ\88оÑ\98 Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81и Ñ\98е Ð¾Ð½ÐµÐ¼Ð¾Ð³Ñ\83Ñ\9bено Ñ\83Ñ\80еÑ\92иваÑ\9aе Ñ\81Ñ\82Ñ\80аниÑ\86а, ÐºÐ°Ð¾ Ð¸ Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82 Ð·Ð°Ñ\85Ñ\82еваÑ\9aа Ð½Ð¾Ð²Ðµ Ð»Ð¾Ð·Ð¸Ð½Ðºе.",
+       "blocked-mailpassword": "Ð\92аÑ\88а IP Ð°Ð´Ñ\80еÑ\81а Ð¸Ð¼Ð° Ð·Ð°Ð±Ñ\80анÑ\83 Ñ\83Ñ\80еÑ\92иваÑ\9aа. Ð Ð°Ð´Ð¸ Ñ\81пÑ\80еÑ\87аваÑ\9aа Ð·Ð»Ð¾Ñ\83поÑ\82Ñ\80ебе, Ð½Ð¸Ñ\98е Ð´Ð¾Ð·Ð²Ð¾Ñ\99ено Ð²Ñ\80аÑ\9bаÑ\9aе Ð»Ð¾Ð·Ð¸Ð½ÐºÐµ Ñ\81а Ñ\9aе.",
        "eauthentsent": "На наведену имејл адресу је послат потврдни код.\nПре него што пошаљемо даљње поруке, пратите упутства с имејла да бисте потврдили да сте ви отворили налог.",
        "throttled-mailpassword": "Порука за промену лозинке је послата у {{PLURAL:$1|1=последњих сат времена|последња $1 сата|последњих $1 сати}}.\nДа бисмо спречили злоупотребу, подсетник шаљемо само једном у року од {{PLURAL:$1|1=сат времена|$1 сата|$1 сати}}.",
        "mailerror": "Грешка при слању поруке: $1",
        "passwordreset-emailtext-ip": "Неко (вероватно Ви, са ИП адресе $1) је затражио нову лозинку на викију {{SITENAME}} ($4).\nСледећи {{PLURAL:$3|кориснички налог је повезан|кориснички налози су повезани}} с овом имејл адресом:\n\n$2\n\n{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.\nПријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку и наставите користити стару лозинку.",
        "passwordreset-emailtext-user": "{{GENDER:$1|Корисник је затражио|Корисница је затражила}} подсетник о подацима за пријаву на викију {{SITENAME}} ($4).\nСледећи {{PLURAL:$3|кориснички налог је повезан|кориснички налози су повезани}} с овом имејл адресом:\n\n$2\n\n{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.\nПријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку.",
        "passwordreset-emailelement": "Корисничко име: \n$1\n\nПривремена лозинка: \n$2",
-       "passwordreset-emailsentemail": "Ако је ово имејл адреса регистована на Вашем налогу, подсетник о лозинци ће бити послат на имејл.",
+       "passwordreset-emailsentemail": "Ако је ово имејл адреса повезана са Вашим налогом, подсетник о лозинци ће бити послат на имејл.",
        "passwordreset-emailsentusername": "Ако сте навели имејл адресу приликом регистрације, биће послат имејл за ресетовање лозинке.",
        "passwordreset-emailsent-capture": "Послат је подсетник преко имејла, који је приказан доле.",
        "passwordreset-emailerror-capture": "Имејл за ресетовање лозинке, приказан испод је послат, али слање {{GENDER:$2|кориснику|корисници}} није успело: $1",
        "minoredit": "мања измена",
        "watchthis": "надгледај ову страницу",
        "savearticle": "Сачувај страницу",
+       "savechanges": "Сачувај измене",
+       "publishpage": "Објави страницу",
+       "publishchanges": "Објави измене",
        "preview": "Претпреглед",
        "showpreview": "Прикажи претпреглед",
        "showdiff": "Прикажи измене",
        "userpage-userdoesnotexist": "Кориснички налог „<nowiki>$1</nowiki>“ није отворен.\nРазмислите да ли заиста желите да направите/уредите ову страницу.",
        "userpage-userdoesnotexist-view": "Кориснички налог „$1“ није отворен.",
        "blocked-notice-logextract": "Овај корисник је тренутно блокиран.\nИзвештај о последњем блокирању можете погледати испод:",
-       "clearyourcache": "'''Напомена:''' након чувања, можда ћете морати да очистите кеш прегледача.\n*'''Фајерфокс и Сафари:''' држите ''Shift'' и кликните на ''Освежи'', или притисните ''Ctrl-F5'' или Ctrl-R (''⌘-R'' на Макинтошу)\n*'''Гугл кроум:''' притисните ''Ctrl-Shift-R'' (''⌘-Shift-R'' на Макинтошу)\n*'''Интернет експлорер: '''држите ''Ctrl'' и кликните на ''Освежи'', или притисните ''Ctrl-F5''\n*'''Опера:''' очистите привремену меморију преко менија ''Алатке → Поставке''.",
+       "clearyourcache": "<strong>Напомена:</strong> након чувања, можда ћете морати да очистите кеш прегледача како бисте видели промене.\n* <strong>Фајерфокс / Сафари:</strong> држите <em>Shift</em> и кликните на <em>Освежи</em>, или притисните <em>Ctrl-F5</em> или <em>Ctrl-R (<em>⌘-R</em> на Меку)\n* <strong>Гугл кроум:</strong> притисните <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> на Меку)\n* <strong>Интернет експлорер:</strong> држите <em>Ctrl</em> и кликните на <em>Освежи</em> или притисните <em>Ctrl-F5</em>\n* <strong>Опера:</strong> идите на <em>Алатке → Подешавања</em> (<em>Опера → Поставке</em> на Меку) и затим <em>Приватност и безбедност → Очистите податке о прегледима → Кеширане слике и датотеке</em>.",
        "usercssyoucanpreview": "'''Савет:''' кориситите дугме „{{int:showpreview}}“ да испробате свој нови CSS пре него што га сачувате.",
        "userjsyoucanpreview": "'''Савет:''' кориситите дугме „{{int:showpreview}}“ да испробате свој нови јаваскрипт пре него што га сачувате.",
        "usercsspreview": "'''Ово је само преглед CSS-а.'''\n'''Страница још није сачувана!'''",
        "previewnote": "<strong>Ово је претпреглед.</strong>\nВаше измене још нису сачуване!",
        "continue-editing": "Иди на уређивачки оквир",
        "previewconflict": "Овај преглед осликава како ће текст у текстуалном оквиру изгледати.",
-       "session_fail_preview": "'''Нисмо могли да обрадимо вашу измену због губитка података сесије.'''\nПокушајте поново.\nАко и даље не ради, покушајте да се [[Special:UserLogout|одјавите]] и поново пријавите.",
-       "session_fail_preview_html": "'''Нисмо могли да обрадимо вашу измену због губитка података сесије.'''\n\n''Будући да је на овом викију омогућен унос HTML ознака, преглед је сакривен као мера предострожности против напада преко јаваскрипта.''\n\n'''Ако сте покушали да направите праву измену, покушајте поново.\nАко и даље не ради, покушајте да се [[Special:UserLogout|одјавите]] и поново пријавите.'''",
+       "session_fail_preview": "Нисмо могли да обрадимо вашу измену због губитка података сесије.\n\nМожда сте одјављени. <strong>Проверите да ли сте пријављен и покушајте поново</strong>.\n\nАко и даље не ради, покушајте да се [[Special:UserLogout|одјавите]] и поново пријавите и проверите да ли су на Вашем претраживачу дозвољени колачићи са овог сајта.",
+       "session_fail_preview_html": "Нисмо могли да обрадимо вашу измену због губитка података сесије.\n\n<em>Будући да је на овом викију омогућен унос HTML ознака, преглед је сакривен као мера предострожности против напада преко јаваскрипта.</em>\n\n<strong>Ако сте покушали да направите праву измену, покушајте поново.<strong>\nАко и даље не ради, покушајте да се [[Special:UserLogout|одјавите]] и поново пријавите и проверите да ли Ваш претраживач дозвољава колачиће са овог сајта.",
        "token_suffix_mismatch": "'''Ваша измена је одбачена јер је ваш прегледач убацио знакове интерпункције у новчић уређивања.\nТо се понекад догађа када се користи неисправан посредник.'''",
        "edit_form_incomplete": "<strong>Неки делови обрасца за уређивање нису стигли до сервера. Проверите да ли су ваше измене непромењене и покушајте поново.</strong>",
        "editing": "Уређујете $1",
        "userrights-unchangeable-col": "Групе које не можете да промените",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Сукоб промена корисничких права! Молимо проверите ваше измене.",
-       "userrights-removed-self": "УÑ\81пеÑ\88но Ñ\81Ñ\82е Ñ\81еби Ñ\81кинÑ\83ли Ð¿Ñ\80ава. Ð\97бог Ñ\82ога Ð½Ð¸Ñ\98е Ð²Ð°Ð¼ дозвољен приступ овој страници.",
+       "userrights-removed-self": "СкинÑ\83ли Ñ\81Ñ\82е Ñ\81еби Ð¿Ñ\80ава. Ð\97бог Ñ\82ога Ð\92ам Ð½Ð¸Ñ\98е дозвољен приступ овој страници.",
        "group": "Група:",
        "group-user": "Корисници",
        "group-autoconfirmed": "Аутоматски потврђени корисници",
        "group-bot-member": "{{GENDER:$1|бот}}",
        "group-sysop-member": "{{GENDER:$1|администратор|администраторка|администратор}}",
        "group-bureaucrat-member": "{{GENDER:$1|бирократа}}",
-       "group-suppress-member": "{{GENDER:$1|ревизор|ревизорка}}",
+       "group-suppress-member": "{{GENDER:$1|брисач измена}}",
        "grouppage-user": "{{ns:project}}:Корисници",
        "grouppage-autoconfirmed": "{{ns:project}}:Аутоматски потврђени корисници",
        "grouppage-bot": "{{ns:project}}:Ботови",
        "grant-createeditmovepage": "Прављење, уређивање и премештање страница",
        "grant-delete": "Брисање страница, измена и уноса у дневницима",
        "grant-editinterface": "Уређивање Медијавики именског простора и корисничких CSS/JavaScript страница",
+       "grant-editmycssjs": "Уређивање вашег CSS/JavaScript-а",
        "grant-editmyoptions": "Уређивање ваших подешавања",
        "grant-editmywatchlist": "Уређивање вашег списка надгледања",
        "grant-editpage": "Уређивање постојећих страница",
        "grant-editprotected": "Уређивање заштићених страница",
+       "grant-patrol": "Патролирање измена",
        "grant-protect": "Закључавање и откључавање страница",
        "grant-rollback": "Враћање измена",
+       "grant-sendemail": "Слање имејлова другим корисницима",
        "grant-uploadeditmovefile": "Отпремање, замена и премештање датотека",
        "grant-uploadfile": "Слање нових датотека",
        "grant-basic": "Основна права",
        "uploadstash-summary": "Ова страница пружа приступ датотекама које су послате (или се шаљу), али још нису објављене. Ове датотеке су видљиве само кориснику који га је послао.",
        "uploadstash-clear": "Очисти сакривене датотеке",
        "uploadstash-nofiles": "Немате сакривене датотеке.",
-       "uploadstash-badtoken": "Извршавање дате радње није успело. Разлог томе може бити истек времена за уређивање. Покушајте поново.",
+       "uploadstash-badtoken": "Извршавање дате радње није успело, разлог томе може бити истек времена за уређивање. Покушајте поново.",
        "uploadstash-errclear": "Чишћење датотека није успело.",
        "uploadstash-refresh": "Освежи списак датотека",
        "invalid-chunk-offset": "Неисправна полазна тачка",
        "listgrouprights-namespaceprotection-restrictedto": "Права потребна за уређивање",
        "listgrants-rights": "Права",
        "trackingcategories": "Медијавики категорије",
-       "trackingcategories-summary": "Ð\9eва Ð¿Ð¾Ñ\81ебна Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\98е Ñ\81пиÑ\81ак ÐºÐ°Ñ\82егоÑ\80иÑ\98а ÐºÐ¾Ñ\98е Ñ\81Ñ\83 Ð´ÐµÐ¾ Ð\9cедиÑ\98авикиÑ\98а, Ð¾Ð½Ðµ Ñ\81е Ð°Ñ\83Ñ\82омаÑ\82Ñ\81ки Ð°Ð¶Ñ\83Ñ\80иÑ\80аÑ\98Ñ\83 Ð¸ Ñ\9aиÑ\85ови Ð½Ð°Ð·Ð¸Ð²Ð¸ Ñ\81е Ð¼Ð¾Ð³Ñ\83 Ð¼ÐµÑ\9aаÑ\9aаÑ\82и Ñ\83Ñ\80еÑ\92иваÑ\9aем Ñ\81иÑ\81Ñ\82емÑ\81киÑ\85 Ð¿Ð¾Ñ\80Ñ\83ка Ñ\83 Ð¸Ð¼ÐµÐ½Ñ\81ком Ð¿Ñ\80оÑ\81Ñ\82оÑ\80Ñ\83 {{ns:8}}.",
+       "trackingcategories-summary": "Ова посебна страница је списак категорија које су део Медијавикија, оне се аутоматски ажурирају и њихови називи се могу мењати уређивањем системских порука у именском простору {{ns:8}}.",
        "trackingcategories-name": "Име поруке",
        "trackingcategories-desc": "Које странице се налазе у категорији",
        "noindex-category-desc": "Странице које у себи имају магичну реч <code><nowiki>__NOINDEX__</nowiki></code>.",
        "sp-contributions-username": "ИП адреса или корисничко име:",
        "sp-contributions-toponly": "Само најновије измене",
        "sp-contributions-newonly": "Само измене којима су направљене нове странице",
+       "sp-contributions-hideminor": "Сакриј мање измене",
        "sp-contributions-submit": "Претражи",
        "whatlinkshere": "Шта води овде",
        "whatlinkshere-title": "Странице које су повезане са „$1“",
        "ipb-unblock": "Деблокирај корисничко име или IP адресу",
        "ipb-blocklist": "Погледај постојећа блокирања",
        "ipb-blocklist-contribs": "Доприноси за {{GENDER:$1|$1}}",
+       "ipb-blocklist-duration-left": "преостало: $1",
        "unblockip": "Деблокирај корисника",
        "unblockiptext": "Користите образац испод да бисте вратили право писања блокираној ИП адреси или корисничком имену.",
        "ipusubmit": "Уклони ову блокаду",
        "tooltip-ca-nstab-category": "Погледајте страницу категорија",
        "tooltip-minoredit": "Означите измену као мању",
        "tooltip-save": "Сачувајте измене које сте направили",
+       "tooltip-publish": "Објави своје измене",
        "tooltip-preview": "Прегледајте своје измене. Пожељно је да користите ово дугме пре чувања",
        "tooltip-diff": "Погледајте све измене које сте направили на тексту",
        "tooltip-compareselectedversions": "Погледаjте разлике између две изабране измене ове странице.",
        "previousdiff": "← Старија измена",
        "nextdiff": "Новија измена →",
        "mediawarning": "<strong>Упозорење:</strong> ова врста датотеке може садржати штетан код.\nАко га покренете, Ваш рачунар може бити угрожен.",
-       "imagemaxsize": "Ограничење величине слике:<br />''(на страницама за опис датотека)''",
+       "imagemaxsize": "Ограничење величине слике:<br /><em>(на страницама за опис датотека)</em>",
        "thumbsize": "Величина минијатуре:",
        "widthheight": "$1 × $2",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|страница|странице|страница}}",
        "confirmemail_body_set": "Неко, вероватно ви, са ИП адресе $1 \nје променио имејл адресу налога „$2“ у ову адресу на {{SITENAME}}.\n\nДа бисмо потврдили да овај налог стварно припада вама и поново активирали могућности имејла на {{SITENAME}}, отворите следећу везу у прегледачу:\n\n$3\n\nАко налог *не* припада вама, пратите следећу везу да откажете потврду имејл адресе:\n\n$5\n\nОвај потврдни код истиче $4.",
        "confirmemail_invalidated": "Потврда имејл адресе је отказана",
        "invalidateemail": "Отказивање потврде имејла",
+       "notificationemail_body_changed": "Неко, вероватно Ви је променио имејл адресу налога из $2“ у „$3“ са IP адресе $1 на сајту {{SITENAME}}.\n\nАко ово нисте били Ви, одмах обавестите администраторе сајта.",
        "scarytranscludedisabled": "[Међувики укључивање шаблона је онемогућено]",
        "scarytranscludefailed": "[Добављање шаблона за $1 није успело]",
        "scarytranscludefailed-httpstatus": "[Не могу да преузмем шаблон $1: HTTP $2]",
        "version-libraries-license": "Лиценца",
        "version-libraries-description": "Опис",
        "version-libraries-authors": "Аутори",
-       "redirect": "Преусмерење на датотеку, корисника, страницу или измену",
+       "redirect": "Преусмерење на датотеку, корисника, страницу, измену или дневник",
        "redirect-submit": "Иди",
        "redirect-lookup": "Тип вредности:",
        "redirect-value": "Вредност:",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
        "mw-widgets-titleinput-description-new-page": "страница још увек не постоји",
        "mw-widgets-titleinput-description-redirect": "преусмерава на $1",
-       "api-error-blacklisted": "Изаберите другачији, описан назив.",
        "randomrootpage": "Случајна коренска страница",
        "log-action-filter-block": "Тип блокирања:",
        "log-action-filter-contentmodel": "Тип промене модела садржаја:",
index 996d191..ad1dc2e 100644 (file)
        "minoredit": "manja izmena",
        "watchthis": "nadgledaj ovu stranicu",
        "savearticle": "Sačuvaj stranicu",
-       "preview": "Pregled",
+       "savechanges": "Sačuvaj izmene",
+       "publishpage": "Objavi stranicu",
+       "publishchanges": "Objavi izmene",
+       "preview": "Pretpregled",
        "showpreview": "Prikaži pretpregled",
        "showdiff": "Prikaži izmene",
        "blankarticle": "<strong>Upozorenje:</strong> stranica koju pravite nema nikakav sadržaj.\nAko još jednom pritisnete „{{int:savearticle}}“ napravićete praznu stranicu.",
        "userpage-userdoesnotexist": "Korisnički nalog „<nowiki>$1</nowiki>“ nije otvoren.\nRazmislite da li zaista želite da napravite/uredite ovu stranicu.",
        "userpage-userdoesnotexist-view": "Korisnički nalog „$1“ nije otvoren.",
        "blocked-notice-logextract": "Ovaj korisnik je trenutno blokiran.\nIzveštaj o poslednjem blokiranju možete pogledati ispod:",
-       "clearyourcache": "'''Napomena:''' nakon čuvanja, možda ćete morati da očistite keš pregledača.\n*'''Fajerfoks i Safari:''' držite ''Shift'' i kliknite na ''Osveži'', ili pritisnite ''Ctrl-F5'' ili Ctrl-R (''⌘-R'' na Makintošu)\n*'''Gugl kroum:''' pritisnite ''Ctrl-Shift-R'' (''⌘-Shift-R'' na Makintošu)\n*'''Internet eksplorer: '''držite ''Ctrl'' i kliknite na ''Osveži'', ili pritisnite ''Ctrl-F5''\n*'''Opera:''' očistite privremenu memoriju preko menija ''Alatke → Postavke''.",
+       "clearyourcache": "<strong>Napomena:</strong> nakon čuvanja, možda ćete morati da očistite keš pregledača kako biste videli promene.\n* <strong>Fajerfoks / Safari:</strong> držite <em>Shift</em> i kliknite na <em>Osveži</em>, ili pritisnite <em>Ctrl-F5</em> ili <em>Ctrl-R (<em>⌘-R</em> na Meku)\n* <strong>Gugl kroum:</strong> pritisnite <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> na Meku)\n* <strong>Internet eksplorer:</strong> držite <em>Ctrl</em> i kliknite na <em>Osveži</em> ili pritisnite <em>Ctrl-F5</em>\n* <strong>Opera:</strong> idite na <em>Alatke → Podešavanja</em> (<em>Opera → Postavke</em> na Meku) i zatim <em>Privatnost i bezbednost → Očistite podatke o pregledima → Keširane slike i datoteke</em>.",
        "usercssyoucanpreview": "'''Savet:''' korisitite dugme „{{int:showpreview}}“ da isprobate svoj novi CSS pre nego što ga sačuvate.",
        "userjsyoucanpreview": "'''Savet:''' korisitite dugme „{{int:showpreview}}“ da isprobate svoj novi javaskript pre nego što ga sačuvate.",
        "usercsspreview": "'''Ovo je samo pregled CSS-a.'''\n'''Stranica još nije sačuvana!'''",
        "rev-showdeleted": "prikaži",
        "revisiondelete": "Obriši/vrati izmene",
        "revdelete-nooldid-title": "Nema tražene izmene",
-       "revdelete-nooldid-text": "Niste naveli željenu izmenu, ona ne postoji ili pokušavate da je sakrijete.",
+       "revdelete-nooldid-text": "Niste izabrali odredišnu izmenu na kojoj treba da se izvrši ova funkcija, ta izmena ne postoji, ili pokušavate sakriti trenutnu izmenu.",
        "revdelete-no-file": "Tražena datoteka ne postoji.",
        "revdelete-show-file-confirm": "Želite li da vidite obrisanu izmenu datoteke „<nowiki>$1</nowiki>“ od $2; $3?",
        "revdelete-show-file-submit": "Da",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrator|administratorka}}",
        "group-bureaucrat-member": "{{GENDER:$1|birokrata}}",
-       "group-suppress-member": "{{GENDER:$1|revizor|revizorka}}",
+       "group-suppress-member": "{{GENDER:$1|brisač izmena}}",
        "grouppage-user": "{{ns:project}}:Korisnici",
        "grouppage-autoconfirmed": "{{ns:project}}:Automatski potvrđeni korisnici",
        "grouppage-bot": "{{ns:project}}:Botovi",
        "listgrouprights-namespaceprotection-restrictedto": "Prava potrebna za uređivanje",
        "listgrants-rights": "Prava",
        "trackingcategories": "Medijaviki kategorije",
-       "trackingcategories-summary": "Ova posebna stranica je spisak kategorija koje su deo Medijavikija, one se automatski ažuriraju i njihovi nazivi se mogu menjanjati uređivanjem sistemskih poruka u imenskom prostoru {{ns:8}}.",
+       "trackingcategories-summary": "Ova posebna stranica je spisak kategorija koje su deo Medijavikija, one se automatski ažuriraju i njihovi nazivi se mogu menjati uređivanjem sistemskih poruka u imenskom prostoru {{ns:8}}.",
        "trackingcategories-name": "Ime poruke",
        "trackingcategories-desc": "Koje stranice se nalaze u kategoriji",
        "noindex-category-desc": "Stranice koje u sebi imaju magičnu reč <code><nowiki>__NOINDEX__</nowiki></code>.",
        "tooltip-ca-nstab-category": "Pogledajte stranicu kategorija",
        "tooltip-minoredit": "Označite izmenu kao manju",
        "tooltip-save": "Sačuvajte izmene koje ste napravili",
+       "tooltip-publish": "Objavi svoje izmene",
        "tooltip-preview": "Pregledajte svoje izmene. Poželjno je da koristite ovo dugme pre čuvanja",
        "tooltip-diff": "Pogledajte sve izmene koje ste napravili na tekstu",
        "tooltip-compareselectedversions": "Pogledajte razlike između dve izabrane izmene ove stranice.",
        "previousdiff": "← Starija izmena",
        "nextdiff": "Novija izmena →",
        "mediawarning": "<strong>Upozorenje:</strong> ova vrsta datoteke može sadržati štetan kod.\nAko ga pokrenete, Vaš računar može biti ugrožen.",
-       "imagemaxsize": "Ograničenje veličine slike:<br />''(na stranicama za opis datoteka)''",
+       "imagemaxsize": "Ograničenje veličine slike:<br /><em>(na stranicama za opis datoteka)</em>",
        "thumbsize": "Veličina minijature:",
        "widthheight": "$1 × $2",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|stranica|stranice|stranica}}",
        "mw-widgets-dateinput-placeholder-month": "GGGG-MM",
        "mw-widgets-titleinput-description-new-page": "stranica još uvek ne postoji",
        "mw-widgets-titleinput-description-redirect": "preusmerava na $1",
-       "api-error-blacklisted": "Izaberite drugačiji, opisan naziv.",
        "randomrootpage": "Slučajna korenska stranica"
 }
index 7cf0bcc..499ddeb 100644 (file)
        "protectedpagetext": "A papira disi sroto gi kenki.",
        "viewsourcetext": "Yu kan luku nanga kopi a source fu a papira disi:",
        "ns-specialprotected": "Spesrutu papira no kan kenki.",
-       "titleprotected": "[[User:$1|$1]] sroto a meki fu wan papira nanga a nen disi\nFu san ede: ''$2''.",
+       "titleprotected": "[[User:$1|$1]] sroto a meki fu wan papira nanga a nen disi\nFu san ede: <em>$2</em>.",
        "logouttext": "'''Yu psa gwe now.'''\n\nYu kan tan kebroiki {{SITENAME}} sondro nen, noso yu kan psa kon baka leki a srefi noso wan tra kebroikiman.\nSabi taki a kan gersi leki yu psa kon ete, te leki yu leygi a cache fu yu browser.",
        "yourname": "Kebroikiman nen:",
        "yourpassword": "Psa wortu:",
index 26ee88d..6b1f4dd 100644 (file)
@@ -71,7 +71,8 @@
                        "Dammråtta",
                        "Mgr",
                        "Matma Rex",
-                       "McDutchie"
+                       "McDutchie",
+                       "Larske"
                ]
        },
        "tog-underline": "Stryk under länkar:",
        "minoredit": "Mindre ändring (m)",
        "watchthis": "Bevaka denna sida",
        "savearticle": "Spara sidan",
+       "savechanges": "Spara ändringar",
        "publishpage": "Publicera sida",
+       "publishchanges": "Publicera ändringar",
        "preview": "Förhandsgranska",
        "showpreview": "Visa förhandsgranskning",
        "showdiff": "Visa ändringar",
        "content-model-css": "CSS",
        "content-json-empty-object": "Tomt objekt",
        "content-json-empty-array": "Tomt fält",
+       "deprecated-self-close-category": "Sidor som använder ogiltiga självstängda HTML-taggar",
+       "deprecated-self-close-category-desc": "Sidan använder ogiltiga självstängda HTML-taggar, som <code>&lt;b/></code> eller <code>&lt;span/></code>.  Beteendet för dessa kommer snart att ändras för att bli konsistent med HTML5-specifikationen, så dessa anses vara för föråldrade för att använda i wikitext.",
        "duplicate-args-warning": "<strong>Varning:</strong> [[:$1]] anropar [[:$2]] med mer än ett värde för parametern \"$3\". Endast det sista värdet kommer att användas.",
        "duplicate-args-category": "Sidor som använder upprepade argument i mallanrop",
        "duplicate-args-category-desc": "Sidan innehåller mallanrop som använder repeterade argument, så som <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> eller <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "rightslogtext": "Detta är en logg över ändringar av användares rättigheter.",
        "action-read": "läs denna sida",
        "action-edit": "redigera denna sida",
-       "action-createpage": "skapa sidor",
-       "action-createtalk": "skapa diskussionssidor",
+       "action-createpage": "skapa denna sida",
+       "action-createtalk": "skapa den här diskussionssidan",
        "action-createaccount": "skapa detta användarkonto",
        "action-autocreateaccount": "skapa detta externa användarkonto automatiskt",
        "action-history": "visa historiken för denna sida",
        "upload-http-error": "Ett HTTP-fel uppstod: $1",
        "upload-copy-upload-invalid-domain": "Uppladdning av kopior är inte tillgängligt från denna domän.",
        "upload-foreign-cant-upload": "Denna wiki är inte konfigurerad för att ladda upp filer till det begärda externa filförvaret.",
+       "upload-foreign-cant-load-config": "Misslyckades att läsa in konfigurationen för filuppladdningar till det externa filförvaret.",
+       "upload-dialog-disabled": "Filuppladdningar med denna dialogruta har inaktiverats på denna wiki.",
        "upload-dialog-title": "Ladda upp fil",
        "upload-dialog-button-cancel": "Avbryt",
        "upload-dialog-button-done": "Klar",
        "uploadnewversion-linktext": "Ladda upp en ny version av denna fil",
        "shared-repo-from": "från $1",
        "shared-repo": "en gemensam filförvaring",
+       "shared-repo-name-wikimediacommons": "Wikimedia Commons",
        "filepage.css": "/* CSS som skrivs här inkluderas på filbeskrivningssidan, även på utländska klientwikis */",
        "upload-disallowed-here": "Du kan inte skriva över denna fil.",
        "filerevert": "Återställ $1",
        "sp-contributions-username": "IP-adress eller användarnamn:",
        "sp-contributions-toponly": "Visa endast aktuella sidversioner",
        "sp-contributions-newonly": "Visa endast redigeringar där sidor skapas",
+       "sp-contributions-hideminor": "Dölj mindre ändringar",
        "sp-contributions-submit": "Sök",
        "whatlinkshere": "Vad som länkar hit",
        "whatlinkshere-title": "Sidor som länkar till \"$1\"",
        "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
        "mw-widgets-titleinput-description-new-page": "sidan existerar inte ännu",
        "mw-widgets-titleinput-description-redirect": "omdirigerar till $1",
-       "api-error-blacklisted": "Välj en annan beskrivande titel.",
        "sessionmanager-tie": "Kan inte kombinera flera begäransautentiseringstyper: $1.",
        "sessionprovider-generic": "$1-sessioner",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "cookiebaserade sessioner",
        "log-action-filter-newusers": "Typ av kontoskapande:",
        "log-action-filter-patrol": "Typ av patrullering:",
        "log-action-filter-protect": "Typ av skydd:",
-       "log-action-filter-rights": "Typ av rättighetsändring",
-       "log-action-filter-suppress": "Censurtyp",
+       "log-action-filter-rights": "Typ av rättighetsändring:",
+       "log-action-filter-suppress": "Censurtyp:",
        "log-action-filter-upload": "Typ av uppladdning:",
        "log-action-filter-all": "Alla",
        "log-action-filter-block-block": "Blockering",
        "linkaccounts-success-text": "Kontot länkades.",
        "linkaccounts-submit": "Länka konton",
        "unlinkaccounts": "Avlänka konton",
-       "unlinkaccounts-success": "Kontot avlänkades."
+       "unlinkaccounts-success": "Kontot avlänkades.",
+       "authenticationdatachange-ignored": "Ändringen av autentiseringsdata hanterades inte. Kanske ingen tillhandahållare har konfigurerats?"
 }
index ff9f10e..ccd1f6c 100644 (file)
        "sp-contributions-blocked-notice-anon": "இந்த IP முகவரி தற்போது தடுக்கப்பட்டுள்ளது.\nசமீபத்திய தடுப்பு குறிப்பேடு  கீழே குறிப்பிற்காக வழங்கப்பட்டுள்ளது :",
        "sp-contributions-search": "பங்களிப்புகளைத் தேடு",
        "sp-contributions-username": "ஐ.பி. அல்லது பயனர் பெயர்:",
-       "sp-contributions-toponly": "சமீபத்திய பரிசீலனைகளுக்குட்பட்ட  திருத்தங்களை மட்டும் காண்பி",
-       "sp-contributions-newonly": "பக்க உருவாக்க திருத்தங்களை மட்டும் காட்டு",
+       "sp-contributions-toponly": "சமீபத்திய மாற்றமைவுத் திருத்தங்கள் மட்டும்",
+       "sp-contributions-newonly": "பக்க உருவாக்கங்கள் மட்டும்",
+       "sp-contributions-hideminor": "சிறு தொகுப்புக்களை மறை",
        "sp-contributions-submit": "தேடுக",
        "whatlinkshere": "இப்பக்கத்தை இணைத்தவை",
        "whatlinkshere-title": "\"$1\" பக்கத்துக்கு இணைக்கப்பட்டவை",
        "markaspatrolleddiff": "ரோந்திட்டதாக குறி",
        "markaspatrolledtext": "இதனை சுற்றுக்காவல் செய்ததாகக் குறி",
        "markaspatrolledtext-file": "இக்கோப்பு பதிப்பினை ரோந்திட்டதாக குறி",
-       "markedaspatrolled": "à®°à¯\8bநà¯\8dதிà®\9fà¯\8dà®\9fதாà®\95 குறிக்கப்பட்டது",
+       "markedaspatrolled": "à®\9aà¯\81à®±à¯\8dà®±à¯\81à®\95à¯\8dà®\95ாவலà¯\8d à®\9aà¯\86யà¯\8dததாà®\95à®\95à¯\8d குறிக்கப்பட்டது",
        "markedaspatrolledtext": "தெரிவு செய்யப்பட்டத் திருத்தம் [[:$1]]  பார்வையிட்டதாக குறிக்கப்பட்டுள்ளது.",
        "rcpatroldisabled": "அண்மைய மாற்றங்களின் ரோந்து முடக்கப்பட்டுள்ளது",
        "rcpatroldisabledtext": "அண்மைய மாற்றங்களின் ரோந்து தற்காலிகமாக முடக்கப்பட்டுள்ளது.",
        "mw-widgets-dateinput-no-date": "திகதி தெரிவுச் செய்யப்படவில்லை",
        "mw-widgets-titleinput-description-new-page": "இப்பக்கம் இன்னும் உருவாக்கப்படவில்லை",
        "mw-widgets-titleinput-description-redirect": "$1-க்கு வழிமாற்று",
-       "api-error-blacklisted": "தயவுகூர்ந்து வேறு, விளக்கமான தலைப்பைத் தேர்ந்தெடுக்கவும்.",
        "sessionprovider-generic": "$1 பகுதி",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "குக்கீயை அடிபடையாக்கக் கொண்ட பகுதிகள்",
        "sessionprovider-nocookies": "குக்கீசு செயலற்று இருக்கலாம். உங்களது குக்கீசு செயலில் உள்ளது என உறுதிப்படுத்திவிட்டு மீண்டும் முயல்க.",
index 662edaf..068b570 100644 (file)
        "mainpage-description": "ಮುಖ್ಯ ಪುಟ",
        "policy-url": "Project:ನಿಯಮಾವಳಿ",
        "portal": "ಸಮುದಾಯೊ ಪುಟೊ",
-       "portal-url": "Project:ಸಮುದಾಯ ಪುಟ",
+       "portal-url": "Project:ಸಮುದಾಯ ಪುಟ",
        "privacy": "ಕಾಸಗಿ ಕಾರ್ಯೊನೀತಿ",
        "privacypage": "Project:ಕಾಸಗಿ ಕಾರ್ಯೊನೀತಿ",
        "badaccess": "ಅನುಮತಿ ದೋಷ",
        "createacct-submit": "ಪೊಸ ಕಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
        "createacct-another-submit": "ಪೊಸ ಕಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
        "createacct-benefit-heading": "{{SITENAME}}ನಿಕ್ಲೆನಂಚಿತ್ತಿನ ಜನೊಕ್ಲೆಡ್ದ್ ಉಂಡಾಪುಂಡು.",
-       "createacct-benefit-body1": "{{PLURAL:$1|ಸà²\82ಪದನà³\86|ಸà²\82ಪದನೆಲು}}",
+       "createacct-benefit-body1": "{{PLURAL:$1|ಸà²\82ಪà³\8aದನà³\86|ಸà²\82ಪದà³\8aನೆಲು}}",
        "createacct-benefit-body2": "{{PLURAL:$1|ಪುಟೊ|ಪುಟೊಕ್ಕುಲು}}",
        "createacct-benefit-body3": "{{PLURAL:$1|ಇನಾಮು|ಇನಾಮುಲು}}",
        "badretype": "ಈರ್ ಕೊರ್ನ ಪ್ರವೇಶ ಪದೆ ಬೇತೆ ಬೇತೆ ಅತ್ಂಡ್",
        "minoredit": "ಉಂದು ಎಲ್ಯ ಬದಲಾವಣೆ",
        "watchthis": "ಈ ಪುಟೊನು ತೂಲೆ",
        "savearticle": "ಪುಟೊನು ಒರಿಪಾಲೆ",
+       "savechanges": "ಬದಲಾವನೆನ್ ಒರಿಪಾಲೆ",
        "publishpage": "ಪುಟೋನು ಪ್ರಕಟಿಸಲೇ",
+       "publishchanges": "ಬದಲಾವನೆನ್ ತೋಜಾಲೆ",
        "preview": "ಮುನ್ನೋಟ",
        "showpreview": "ಮುನ್ನೋಟೊ ತೋಜಾವು",
        "showdiff": "ಬದಲಾವಣೆಲೆನ್ ತೋಜಾವ್",
        "mergehistory-reason": "ಕಾರಣ:",
        "revertmerge": "ಅನ್-ಮರ್ಜ್ ಮಲ್ಪುಲೆ",
        "history-title": "\"$1\" ಪುಟೊತ ಆವೃತ್ತಿ ಇತಿಹಾಸೊ",
-       "difference-title": "ಪಿರ à²ªà²°à²¿à²¸à³\80ಲನà³\86ದ à²¨à²¡à³\81ತ à²µà³\8dಯತà³\8dವಾಸೊ \"$1\"",
+       "difference-title": "ಪಿರ à²ªà²°à²¿à²¸à³\80ಲನà³\86ದ à²¨à²¡à³\81ತ à²µà³\8dಯತà³\8dಯಾಸೊ \"$1\"",
        "lineno": "$1ನೇ ಸಾಲ್:",
        "compareselectedversions": "ಆಯ್ಕೆ ಮಲ್ತಿನ ಆವೃತ್ತಿಲೆನ್ ಹೊಂದಾಣಿಕೆ ಮಲ್ತ್ ತೂಲೆ",
        "editundo": "ದುಂಬುದಲೆಕೊ",
index 5687b5c..a224d42 100644 (file)
        "gotaccount": "Ó iha konta ona? '''$1'''.",
        "gotaccountlink": "Log in",
        "userexists": "Naran uza-na'in ne'e ona iha wiki.\nFavór ida lori naran seluk.",
-       "nosuchuser": "Konta uza-na'in (naran \"$1\") la iha.\nUser names are case sensitive.\nCheck your spelling, ka [[Special:UserLogin/signup|kria konta foun]].",
+       "nosuchuser": "Konta uza-na'in (naran \"$1\") la iha.\nUser names are case sensitive.\nCheck your spelling, ka [[Special:CreateAccount|kria konta foun]].",
        "nouserspecified": "Ó tenke espesífiku naran uza-na'in ida.",
        "accountcreated": "Registrar tiha uza-na'in",
        "loginlanguagelabel": "Lian: $1",
        "filedelete-reason-otherlist": "Motivu seluk",
        "filedelete-edit-reasonlist": "Edita lista motivu nian",
        "randompage": "Pájina ruma",
+       "randomincategory-submit": "Bá",
        "statistics": "Estatístika",
        "brokenredirects-edit": "edita",
        "brokenredirects-delete": "halakon",
        "allpagessubmit": "Bá",
        "allpagesprefix": "Hatudu pájina sira ho prefiksu:",
        "categories": "Kategoria sira",
-       "special-categories-sort-abc": "tau tuir alfabetu",
        "linksearch-ns": "Espasu pájina nian:",
        "linksearch-ok": "Buka",
        "listusers-submit": "Hatudu",
        "ipb_already_blocked": "Ema ruma blokeiu \"$1\" tiha ona",
        "move-page": "Book $1",
        "move-page-legend": "Book pájina",
-       "movearticle": "Book pájina:",
        "movenotallowed": "Ó la bele book pájina sira.",
        "newtitle": "Naran foun:",
        "move-watch": "Hateke pájina ne'e",
        "movetalk": "Book pájina diskusaun mós",
        "movelogpage": "Lista book",
        "movereason": "Motivu:",
-       "delete_and_move": "Halakon ho book",
        "delete_and_move_confirm": "Sin, halakon pájina",
        "export": "Esporta pájina sira",
        "export-submit": "Esporta",
index 89f476c..0e572ce 100644 (file)
@@ -7,14 +7,15 @@
                        "Wantok",
                        "Wytukaze",
                        "לערי ריינהארט",
-                       "सरोज कुमार ढकाल"
+                       "सरोज कुमार ढकाल",
+                       "Tacsipacsi"
                ]
        },
        "tog-underline": "Putim lain ananit long ol link:",
        "tog-hideminor": "Noken soim ol liklik senis insait long ol nupela senis",
        "tog-hidepatrolled": "Noken soim ol lukluk senis insait long ol nupela senis",
        "tog-newpageshidepatrolled": "Noken soim ol lukluk senis insait long ol nupela pes",
-       "tog-extendwatchlist": " Larim lukautbuk i go longpela long soim olgeta senis, long halivim tasol bihain tru",
+       "tog-extendwatchlist": "Larim lukautbuk i go longpela long soim olgeta senis, long halivim tasol bihain tru",
        "tog-usenewrc": "Moa beta stail bilong nupela senis na lukautbuk (i nidim JavaScript)",
        "tog-numberheadings": "Putim ol namba i go long wanwan hap bilong pes",
        "tog-showtoolbar": "Soim ol liklik link long wokim senis kwiktaim (i nidim JavaScript)",
        "listgrouprights-group": "Grup",
        "listgrouprights-members": "(lista bilong ol memba)",
        "emailuser": "E-mel dispela yusa",
-       "emailpage": "E-mel yusa",
        "defemailsubject": "{{SITENAME}} e-mel",
        "noemailtitle": "Nogat e-mel",
        "emailfrom": "I kam long:",
        "blocklogpage": "Ripot long pasim ol yusa",
        "move-page": "Surikim $1",
        "move-page-legend": "Surikim pes",
-       "movearticle": "Surikim pes:",
        "newtitle": "Nupela nem bilong pes:",
        "movepagebtn": "Surikim",
        "pagemovedsub": "Pes i surik pinis",
index 7c2ceda..a4a02e3 100644 (file)
        "tog-watchdefault": "Değişiklik yaptığım sayfaları ve dosyaları izleme listeme ekle",
        "tog-watchmoves": "Taşıdığım sayfaları ve dosyaları izleme listeme ekle",
        "tog-watchdeletion": "Sildiğim sayfaları ve dosyaları izleme listeme ekle",
+       "tog-watchuploads": "Yüklediğim yeni dosyaları izleme listeme ekle",
        "tog-watchrollback": "Geridönüş yaptığım sayfaları izleme listeme ekle",
        "tog-minordefault": "Varsayılan olarak, bütün düzenlemelerimi küçük değişiklik olarak işaretle",
        "tog-previewontop": "Ön izlemeyi, düzenleme kutusunun üstünde göster",
        "tog-ccmeonemails": "Diğer kullanıcılara gönderdiğim e-postaların bir kopyasını bana da gönder",
        "tog-diffonly": "Sayfa içeriğini, sürüm farklarının altında gösterme",
        "tog-showhiddencats": "Gizli kategorileri göster",
-       "tog-norollbackdiff": "Geri döndürme uygulandıktan sonra değişiklik görünümünü es geç",
+       "tog-norollbackdiff": "Geri döndürme uygulandıktan sonra farkları gösterme",
        "tog-useeditwarning": "Yaptığım değişiklikleri kaydetmeden sayfayı kapatırken beni uyar",
        "tog-prefershttps": "Oturum açarken her zaman güvenli bağlantı kullan",
        "underline-always": "Daima",
        "password-change-forbidden": "Bu vikide parolanızı değiştiremezsiniz.",
        "externaldberror": "Ya doğrulama veritabanı hatası var ya da kullanıcı hesabınızı güncellemeye yetkiniz yok.",
        "login": "Oturum aç",
+       "login-security": "Kimliğinizi doğrulayın",
        "nav-login-createaccount": "Oturum aç / hesap oluştur",
        "userlogin": "Oturum aç / hesap oluştur",
        "userloginnocreate": "Giriş yap",
        "userlogin-resetpassword-link": "Parolanızı mı unuttunuz?",
        "userlogin-helplink2": "Oturum açma konusunda yardım alın",
        "userlogin-loggedin": "Zaten {{GENDER:$1|$1}} olarak oturum açtınız.\nBaşka bir kullanıcı olarak oturum açmak için aşağıdaki formu kullanın.",
+       "userlogin-reauth": "{{GENDER:$1|$1}} olduğunuzu doğrulamak için tekrar giriş yapmalısınız.",
        "userlogin-createanother": "Başka bir hesap oluşturun",
        "createacct-emailrequired": "E-posta adresi",
        "createacct-emailoptional": "E-posta adresi (isteğe bağlı)",
        "createacct-reason-ph": "Neden başka bir hesap oluşturuyorsunuz",
        "createacct-submit": "Hesabınızı oluşturun",
        "createacct-another-submit": "Hesap oluşturun",
+       "createacct-continue-submit": "Hesap oluşturmaya devam et",
+       "createacct-another-continue-submit": "Hesap oluşturmaya devam et",
        "createacct-benefit-heading": "{{SITENAME}} sizin gibi insanlar tarafından geliştirilir.",
        "createacct-benefit-body1": "{{PLURAL:$1|düzenleme|düzenleme}}",
        "createacct-benefit-body2": "{{PLURAL:$1|madde|madde}}",
        "nocookiesnew": "Kullanıcı hesabı oluşturuldu ama oturum açamadınız.\nOturum açmak için {{SITENAME}} çerezleri kullanır.\nÇerez kullanımı devredışı.\nLütfen çerez kullanımını açınız ve yeni kullanıcı adınız ve şifrenizle oturum açınız.",
        "nocookieslogin": "{{SITENAME}} sitesinde oturum açabilmek için çerezlerinizin açık olması gerekiyor. Sizin çerezleriniz kapalı. Lütfen açınız ve bir daha deneyiniz.",
        "nocookiesfornew": "Kullanıcı hesabı oluşturulamadı, sorunun kaynağını da tespit edemedik.\nÇerezlerin açık olduğundan emin olun ve bu sayfayı yeniden yükleyip tekrar deneyin.",
+       "createacct-loginerror": "Hesap başarılı şekilde oluşturuldu ancak otomatik olarak oturumunuz açılmadı. Lütfen [[Special:UserLogin|manuel giriş]] sayfasına gidin.",
        "noname": "Geçerli bir kullanıcı adı girmediniz.",
        "loginsuccesstitle": "Oturum açıldı",
        "loginsuccess": "'''{{SITENAME}} üzerinde \"$1\" kullanıcı adıyla oturum açtınız.'''",
        "noemail": "\"$1\" adlı kullanıcıya kayıtlı bir e-posta adresi yok.",
        "noemailcreate": "Geçerli bir e-posta adresi sağlamalısınız",
        "passwordsent": "\"$1\" adına kayıtlı e-posta adresine yeni bir parola gönderildi. Oturumu, lütfen, iletiyi aldıktan sonra açın.",
-       "blocked-mailpassword": "Siteye erişiminiz engellenmiş olduğundan, yeni şifre gönderilme işlemi yapılamamaktadır.",
+       "blocked-mailpassword": "IP adresiniz düzenleme yapmaya engellenmiştir. Kötüye kullanımın önüne geçmek için söz konusu IP adresinden şifre kurtarmaya izin verilmemektedir.",
        "eauthentsent": "Belirtilen e-posta adresine onay kodu içeren bir e-posta gönderildi.\nHesaba başka bir e-posta gönderilmeden önce, e-postadaki yönergeleri uygulayıp, hesabın gerçekten size ait olduğunu onaylamanız gerekir.",
        "throttled-mailpassword": "Bir parola sıfırlama e-postası son {{PLURAL:$1|bir saat|$1 saat}} içinde zaten gönderildi. Hizmeti kötüye kullanmayı önlemek için, her {{PLURAL:$1|bir saatte|$1 saatte}} sadece bir parola sıfırlama e-postası gönderilecektir.",
        "mailerror": "E-posta gönderim hatası: $1",
        "createaccount-title": "{{SITENAME}} için yeni kullanıcı hesabı oluşturulması",
        "createaccount-text": "Birisi {{SITENAME}} sitesinde ($4) sizin e-posta adresinizi kullarak, şifresi \"$3\" olan, \"$2\" isimli bir hesap oluşturdu.\n\nSiteye giriş yapmalı ve parolanızı değiştirmelisiniz.\n\nEğer kullanıcı hesabını yanlışlıkla oluşturmuş iseniz, bu mesajı yoksayabilirsiniz.",
        "login-throttled": "Çok fazla yeni oturum açma girişiminde bulundunuz.\nDevam etmeden önce $1 bekleyin.",
-       "login-abort-generic": "Girişiniz başarısız - iptal edilmiş",
+       "login-abort-generic": "Giriş başarısız - Durduruldu",
        "login-migrated-generic": "Hesabınız aktarılmış ve kullanıcı adınız artık bu vikide yok.",
        "loginlanguagelabel": "Dil: $1",
        "suspicious-userlogout": "Çıkış isteğiniz reddedildi çünkü bozuk bir tarayıcı ya da önbellekli vekil tarafından gönerilmiş gibi görünüyor.",
        "createacct-another-realname-tip": "Gerçek adınız isteğe bağlıdır.\nEğer gerçek adınızı belirtirseniz, çalışmalarınıza atıfta bulunulması için de kullanılacaktır.",
        "pt-login": "Giriş yap",
        "pt-login-button": "Oturum aç",
+       "pt-login-continue-button": "Oturum açmaya devam edin",
        "pt-createaccount": "Hesap oluştur",
        "pt-userlogout": "Oturumu kapat",
        "php-mail-error-unknown": "PHP's mail() fonksiyonunda bilinmeyen hata",
        "botpasswords-label-cancel": "İptal",
        "botpasswords-label-delete": "Sil",
        "botpasswords-label-resetpassword": "Şifreyi sıfırla",
+       "botpasswords-label-grants": "Geçerli ayrıcalıklar:",
        "botpasswords-label-restrictions": "Kullanım kısıtlamaları:",
        "botpasswords-label-grants-column": "Verilen",
        "botpasswords-bad-appid": "Bot ismi \"$1\" geçerli değil.",
        "botpasswords-insert-failed": "Bot adı \"$1\" eklenemedi. Zaten eklenmiş olmalı?",
        "botpasswords-update-failed": "Bot ismini \"$1\" olarak güncelleme başarısız oldu. Silinmiş olabilir mi?",
        "botpasswords-created-title": "Bot şifresi oluşturuldu.",
-       "botpasswords-created-body": "Bot şifresi \"$1\" başarıyla oluşturuldu.",
+       "botpasswords-created-body": "\"$2\" adlı kullanıcının \"$1\" isimli botu için şifre oluşturuldu.",
        "botpasswords-updated-title": "Bot şifresi guncellendi",
-       "botpasswords-updated-body": "Bot şifresi \"$1\" başarıyla güncellendi.",
+       "botpasswords-updated-body": "\"$2\" adlı kullanıcının \"$1\" isimli botunun şifresi güncellendi.",
        "botpasswords-deleted-title": "Bot şifresi silindi.",
-       "botpasswords-deleted-body": "Bot şifresi $1 silinmiş.",
+       "botpasswords-deleted-body": "\"$2\" adlı kullanıcının \"$1\" isimli botunun şifresi silindi.",
+       "botpasswords-newpassword": "<strong>$1</strong> ile oturum açmak için yeni şifre: <strong>$2</strong>. <em>İlerde başvurmak için lütfen kaydedin.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider kullanılamaz.",
+       "botpasswords-restriction-failed": "Bot şifresi sınırlamaları oturum açmayı engelledi.",
+       "botpasswords-invalid-name": "Belirtilen kullanıcı adı bot şifresi ayırıcısını içermiyor (\"$1\").",
        "resetpass_forbidden": "Parolalar değiştirilememektedir",
+       "resetpass_forbidden-reason": "Şifre değiştirilemedi: $1",
        "resetpass-no-info": "Bu sayfaya doğrudan erişmek için oturum açmanız gereklidir.",
        "resetpass-submit-loggedin": "Parolayı değiştir",
        "resetpass-submit-cancel": "İptal",
        "resetpass-abort-generic": "Parola değişikliği bir uzantı tarafından iptal edildi.",
        "resetpass-expired": "Parolanızın süresi bitti. Lütfen, giriş için yeni bir parola oluşturun.",
        "resetpass-expired-soft": "Parolanızın süresi bitti ve değiştirilmesi gerekiyor. Lütfen, yeni bir parola seçin veya daha sonra oluşturmak için \"{{int:authprovider-resetpass-skip-label}}\" butonuna tıklayın.",
-       "resetpass-validity-soft": "Parolanız geçerli değiş: $1\n\nLütfen yeni bir şifre belirleyin veya daha sonra sıfırlamak için \"{{int:authprovider-resetpass-skip-label}}\" bağlantısını tıklayın.",
+       "resetpass-validity-soft": "Parolanız geçerli değil: $1\n\nLütfen yeni bir şifre belirleyin ya da daha sonra sıfırlamak için \"{{int:authprovider-resetpass-skip-label}}\" bağlantısını tıklayın.",
        "passwordreset": "Parola sıfırlama",
        "passwordreset-text-one": "Parolanızı sıfırlamak için bu formu doldurun.",
        "passwordreset-text-many": "{{PLURAL:$1|E-posta ile geçici bir parola almak için alanlardan birini doldurun.}}",
        "passwordreset-emailtext-user": "$1 adlı kullanıcı, {{SITENAME}} ($4) için hesap bilgilerinizin hatırlatılmasını istedi. Aşağıdaki kullanıcı {{PLURAL:$3|hesabı|hesapları}} bu e-posta adresiyle ilişkili:\n\n$2\n\n{{PLURAL:$3|Bu geçici şifre|Bu geçici şifreler}} {{PLURAL:$5|bir gün|$5  gün}} geçerlidir.\nBu geçici parola ile giriş yapın ve yeni bir şifre seçin. Bu talep bir başkasına aitse veya şifrenizi hatırladıysanız ve artık şifrenizi değiştirmek istemiyorsanız; bu iletiyi önemsemeyerek eski şifrenizi kullanmaya devam edebilirsiniz.",
        "passwordreset-emailelement": "Kullanıcı adı: \n$1\n\nGeçici şifre: \n$2",
        "passwordreset-emailsentemail": "Eğer bu e-posta adresi hesabınızın bağlı olduğu adres ise, bir parola sıfırlama e-postası gönderilecektir.",
+       "passwordreset-emailsentusername": "Eğer bu e-posta adresi hesabınızın bağlı olduğu adres ise, bir parola sıfırlama e-postası gönderilecektir.",
        "passwordreset-emailsent-capture": "Aşağıda gözüktüğü gibi bir parola sıfırlama e-postası gönderildi.",
        "passwordreset-emailerror-capture": "Aşağıda gözüktüğü gibi bir parola sıfırlama e-postası oluşturuldu ancak {{GENDER:$2|kullanıcıya}} gönderme işlemi başarısız oldu: $1",
+       "passwordreset-invalideamil": "Geçersiz e-posta adresi",
+       "passwordreset-nodata": "Ne bir kullanıcı adı ne de bir e-posta adresi verildi.",
        "changeemail": "E-posta adresini değiştir veya çıkar",
-       "changeemail-header": "Hesabın e-posta adresini değiştirin",
+       "changeemail-header": "E-posta adresinizi değiştirmek için bu formu doldurun. Eğer e-posta adresini hesabınızdan kaldırmak istiyorsanız formu gönderirken e-posta adresi bölümünü boş bırakın.",
        "changeemail-passwordrequired": "Bu değişikliği onaylamak için şifrenizi girmeniz gerekir.",
        "changeemail-no-info": "Bu sayfaya doğrudan erişmek için oturum açmanız gereklidir.",
        "changeemail-oldemail": "Mevcut E-posta adresi:",
        "changeemail-newemail": "Yeni E-posta adresi:",
+       "changeemail-newemail-help": "E-posta adresinizi silmek istiyorsanız bu alan boş bırakılmalıdır. E-posta adresi silindikten sonra unutulan şifreyi sıfırlayamazsınız ve bu Viki'den e-posta alamazsınız.",
        "changeemail-none": "(yok)",
        "changeemail-password": "{{SITENAME}} parolanız:",
        "changeemail-submit": "E-posta'yı değiştir",
        "minoredit": "Bu küçük bir değişiklik",
        "watchthis": "Bu sayfayı izle",
        "savearticle": "Sayfayı kaydet",
+       "savechanges": "Değişiklikleri kaydet",
+       "publishpage": "Sayfayı yayımla",
        "preview": "Önizleme",
        "showpreview": "Önizlemeyi göster",
        "showdiff": "Değişiklikleri göster",
        "accmailtext": "[[User talk:$1|$1]] için rastgele oluşturulan parola $2 adresine gönderildi.\n\nBu yeni hesap için parola, giriş yapıldıktan sonra ''[[Special:ChangePassword|parolayı değiştir]]'' bölümünde değiştirilebilir.",
        "newarticle": "(Yeni)",
        "newarticletext": "Henüz varolmayan bir sayfaya konulmuş bir bağlantıya tıkladınız.\nSayfayı oluşturmak için aşağıdaki metin kutusunu kullanın. ([$1 yardım sayfasına] bakınız).\nBuraya yanlışlıkla geldiyseniz tarayıcınızın  <strong>geri </strong> tuşuna tıklayın.",
-       "anontalkpagetext": "----''Bu sayfa henüz bir kullanıcı hesabı oluşturmamış veya hesabını kullanmayan bir anonim kullanıcının mesaj sayfasıdır. Bu nedenle bu kişiyi belirtmek için rakamsal IP adresini kullanmak zorundayız. Bu gibi IP adresleri birçok kullanıcı tarafından paylaşılabilir. Eğer siz de bir anonim kullanıcıysanız ve size sizin ilginiz olmayan iletiler geliyorsa, lütfen diğer anonim kullanıcılarla olabilecek olan karmaşayı önlemek için [[Special:CreateAccount|bir hesap edinin]] veya [[Special:UserLogin|oturum açın]].''",
+       "anontalkpagetext": "----\n<em>Bu sayfa henüz bir kullanıcı hesabı oluşturmamış veya hesabını kullanmayan bir anonim kullanıcının mesaj sayfasıdır.</em>\nBu nedenle bu kişiyi belirtmek için rakamsal IP adresini kullanmak zorundayız.\nBu gibi IP adresleri birçok kullanıcı tarafından paylaşılabilir.\nEğer siz de bir anonim kullanıcıysanız ve size sizin ilginiz olmayan iletiler geliyorsa, lütfen diğer anonim kullanıcılarla olabilecek olan karmaşayı önlemek için [[Special:CreateAccount|bir hesap edinin]] veya [[Special:UserLogin|oturum açın]].",
        "noarticletext": "Bu sayfa şu anda boştur.\nBu başlığı [[Special:Search/{{PAGENAME}}|diğer sayfalarda arayabilir]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ilgili kayıtları arayabilir],\nya da bu sayfayı [{{fullurl:{{FULLPAGENAME}}|action=edit}} oluşturabilirsiniz]</span>.",
        "noarticletext-nopermission": "Bu sayfa şu anda boştur. \nBu başlığı [[Special:Search/{{PAGENAME}}|diğer sayfalarda arayabilir]] ya da <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ilgili kayıtları tarayabilirsiniz]</span>, fakat sayfayı oluşturma yetkiniz bulunmamaktadır.",
        "missing-revision": "\"{{FULLPAGENAME}}\" sayfasının #$1 sürümü yok.\n\nBu duruma genellikle silinmiş bir sayfaya eski tarihli bir bağlantının takip edilmesi neden olur.\n\nDaha fazla detaylı bilgi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sayfasında bulunabilir].",
        "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" kullanıcı hesabı kayıtlı değil. Bu sayfayı oluşturmak/değiştirmek istiyorsanız lütfen kontrol edin.",
        "userpage-userdoesnotexist-view": "\"$1\" kullanıcı hesabı kayıtlı değil.",
        "blocked-notice-logextract": "Bu kullanıcı şuanda engellenmiş.\nSon engelleme günlüğü girdisi referans için aşağıda sağlanmıştır:",
-       "clearyourcache": "'''Not:''' Kaydettikten sonra değişiklikleri görmek için tarayıcınızın önbelleğini temizlemeniz gerekebilir.\n* '''Firefox / Safari:''' ''Shift'' tuşuna basılıyken \"Yeniden yükle\"'ye tıklayın ya da \"Ctrl-F5\" ya da ''Ctrl-R'' yapın (Mac için '⌘-R'').\n* '''Google Chrome:''' ''Ctrl-Shift-R'''ye basın. (Mac için ''⌘-Shift-R'')\n* '''Internet Explorer:''' ''Ctrl'' basılıyken ''Yenile'''ye tıklayın ya da ''Ctrl-F5'' yapın.\n* '''Opera:''' ''Araçlar → Tercihler'''den önbelliği temizleyin.",
+       "clearyourcache": "<strong>Note:</strong> Kaydettikten sonra değişiklikleri görmek için tarayıcınızın önbelleğini temizlemeniz gerekebilir.\n* <strong>Firefox / Safari:</strong> <em>Shift</em> tuşuna basılıyken <em>Yeniden yükle</em>'ye tıklayın ya da <em>Ctrl-F5</em> ya da <em>Ctrl-R</em> yapın (Mac için <em>⌘-R</em>).\n* <strong>Google Chrome:</strong> <em>Ctrl-Shift-R</em>'ye basın. (Mac için <em>⌘-Shift-R</em>)\n* <strong>Internet Explorer:</strong> <em>Ctrl</em> basılıyken <em>Yenile</em>'ye tıklayın ya da <em>Ctrl-F5</em> yapın.\n* <strong>Opera:</strong> <em>Araçlar → Tercihler</em>'den önbelliği temizleyin.",
        "usercssyoucanpreview": "'''İpucu:''' Kaydetmeden önce \"{{int:showpreview}}\"e tıklayarak yeni CSSinizi deneyin.",
        "userjsyoucanpreview": "'''İpucu:''' Kaydetmeden önce \"{{int:showpreview}}\"e tıklayarak yeni JavaScript'inizi test edin.",
        "usercsspreview": "'''Sadece kullanıcı CSS dosyanızın önizlemesini görüyorsun.''' '''Kullanıcı CSS dosyası henüz kaydolmadı!'''",
        "previewnote": "'''Bunun yalnızca bir ön izleme olduğunu unutmayın.'''\nYaptığınız değişiklikler henüz kaydedilmedi!",
        "continue-editing": "Düzenlemeye devam et",
        "previewconflict": "Bu önizleme metin düzenleme kutucuğunun üstünde, maddenin eğer değişikliklerinizi kaydetmeyi seçerseniz nasıl görüneceğini yansıtır.",
-       "session_fail_preview": "Özür dileriz. Oturum açılması ile ilgili veri kaybından kaynaklı değişikliğinizi kaydedemedik. Lütfen tekrar deneyiniz. Eğer bu yöntem işe yaramazsa oturumu kapatıp tekrar sisteme geri giriş yapınız.",
+       "session_fail_preview": "Özür dileriz. Oturum açılması ile ilgili veri kaybından kaynaklı değişikliğinizi kaydedemedik.\n\nLütfen tekrar deneyiniz. Eğer bu yöntem işe yaramazsa oturumu kapatıp tekrar sisteme geri giriş yapınız.",
        "session_fail_preview_html": "'''Üzgünüz! Oturum verisinin kaybolmasından dolayı düzenlemenizi işleme geçiremeyeceğiz.'''\n\n''Çünkü {{SITENAME}} sitesinde raw HTML etkindir, önizleme JavaScript saldırılarına önlem olarak gizlenmiştir.''\n\n'''Eğer bu haklı bir düzenleme girişimiyse, lütfen yeniden deneyin. Eğer hala çalışmazsa, [[Special:UserLogout|çıkış yapıp]] yeniden oturum açmayı deneyin.'''",
        "token_suffix_mismatch": "'''Değişikliğiniz geri çevrildi çünkü alıcınız düzenleme kutucuğundaki noktalama işaretlerini bozdu.\nDeğişikliğiniz, sayfa metninde bozulmayı önlemek için geri çevrildi.\nEğer sorunlu bir web-tabanlı anonim proksi servisi kullanıyorsanız bu olay bazen gerçekleşebilir.'''",
        "edit_form_incomplete": "'''Değişiklik formu için bazı sunuculara erişilemedi; yaptığınız değişiklikler bozulmamıştır, gözden geçirip tekrar deneyiniz.'''",
        "revdelete-unsuppress": "Geri döndürülmüş revizyonlardaki kısıtlamaları kaldır",
        "revdelete-log": "Neden:",
        "revdelete-submit": "Seçilen {{PLURAL:$1|sürüme|sürümlere}} uygula",
-       "revdelete-success": "'''Revizyon görünürlüğü başarıyla güncellendi.'''",
+       "revdelete-success": "Revizyon görünürlüğü güncellendi.",
        "revdelete-failure": "'''Revizyon görünürlüğü güncellenemiyor:'''\n$1",
        "logdelete-success": "Günlük görünürlüğü ayarlandı.",
        "logdelete-failure": "'''Günlük görünürlüğü ayarlanamadı:'''\n$1",
        "mergehistory-empty": "Hiçbir sürüm birleştirilemez.",
        "mergehistory-done": "$1 sayfasının $3 {{PLURAL:$3|revizyonu|revizyonu}} başarıyla [[:$2]] içine birleştirildi.",
        "mergehistory-fail": "Geçmiş birleştirmesi gerçekleştirlemiyor, lütfen sayfa ve zaman parametrelerini yeniden kontrol edin.",
+       "mergehistory-fail-bad-timestamp": "Zaman damgası geçersiz.",
+       "mergehistory-fail-invalid-source": "Kaynak sayfa geçersiz.",
        "mergehistory-fail-invalid-dest": "Hedef sayfa geçersiz.",
+       "mergehistory-fail-no-change": "Geçmiş birleştirme hiçbir sürümü birleştirmedi. Lütfen sayfa ve zaman parametrelerini bir kez daha kontrol edin.",
        "mergehistory-fail-permission": "Geçmiş birleştirmek için gerekli izinler yok.",
+       "mergehistory-fail-self-merge": "Kaynak ve hedef sayfa aynı.",
        "mergehistory-fail-toobig": "Limit olarak belirlenen $1 {{PLURAL:$1|sürümden|sürümden}} daha fazlasını taşımak gerekeceği için geçmiş birleştirme gerçekleştirilemiyor.",
        "mergehistory-no-source": "Kaynak sayfa $1 bulunmamaktadır.",
        "mergehistory-no-destination": "Hedef sayfa $1 bulunmamaktadır.",
        "prefs-help-recentchangescount": "Bu, son değişiklikleri, sayfa geçmişlerini ve günlükleri içerir.",
        "prefs-help-watchlist-token2": "Bu izleme listenizin gizli anahtarıdır. Anahtarı bilen herkes izleme listenizi görebilir. Bu nedenle kimseyle paylaşmayın. [[Special:ResetTokens|Bu anahtarı sıfırlamak isterseniz buraya tıklayın]].",
        "savedprefs": "Tercihleriniz kaydedildi.",
+       "savedrights": "{{GENDER:$1|$1}} için kullanıcı hakları kaydedildi.",
        "timezonelegend": "Zaman dilimi:",
        "localtime": "Yerel saat:",
        "timezoneuseserverdefault": "Viki varsayılanını kullanın ($1)",
        "filerevert-legend": "Dosyayı eski haline döndür",
        "filerevert-intro": "'''[[Media:$1|$1]]''' medyasının [$4 $3, $2 tarihli sürüm]ünü geri getiriyorsunuz.",
        "filerevert-comment": "Neden:",
-       "filerevert-defaultcomment": "$2, $1 tarihli sürüme geri döndürüldü",
+       "filerevert-defaultcomment": "$2, $1 ($3) tarihli sürüme geri döndürüldü",
        "filerevert-submit": "Eski haline döndür",
        "filerevert-success": "'''[[Media:$1|$1]]''' dosyası [$4 $3, $2 tarihli sürüme] geri döndürüldü.",
        "filerevert-badversion": "Bu dosyanın verilen zaman bilgisine sahip önceki bir yerel sürümü yok.",
        "protectedpages-performer": "Koruyan kullanıcı",
        "protectedpages-params": "Koruma parametreleri",
        "protectedpages-reason": "Sebep",
+       "protectedpages-submit": "Sayfaları görüntüle",
        "protectedpages-unknown-timestamp": "Bilinmiyor",
        "protectedpages-unknown-performer": "Bilinmeyen kullanıcı",
        "protectedtitles": "Korunan başlıklar",
        "protectedtitles-summary": "Bu sayfa şu anda oluşturulması korunan başlıkları listeler. Koruma altında olan mevcut sayfaların listesi için [[{{#special:ProtectedPages}}|{{int:protectedpages}}]] sayfasına bakın.",
        "protectedtitlesempty": "Şu anda, bu parametrelerle korunan hiç bir başlık yok.",
+       "protectedtitles-submit": "Başlıkları görüntüle",
        "listusers": "Kullanıcı listesi",
        "listusers-editsonly": "Sadece değişiklik yapan kullanıcıları göster",
        "listusers-creationsort": "Oluşturma tarihine göre sırala",
        "apisandbox-submit": "İstek yap",
        "apisandbox-reset": "Temizle",
        "apisandbox-retry": "Tekrar dene",
+       "apisandbox-helpurls": "Yardım bağlantıları",
        "apisandbox-examples": "Örnekler",
-       "apisandbox-results": "Sonuç",
+       "apisandbox-results": "Sonuçlar",
        "apisandbox-request-url-label": "İstek URL:",
        "apisandbox-request-time": "İstek zamanı: $1",
        "booksources": "Kaynak kitaplar",
        "sp-contributions-username": "IP adresi veya kullanıcı adı:",
        "sp-contributions-toponly": "Sadece son revizyon olan değişiklikleri göster",
        "sp-contributions-newonly": "Yalnızca yeni sayfa oluşturan değişiklikleri görüntüle",
+       "sp-contributions-hideminor": "Küçük değişiklikleri gizle",
        "sp-contributions-submit": "Ara",
        "whatlinkshere": "Sayfaya bağlantılar",
        "whatlinkshere-title": "\"$1\" maddesine bağlantı veren sayfalar",
        "cant-move-to-user-page": "Bir sayfayı, bir kullanıcı sayfasına taşımaya izniniz yok (bir kullanıcı altsayfası dışında).",
        "cant-move-category-page": "Kategori sayfalarını taşıma yetkiniz yok.",
        "cant-move-to-category-page": "Bir sayfayı, bir kategoriye taşımaya izniniz yok.",
-       "newtitle": "Yeni isim",
+       "newtitle": "Yeni başlık:",
        "move-watch": "Bu sayfayı izle",
        "movepagebtn": "İsmi değiştir",
        "pagemovedsub": "İsim değişikliği tamamlandı.",
        "movenosubpage": "Bu sayfanın altsayfası yoktur.",
        "movereason": "Neden:",
        "revertmove": "geri al",
-       "delete_and_move_text": "==Silinmesi gerekiyor==\n\n\"[[:$1]]\" isimli bir sayfa zaten mevcut. O sayfayı silerek, isim değişikliğini gerçekleştirmeye devam etmek istiyor musunuz?",
+       "delete_and_move_text": "Hedef sayfa olan \"[[:$1]]\" zaten mevcut. Taşımayı gerçekleştirebilmek için, mevcut sayfayı silmek ister misiniz?",
        "delete_and_move_confirm": "Evet, sayfayı sil",
        "delete_and_move_reason": "[[$1]] sayfasının isim değişikliğinin gerçekleşmesi için silindi.",
        "selfmove": "Olmasını istediğiniz isim ile mevcut isim aynı. Değişiklik mümkün değil.",
        "exif-compression-6": "JPEG",
        "exif-copyrighted-true": "Telif hakkı",
        "exif-copyrighted-false": "Telif Hakkı durumu belirtilmemiş",
+       "exif-photometricinterpretation-1": "Siyah ve beyaz (Siyah 0)",
        "exif-photometricinterpretation-2": "RGB",
        "exif-photometricinterpretation-6": "YCbCr",
        "exif-unknowndate": "Bilinmeyen zaman",
        "confirmemail_body_set": "Birisi, muhtemelen siz, $1 IP adresiyle {{SITENAME}} sitesinde \"$2\" kullanıcı hesabının e-posta adresi olarak bu e-posta adresini belirtti.\n\nBu hesabın gerçekten size ait olduğunu onaylamak ve {{SITENAME}} sitesindeki e-posta işlevlerini aktif etmek için alttaki bağlantıyı tarayıcınızda açmanız gerekiyor:\n\n$3\n\nEğer bu hesap size ait değilse, e-posta adresi onayını iptal etmek için alttaki bağlantıyı takip edin:\n\n$5\n\nBu onay kodu $4 tarihine kadar geçerlidir.",
        "confirmemail_invalidated": "E-posta adresi doğrulaması iptal edildi",
        "invalidateemail": "E-posta doğrulamasını iptal et",
+       "notificationemail_subject_changed": "{{SITENAME}} sitesine kayıtlı e-posta adresi değiştirildi",
        "scarytranscludedisabled": "[Vikilerarası çapraz ekleme devre dışı]",
        "scarytranscludefailed": "[$1 için şablon alımı başarısız oldu]",
        "scarytranscludefailed-httpstatus": "[$1 için şablon alımı başarısız oldu: HTTP $2]",
        "watchlistedit-raw-done": "İzleme listeniz güncellendi.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 başlık|$1 başlık}} eklendi:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 başlık|$1 başlık}} silindi:",
-       "watchlistedit-clear-title": "İzleme listesi temizlendi",
+       "watchlistedit-clear-title": "İzleme listesini temizle",
        "watchlistedit-clear-legend": "İzleme listesini temizle",
        "watchlistedit-clear-explain": "İzleme listenizdeki tüm başlıklar silinecek",
        "watchlistedit-clear-titles": "Başlıklar:",
        "hijri-calendar-m9": "Ramazan",
        "hijri-calendar-m10": "Şevval",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|mesaj]])",
+       "timezone-local": "Yerel",
        "duplicate-defaultsort": "'''Uyarı:''' Varsayılan \"$2\" sınıflandırma anahtarı, önceki \"$1\" sınıflandırma anahtarını geçersiz kılıyor.",
        "duplicate-displaytitle": "<strong>Uyarı:</strong> \"$2\" şeklindeki yeni başlık \"$1\" şeklindeki eski başlığın üzerine yazılacak.",
        "invalid-indicator-name": "<strong>Hata:</strong> Sayfa durum göstergelerinin <code>name</code> özelliği boş olamaz.",
        "expand_templates_preview": "Önizleme",
        "expand_templates_preview_fail_html": "<em>{{SITENAME}} işlenmemiş HTML koduna izin verdiği ve oturum verilerinde kayıp yaşandığı için, ön izleme, JavaScript saldırılarına karşı önlem olarak gizlendi.</em>\n\n<strong>Eğer meşru bir ön izleme girişimi idiyse, tekrar deneyiniz.</strong>\nYine de çalışmıyorsa, [[Special:UserLogout|oturum kapamayı]] ve tekrar açmayı deneyin.",
        "expand_templates_preview_fail_html_anon": "<em>{{SITENAME}} işlenmemiş HTML koduna izin verdiği ve oturum verilerinde kayıp yaşandığı için, ön izleme, JavaScript saldırılarına karşı önlem olarak gizlendi.</em>\n\n<strong>Eğer meşru bir ön izleme girişimi idiyse, lütfen  [[Special:UserLogin|oturum açarak]] tekrar deneyin.</strong>",
-       "pagelanguage": "Sayfa dili seçicisi",
+       "pagelanguage": "Sayfa dilini değiştir",
        "pagelang-name": "Sayfa",
        "pagelang-language": "Dil",
        "pagelang-use-default": "Varsayılan dili kullan",
        "pagelang-select-lang": "Dil seçin",
        "right-pagelang": "Sayfa dilini değiştir",
        "action-pagelang": "sayfa dilini değiştir",
-       "log-name-pagelang": "Dil günlüğünü değiştir",
+       "log-name-pagelang": "Dil değişimi günlüğü",
        "log-description-pagelang": "Bu, sayfalardaki dil değişikliklerinin kayıt günlüğüdür.",
        "logentry-pagelang-pagelang": "$1, $3 sayfasının dilini $4 dilinden $5 diline {{GENDER:$2|çevirdi}}.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (etkin)",
        "log-action-filter-delete": "Silme türü:",
        "log-action-filter-patrol": "Devriye türü:",
        "log-action-filter-protect": "Koruma tipi:",
+       "log-action-filter-rights": "Hak türü seçimi:",
+       "log-action-filter-suppress": "Kaldırma türü:",
        "log-action-filter-upload": "Yükleme türü:",
        "log-action-filter-all": "Tümü",
        "log-action-filter-block-block": "Blok",
        "log-action-filter-protect-modify": "Koruma değişikliği",
        "log-action-filter-protect-unprotect": "Korunmayan",
        "log-action-filter-upload-upload": "Yeni yükleme",
-       "log-action-filter-upload-overwrite": "Yeniden yükle"
+       "log-action-filter-upload-overwrite": "Yeniden yükle",
+       "authmanager-email-label": "E-posta",
+       "authmanager-email-help": "E-posta adresi",
+       "authmanager-realname-label": "Gerçek ad",
+       "authmanager-realname-help": "Kullanıcının gerçek adı",
+       "authmanager-provider-temporarypassword": "Geçici parola",
+       "authprovider-resetpass-skip-label": "Atla",
+       "authprovider-resetpass-skip-help": "Parola sıfırlamayı atla."
 }
index 5d532fc..702c294 100644 (file)
        "prefs-help-email": "Latat majbur dkıṭwat uEmail-Adresayḍox, elo glozam inaqla ṫo³at uQliḍayḍox u hakka dlozam dmişadar lox Qliḍo ḥaṭo.",
        "prefs-help-email-others": "Kibux mijğolat 3am Hadome ğer biFaṭo duMamlo u luglozam dumat Işmux.",
        "prefs-signature": "Imḍa",
-       "email-address-validity-valid": "uEmail-Adresayḍux m³adlo yo.",
        "group-user": "Hadome",
        "group-all": "(kulle)",
        "newuserlogpage": "User creation log",
        "allmessages-language": "Leşono",
        "allmessages-filter-submit": "Zux",
        "thumbnail-more": "Rabtır",
-       "thumbnail_error": "Error creating thumbnail: $1",
        "tooltip-pt-userpage": "iFaṭaṭyḍox",
        "tooltip-pt-mytalk": "iFaṭayḍux duDroşo",
        "tooltip-pt-preferences": "a3ayaratayḍux",
        "dberr-problems": "Şubqono! iFaṭaṭe u3do kitla Qaṫre.",
        "htmlform-submit": "Mqayad",
        "htmlform-selectorother-other": "Ḥrene",
-       "feedback-message": "Ṫebo:",
        "feedback-cancel": "Mbaṫel",
+       "feedback-message": "Ṫebo:",
        "searchsuggest-search": "Kruxyo",
        "api-error-unknownerror": "Fawdo nuxroyo: $1",
        "duration-seconds": "$1 {{PLURAL:$1|Ṥaniye|Ṥaniyat}}",
index bafa6e8..f0128f9 100644 (file)
        "rightslog": "Кулланучының хокуклары көндәлеге",
        "action-read": "бу битне укырга",
        "action-edit": "бу битне үзгәртергә",
-       "action-createpage": "битләрне язырга",
-       "action-createtalk": "бәхәс битен ясарга",
+       "action-createpage": "бу битне төзү",
+       "action-createtalk": "бу бәхәс битен төзү",
        "action-move": "бу битне күчерерге",
        "action-sendemail": "электрон хат җибәрү",
        "nchanges": "$1 {{PLURAL:$1|үзгәртү}}",
index 91a3e3a..757e97e 100644 (file)
        "history": "Арынның төөгүзү",
        "history_short": "Төөгү",
        "printableversion": "Парлап үндүрер янзызы",
-       "permalink": "Ð\94окÑ\82аамал Ñ\88өлүлге",
+       "permalink": "Ð\94окÑ\82аамал Ñ\85евиÑ\80и",
        "print": "Саазынга үндүрер",
        "view": "Көөр",
        "view-foreign": "$1 сайттан көөр",
        "italic_sample": "курсив хевир",
        "italic_tip": "Курсив хевир",
        "link_sample": "Шөлүлгениң ады",
-       "link_tip": "Иштики шөлүлге",
+       "link_tip": "Иштики арынче айтыг",
        "extlink_sample": "http://www.example.com холбааның ады",
-       "extlink_tip": "Даштыкы шөлүлге (\"http://\" префикс дугайында утпаңар)",
+       "extlink_tip": "Даштыкы арынче айтыг (\"http://\" префикс дугайында утпаңар)",
        "headline_sample": "Эге аттың сөзүглели",
        "headline_tip": "2-ги деңнелдиң эге ады",
        "nowiki_sample": "Форматтавас сөзүглелди бээр салыңар",
        "image_sample": "Чижек.jpg",
        "image_tip": "Киирген файл",
        "media_sample": "Чижек.ogg",
-       "media_tip": "Файлче шөлүлге",
+       "media_tip": "Файлче айтыг",
        "sig_tip": "Холуңар үжүү, үе-шагы",
        "hr_tip": "Доора шугум (көвей ажыглаваңар)",
        "summary": "Түңнел:",
        "unwatchedpages": "Хайгаарабас арыннар",
        "unusedtemplates": "Ажыглаан эвес майыктар",
        "unusedtemplateswlh": "өске холбаалар",
-       "randompage": "Дужа-келби таварышкан арын",
+       "randompage": "Душ бооп таваржып келген арын",
        "statistics": "Статистика",
        "statistics-pages": "Арыннар",
        "brokenredirects-edit": "өскертири",
        "linksearch": "Даштыкы холбааларга дилээри",
        "linksearch-ns": "Аттар делгеми:",
        "linksearch-ok": "Дилээри",
-       "linksearch-line": "$1-же $2-ден шөлүлге",
+       "linksearch-line": "$2-де бижиттинген $1 деп тускай айтыг",
        "listusers-submit": "Көргүзери",
        "activeusers-hidebots": "Роботтарны чажырары",
        "activeusers-hidesysops": "Эргелекчыларны чажырары",
        "sp-contributions-username": "ИП-адрес азы ажыглачының ады:",
        "sp-contributions-toponly": "Чазалгаларның чүгле сөөлгү хевирлерин көргүзер",
        "sp-contributions-submit": "Дилээри",
-       "whatlinkshere": "ШөлүлгелеÑ\80ни Ð±Ñ\8dÑ\8dр",
-       "whatlinkshere-title": "«$1» деп арынга шөлүтген арыннар",
+       "whatlinkshere": "Ð\90Ñ\80гÑ\8bÑ\88кан Ð°Ñ\80Ñ\8bннар",
+       "whatlinkshere-title": "«$1» деп арынче айтып турар тускай арыннар",
        "whatlinkshere-page": "Арын:",
        "linkshere": "Адаандагы арыннар бээр «'''[[:$1]]'''» шөлүдүп турарлар:",
        "nolinkshere": "'''[[:$1]]''' деп арынче шөлүтткен арыннар чок.",
        "tooltip-n-portal": "Төлевилел дугайында, маңаа чүнү кылып болурул, ол ышкаш кайда чүү барыл",
        "tooltip-n-currentevents": "Амгы болуушкуннар дугайында медээ",
        "tooltip-n-recentchanges": "Викиниң сөөлгү өскерлиишкиннер даңзызы",
-       "tooltip-n-randompage": "Дужа-келби таварышкан арынны көөр",
+       "tooltip-n-randompage": "Душ бооп таваржып келген арынны ажыдып көөрү",
        "tooltip-n-help": "Шынзылга ап болур чер",
-       "tooltip-t-whatlinkshere": "Ук Ð°Ñ\80Ñ\8bнÑ\87е Ñ\88өлүлгелиг Ñ\88Ñ\83пÑ\82Ñ\83 Ð°Ñ\80Ñ\8bннаÑ\80нÑ\8bÒ£ Ð´Ð°Ò£Ð·Ñ\8bзÑ\8b",
+       "tooltip-t-whatlinkshere": "Ð\91о Ð°Ñ\80Ñ\8bн-биле Ð°Ñ\80гÑ\8bжÑ\8bп, Ñ\82Ñ\8bÑ\80Ñ\82Ñ\8bжÑ\8bп Ð°Ð»Ð³Ð°Ð½ Ñ\85амÑ\8bк Ð°Ñ\80Ñ\8bннаÑ\80 Ñ\87изези",
        "tooltip-t-recentchangeslinked": "Бо арындан шөлүлгелиг арыннарында сөөлгү өскерилгелер",
        "tooltip-feed-rss": "Бо арының РСС медээ агымы",
        "tooltip-feed-atom": "Бо арының Атом медээ агымы",
index 04f2eb2..848ba1b 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Moha",
-                       "Tifinaghes"
+                       "Tifinaghes",
+                       "ⵕⴰⵊⵉ"
                ]
        },
        "underline-always": "ⴷⴰⵢⵎⴰⵏ",
        "protect_change": "ⴱⴷⴷⴻⵍ",
        "unprotect": "ⴱⴷⴷⴻⵍ ⵜⴰⵙⵜⴰⵏⵜ",
        "newpage": "ⵜⴰⵙⵏⴰ ⵜⴰⵎⴰⵢⵏⵓⵜ",
+       "talkpage": "ⵎⵙⴰⵡⴰⵍ ⵅⴼ ⵜⴰⵙⵏⴰ ⴰ",
        "talkpagelinktext": "ⴰⵎⵢⴰⵏⵏⴰⵏ",
        "specialpage": "ⵜⴰⵙⵏⴰ ⵉⵥⵍⵉⵏ",
        "personaltools": "ⵉⵎⴰⵙⵙⵏ ⵉⵏⵡ",
        "currentevents": "ⵉⵏⵖⵎⵉⵙⵏ ⵉⵎⴰⵢⵏⵓⵜⵏ",
        "disclaimers": "ⵡⴰⵔ ⵜⴰⵎⴰⵙⴰⵢⵜ",
        "edithelp": "ⵜⵉⵡⵉⵙⵉ ⵏ ⵓⴱⴷⴷⴻⵍ",
+       "helppage-top-gethelp": "ⵜⵉⵡⵉⵙⵉ",
        "mainpage": "ⴰⵙⵏⵓⴱⴳ",
        "mainpage-description": "ⴰⵙⵏⵓⴱⴳ",
        "policy-url": "Project:ⵜⴰⵙⵔⵜⵉⵜ",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "backlinksubtitle": "← $1",
        "youhavenewmessages": "ⵜⵍⵍⴰ ⵖⵓⵔⴽ $1 ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|ⵜⵓⵣⵓⵏⵜ ⵜⴰⵎⴰⵢⵏⵓⵜ|999=ⵜⵓⵣⵓⵏⵉⵏ ⵜⵉⵎⴰⵢⵏⵓⵜⵉⵏ}}",
+       "youhavenewmessagesmulti": "ⵉⵍⵍⴰ ⵖⵓⵔⴽ ⵜⵓⵣⵓⵏⵉⵏ ⵜⵉⵎⴰⵢⵏⵓⵜⵉⵏ ⴳ $1",
        "editsection": "ⴱⴷⴷⴻⵍ",
        "editold": "ⴱⴷⴷⴻⵍ",
        "viewsourceold": "ⵥⵕ ⴰⵖⴱⴰⵍⵓ",
        "toc": "ⴰⴳⴱⵓⵔ",
        "showtoc": "ⵥⵕ",
        "hidetoc": "ⵃⴱⵓ",
+       "confirmable-yes": "ⵢⴰⵀ",
+       "confirmable-no": "ⵓⵀⵓ",
        "viewdeleted": "ⵥⵕ $1?",
        "feedlinks": "Feed:",
        "site-rss-feed": "\"$1\" RSS feed",
        "page-rss-feed": "\"$1\" RSS feed",
        "feed-atom": "ⴰⵜⵓⵎ",
        "feed-rss": "RSS",
-       "red-link-title": "$1 (ⵜⴰⵙⵏⴰ ⵓⵔ ⵜⵍⵍⴰ)",
+       "red-link-title": "$1 (âµ\9câ´°âµ\99âµ\8fâ´° â´° âµ\93âµ\94 âµ\9câµ\8dâµ\8dâ´°)",
        "nstab-main": "ⵜⴰⵙⵏⴰ",
        "nstab-user": "ⴰⵎⴷⴰⵏ ⵏ ⵜⴰⵙⵏⴰ",
        "nstab-media": "ⵜⴰⵙⵏⴰ ⵏ ⵎⵉⴷⵢⴰ",
        "nstab-template": "ⵜⴰⵍⵖⴰ",
        "nstab-help": "ⵜⴰⵙⵏⴰ ⵏ ⵜⵡⵉⵙⵉ",
        "nstab-category": "ⵜⴰⴳⴳⴰⵢⵜ",
+       "mainpage-nstab": "ⴰⵙⵏⵓⴱⴳ",
        "error": "ⴰⵣⴳⵍ",
        "internalerror": "ⴰⵣⴳⵍ ⴰⴳⵯⵏⵙⴰⵏ",
        "internalerror_info": "ⴰⵣⴳⵍ ⴰⴳⵯⵏⵙⴰⵏ :$1",
        "viewsource": "ⵥⵕ ⴰⵖⴱⴰⵍⵓ",
        "viewsource-title": "ⵥⵕ ⴰⵖⴱⴰⵍⵓ ⵏ $1",
        "exception-nologin": "ⵓⵔ ⵜⴽⵛⵎⴷ",
+       "welcomeuser": "ⴰⵏⵙⵓⴼ, $1!",
        "userlogin-yourname": "ⴰⵙⵙⴰⵖ",
        "yourpassword": "ⵜⴰⵡⴰⵍⵜ ⵓⵙⵉⴽⵍ:",
        "yourpasswordagain": "ⴰⵍⵙ ⵜⴰⵡⴰⵍⵜ ⵓⵙⵉⴽⵍ:",
        "newpassword": "ⵜⴰⵡⴰⵍⵜ ⵓⵙⵉⴽⵍ ⵜⴰⵎⴰⵢⵏⵓⵜ:",
        "retypenew": "ⴰⵍⵙ ⵜⴰⵡⴰⵍⵜ ⵓⵙⵉⴽⵍ ⵜⴰⵎⴰⵢⵏⵓⵜ:",
        "resetpass-submit-loggedin": "ⴱⴷⴷⴻⵍ ⵜⴰⵡⴰⵍⵜ ⵓⵙⵉⴽⵍ",
+       "resetpass-submit-cancel": "ⴼⴼⵖ",
        "passwordreset": "ⴰⵍⵙ ⵜⴰⵡⴰⵍⵜ ⵓⵙⵉⴽⵍ",
        "passwordreset-username": "ⴰⵙⵙⴰⵖ ⵓⵎⴷⴰⵏ:",
        "passwordreset-domain": "ⴰⵙⵡⵉⵔ:",
        "withoutinterwiki-submit": "ⵥⵕ",
        "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
        "ncategories": "$1 {{PLURAL:$1|ⵜⴰⴳⴳⴰⵢⵜ|ⵜⴰⴳⴳⴰⵢⵉⵏ}}",
-       "nviews": "$1 {{PLURAL:$1|ⵥⵕ|ⵥⵕ ⴰⴽⴽ}}",
        "longpages": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⵎⵇⵇⴰⵔⵏⵜ",
        "newpages": "ⵜⵉⵙⵏⵉⵡⵉⵏ ⵜⵉⵎⴰⵢⵏⵓⵜⵉⵏ",
        "newpages-username": "ⴰⵙⵙⴰⵖ ⵓⵎⴷⴰⵏ:",
        "tooltip-pt-mytalk": "ⵜⴰⵙⵏⴰ ⵓⵎⵙⴰⵡⴰⵍ ⵏⵏⴽ",
        "tooltip-pt-mycontris": "ⵓⵎⵓⵖ ⵏ ⵜⵡⵉⵙⵉ ⵏⵏⴽ",
        "tooltip-pt-logout": "ⵓⴼⵓⵖ",
+       "tooltip-ca-talk": "ⴰⵎⵙⴰⵡⴰⵍ ⵅⴼ ⵜⵙⵏⴰ ⴰ",
        "tooltip-search": "ⵔⵣⵣⵓ ⵅⴼ {{SITENAME}}",
        "tooltip-search-fulltext": "ⵔⵣⵣⵓ ⴷⵉ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵅⴼ ⵓⴹⵕⵉⵙ ⴰⴷ",
        "tooltip-p-logo": "ⴰⵙⵏⵓⴱⴳ",
        "logentry-delete-delete": "$1 ⴽⴽⵉⵙ ⵜⴰⵙⵏⴰ $3",
        "logentry-delete-restore": "$1 ⵙⵙⴰⵖⵓⵍ ⵜⴰⵙⵏⴰ $3",
        "rightsnone": "(ⵡⴰⵔ)",
-       "feedback-subject": "ⴰⵙⵏⵜⵍ:",
-       "feedback-message": "ⵜⴰⴱⵔⴰⵜ:",
        "feedback-close": "ⵉⵣⵎⵎⴻⵎ",
+       "feedback-message": "ⵜⴰⴱⵔⴰⵜ:",
+       "feedback-subject": "ⴰⵙⵏⵜⵍ:",
        "searchsuggest-search": "ⴰⵔⵣⵣⵓ",
-       "api-error-duplicate-popup-title": "ⵣⴷⴻⵎ {{PLURAL:$1|ⴰⵙⴷⴰⵡ|ⵉⵙⴷⴰⵡⵏ}}.",
        "api-error-filename-tooshort": "ⴰⵙⵙⴰⵖ ⵓⵙⴷⴰⵡ ⵉⴳⵣⵣⵓⵍ ⵛⵉⴳⴰⵏ.",
        "duration-seconds": "$1 {{PLURAL:$1|ⵜⴰⵙⵏⴰⵜ|ⵜⵉⵙⵏⴰⵜⵉⵏ}}",
        "duration-minutes": "$1 {{PLURAL:$1|ⵜⵓⵙⴷⴰⴷⵜ|ⵜⵓⵙⴷⴰⴷⵉⵏ}}",
        "duration-weeks": "$1 {{PLURAL:$1|ⵉⵎⴰⵍⴰⵙⵙ|ⵉⵎⴰⵍⴰⵙⵙⵏ}}",
        "duration-years": "$1 {{PLURAL:$1|ⴰⵙⴳⴳⵯⴰⵙ|ⵉⵙⴳⴳⵯⴰⵙⵏ}}",
        "duration-decades": "$1 {{PLURAL:$1|ⵜⴰⵙⵓⵜ|ⵜⴰⵙⵓⵜⵉⵏ}}",
-       "duration-centuries": "$1 {{PLURAL:$1|ⵜⴰⵙⵓⵜ|ⵜⴰⵙⵓⵜⵉⵏ}}"
+       "duration-centuries": "$1 {{PLURAL:$1|ⵜⴰⵙⵓⵜ|ⵜⴰⵙⵓⵜⵉⵏ}}",
+       "special-characters-group-latin": "ⵜⴰⵍⴰⵜⵉⵏⵉⵜ",
+       "special-characters-group-ipa": "IPA",
+       "special-characters-group-greek": "ⵜⴰⵢⵓⵏⴰⵏⵉⵜ",
+       "special-characters-group-arabic": "ⵜⴰⵄⵔⴰⴱⵜ",
+       "special-characters-group-persian": "ⵜⴰⴼⴰⵔⵉⵙⵉⵜ",
+       "special-characters-group-hebrew": "ⵜⴰⵄⵉⴱⵔⵉⵜ",
+       "special-characters-group-bangla": "ⵜⴰⴱⵏⴳⴰⵍⵉⵜ",
+       "special-characters-group-tamil": "ⵜⴰⵎⵉⵍ",
+       "special-characters-group-telugu": "ⵜⴻⵍⵓⴳⵓ",
+       "special-characters-group-sinhala": "ⵜⴰⵙⵏⵀⴰⵍⵉⵜ",
+       "special-characters-group-thai": "ⵜⴰⵟⴰⵢⵍⴰⵏⴷⵉⵜ",
+       "special-characters-group-lao": "ⵜⵍⴰⵡⵉⵜ",
+       "special-characters-group-khmer": "ⵅⴰⵎⵉⵔ"
 }
index 56aa37b..c529978 100644 (file)
        "minoredit": "Незначна зміна",
        "watchthis": "Спостерігати за цією сторінкою",
        "savearticle": "Зберегти сторінку",
+       "savechanges": "Зберегти зміни",
        "publishpage": "Опублікувати сторінку",
+       "publishchanges": "Опублікувати зміни",
        "preview": "Попередній перегляд",
        "showpreview": "Попередній перегляд",
        "showdiff": "Показати зміни",
        "content-model-css": "CSS",
        "content-json-empty-object": "Порожній об'єкт",
        "content-json-empty-array": "Порожній масив",
+       "deprecated-self-close-category": "Сторінки, що використовують недійсні самозакривні теги HTML",
+       "deprecated-self-close-category-desc": "Сторінка містить недійсні самозакривні теги HTML, наприклад, <code>&lt;b/></code> чи <code>&lt;span/></code>.  Їхню поведінку невдовзі буде змінено у відповідності зі специфікацією HTML5, тому їх використання у вікітексті є застарілим.",
        "duplicate-args-warning": "<strong>Увага:</strong> [[:$1]] викликає [[:$2]] з більш ніж одним значенням параметра «$3». Буде використано лише останнє вказане значення.",
        "duplicate-args-category": "Сторінки, що містять шаблон із кількома значеннями одного й того ж параметра",
        "duplicate-args-category-desc": "Тут перелічено сторінки, що містять дублікатне визначення аргументу при включенні шаблону, приміром, <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> або <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "rightslogtext": "Це протокол зміни прав користувачів.",
        "action-read": "перегляд цієї сторінки",
        "action-edit": "редагування цієї сторінки",
-       "action-createpage": "Ñ\81Ñ\82воÑ\80еннÑ\8f Ñ\81Ñ\82оÑ\80Ñ\96нок",
-       "action-createtalk": "Ñ\81Ñ\82воÑ\80еннÑ\8f Ñ\81Ñ\82оÑ\80Ñ\96нок Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ\80енÑ\8c",
+       "action-createpage": "Ñ\81Ñ\82воÑ\80иÑ\82и Ñ\86Ñ\8e Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\83",
+       "action-createtalk": "Ñ\81Ñ\82воÑ\80иÑ\82и Ñ\86Ñ\8e Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\83 Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ\80еннÑ\8f",
        "action-createaccount": "створення цього облікового запису",
        "action-autocreateaccount": "автоматичне створення цього зовнішнього облікового запису користувача",
        "action-history": "переглядати історію цієї сторінки",
        "upload-http-error": "Відбулася помилка HTTP: $1",
        "upload-copy-upload-invalid-domain": "З цього домену завантаження неможливе.",
        "upload-foreign-cant-upload": "Ця вікі не налаштована на завантаження файлів у запитаний сторонній файловий репозиторій.",
+       "upload-foreign-cant-load-config": "Завантаження конфігурації завантаження файлів на зовнішнє сховище файлів не вдалося.",
+       "upload-dialog-disabled": "Завантаження файлів з допомогою цього діалогового вікна відключені у цій вікі.",
        "upload-dialog-title": "Завантажити файл",
        "upload-dialog-button-cancel": "Скасувати",
        "upload-dialog-button-done": "Готово",
        "booksources-text": "На цій сторінці наведено список посилань на сайти, де ви, можливо, знайдете додаткову інформацію про книгу. Це інтернет-магазини й системи пошуку в бібліотечних каталогах.",
        "booksources-invalid-isbn": "Вказаний номер ISBN, судячи з усього, містить помилку. Будь ласка, перевірте, що при перенесенні номера з першоджерела не виникло спотворень.",
        "specialloguserlabel": "Виконавець:",
-       "speciallogtitlelabel": "Ціль (назва сторінки або {{ns:user}}:ім'я користувача):",
+       "speciallogtitlelabel": "Ціль (назва сторінки або {{ns:user}}:Ім'я_користувача):",
        "log": "Журнали",
        "logeventslist-submit": "Показати",
        "all-logs-page": "Усі публічні журнали",
        "sp-contributions-username": "IP-адреса або ім'я користувача:",
        "sp-contributions-toponly": "Показувати тільки редагування, що є останніми версіями",
        "sp-contributions-newonly": "Показувати тільки редагування, які є створеннями сторінок",
+       "sp-contributions-hideminor": "Приховати малі правки",
        "sp-contributions-submit": "Пошук",
        "whatlinkshere": "Посилання сюди",
        "whatlinkshere-title": "Сторінки, що посилаються на «$1»",
        "unblock": "Розблокувати користувача",
        "blockip": "Заблокувати {{GENDER:$1|користувача|користувачку}}",
        "blockip-legend": "Блокування користувача",
-       "blockiptext": "Використовуйте форму нижче, щоб заблокувати можливість редагування зазначеній IP-адресі або користувачу.\nЦе слід робити лише для запобігання порушенням і у відповідності до [[{{MediaWiki:Policy-url}}|правил]].\nОбов'язково заповніть причину нижче, бажано дати інформативну вичерпну інформацію (наприклад, послатися на конкретні правила, дати посилання на редагування користувача, які призвели до блокування). Можна конкретизувати причину блокування на сторінці обговорення користувача.\nВи можете заблокувати діапазони IP-адрес, використовуючи [https://uk.wikipedia.org/wiki/CIDR]-синтаксис. Максимально допустимий діапазон — /$1 для протоколу IPv4 та /$2 для протоколу IPv6.",
+       "blockiptext": "Використовуйте форму нижче, щоб заблокувати можливість редагування зазначеній IP-адресі або користувачу.\nЦе слід робити лише для запобігання порушенням і у відповідності до [[{{MediaWiki:Policy-url}}|правил]].\nОбов'язково заповніть причину нижче, бажано дати інформативну вичерпну інформацію (наприклад, послатися на конкретні правила, дати посилання на редагування користувача, які призвели до блокування). Можна конкретизувати причину блокування на сторінці обговорення користувача.\nВи можете заблокувати діапазони IP-адрес, використовуючи [https://uk.wikipedia.org/wiki/CIDR CIDR]-синтаксис. Максимально допустимий діапазон — /$1 для протоколу IPv4 та /$2 для протоколу IPv6.",
        "ipaddressorusername": "IP-адреса або ім'я користувача:",
        "ipbexpiry": "Термін:",
        "ipbreason": "Причина:",
        "exif-pixelydimension": "Висота зображення",
        "exif-usercomment": "Додатковий коментар",
        "exif-relatedsoundfile": "Файл звукового коментаря",
-       "exif-datetimeoriginal": "Оригинальні дата й час",
+       "exif-datetimeoriginal": "Оригінальні дата й час",
        "exif-datetimedigitized": "Дата й час оцифровки",
        "exif-subsectime": "Долі секунд часу редагування файлу",
        "exif-subsectimeoriginal": "Долі секунд оригінального часу",
        "mw-widgets-dateinput-placeholder-month": "РРРР-ММ",
        "mw-widgets-titleinput-description-new-page": "сторінка ще не існує",
        "mw-widgets-titleinput-description-redirect": "перенаправлення на $1",
-       "api-error-blacklisted": "Будь ласка, виберіть іншу, більш зрозумілу назву.",
        "sessionmanager-tie": "Не можна поєднувати кілька типів автентифікації запиту: $1.",
        "sessionprovider-generic": "сесій $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "сесій на основі кук",
        "log-action-filter-newusers": "Тип створення облікового запису:",
        "log-action-filter-patrol": "Тип патрулювання:",
        "log-action-filter-protect": "Тип захисту:",
-       "log-action-filter-rights": "Тип зміни прав",
-       "log-action-filter-suppress": "Тип приховування",
+       "log-action-filter-rights": "Тип зміни прав:",
+       "log-action-filter-suppress": "Тип приховування:",
        "log-action-filter-upload": "Тип завантаження:",
        "log-action-filter-all": "Усі",
        "log-action-filter-block-block": "Блокування",
        "cannotauth-not-allowed-title": "Доступ заборонено",
        "cannotauth-not-allowed": "Вам не дозволено використовувати цю сторінку",
        "changecredentials": "Зміна облікових даних",
-       "changecredentials-submit": "Змінити",
+       "changecredentials-submit": "Змінити облікові дані",
        "changecredentials-invalidsubpage": "«$1» не є коректним типом облікових даних.",
        "changecredentials-success": "Ваші облікові дані змінено.",
        "removecredentials": "Вилучити облікові дані",
-       "removecredentials-submit": "Вилучити",
+       "removecredentials-submit": "Вилучити облікові дані",
        "removecredentials-invalidsubpage": "$1 не є коректним типом облікових даних.",
        "removecredentials-success": "Ваші облікові дані вилучено.",
        "credentialsform-provider": "Тип облікових даних:",
        "linkaccounts-success-text": "Обліковий запис було пов'язано.",
        "linkaccounts-submit": "Пов'язати облікові записи",
        "unlinkaccounts": "Відв'язати облікові записи",
-       "unlinkaccounts-success": "Обліковий запис було відв'язано."
+       "unlinkaccounts-success": "Обліковий запис було відв'язано.",
+       "authenticationdatachange-ignored": "Неопрацьована зміна облікових даних. Можливо, жоден з провайдерів не був налаштований?"
 }
index 465b547..eed7c64 100644 (file)
@@ -26,7 +26,9 @@
                        "Syedalinaqinaqvi",
                        "محمد افضل",
                        "Macofe",
-                       "Hindustanilanguage"
+                       "Hindustanilanguage",
+                       "امین اکبر",
+                       "Jdforrester"
                ]
        },
        "tog-underline": "ربط کی خط کشیدگی:",
        "april-gen": "اپريل",
        "may-gen": "مئی",
        "june-gen": "جون",
-       "july-gen": "جولائ",
+       "july-gen": "جولائی",
        "august-gen": "اگست",
        "september-gen": "ستمبر",
        "october-gen": "اکتوبر",
        "protectedpagetext": "اس صفحہ کو تدوین سے محفوظ رکھنے کیلیے مقفل کر دیا گیا ہے۔",
        "viewsourcetext": "آپ صرف مسودہ دیکھ سکتے ہیں اور اسکی نقل اتار سکتے ہیں۔",
        "viewyourtext": "آپ اس مواد کو دیکھ سکتے ہیں اور اٹھا (کاپی) سکتے ہیں <strong>آپ کی ترامیم</strong> اس صفحہ پر۔",
-       "protectedinterface": "یہ صفحہ سوفٹ وئیر کے لیے انٹرفیس متن فراہم کرتا ہے، اور ناجائزاستعمال کے سدِباب کے لیے اِسے مقفل کیا گیا ہے.",
-       "editinginterface": "'''انتباہ: ''' آپ ایک ایسا صفحہ تدوین کر رہے ہیں جو سوفٹ ویئر کیلئے انٹرفیس متن فراہم کرتا ہے۔ اس صفحہ میں کی جانے والی ترمیم، دیگر صارفین کے لیے انٹرفیس کو تبدیل کردے گی۔\nبراہِ کرم، ترجمہ کے لیے [https://translatewiki.net/wiki/Main_Page?setlang=en '''ٹرانسلیٹ ویکی.نیٹ'''] (میڈیا ویکی دارالترجمہ) استعمال کریں.",
-       "translateinterface": "تمام ویکیوں میں تبدیلی یا شامل کرنے کے لیے، اسے استعمال کریں [https://translatewiki.net/ translatewiki.net]، میڈیا ویکی دارالترجمہ.",
+       "protectedinterface": "{{fmbox \n| type = editnotice\n| image = [[File:Namespace MediaWiki.svg|45px]]\n| text = '''اس [[mw:Manual:System message|انٹرفیس پیغام]] یا [[ویکیپیڈیا:جلد|جلد]] کی دستاویز [[mw:Manual:Interface/{{PAGENAME}}|میڈیاویکی ڈاٹ آرگ]] یا [[translatewiki:MediaWiki:{{PAGENAME}}/qqq|ٹرانسلیٹ ویکی ڈاٹ نیٹ]] پر بنائی جا سکتی ہے۔''' <br /> چونکہ یہ صفحہ میڈیاویکی سوفٹویئر کے لیے انٹرفیس متن فراہم کرتا ہے، اس لیے اس میں محض [[ویکیپیڈیا:منتظمین|منتظمین]] ہی ترمیم کر سکتے ہیں۔ البتہ اگر آپ کو اس میں کسی قسم کی ترمیم مطلوب ہو تو ذیل میں موجود بٹن پر کلک کرکے اس پیغام میں ترمیم کی درخواست کر سکتے ہیں۔\n<div class=\"center\" style=\"margin-top: 4px;\">{{درخواست ترمیم روانہ کریں|type=full}}</div>\n}}{{editnotice load\n| notice action = view \n}}",
+       "editinginterface": "<strong>انتباہ: </strong> آپ ایک ایسے صفحے میں ترمیم کر رہے ہیں جو سوفٹ ویئر کے لیے انٹرفیس متن فراہم کرتا ہے۔ اس صفحہ میں کی جانے والی تبدیلی سے اس ویکی پر دیگر صارفین کے لیے انٹرفیس متاثر ہوگی۔",
+       "translateinterface": "تمام ویکیوں میں تبدیلی یا شامل کرنے کے لیے، [https://translatewiki.net/ translatewiki.net]کو استعمال کریں ، میڈیا ویکی دارالترجمہ.",
        "namespaceprotected": "آپ کو '''$1''' فضائے نام میں صفحات تدوین کرنے کی اِجازت نہیں ہے.",
        "mycustomcssprotected": "آپ اس سی ایس ایس (CSS) صفحہ میں ترمیم کرنے کا اختیار نہیں رکھتے۔",
        "mycustomjsprotected": "آپ اس جاوا اسکپرٹ (JavaScript) صفحہ میں ترمیم کرنے کا اختیار نہیں رکھتے۔",
        "nologin": "کیا آپ نے کھاتہ نہیں بنایا ہوا؟ '''$1'''۔",
        "nologinlink": "کھاتا بنائیں",
        "createaccount": "کھاتہ کھولیں",
-       "gotaccount": "پہلے سے کھاتہ بنا ہوا ہے? '''$1'''.",
+       "gotaccount": "پہلے سے کھاتہ بنا ہوا ہے؟ '''$1'''۔",
        "gotaccountlink": "داخل ہوجائیے",
        "userlogin-resetlink": "داخلِ نوشتہ ہونے کی تفاصیل بھول گئے ہیں؟",
        "userlogin-resetpassword-link": "کلمہ شناخت بھول گئے؟",
        "newarticle": "(نیا)",
        "newarticletext": "آپ نے ایک ایسے صفحے کے ربط کی پیروی کی ہے جو کہ ابھی موجود نہیں ہے.\nیہ صفحہ تخلیق کرنے کیلئے درج ذیل خانہ میں متن درج کیجئے (مزید معلومات کیلئے [$1 صفحۂ معاونت] ملاحظہ فرمائیے).\nاگر آپ یہاں غلطی سے پہنچے ہیں تو پچھلے صفحے پر واپس جانے کیلئے اپنے متصفح پر '''back''' کا بٹن ٹک کیجئے.",
        "anontalkpagetext": "----''یہ صفحہ ایک ایسے صارف کا ہے جنہوں نے یا تو اب تک اپنا کھاتا نہیں بنایا یا پھر وہ اسے استعمال نہیں کر رہے/ رہی ہیں۔ لہٰذا ہمیں انکی شناخت کے لئے ایک عددی آئی پی پتہ استعمال کرنا پڑرہا ہے۔ اس قسم کا آئی پی پتہ ایک سے زائد صارفین کے لئے مشترک بھی ہوسکتا ہے۔ اگر آپکی موجودہ حیثیت ایک گمنام صارف کی ہے اور آپ محسوس کریں کہ اس صفحہ پر آپکی جانب منسوب یہ بیان غیرضروری ہے تو براہ کرم [[Special:CreateAccount|کھاتہ بنائیں]] یا [[Special:UserLogin|داخلِ نوشتہ]] ہوجائیے تاکہ مستقبل میں آپکو گمنام صارفین میں شمار کرنے سے پرہیز کیا جاسکے۔\"",
-       "noarticletext": "اِس صفحہ میں فی الحال کوئی متن موجود نہیں ہے.\nآپ دیگں صفحات میں [[Special:Search/{{PAGENAME}}|اِس صفحہ کے عنوان کیلئے تلاش کرسکتے ہیں]]، <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} متعلقہ نوشتہ جات تلاش کرسکتے ہیں],\nیا [{{fullurl:{{FULLPAGENAME}}|action=edit}} اِس صفحہ میں ترمیم کرسکتے ہیں]</span>",
-       "noarticletext-nopermission": "اس صفحہ میں فی الحال کوئی متن موجود نہیں ہے.\nآپ دیگں صفحات میں [[Special:Search/{{PAGENAME}}|اِس صفحہ کے عنوان کیلئے]] یا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} متعلقہ نوشتہ جات تلاش کرسکتے ہیں]</span>",
+       "noarticletext": "اِس صفحہ میں فی الحال کوئی متن موجود نہیں ہے۔\nآپ دیگر صفحات میں [[Special:Search/{{PAGENAME}}|اِس صفحہ کے عنوان کو تلاش کر سکتے ہیں]]، <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} متعلقہ نوشتہ جات میں تلاش کر سکتے ہیں]،\nیا [{{fullurl:{{FULLPAGENAME}}|action=edit}} اِس صفحہ کو تخلیق کر سکتے ہیں]</span>۔",
+       "noarticletext-nopermission": "اس صفحہ میں فی الحال کوئی متن موجود نہیں ہے۔\nآپ دیگر صفحات میں [[Special:Search/{{PAGENAME}}|اِس صفحہ کے عنوان کے لیے]] یا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} متعلقہ نوشتہ جات تلاش کرسکتے ہیں]</span>",
        "userpage-userdoesnotexist-view": "صارف کھاتہ \"$1\" مندرج نہیں ہے۔",
        "updated": "(اپ ڈیٹڈ)",
        "note": "'''نوٹ:'''",
        "defaultmessagetext": "طے شدہ پیغام کا متن",
        "content-model-text": "سادہ متن",
        "content-model-javascript": "جاوا اسکرپٹ",
+       "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|تبادلہ خیال]]) کی جانب سے کی گئی ترمیم $1 رد کردی گئی ہے۔",
        "viewpagelogs": "اس صفحہ کیلیے نوشتہ جات دیکھیے",
        "nohistory": "اِس صفحہ کیلئے کوئی تدوینی تاریخچہ موجود نہیں ہے.",
        "currentrev": "حـالیـہ تـجدید",
        "history-show-deleted": "صرف حذف شدہ",
        "histfirst": "قدیم ترین",
        "histlast": "تازہ ترین",
-       "historysize": "({{PLURAL:$1|1 لکمہ|$1 لکم}})",
+       "historysize": "({{PLURAL:$1|1 بائٹ|$1 بائٹ}})",
        "historyempty": "(خالی)",
        "history-feed-title": "تاریخچۂ نظرثانی",
        "history-feed-description": "ویکی پر اِس صفحہ کا تاریخچۂ نظرثانی",
        "difference-multipage": "(فرق مابین صفحات)",
        "lineno": "لکیر $1:",
        "compareselectedversions": "منتخب متـن کا موازنہ",
-       "editundo": "استرجع",
+       "editundo": "رد ØªØ±Ù\85Û\8cÙ\85",
        "diff-empty": "(کوئی فرق نہیں)",
        "diff-multi-sameuser": "({{PLURAL: $1 | ایک متوسط نظرثانی | $1 کئی متوسط نظرثانیاں}}ایک ہی صارف کی جانب سے نہیں دکھائی گئی)",
        "searchresults": "تلاش کا نتیجہ",
        "group-user-member": "صارف",
        "group-autoconfirmed-member": "خودتوثیق شدہ صارف",
        "group-bot-member": "خودکار صارف",
-       "group-sysop-member": "منتظم",
+       "group-sysop-member": "{{GENDER:$1|منتظم}}",
        "group-bureaucrat-member": "{{GENDER:$1|مامور اداری}}",
        "group-suppress-member": "{{GENDER:$1|suppressor}}",
        "grouppage-user": "{{ns:project}}:صارفین",
        "grouppage-autoconfirmed": "{{ns:project}}:خود توثیق شدہ صارف",
        "grouppage-bot": "{{ns:project}}:روبہ جات",
        "grouppage-sysop": "{{ns:project}}:منتظمین",
-       "grouppage-bureaucrat": "بیورو کریٹ",
+       "grouppage-bureaucrat": "{{ns:project}}:مامورین اداری",
        "right-upload": "ملفات زبراثقال (اپ لوڈ) کریں",
        "right-writeapi": "اے پی آئی لکھائی کا استعمال",
        "right-delete": "صفحات حذف کریں",
        "newpageletter": "نیا ..",
        "boteditletter": " خودکار",
        "rc_categories_any": "کوئی بھی منتخب",
-       "rc-change-size-new": "$1 {{PLURAL:$1|بائٹ|بائٹس}} تبدیلی کے بعد",
+       "rc-change-size-new": "$1 {{PLURAL:$1|بائٹ|بائٹ}} تبدیلی کے بعد",
        "rc-enhanced-expand": "تفصیلات دکھائیں",
        "rc-enhanced-hide": "تفصیلات چھپائیے",
        "recentchangeslinked": "متعلقہ تبدیلیاں",
        "sourcefilename": "اسم ملف (فائل) کا منبع:",
        "destfilename": "تعین شدہ اسم ملف:",
        "watchthisupload": "یہ صفحہ زیر نظر کریں",
+       "upload-dialog-disabled": "اس ویکی پر اس ڈائیلاگ سے فائل اپ لوڈز غیر فعال ہیںَ",
        "upload-dialog-button-cancel": "منسوخ",
        "upload-dialog-button-done": "مکمل",
        "upload-dialog-button-save": "محفوظ",
        "wlshowlast": "دکھائیں آخری $1 گھنٹے $2 دن",
        "watchlist-hide": "چھپائیں",
        "watchlist-submit": "دکھائیں",
+       "wlshowtime": "ظاہر ہونے کی مدت:",
        "wlshowhideminor": "معمولی ترامیم",
        "wlshowhidebots": "روبہ جات",
        "wlshowhideliu": "مندرج صارفین",
        "wlshowhideanons": "گمنام صارفین",
        "wlshowhidepatr": "مراجعت شدہ ترامیم",
        "wlshowhidemine": "میری ترامیم",
+       "wlshowhidecategorization": "صفحاتی زمرہ بندی",
        "watchlist-options": "اختیارات برائے زیرِنظرفہرست",
        "enotif_reset": "جملہ صفحات کو بطور زیارت شدہ نشان زد کریں",
        "enotif_subject_deleted": "{{SITENAME}} میں صفحہ $1 صارف $2 نے {{GENDER:$2|حذف کیا}}",
        "protectlogpage": "نوشتۂ محفوظ شدگی",
        "protectedarticle": "\"[[$1]]\" کومحفوظ کردیا",
        "unprotectedarticle": "\"[[$1]]\" کوغیر محفوظ کیا",
+       "movedarticleprotection": "نے \"[[$2]]\" کا درجہ حفاظت \"[[$1]]\" کی جانب منتقل کیا",
        "prot_1movedto2": "[[$1]] بجانب [[$2]] منتقل",
        "protectcomment": "وجہ:",
        "protect-default": "تمام صارفین کو اہل بناؤ",
        "whatlinkshere-next": "{{PLURAL:$1|اگلا|اگلے $1}}",
        "whatlinkshere-links": "روابط ←",
        "whatlinkshere-hideredirs": "رجوع مکررات $1",
-       "whatlinkshere-hidetrans": "$1 ØªØ¶Ù\85Û\8cÙ\86ات",
+       "whatlinkshere-hidetrans": "$1 Ø§Ø³ØªØ¹Ù\85اÙ\84ات",
        "whatlinkshere-hidelinks": "روابط $1",
        "whatlinkshere-hideimages": "روابطِ تصاویر $1",
        "whatlinkshere-filters": "فلٹرذ",
        "move-watch": "صفحہ زیر نظر",
        "movepagebtn": "مـنـتـقـل",
        "pagemovedsub": "انتقال کامیاب",
-       "movepage-moved": "'''\"$1\" منتقل کردیا گیا بطرف \"$2\"'''",
+       "movepage-moved": "<strong>\"$1\" کو \"$2\" کی جانب منتقل کر دیا گیا</strong>",
        "movepage-moved-redirect": "رجوع مکرر تخلیق کر دیا گیا۔",
+       "movepage-moved-noredirect": "رجوع مکرر کو بننے سے روک دیا گیا ہے۔",
        "articleexists": "اس عنوان سے کوئی صفحہ پہلے ہی موجود ہے، یا آپکا منتخب کردہ نام مستعمل نہیں۔ براۓ مہربانی دوسرا نام منتخب کیجیۓ۔",
        "movelogpage": "نوشتۂ منتقلی",
        "movereason": "وجہ:",
        "allmessages-filter-translate": "ترجمہ",
        "thumbnail-more": "چوڑا کریں",
        "import": "درآمد صفحات",
-       "tooltip-pt-userpage": "آپ کا صارفی صفحہ",
-       "tooltip-pt-mytalk": "آپ Ú©Ø§ ØµÙ\81Ø­Û\82 Ú¯Ù\81تگÙ\88",
+       "tooltip-pt-userpage": "آپ کا صارف صفحہ",
+       "tooltip-pt-mytalk": "آپ Ú©Ø§ ØªØ¨Ø§Ø¯Ù\84Û\81 Ø®Û\8cاÙ\84 ØµÙ\81Ø­Û\81",
        "tooltip-pt-preferences": "آپ کی ترجیحات",
        "tooltip-pt-watchlist": "اُن صفحات کی فہرست جن کی تبدیلیاں آپ کی زیرِنظر ہیں",
-       "tooltip-pt-mycontris": "آپ کی شراکت کی فہرست",
+       "tooltip-pt-mycontris": "آپ کی شراکتوں کی فہرست",
        "tooltip-pt-login": "آپ کیلئے داخلِ نوشتہ ہونا اچھا ہے؛ تاہم، یہ ضروری نہیں",
        "tooltip-pt-logout": "خارجِ نوشتہ ہوجائیں",
        "tooltip-pt-createaccount": "آپ کو مدعو کیا جاتا ہے کہ کھاتہ بنائیں۔تاہم کھاتہ بنانا لازم نہیں۔",
        "tooltip-summary": "مختصر خلاصہ درج کریں",
        "anonymous": "{{SITENAME}} گمنام صارف",
        "others": "دیگر",
+       "pageinfo-visiting-watchers": "تعداد ناظرین جنہوں نے حالیہ ترامیم کا مشاہدہ کیا",
+       "pageinfo-hidden-categories": "پوشیدہ {{PLURAL:$1|زمرہ|زمرہ جات}} ($1)",
        "pageinfo-toolboxlink": "معلومات صفحہ",
        "markaspatrolledtext": "اس صفحہ کو بطور مراجعت شدہ نشان زد کریں",
        "deletedrevision": "حذف شدہ پرانی ترمیم $1۔",
        "file-nohires": "اس سے بڑی تصمیم دستیاب نہیں۔",
        "show-big-image": "اصل ملف",
        "show-big-image-preview": "اس نمائش کا حجم:$1",
+       "show-big-image-other": "دیگر {{PLURAL:$2|تجویز|تجویزیں}}: $1۔",
        "show-big-image-size": "$1 × $2 pixels",
        "newimages": "نئی فائلوں کی گیلری",
        "ilsubmit": "تلاش",
        "bydate": "بالحاظ تاریخ",
        "weeks": "{{PLURAL:$1|$1ہفتہ| $1  ہفتے}}",
+       "ago": "$1 قبل",
+       "minutes-ago": "$1 {{PLURAL:$1|منٹ|منٹ}} قبل",
+       "seconds-ago": "$1 {{PLURAL:$1|سیکنڈ|سیکنڈ}} قبل",
        "bad_image_list": "شکلبند درج ذیل ہے:\n\nصرف فہرستی عناصر (* سے شروع ہونے والی لکیری) شامل کی جاتی ہیں۔\nکسی لکیر میں پہلا ربط کوئی خراب ملف کا ہونا چاہئے۔\nاُسی لکیر میں باقی آنے والے ربط کو مستثنیٰ قرار دیا جاتا ہے، مثلاً صفحات جہاں ملف لکیر کے وسط میں آسکتا ہے۔",
        "metadata": "میٹا ڈیٹا",
        "metadata-help": "اِس ملف میں اِضافی معلومات شامل ہیں، جو کہ شاید اُس رقمی کیمرے یا سکینر سے آئے ہیں جس کے ذریعے یہ ملف بنائی گئی تھی۔\nاگر ملف اپنی اصل حالت میں نہیں رہی ہے تو کچھ تفاصیل ترمیم شدہ ملف کی مکمل طور پر عکاسی نہیں کرپائیں گے۔",
        "metadata-collapse": "طویل تفاصیل چھپاؤ",
+       "metadata-fields": "تصویر کے میٹاڈیٹا کے وہ خانے جو اس پیغام میں درج ہیں وہ تصویر کے صفحے پر شامل ہوتے ہیں نیز یہ اس وقت ظاہر ہوتے ہیں جب میٹاڈیٹا کو وسیع کیا جائے۔\nالبتہ دیگر خانے ابتدائی طور پر پوشیدہ ہوتے ہیں۔\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-orientation": "پیشکش",
        "exif-xresolution": "چھوڑاوی دکھاوت",
        "exif-yresolution": "لمباوی دکھاوت",
        "logentry-delete-delete": "$1 {{GENDER:$2|حذف کیا گیا}} صفحہ $3",
        "logentry-move-move": "$1 نے صفحہ $3 کو بجانب $4 منتقل کیا",
        "logentry-newusers-create": "صارف کھاتہ $1 {{GENDER:$2|بنایا گیا}}",
+       "logentry-protect-move_prot": "$1 نے ترتیب درجہ حفاظت $4 سے $3 کی طرف {{GENDER:$2|منتقل کی}}",
        "logentry-protect-modify": "$1 نے $3 کا درجۂ حفاظت {{GENDER:$2|تبدیل کیا}} $4",
+       "logentry-rights-rights": "$1 نے {{GENDER:$6|$3}} کی گروہی رکنیت از $4 تا $5 {{GENDER:$2|تبدیل کی}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|اپلوڈ}} $3",
        "rightsnone": "(کچھ نہیں)",
        "revdelete-summary": "خلاصۂ تدوین",
index 8d0cb67..3715253 100644 (file)
        "minoredit": "Sửa đổi nhỏ",
        "watchthis": "Theo dõi trang này",
        "savearticle": "Lưu trang",
+       "savechanges": "Lưu các thay đổi",
        "publishpage": "Xuất bản trang",
+       "publishchanges": "Xuất bản các thay đổi",
        "preview": "Xem trước",
        "showpreview": "Xem trước",
        "showdiff": "Xem thay đổi",
        "content-model-css": "CSS",
        "content-json-empty-object": "Đối tượng trống",
        "content-json-empty-array": "Mảng trống",
+       "deprecated-self-close-category": "Trang có thẻ HTML tự đóng không hợp lệ",
        "duplicate-args-warning": "<strong>Cảnh báo:</strong> [[:$1]] đang gọi  [[:$2]] với nhiều hơn một giá trị cho thông số “$3”. Chỉ giá trị cuối cùng mới được sử dụng.",
        "duplicate-args-category": "Trang đưa đối số thừa vào bản mẫu",
        "duplicate-args-category-desc": "Trang đưa một đối số nhiều lần vào một bản mẫu được nhúng, thí dụ <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> hoặc <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "rightslogtext": "Đây là nhật trình lưu những thay đổi đối với các quyền hạn thành viên.",
        "action-read": "đọc trang này",
        "action-edit": "sửa đổi trang này",
-       "action-createpage": "tạo trang",
-       "action-createtalk": "tạo trang thảo luận",
+       "action-createpage": "tạo trang này",
+       "action-createtalk": "tạo trang thảo luận này",
        "action-createaccount": "mở tài khoản này",
        "action-autocreateaccount": "tự động tạo tài khoản người dùng bên ngoài này",
        "action-history": "xem lịch sử của trang này",
        "upload-http-error": "Xảy ra lỗi HTTP: $1",
        "upload-copy-upload-invalid-domain": "Không có sẵn các bản sao tải lên tại tên miền này.",
        "upload-foreign-cant-upload": "Wiki này không được thiết lập để tải tập tin lên kho tập tin chung bên ngoài được chỉ định.",
+       "upload-foreign-cant-load-config": "Thất bại khi tải cấu hình cho tập tin tải lên kho tập tin bên ngoài.",
+       "upload-dialog-disabled": "Chức năng tải lên tập tin qua hộp thoại này bị tắt trong wiki này.",
        "upload-dialog-title": "Tải tập tin lên",
        "upload-dialog-button-cancel": "Hủy bỏ",
        "upload-dialog-button-done": "Xong",
        "sp-contributions-username": "Địa chỉ IP hay tên thành viên:",
        "sp-contributions-toponly": "Chỉ hiện các phiên bản mới nhất",
        "sp-contributions-newonly": "Chỉ hiện các sửa đổi tạo trang",
+       "sp-contributions-hideminor": "Ẩn các sửa đổi nhỏ",
        "sp-contributions-submit": "Tìm kiếm",
        "whatlinkshere": "Các liên kết đến đây",
        "whatlinkshere-title": "Các trang liên kết đến “$1”",
        "pageinfo-category-files": "Số tập tin",
        "markaspatrolleddiff": "Đánh dấu tuần tra",
        "markaspatrolledtext": "Đánh dấu tuần tra trang này",
-       "markaspatrolledtext-file": "Đánh dấu phiên bản fiel này là đã kiểm tra",
+       "markaspatrolledtext-file": "Đánh dấu đã tuần tra phiên bản file này",
        "markedaspatrolled": "Đã đánh dấu tuần tra",
        "markedaspatrolledtext": "Phiên bản được chọn của [[:$1]] đã được đánh dấu tuần tra.",
        "rcpatroldisabled": "“Thay đổi gần đây” của các trang tuần tra không bật",
        "mw-widgets-dateinput-placeholder-month": "YYYY-MM (năm-tháng)",
        "mw-widgets-titleinput-description-new-page": "trang này chưa tồn tại",
        "mw-widgets-titleinput-description-redirect": "đổi hướng đến $1",
-       "api-error-blacklisted": "Xin vui lòng chọn một tên khác miêu tả đầy đủ.",
        "sessionmanager-tie": "Không thể kết hợp nhiều yêu cầu xác thực loại: $1.",
        "sessionprovider-generic": "phiên $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "phiên dựa trên cookie",
        "linkaccounts-success-text": "Đã liên kết tài khoản.",
        "linkaccounts-submit": "Liên kết tài khoản",
        "unlinkaccounts": "Gỡ liên kết tài khoản",
-       "unlinkaccounts-success": "Đã gỡ liên kết tài khoản."
+       "unlinkaccounts-success": "Đã gỡ liên kết tài khoản.",
+       "authenticationdatachange-ignored": "Tác vụ thay đổi dữ liệu xác thực không được xử lý. Có lẽ nhà cung cấp chưa được cấu hình?"
 }
index 3e055ed..0f2b80e 100644 (file)
        "unwatch": "Nimmä beoobachdn",
        "watchlist-details": "Duu häldsch {{PLURAL:$1|1 sajdn|$1 sajdn}} undâr beoobachdung.",
        "wlshowlast": "Dsajch dii ändrunga fo di ledsdn $1 schdundn, $2 dooch odär",
-       "watchlistall2": "ale",
        "watchlist-options": "Was un wii alles af Dajnâr beobachdungslisdn dsajchd wärn sol",
        "watching": "Ghumd undâr beoobachdung ...",
        "unwatching": "Beobachdn ajschränggn",
index 1fcb1d9..ef9200d 100644 (file)
        "deletecomment": "Süü",
        "deleteotherreason": "Muu vai lisä süü",
        "deletereasonotherlist": "Muu süü",
-       "rollback_short": "Vääntega",
        "rollbacklink": "vääntega",
        "protectlogpage": "Varjõtud cüľľed",
        "protectedarticle": "\"[[$1]]\" on nüd varjõttu",
        "block-log-flags-nocreate": "lukuloomin piäteltü",
        "movepagetext": "Alla õlõvall ruumõll võitta anta cüľľelle uutt nimiä; kõik cüľľee istori leeb liikutõttu uuvvõ nimee alle.\nVanass cüľľess nõizõb tulõma mešaituzcülci, kumpa näütteeb uuvvõsõ cülcese.\nVõitta obnovoittaa cülcese silmell lüüvvävä mešaituhsõd avtomaattisessi uuvõllõ nimelle.\nKui että taho sitä tehävää avtomaattisessi, mälehtega ettsiää [[Special:DoubleRedirects|kahskõrtaissit]] vai [[Special:BrokenRedirects|katciit]] mešaituhsiit.\nÕlõtta vastuussa sihee, jot linkid näütteeväd sinne, kuhõõ ned pitäiziväd näütellää.\n\nCülciä '''eb''' nõizõ liikuttama, kui uusi nimi on jo cäütennü, muut kuiva kui cülci on tühjä vai on mešaituz, kummall ebõõ muutuzistoria.\nSee täheteb sitä, jot võitta liikuttaa cüľľee takaz vanalle nimelle kui öhsünettä, mutta että või cirjuttaa eloz õlõvaa cüľľee päälle.\n\nSee saattab õlla suuri ja oottõmizõtoi muutuz populaarnoille cüľľelle. Õlka nii üvä, obespecoittõga, jot saatta arvoa sledstvijäd ennee kui liikutta cüľľee.",
        "movepagetalktext": "Cülci ja sene juttucülci leeväd liikutõtud ühez, '''va kui''':\n*Tseeľicüľľell on eloz juttucülci, kumpa ebõõ tühjä, vai\n*Jätättä all õlõvaa ruuoo merkkittämättä.\n\nNeill kõhtoill piättä liikuttaa vai ühissää cüľľee cäzi.",
-       "movearticle": "Liikut cülci",
        "newtitle": "Uusi nimi cüľľelee",
        "move-watch": "Katso sitä cülciä",
        "movepagebtn": "Liikut cülci",
        "tags-edit": "muuttaa",
        "htmlform-selectorother-other": "Muu",
        "rightsnone": "(eb õõ)",
-       "feedback-message": "Ilmottamin:",
        "feedback-cancel": "Otmeńoit",
-       "feedback-close": "On tehtü"
+       "feedback-close": "On tehtü",
+       "feedback-message": "Ilmottamin:"
 }
index 31790e2..4edc5d8 100644 (file)
@@ -50,7 +50,7 @@
        "tog-enotifminoredits": "頁搭文件細編也用電子信通知我",
        "tog-enotifrevealaddr": "電子信通知單裏顯示我個電子信地址",
        "tog-shownumberswatching": "顯示關注人數",
-       "tog-oldsig": "生个签名:",
+       "tog-oldsig": "生个签名:",
        "tog-fancysig": "拿签名当成维基文本(弗自动链接)",
        "tog-uselivepreview": "使用实时预览",
        "tog-forceeditsummary": "朆写编辑摘要个辰光提醒我",
        "protectedpagetext": "箇页锁牢定,防编搭各许操作。",
        "viewsourcetext": "侬可以查看搭仔复制箇只页面个源码。",
        "viewyourtext": "侬好望搭著复制<strong>侬编辑箇页后</strong>个源码。",
-       "protectedinterface": "箇页为箇维基个软件提供界面文本,锁牢定防乱用。\n加改全部维基个译文,用[https://translatewiki.net/ translatewiki.net],MediaWiki软件个本地化计划。",
+       "protectedinterface": "本页为箇维基个软件提供界面文本,锁牢定防乱用。要增加或修改所有维基个译文,用[https://translatewiki.net/ translatewiki.net],MediaWiki软件个本地化计划。",
        "editinginterface": "<strong>警告:</strong>侬来里编写个页面是畀软件用个界面文本。箇页变化会影响各许人个界面样子。",
        "translateinterface": "要添加或者更改所有wiki个翻译,请侬访问MediaWiki本地化项目个网站[https://translatewiki.net/ translatewiki.net]。",
        "cascadeprotected": "箇只页面畀保护拉许,因为渠已嵌入到下底已经标注“级联保护”个{{PLURAL:$1|一只|多只}}畀保护页面:\n$2",
        "noname": "用户名无效。",
        "loginsuccesstitle": "登录哉",
        "loginsuccess": "<strong>侬现在以“$1”个身份登录到{{SITENAME}}。</strong>",
-       "nosuchuser": "寻弗着用户“$1”。用户名是大小写敏感外加区分繁简体个。请检查拼写,或者[[Special:CreateAccount|开只新账æ\88·]]ã\80\82",
+       "nosuchuser": "寻弗着用户“$1”。用户名是大小写敏感外加区分繁简体个。请检查拼写,或者[[Special:CreateAccount|开只新账å\8f·]]ã\80\82",
        "nosuchusershort": "无没叫“$1”个用户。请检查侬个输入。",
        "nouserspecified": "侬必须选个用户名。",
        "login-userblocked": "箇个用户拨封锁拉许。弗允许登录。",
        "password-name-match": "密码弗好搭户名一样。",
        "password-login-forbidden": "用箇名字搭密码是弗准个。",
        "mailmypassword": "重置密码",
-       "passwordremindertitle": "{{SITENAME}} 个临时新密码",
+       "passwordremindertitle": "{{SITENAME}}个新临时密码",
        "passwordremindertext": "有人(作兴是侬,来自IP地址$1)已经请求{{SITENAME}}个新密码($4)。\n用户“$2”个一只新临时密码现在已经设置好为“$3”。\n假使箇只动作是侬发起个,侬需要立即登录并选择一只新个密码。\n侬个临时密码会得垃拉$5日里向过期。\n\n假使箇只请求弗是侬发起个,或者侬已经拿密码想起来外加弗准备改脱渠,\n侬可以忽略此消息并继续使用侬个旧密码。",
        "noemail": "用户\"$1\"弗曾登记电子邮件地址。",
        "noemailcreate": "侬要提供只有效个电子邮件地址",
        "passwordsent": "用户\"$1\"个新密码已经寄往登记个电子邮件地址。\n请收着仔再登录。",
-       "blocked-mailpassword": "侬个IP地址处于查封状态,弗允许编辑,为仔安全起见,密码恢复功能已经禁用。",
+       "blocked-mailpassword": "侬个IP地址处于查封状态,弗允许编辑。为仔防止乱用,箇只IP地址个密码恢复功能已经禁用。",
        "eauthentsent": "一封确认信已经发送到指定个电子邮箱地址。垃拉其他邮件发送到本账号之前,侬必须首先按照箇封信里向个指示,确认箇只邮箱真实有效。",
        "throttled-mailpassword": "密码转设电子信徕最近$1个钟头里发畀你侬哉。保险点,密码转设电子信$1个钟头只一垡好发。",
        "mailerror": "发送邮件错误:$1",
        "createaccount-title": "垃拉{{SITENAME}}里向创建新账户",
        "createaccount-text": "有人垃拉{{SITENAME}}里向利用侬个邮箱创建仔一只叫 \"$2\" 个新帐户($4),密码是 \"$3\" 。侬应该立即登录并更改密码。\n\n如果箇个账户创建错误个说话,侬可以忽略此信息。",
        "login-throttled": "你侬试登忒多次哉。\n等 $1 再试试凑相。",
-       "login-abort-generic": "登录弗成功 - 已终止",
+       "login-abort-generic": "侬登录失败 - 中止哉",
        "login-migrated-generic": "侬个账号已经畀移脱哉,并且侬个用户名来箇wiki弗再存在。",
        "loginlanguagelabel": "闲话:$1",
        "suspicious-userlogout": "侬登出个要求已经拨回头脱,因为渠可能是由已损坏个浏览器或者缓存代理传送个。",
        "resettokens-resetbutton": "重置选中个密钥",
        "bold_sample": "粗体文字",
        "bold_tip": "粗体文字",
-       "italic_sample": "斜体文",
-       "italic_tip": "斜体文",
+       "italic_sample": "斜体文",
+       "italic_tip": "斜体文",
        "link_sample": "链接标题",
        "link_tip": "内部链接",
        "extlink_sample": "http://www.example.com 链接标题",
        "showpreview": "显示预览",
        "showdiff": "显示变化",
        "blankarticle": "<strong>警告:</strong>侬要创建个页面是空白个。如果侬再次点击“{{int:savearticle}}”,一只呒不任何内容个页面会畀创建。",
-       "anoneditwarning": "<strong>警告:</strong>侬弗曾登录。如果侬做仔啥编辑,箇么侬个IP地址会公开可见。如果侬<strong>[$1 登录]</strong>或<strong>[$2 创建一只账号]</strong>,侬个编辑会归功于侬用户名下底,而且会有其他优点。",
+       "anoneditwarning": "<strong>警告:</strong>侬弗曾登录。如果侬做仔啥编辑,箇么侬个IP地址会公开可见。如果侬<strong>[$1 登录]</strong>或者<strong>[$2 建立只账号]</strong>,侬个编辑会归功到侬用户名下底,而且有其他优点。",
        "anonpreviewwarning": "''侬弗曾登录。侬个IP位址会得记录拉此页个编辑历史里向。''",
        "missingsummary": "'''提示:''' 侬弗曾提供编辑摘要。假使侬再次单击保存,侬个编辑将弗带编辑摘要保存。",
        "selfredirect": "<strong>警告:</strong>侬来上拿本页面重定向到它自家。侬可能搞错著重定向个目标,或者侬来上编辑错个页面。如果侬再次点击“{{int:savearticle}}”,重定向弗管哪亨会畀创建。",
        "missingcommentheader": "<strong>提示:</strong>侬弗曾为此评论提供标题。如果侬再次单击“{{int:savearticle}}”,侬个编辑将弗带标题保存。",
        "summary-preview": "摘要预览:",
        "subject-preview": "主题预览:",
-       "blockedtitle": "用户查封",
+       "blockedtitle": "用户查封",
        "blockedtext": "<strong>侬个用户名或IP地址已经畀查封。</strong>\n\n由$1查封。畀出个原因是<em>$2</em>。\n\n* 查封开始辰光:$8\n* 查封到期辰光:$6\n* 目标查封对象:$7\n\n侬可以联络$1或者其他个[[{{MediaWiki:Grouppage-sysop}}|管理员]],讨论箇趟查封。侬弗好使用“电邮联系箇位用户”功能,除非侬已经垃侬个[[Special:Preferences|账号设置]]里向指定仔一只有效个电邮地址并且朆畀禁止使用箇只功能。侬当前个IP地址是$3,而该查封ID是#$5。请垃拉侬个查询里向注明以上所有资料。",
        "autoblockedtext": "侬个IP地址已经畀自动查封,因为之前另一位畀$1查封个用户搭侬用一样个IP地址。查封个原因是:\n\n:<em>$2</em>\n\n* 查封开始辰光:$8\n* 查封到期辰光:$6\n* 目标查封对象:$7\n\n侬可以联络$1或者其他个[[{{MediaWiki:Grouppage-sysop}}|管理员]],讨论箇趟查封。\n\n注意侬弗好使用“电邮联系箇位用户”功能,除非侬已经垃侬个[[Special:Preferences|账号设置]]里向指定仔一只有效个电邮地址并且朆畀禁止使用箇只功能。\n\n侬当前个IP地址是$3,而该查封ID是#$5。请垃拉侬个查询里向注明以上所有资料。",
        "blockednoreason": "朆畀出原因",
        "previewnote": "<strong>该个还只是预览。</strong>倷个修改还朆保存!",
        "continue-editing": "到编辑区去",
        "previewconflict": "箇个预览显示了上头文字编辑区里向个内容。渠会得垃拉侬保存之后出现。",
-       "session_fail_preview": "'''弗好意思!由于会话数据落失,我伲弗好处理侬个编辑。'''请重试。如果再次失败,请尝试[[Special:UserLogout|登出]]之后重新登录。",
+       "session_fail_preview": "弗好意思!由于会话数据落失,我伲弗好处理侬个编辑。\n\n侬作兴已经登出哉。<strong>请核实侬啊曾登录勒上,再试一遍</strong>。如果仍旧弗来事,请[[Special:UserLogout|登出]]著再重新登录,并确保侬个浏览器允许本站个cookie。",
        "session_fail_preview_html": "弗好意思!因为会话数据落失,我伲弗好处理侬个编辑。\n\n<em>由于{{SITENAME}}允许使用原始个HTML,为著防范JavaScript攻击,预览已经囥脱。</em>\n\n<strong>如果箇是一趟合法个编辑,请再试一遍。</strong>如果仍旧弗来事,请[[Special:UserLogout|登出]]著再重新登录,并确保侬个浏览器允许本站个cookie。",
        "token_suffix_mismatch": "<strong>由于侬用户端里向个编辑令牌毁损仔一些标点符号字元,为防止编辑个文字损坏,侬个编辑已经畀回头。</strong>箇种情况通常出现垃拉使用含有交关bug、以网络为主个匿名代理服务个辰光。",
        "editing": "来里编写$1",
        "yourtext": "侬个文字",
        "storedversion": "已保存版本",
        "nonunicodebrowser": "'''警告:侬个浏览器弗兼容Unicode编码。'''箇搭有一只工作区将使侬可以安全编辑页面:非ASCII字符将以十六进制编码方式出现垃拉编辑框里向。",
-       "editingold": "''' 注意:倷勒里改动一只已经过期个页面修改。 如果倷保存俚个说话,勒拉该个修改之后个亨白浪当个修改侪会呒拨个。'''",
+       "editingold": "<strong>警告:倷勒里编辑该只页面个旧版本。</strong>如果倷保存俚个说话,勒拉该个版本之后个亨白浪当个修改侪会呒不个。",
        "yourdiff": "两样",
        "copyrightwarning": "请注意侬对{{SITENAME}}个所有贡献侪必须垃拉$2下头发布(请查看垃拉$1个细节)。假使侬弗希望侬个文字畀任意修改搭再发布,请弗要提交。<br />\n侬同时也要向阿拉保证侬所提交个内容是侬自家所作,或得自一个弗受版权保护或相似自由个来源。<strong>弗要垃拉弗曾获得授权个情况下头发表!</strong>",
        "copyrightwarning2": "请注意侬对{{SITENAME}}个所有贡献\n侪可能畀别个贡献者编辑,修改或删除。\n假使侬弗希望侬个文字畀任意修改搭仔再发布,请弗要提交。<br />\n侬同时也要向我伲保证侬提交个内容是侬自家所作,或得自一个弗受版权保护或相似自由个来源(参阅$1个细节)。\n''' 弗要垃拉弗曾获得授权个情况下头发表!'''",
        "postedit-confirmation-created": "页面已创建。",
        "postedit-confirmation-restored": "页面已恢复。",
        "postedit-confirmation-saved": "倷个编辑已保存。",
-       "edit-already-exists": "弗好创建新页面。\n已经有垃许。",
+       "edit-already-exists": "弗好创建新页面。已经有垃许。",
        "defaultmessagetext": "默认消息文本",
        "invalid-content-data": "无效内容数据",
        "content-not-allowed-here": "[[$2]]页面上弗允许“$1”内容",
        "cantcreateaccounttitle": "弗好开户",
        "cantcreateaccount-text": "从箇只IP地址 (<b>$1</b>) 创建账户已经畀[[User:$3|$3]]禁止。\n\n$3封禁个原因是''$2''",
        "viewpagelogs": "望箇页日志",
-       "nohistory": "该只页面呒编辑历史。",
-       "currentrev": "最版本",
+       "nohistory": "该只页面呒编辑历史。",
+       "currentrev": "最版本",
        "currentrev-asof": "$1个最新修订版",
        "revisionasof": "垃拉$1所作出个修订版",
        "revision-info": "{{GENDER:$6|$2}}$1个版本$7",
        "historysize": "($1字节)",
        "historyempty": "(空)",
        "history-feed-title": "校订历史",
-       "history-feed-description": "wiki里向本页个修订历史",
+       "history-feed-description": "本wiki里向该只页面个修订历史",
        "history-feed-item-nocomment": "$1垃拉$2",
        "history-feed-empty": "请求个页面弗存在。渠作兴已畀删除或重命名。\n尝试[[Special:Search|搜索本站]]获得相关新建页面。",
        "history-edit-tags": "编辑选中修订版本个标签",
-       "rev-deleted-comment": "(编辑摘要畀删脱)",
-       "rev-deleted-user": "ï¼\88ç\94¨æ\88·å\90\8då·²å\88 é\99¤)",
-       "rev-deleted-event": "(日志细节畀删脱)",
+       "rev-deleted-comment": "(编辑摘要删脱哉)",
+       "rev-deleted-user": "ï¼\88ç\94¨æ\88·å\90\8då\88 è\84±å\93\89)",
+       "rev-deleted-event": "(日志细节删脱哉)",
        "rev-deleted-user-contribs": "[用户名或IP地址已删除 - 垃贡献里向囥脱编辑]",
        "rev-deleted-text-permission": "箇只页面版本已畀'''删除'''。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 删除日志]里向可以寻着详细信息。",
        "rev-deleted-text-unhide": "箇只页面修订已经畀<strong>删脱</strong>。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 删除日志]里向可以寻着详细信息。\n如果侬想继续个说话,侬仍旧好[$1 查看箇趟修订]。",
        "revdelete-unsuppress": "垃拉已恢复个修订里向移除限制",
        "revdelete-log": "理由:",
        "revdelete-submit": "应用于拣中个{{PLURAL:$1|修订}}",
-       "revdelete-success": "'''修订个可见性已经成功更新。'''",
+       "revdelete-success": "修订个可见性已经更新哉。",
        "revdelete-failure": "版本个可见性无法更新:$1",
        "logdelete-success": "日志个可见性设置好哉。",
        "logdelete-failure": "'''事件个可见性无法设置:'''\n$1",
        "prefsnologintext2": "请登录来更改侬个用户设置。",
        "prefs-skin": "皮肤",
        "skin-preview": "预览",
-       "datedefault": "呒偏好",
+       "datedefault": "呒偏好",
        "prefs-labs": "实验性特色",
        "prefs-user-pages": "用户页",
        "prefs-personal": "用户档案",
        "rightslog": "用户权限日志",
        "action-read": "讀箇頁",
        "action-edit": "编辑箇只页面",
-       "action-createpage": "å\81\9aæ\96°é \81",
-       "action-createtalk": "å\81\9aè¨\8eè«\96é \81",
+       "action-createpage": "建ç«\8b该å\8fªé¡µé\9d¢",
+       "action-createtalk": "建ç«\8b该å\8fªè®¨è®ºé¡µ",
        "action-minoredit": "標小編寫",
        "action-move": "移箇頁",
        "action-move-subpages": "移箇頁搭兒頁",
        "enhancedrc-history": "歷史",
        "recentchanges": "近段辰光个改动",
        "recentchanges-legend": "近段辰光个改动选项",
-       "recentchanges-summary": "登该个页面浪跟踪最近对维基百科个改动。",
+       "recentchanges-summary": "登该个页面浪跟踪最近对本站个改动。",
        "recentchanges-feed-description": "跟踪此订阅垃拉 wiki 高头个最近更改。",
        "recentchanges-label-newpage": "箇编辑建立着新页",
        "recentchanges-label-minor": "箇是小编写",
        "sp-contributions-talk": "讲张",
        "sp-contributions-search": "寻贡献记录",
        "sp-contributions-username": "IP地址要勿用户名:",
+       "sp-contributions-toponly": "只显示阿末只版本个编辑",
        "sp-contributions-submit": "搜寻",
        "whatlinkshere": "有啥链到箇里",
        "whatlinkshere-title": "链接到“$1”个页面",
        "logentry-newusers-create": "用户账号$1畀{{GENDER:$2|创建}}",
        "logentry-newusers-create2": "用户账号$3畀$1{{GENDER:$2|创建}}",
        "logentry-newusers-autocreate": "用户账号$1畀自动{{GENDER:$2|创建}}",
-       "logentry-rights-rights": "$1{{GENDER:$2|更改}}$3个用户组从$4到$5",
+       "logentry-rights-rights": "$1{{GENDER:$2|更改}}{{GENDER:$6|$3}}个用户组从$4到$5",
        "logentry-upload-upload": "$1{{GENDER:$2|上传}}$3",
        "rightsnone": "(呒)",
        "revdelete-summary": "编辑摘要",
+       "feedback-thanks-title": "谢谢侬!",
        "searchsuggest-search": "搜寻",
        "pagelang-language": "闲话"
 }
index e00ae61..d34e2df 100644 (file)
        "password-change-forbidden": "איר קען נישט ענדערן פאסווערטער אויף דער וויקי.",
        "externaldberror": "עס איז אדער פארגעקומען אן אויטענטיקאציע דאטנבאזע פֿעלער אדער איר זענט נישט ערמעגליכט צו דערהיינטיגן אייער דרויסנדיגע קאנטע.",
        "login": "אַרײַנלאָגירן",
+       "login-security": "וועריפיצירט אייער אידענטיטעט",
        "nav-login-createaccount": "ארײַנלאָגירן / זיך אײַנשרײַבן",
        "userlogin": "ארײַנלאָגירן / זיך אײַנשרײַבן",
        "userloginnocreate": "אַרײַנלאגירן",
        "createacct-reason-ph": "פֿארוואס שאפֿט איר נאך א קאנטע",
        "createacct-submit": "שאפֿט אײַער קאנטע",
        "createacct-another-submit": "שאַפֿן קאנטע",
+       "createacct-continue-submit": "פֿארטזעצן שאפֿן קאנטע",
+       "createacct-another-continue-submit": "פֿארטזעצן שאפֿן קאנטע",
        "createacct-benefit-heading": "{{SITENAME}} איז געמאכט דורך מענטשן ווי איר.",
        "createacct-benefit-body1": "{{PLURAL:$1|רעדאַקטירונג|$1 רעדאַקטירונגען}}",
        "createacct-benefit-body2": "$1 {{PLURAL:$1|בלאַט|בלעטער}}",
        "createacct-another-realname-tip": "עכטער נאמען איז אפציאנאל.\nאויב איר וויילט אויס צוצושטעלן אים, וועט דאס גענוצט ווערן צו געבן אטריבוציע פאר זייער ארבעט.",
        "pt-login": "אריינלאגירן",
        "pt-login-button": "אַרײַנלאָגירן",
+       "pt-login-continue-button": "פארטזעצן אריינלאגירן",
        "pt-createaccount": "שאַפֿן אַ קאנטע",
        "pt-userlogout": "אַרויסלאָגירן",
        "php-mail-error-unknown": "אומבאַקאַנט טעות אין()mail פֿונקציע פֿון PHP.",
        "botpasswords-updated-body": "דאס באט פאסווארט פאר באט־נאמען \"$1\" פון באניצער \"$2\" איז דערהיינטיקט געווארן.",
        "botpasswords-deleted-title": "באט פאסווארט אויסגעמעקט",
        "resetpass_forbidden": "פאסווערטער קענען נישט ווערן געטוישט",
+       "resetpass_forbidden-reason": "פאסווערטער קענען נישט ווערן געטוישט: $1",
        "resetpass-no-info": "איר דארפֿט זיין אריינלאגירט צוצוקומען גלייך צו דעם דאזיגן בלאט.",
        "resetpass-submit-loggedin": "טוישן פאסווארט",
        "resetpass-submit-cancel": "אַנולירן",
        "passwordreset-emailsentusername": "טאמער איז פאראן אן ע־פאסט אדרעס פארקניפט מיט דעם באניצער־נאמען, וועט מען שיקן א פאסווארט צוריקשטעלן ע-פּאָסט.",
        "passwordreset-emailsent-capture": "מען האט געשיקט א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן.",
        "passwordreset-emailerror-capture": "מען האט געשאפן א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן, אבער שיקן צום {{GENDER:$2|באניצער}}איז דורכגעפאלן: $1",
+       "passwordreset-nocaller": "מען דארף פֿארזארגן א רופֿער",
+       "passwordreset-invalideamil": "אומגילטיקער ע־פאסט אדרעס",
        "changeemail": "ענדערן אדער אראפנעמען ע-פּאָסט אַדרעס",
        "changeemail-header": "דערגאַנצט די פֿאָרעם צו ענדערן אייער ע-פּאָסט אַדרעס .\nטאמער ווילט איר אראפנעמען די צוארדנונג פון איינעם פון אייערע ע־פאסט אדרעסן פו אייער קאנטע, לאזט ליידיג דעם נייעם ע־פאסט אדרעס ווען איר גיט איין די פֿארעם.",
        "changeemail-passwordrequired": "איר וועט דארפן איינגעבן אייער פאסווארט צו באשטעטיגן די ענדערונג.",
        "grant-group-file-interaction": "אינטעראגירן מיט מעדיע",
        "grant-group-email": "שיקן ע־פאסט",
        "grant-createaccount": "שאַפֿן קאנטעס",
+       "grant-editmywatchlist": "רעדאקטירן אײַער אויפֿפאסונג ליסטע",
+       "grant-editpage": "רעדאקטירן עקזיסטירנדע בלעטער",
+       "grant-editprotected": "רעדאקטירן געשיצטע בלעטער",
        "grant-uploadfile": "אַרויפֿלאָדן נייע טעקעס",
        "grant-basic": "בעיסיק רעכטן",
        "grant-viewmywatchlist": "קוקט אייער אויפפאסונג ליסטע",
        "rightslogtext": "דאָס איז אַ לאג פֿון ענדערונגען צו באַניצער רעכטן.",
        "action-read": "ליינען דעם בלאַט",
        "action-edit": "רעדאקטירן דעם בלאַט",
-       "action-createpage": "ש×\90ַפֿ×\9f ×\91×\9c×¢×\98ער",
-       "action-createtalk": "ש×\90ַפֿ×\9f ×©×\9e×\95עס ×\91×\9c×¢×\98ער",
+       "action-createpage": "ש×\90ַפֿ×\9f ×\93×¢×\9d ×\91×\9c×\90Ö·×\98",
+       "action-createtalk": "ש×\90ַפֿ×\9f ×\93×¢×\9d ×©×\9e×\95עס ×\91×\9c×\90×\98",
        "action-createaccount": "שאַפֿן די באַניצער קאנטע",
        "action-history": "באקוקן רעדאקטירן היסטאריע פון דעם בלאט.",
        "action-minoredit": "באַצייכענען די רעדאַקטירונג ווי מינערדיק",
        "sp-contributions-username": "באניצער נאמען אדער IP אדרעס:",
        "sp-contributions-toponly": "בלויז ווײַזן רעדאַקטירונגען וואָס זענען די לעצטיקע רעוויזיעס",
        "sp-contributions-newonly": "בלויז ווײַזן רעדאקטירונגען וואס זענען נײַ־געשאפענע בלעטער",
+       "sp-contributions-hideminor": "באהאלטן מינערדיגע ענדערונגען",
        "sp-contributions-submit": "זוכן",
        "whatlinkshere": "װאָס פֿאַרבינדט אַהער",
        "whatlinkshere-title": "בלעטער וואס פֿארבינדן צו $1",
        "move-page": "באַוועגן $1",
        "move-page-legend": "באַוועגן בלאַט",
        "movepagetext": "זיך באניצן מיט דעם פֿארעם וועט פֿארענדערן דעם נאמען פֿון דעם בלאט, און וועט אריבערפֿירן זיין געשיכטע צום נייעם נאמען.\nדאס אלטע קעפל וועט ווערן א ווייטערפֿירונג בלאט צום נייעם קעפל.\n\nאיר קענט דערהיינטיגן ווייטערפֿירונגען צום אלטן נאמען אויטאמאטיש.\n\nטאמער נישט, טוט פֿארזיכערן אז עס איז נישטא קיין [[Special:DoubleRedirects|געטאפלטע]] אדער [[Special:BrokenRedirects|צעבראכענע ווייטערפֿירונגען]].\n\nאיר זענט פֿאראנטווארטלעך זיכער מאכן אז אלע פֿארבינדונגען ווערן געריכטעט צום געהעריגן ציל.\n\nדער בלאט וועט <strong> נישט</strong> ווערן אריבערגעפֿירט אויב עס איז שוין דא א בלאט אונטער דעם נייעם נאמען, אחוץ ווען ער איז א ווייטערפֿירונג בלאט, און ער האט נישט קיין געשיכטע פון ענדערונגען.\nפשט דערפֿון, אז איר קענט איבערקערן א ווייטערפֿירונג וואס איר האט אט געמאכט בטעות, און איר קענט נישט אריבערשרייבן אן עקסיסטירנדן בלאט.\n\n<strong>הערה:</strong>\n אזא ענדערונג קען זיין דראסטיש און נישט געווינטשען פאר א פאפולערן בלאט;\nביטע פֿארזיכערט אז איר פֿארשטייט די ווייטגרייכנדע קאנסקווענסן צו דער אקציע בעפֿאר איר פֿירט דאס אויס.",
-       "movepagetext-noredirectfixer": "זיך באניצן מיט דעם פֿארעם אונטן וועט פֿארענדערן דעם נאמען פֿון דעם בלאט, און וועט אריבערפֿירן זיין געשיכטע צום נייעם נאמען.\n\nדאס אלטע קעפל וועט ווערן א ווייטערפֿירן בלאט צום נײַעם נאמען.\n\nטוט פֿארזיכערן אז עס בלײַבן נישט קיין [[Special:DoubleRedirects|געטאפלטע]] אדער [[Special:BrokenRedirects|צעבראכענע]] ווייטערפֿירונגען.\n\nאיר זענט פֿאראנטווארטלעך זיכער מאכן אז אלע פֿארבינדונגען ווערן געריכטעט צו דער געהעריגער ריכטונג.\n\nאַכטונג: דער בלאַט וועט <strong>נישט</strong> ווערן אַריבערגעפֿירט אויב עס איז שוין דאָ א בלאט אונטער דעם נײַעם נאמען, אחוץ ווען ער איז א ווײַטערפֿירונג בלאט, און ער האט נישט קיין געשיכטע פון ענדערונגען.\nפשט דערפֿון, אז איר קענט איבערקערן א ווייטערפֿירונג וואס איר האט אט געמאכט בטעות, און איר קענט נישט אריבערשרײַבן אַן עקסיסטירנדן בלאט.\n\n<strong>הערה:</strong> אזא ענדערונג קען זיין דראַסטיש און נישט געוואונטשן פֿאַר א פאפולערן בלאַט; ביטע פֿאַזיכערט אז איר פֿאַרשטייט די ווײַטגרייכנדע קאנסעקווענסן צו דער אַקציע בעפֿאַר איר גייט ווײַטער.",
+       "movepagetext-noredirectfixer": "×\96×\99×\9a ×\91×\90× ×\99צ×\9f ×\9e×\99×\98 ×\93×¢×\9d ×¤Ö¿×\90רע×\9d ×\90×\95× ×\98×\9f ×\95×\95×¢×\98 ×¤Ö¿×\90רענ×\93ער×\9f ×\93×¢×\9d × ×\90×\9e×¢×\9f ×¤Ö¿×\95×\9f ×\93×¢×\9d ×\91×\9c×\90×\98, ×\90×\95×\9f ×\95×\95×¢×\98 ×\90ר×\99×\91ערפֿ×\99ר×\9f ×\96×\99×\99×\9f ×\92עש×\99×\9b×\98×¢ ×¦×\95×\9d × ×\99×\99×¢×\9d × ×\90×\9e×¢×\9f.\n\n×\93×\90ס ×\90×\9c×\98×¢ ×§×¢×¤×\9c ×\95×\95×¢×\98 ×\95×\95ער×\9f ×\90 ×\95×\95×\99×\99×\98ערפֿ×\99ר×\9f ×\91×\9c×\90×\98 ×¦×\95×\9d × ×²Ö·×¢×\9d × ×\90×\9e×¢×\9f.\n\n×\98×\95×\98 ×¤Ö¿×\90ר×\96×\99×\9bער×\9f ×\90×\96 ×¢×¡ ×\91×\9cײַ×\91×\9f × ×\99ש×\98 ×§×\99×\99×\9f [[Special:DoubleRedirects|×\92×¢×\98×\90פ×\9c×\98×¢]] ×\90×\93ער [[Special:BrokenRedirects|צע×\91ר×\90×\9b×¢× ×¢]] ×\95×\95×\99×\99×\98ערפֿ×\99ר×\95× ×\92×¢×\9f.\n\n×\90×\99ר ×\96×¢× ×\98 ×¤Ö¿×\90ר×\90× ×\98×\95×\95×\90ר×\98×\9c×¢×\9a ×\96×\99×\9bער ×\9e×\90×\9b×\9f ×\90×\96 ×\90×\9c×¢ ×¤Ö¿×\90ר×\91×\99× ×\93×\95× ×\92×¢×\9f ×\95×\95ער×\9f ×\92ער×\99×\9b×\98×¢×\98 ×¦×\95 ×\93ער ×\92×¢×\94ער×\99×\92ער ×¨×\99×\9b×\98×\95× ×\92.\n\n×\90Ö·×\9b×\98×\95× ×\92: ×\93ער ×\91×\9c×\90Ö·×\98 ×\95×\95×¢×\98 <strong>× ×\99ש×\98</strong> ×\95×\95ער×\9f ×\90ַר×\99×\91ער×\92עפֿ×\99ר×\98 ×\90×\95×\99×\91 ×¢×¡ ×\90×\99×\96 ×©×\95×\99×\9f ×\93×\90Ö¸ ×\90 ×\91×\9c×\90×\98 ×\90×\95× ×\98ער ×\93×¢×\9d × ×²Ö·×¢×\9d × ×\90×\9e×¢×\9f, ×\90×\97×\95×¥ ×\95×\95×¢×\9f ×¢×¨ ×\90×\99×\96 ×\90 ×\95×\95ײַ×\98ערפֿ×\99ר×\95× ×\92 ×\91×\9c×\90×\98, ×\90×\95×\9f ×¢×¨ ×\94×\90×\98 × ×\99ש×\98 ×§×\99×\99×\9f ×\92עש×\99×\9b×\98×¢ ×¤×\95×\9f ×¢× ×\93ער×\95× ×\92×¢×\9f.\nפש×\98 ×\93ערפֿ×\95×\9f, ×\90×\96 ×\90×\99ר ×§×¢× ×\98 ×\90×\99×\91ערקער×\9f ×\90 ×\95×\95×\99×\99×\98ערפֿ×\99ר×\95× ×\92 ×\95×\95×\90ס ×\90×\99ר ×\94×\90×\98 ×\90×\98 ×\92×¢×\9e×\90×\9b×\98 ×\91×\98×¢×\95ת, ×\90×\95×\9f ×\90×\99ר ×§×¢× ×\98 × ×\99ש×\98 ×\90ר×\99×\91ערשרײַ×\91×\9f ×\90Ö·×\9f ×¢×§×¡×\99ס×\98×\99רנ×\93×\9f ×\91×\9c×\90×\98.\n\n<strong>×\94ער×\94:</strong> ×\90×\96×\90 ×¢× ×\93ער×\95× ×\92 ×§×¢×\9f ×\96×\99×\99×\9f ×\93ר×\90ַס×\98×\99ש ×\90×\95×\9f × ×\99ש×\98 ×\92×¢×\95×\95×\90×\95× ×\98ש×\9f ×¤Ö¿×\90ַר ×\90 ×¤×\90פ×\95×\9cער×\9f ×\91×\9c×\90Ö·×\98; ×\91×\99×\98×¢ ×¤Ö¿×\90ַר×\96×\99×\9bער×\98 ×\90×\96 ×\90×\99ר ×¤Ö¿×\90ַרש×\98×\99×\99×\98 ×\93×\99 ×\95×\95ײַ×\98×\92ר×\99×\99×\9b× ×\93×¢ ×§×\90נסעק×\95×\95ענס×\9f ×¦×\95 ×\93ער ×\90ַקצ×\99×¢ ×\91עפֿ×\90ַר ×\90×\99ר ×\92×\99×\99×\98 ×\95×\95ײַ×\98ער.",
        "movepagetalktext": "טאמער צייכנס איר דאס קעסטל, וועט דער אסאסיציאירטער רעדן בלאט ווערן באַוועגט אויטאמאֵטיש צום נײַעם קעפל, אחוץ ווען ס'איז שוין דא א נישט-ליידיגער רעדן־בלאט.\n\nאין דעם פֿאל, וועט איר דארפֿן באַוועגן אדער צונויפֿגיסן דעם בלאט האַנטלעך, ווען איר ווילט.",
        "moveuserpage-warning": "'''ווארענונג:''' איר האלט ביי באוועגן א באניצער בלאט. ביטע באמערקט אז נאר דער בלאט ווערט באוועגט אבער דער באניצער נאמען ווערט ''נישט'' געענדערט.",
        "movecategorypage-warning": "<strong>ווארענונג:</strong> איר האלט ביי באוועגן א קאטעגאריע בלאט. גיט אכט אז נאר דער בלאט וועט ווערן באוועגט, אבער די בלעטער אין דער אלטער קאטעגאריע וועט מען <em>נישט</em> be ארײַנשטעלן אין דער נייער קאטעגאריע.",
        "special-characters-title-endash": "ען טירע",
        "special-characters-title-emdash": "עם טירע",
        "special-characters-title-minus": "מינוס",
+       "mw-widgets-titleinput-description-new-page": "דער בלאט עקזיסטירט נאך נישט",
        "log-action-filter-upload": "טיפ ארויפֿלאד:",
        "log-action-filter-all": "אַלע",
        "log-action-filter-delete-delete": "אויסמעקן בלאט",
index 4000da9..4f06504 100644 (file)
@@ -90,7 +90,8 @@
                        "Apflu",
                        "飞舞回堂前",
                        "Cosine02",
-                       "Arthur2e5"
+                       "Arthur2e5",
+                       "Myy730"
                ]
        },
        "tog-underline": "链接下划线:",
        "youhavenewmessagesmanyusers": "您有来自多个用户的$1($2)。",
        "newmessageslinkplural": "{{PLURAL:$1|新信息|999=新消息}}",
        "newmessagesdifflinkplural": "最后{{PLURAL:$1|更改|999=更改}}",
-       "youhavenewmessagesmulti": "在$1有新信息",
+       "youhavenewmessagesmulti": "在$1有新信息",
        "editsection": "编辑",
        "editold": "编辑",
        "viewsourceold": "查看源代码",
        "databaseerror-query": "查询:$1",
        "databaseerror-function": "函数:$1",
        "databaseerror-error": "错误:$1",
-       "transaction-duration-limit-exceeded": "因为写入时间($1)超过了$2{{PLURAL:$2|秒}}的限制,为防止创建大量复制延迟,此次处理已被中止。如果您正在同时更改很多项目,请尝试进行多次小规模操作。",
+       "transaction-duration-limit-exceeded": "因为写入时间($1)超过了$2的限制,为防止创建大量复制延迟,此次处理已被中止。如果您正在同时更改很多项目,请尝试进行多次小规模操作。",
        "laggedslavemode": "<strong>警告:</strong>页面中可能没有包含最近的更新。",
        "readonly": "数据库被锁定",
        "enterlockreason": "请输入锁定的原因,这包括预计解除锁定的时间",
        "password-login-forbidden": "这个用户名称及密码的使用是被禁止的。",
        "mailmypassword": "重置密码",
        "passwordremindertitle": "{{SITENAME}}的新临时密码",
-       "passwordremindertext": "有人(可能是您,来自IP地址$1)已请求{{SITENAME}}的新密码($4)。\n用户“$2”的一个新临时密码现在已被设置好为“$3”。\n如果这个动作是您所指示的,您便需要立即登录并选择一个新的密码。\n您的临时密码会于$5天内过期。\n\n如果是其他人发出了该请求,或者您已经记起了您的密码并不准备改变它,您可以忽略此消息并继续使用您的旧密码。",
+       "passwordremindertext": "有人(可能是您,来自IP地址$1)已请求{{SITENAME}}的新密码($4)。用户“$2”的临时密码现在已被设置为“$3”。如果这个动作是您所指示的,您便需要立即登录并设置一个新的密码。您的临时密码会于{{PLURAL:$5|一天|$5天}}内过期。\n\n如果是其他人发出了该请求,或者您已经记起了您的密码并不准备改变它,您可以忽略此消息并继续使用您的旧密码。",
        "noemail": "用户\"$1\"没有登记电子邮件地址。",
        "noemailcreate": "您需要提供一个有效的电子邮件地址",
        "passwordsent": "用户\"$1\"的新密码已经寄往所登记的电子邮件地址。\n请在收到后再登录。",
        "minoredit": "标记为小编辑",
        "watchthis": "监视本页",
        "savearticle": "保存页面",
+       "savechanges": "保存更改",
        "publishpage": "发布页面",
+       "publishchanges": "发布更改",
        "preview": "预览",
        "showpreview": "显示预览",
        "showdiff": "显示更改",
        "clearyourcache": "<strong>注意:</strong>在保存之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。\n* <strong>Firefox或Safari:</strong>按住<em>Shift</em>的同时单击<em>刷新</em>,或按<em>Ctrl-F5</em>或<em>Ctrl-R</em>(Mac为<em>⌘-R</em>)\n* <strong>Google Chrome:</strong>按<em>Ctrl-Shift-R</em>(Mac为<em>⌘-Shift-R</em>)\n* <strong>Internet Explorer:</strong>按住<em>Ctrl</em>的同时单击<em>刷新</em>,或按<em>Ctrl-F5</em>\n* <strong>Opera:</strong>前往<em>菜单 → 设置</em>(Mac为<em>Opera → Preferences</em>),然后<em>隐私和安全 → 清除浏览数据 → 缓存的图片和文件</em>。",
        "usercssyoucanpreview": "<strong>提示:</strong>在保存前请用“{{int:showpreview}}”按钮来测试您新的 CSS 。",
        "userjsyoucanpreview": "<strong>提示:</strong>在保存前请用“{{int:showpreview}}”按钮来测试您新的 JavaScript 。",
-       "usercsspreview": "<strong>请记住您现在只是在预览的用户CSS。它尚未保存!</strong>",
+       "usercsspreview": "<strong>请记住您现在只是在预览的用户CSS。它尚未保存!</strong>",
        "userjspreview": "<strong>请记住您现在只是在测试/预览您的用户JavaScript。它尚未保存!</strong>",
-       "sitecsspreview": "<strong>请记住现在只是在预览该CSS。它尚未保存!</strong>",
+       "sitecsspreview": "<strong>请记住现在只是在预览该CSS。它尚未保存!</strong>",
        "sitejspreview": "<strong>请记住您现在只是在预览该JavaScript代码。它尚未保存!</strong>",
        "userinvalidcssjstitle": "<strong>警告:</strong>不存在皮肤“$1”。注意自定义的 .css 和 .js 页要使用小写标题,例如,{{ns:user}}:Foo/vector.css 不同于 {{ns:user}}:Foo/Vector.css。",
        "updated": "(已更新)",
        "content-model-css": "CSS",
        "content-json-empty-object": "空的对象",
        "content-json-empty-array": "空的数组",
+       "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”参数的值。只有最后提供的值会被使用。",
        "duplicate-args-category": "调用重复模板参数的页面",
        "duplicate-args-category-desc": "页面包含调用了重复参数的模板,例如<code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code>或<code><nowiki>{{foo|bar|1=baz}}</nowiki></code>。",
        "rev-deleted-comment": "(编辑摘要被移除)",
        "rev-deleted-user": "(用户名被删除)",
        "rev-deleted-event": "(日志详情已移除)",
-       "rev-deleted-user-contribs": "[用户名或IP地址被除 - 编辑在贡献中隐藏]",
+       "rev-deleted-user-contribs": "[用户名或IP地址被除 - 编辑在贡献中隐藏]",
        "rev-deleted-text-permission": "本页面版本已被<strong>删除</strong>。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。",
        "rev-suppressed-text-permission": "此页面修订已经被<strong>监督隐藏</strong>。详细信息可在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中找到。",
        "rev-deleted-text-unhide": "本页面版本已被<strong>删除</strong>。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。如果您想继续操作,您仍然可以[$1 查看本版本]。",
        "rightslogtext": "这是用户权限更改的日志。",
        "action-read": "阅读本页",
        "action-edit": "编辑本页",
-       "action-createpage": "创建页面",
-       "action-createtalk": "创建讨论页面",
+       "action-createpage": "创建页面",
+       "action-createtalk": "创建讨论页面",
        "action-createaccount": "创建该用户账户",
        "action-autocreateaccount": "自动创建该外部用户账户",
        "action-history": "查看此页历史",
        "upload-http-error": "发生HTTP错误:$1",
        "upload-copy-upload-invalid-domain": "不能从该域名上载文件副本。",
        "upload-foreign-cant-upload": "此wiki未配置为上传文件至请求的外部文件存储库。",
+       "upload-foreign-cant-load-config": "未能加载用于上传至外部文件存储库的文件配置。",
+       "upload-dialog-disabled": "使用此对话框的文件上传在此wiki已禁用。",
        "upload-dialog-title": "上传文件",
        "upload-dialog-button-cancel": "取消",
        "upload-dialog-button-done": "完成",
        "emailpagetext": "您可以使用下面的表格发送电子邮件信息至该{{GENDER:$1|用户}}。您在[[Special:Preferences|系统设置]]中输入的电子邮件地址将显示为邮件的“发件人”地址,所以该用户将可以直接回复您。",
        "defemailsubject": "来自{{SITENAME}}用户“$1”的电子邮件",
        "usermaildisabled": "用户电子邮件停用",
-       "usermaildisabledtext": "不能发送电子邮件至本wiki的其他用户",
+       "usermaildisabledtext": "不能发送电子邮件至本wiki的其他用户",
        "noemailtitle": "无电子邮件地址",
        "noemailtext": "该用户还没有指定一个有效的电子邮件地址。",
        "nowikiemailtext": "该用户已经选择不接收来自其他用户的电子邮件。",
        "sp-contributions-username": "IP地址或用户名:",
        "sp-contributions-toponly": "仅显示最后版本的编辑",
        "sp-contributions-newonly": "仅显示创建页面的编辑",
+       "sp-contributions-hideminor": "隐藏小编辑",
        "sp-contributions-submit": "搜索",
        "whatlinkshere": "链入页面",
        "whatlinkshere-title": "链接至“$1”的页面",
        "lockedbyandtime": "(由 {{GENDER:$1|$1}} 于$2 $3执行)",
        "move-page": "移动$1",
        "move-page-legend": "移动页面",
-       "movepagetext": "您可以使用下面的表单来重命名一个页面,同时将其版本历史移动到新页面。同时老的条目将会被重定向到新条目。您可以自动地将重定向更新到原条目。如果您不选择这样做的话,请检查[[Special:DoubleRedirects|双重]]或[[Special:BrokenRedirects|损坏重定向]]链接。您有责任确保链接会被正确指向他们应该被指向的地方。\n\n注意:即使新条目已经有对应页面,此页面也<strong>不会</strong>被移动,除非新页面无任何编辑历史或是重定向页。这意味着您可在误操作后将页面移回原处,同时,您也无法覆盖现有页面。\n\n<strong>注意:</strong>\n对这样一个经常被访问的页面而言这可能是一个重大且唐突的更改;请在行动前先了解您的修改可能带来的一切后果。",
-       "movepagetext-noredirectfixer": "用下面的表单来重命名一个页面,并将其版本历史同时移动到新页面。\n老的页面将成为新页面的重定向页。\n请检查[[Special:DoubleRedirects|双重重定向]]或[[Special:BrokenRedirects|损坏重定向]]链接。\n您应当负责确定所有链接依然会链到指定的页面。\n\n注意如果新页面已经有内容的话,页面将<strong>不会</strong>被移动,\n除非新页面无内容或是重定向页,而且没有版本历史。\n这意味着您再必要时可以在移动到新页面后再移回老的页面,\n同时您也无法覆盖现有页面。\n\n<strong>注意:</strong>\n对一个经常被访问的页面而言这可能是一个重大与唐突的更改;\n请在行动前先确定您了解其所可能带来的后果。",
+       "movepagetext": "您可以使用下面的表单来重命名一个页面,同时将其版本历史移动到新页面。同时老的条目将会被重定向到新条目。您可以自动地将重定向更新到原条目。如果您不选择这样做的话,请检查[[Special:DoubleRedirects|双重]]或[[Special:BrokenRedirects|损坏重定向]]链接。您有责任确保链接会被正确指向他们应该被指向的地方。\n\n注意:即使新条目已经有对应页面,此页面也<strong>不会</strong>被移动,除非新页面无任何编辑历史或是重定向页。这意味着您可在误操作后将页面移回原处,同时,您也无法覆盖现有页面。\n\n<strong>注意:</strong>对这样一个经常被访问的页面而言这可能是一个重大且唐突的更改;请在行动前先了解您的修改可能带来的一切后果。",
+       "movepagetext-noredirectfixer": "用下面的表单来重命名一个页面,并将其版本历史同时移动到新页面。老的页面将成为新页面的重定向页。请检查[[Special:DoubleRedirects|双重重定向]]或[[Special:BrokenRedirects|损坏重定向]]链接。您应当负责确定所有链接依然会链到指定的页面。\n\n注意如果新页面已经有内容的话,页面将<strong>不会</strong>被移动,除非新页面无内容或是重定向页,而且没有版本历史。这意味着您再必要时可以在移动到新页面后再移回老的页面,同时您也无法覆盖现有页面。\n\n<strong>注意:</strong>对一个经常被访问的页面而言这可能是一个重大与唐突的更改;请在行动前先确定您了解其所可能带来的后果。",
        "movepagetalktext": "如果您勾选此框,相关联的讨论页将被自动移动到新的标题,除非这里已经有了一个非空讨论页。\n\n在这种情况下,如有需要,您将不得不手动移动或合并页面。",
        "moveuserpage-warning": "'''警告:'''你将移动一个用户页面。请注意,只有该页面会被移动,该用户''不''会被更名。",
        "movecategorypage-warning": "<strong>警告:</strong>您将移动分类页面。请注意只有此页面将会移动,旧有分类的任何页面将<em>不会</em>同步移动。",
        "markaspatrolleddiff": "标记为已巡查",
        "markaspatrolledtext": "标记此页面为已巡查",
        "markaspatrolledtext-file": "将此文件版本标记为已巡查",
-       "markedaspatrolled": "标记为已查",
+       "markedaspatrolled": "标记为已查",
        "markedaspatrolledtext": "[[:$1]]的已选中版本已被标识为已巡查。",
        "rcpatroldisabled": "最近更改巡查已禁用",
        "rcpatroldisabledtext": "最近更改巡查功能目前已关闭。",
-       "markedaspatrollederror": "不能标志为已检查",
-       "markedaspatrollederrortext": "需要指定一个版本以标记为已巡查。",
-       "markedaspatrollederror-noautopatrol": "你不能把自己的更改标记为已检查。",
+       "markedaspatrollederror": "不能标记为已巡查",
+       "markedaspatrollederrortext": "需要指定一个版本以标记为已巡查。",
+       "markedaspatrollederror-noautopatrol": "您不被允许将您自己的更改标记为已巡查。",
        "markedaspatrollednotify": "$1的更改已被标记为已巡查。",
        "markedaspatrollederrornotify": "标记为已巡查失败。",
        "patrol-log-page": "巡查日志",
        "filedelete-archive-read-only": "存档目录“$1”在网页服务器中不可写。",
        "previousdiff": "←上一编辑",
        "nextdiff": "下一编辑→",
-       "mediawarning": "'''警告''':该文件类型可能含有恶意代码。执行后你的系统可能受损。",
+       "mediawarning": "<strong>警告:</strong>该文件类型可能含有恶意代码。执行后您的系统可能受损。",
        "imagemaxsize": "图像尺寸限制:<br />''(文件说明页面)''",
        "thumbsize": "缩略图尺寸:",
        "widthheightpage": "$1×$2,$3页",
        "watchlistedit-raw-submit": "更新监视列表",
        "watchlistedit-raw-done": "您的监视列表已经更新。",
        "watchlistedit-raw-added": "$1个标题被添加:",
-       "watchlistedit-raw-removed": "$1个标题被除:",
+       "watchlistedit-raw-removed": "$1个标题被除:",
        "watchlistedit-clear-title": "清空监视列表",
        "watchlistedit-clear-legend": "清空监视列表",
        "watchlistedit-clear-explain": "所有标题将从您的监视列表中移除",
        "version-license-not-found": "未找到此扩展相关的详细授权信息。",
        "version-credits-title": "$1贡献者名单",
        "version-credits-not-found": "未找到此扩展相关的详细制作人信息。",
-       "version-poweredby-credits": "本Wiki由'''[https://www.mediawiki.org/ MediaWiki]'''驱动,版权所有 © 2001-$1 $2。",
+       "version-poweredby-credits": "本Wiki由<strong>[https://www.mediawiki.org/ MediaWiki]</strong>驱动,版权所有 © 2001-$1 $2。",
        "version-poweredby-others": "其他",
        "version-poweredby-translators": "translatewiki.net上的翻译者",
        "version-credits-summary": "我们感谢下列人士为[[Special:Version|MediaWiki]]作出的贡献。",
        "mw-widgets-dateinput-no-date": "没有选定日期",
        "mw-widgets-titleinput-description-new-page": "页面不存在",
        "mw-widgets-titleinput-description-redirect": "重定向至$1",
-       "api-error-blacklisted": "请选择其他描述性的标题。",
        "sessionmanager-tie": "不能结合多个请求的身份验证类型:$1。",
        "sessionprovider-generic": "$1会话",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "基于cookie的会话",
        "log-action-filter-newusers": "账户创建的类型:",
        "log-action-filter-patrol": "巡查类型:",
        "log-action-filter-protect": "保护类型:",
-       "log-action-filter-rights": "权限更改的类型",
-       "log-action-filter-suppress": "屏蔽的类型",
+       "log-action-filter-rights": "权限更改的类型",
+       "log-action-filter-suppress": "屏蔽的类型",
        "log-action-filter-upload": "上传类型:",
        "log-action-filter-all": "全部",
        "log-action-filter-block-block": "封禁",
        "linkaccounts-success-text": "账户已链接。",
        "linkaccounts-submit": "链接帐户",
        "unlinkaccounts": "取消链接账户",
-       "unlinkaccounts-success": "账户已取消链接。"
+       "unlinkaccounts-success": "账户已取消链接。",
+       "authenticationdatachange-ignored": "身份验证数据更改未处理。也许没有配置的提供者?"
 }
index 13dfa09..892ce4d 100644 (file)
@@ -72,7 +72,8 @@
                        "Bbslam",
                        "Zerng07",
                        "Reke",
-                       "Kly"
+                       "Kly",
+                       "Cosine02"
                ]
        },
        "tog-underline": "底線標示連結:",
        "databaseerror-query": "查詢:$1",
        "databaseerror-function": "功能:$1",
        "databaseerror-error": "錯誤:$1",
-       "transaction-duration-limit-exceeded": "為了避免造成大量備援延遲,因寫入時間 ($1) 已超出了 $2 {{PLURAL:$2|秒|秒}}限制,此次操作已被中止。\n若您一次修改了許多項目,可嘗試分批處理。",
+       "transaction-duration-limit-exceeded": "為了避免造成大量備援延遲,因寫入時間 ($1) 已超出了 $2 限制,此次操作已被中止。\n若您一次修改了許多項目,可嘗試分批處理。",
        "laggedslavemode": "<strong>警告:</strong>頁面可能不包含最近的更新。",
        "readonly": "資料庫已鎖定",
        "enterlockreason": "請輸入鎖定的原因,包括估計重新開放的時間",
        "minoredit": "這是一個小修訂",
        "watchthis": "監視此頁面",
        "savearticle": "儲存頁面",
+       "savechanges": "儲存變更",
        "publishpage": "發佈頁面",
+       "publishchanges": "發布變更",
        "preview": "預覽",
        "showpreview": "顯示預覽",
        "showdiff": "顯示變更",
        "content-model-css": "CSS",
        "content-json-empty-object": "空物件",
        "content-json-empty-array": "空陣列",
+       "deprecated-self-close-category": "使用無效 Self-closed HTML 標籤的頁面",
+       "deprecated-self-close-category-desc": "頁面包含無效的 Self-closed HTML 標籤,如 <code>&lt;b/></code> or <code>&lt;span/></code>。這些標籤的模式將會更改為與 HTML5 規格一致,因此 wikitext 的這種用法已停用。",
        "duplicate-args-warning": "<strong>警告:</strong> [[:$1]] 呼叫 [[:$2]] 的 \"$3\" 參數使用了超過一次,僅會使用提供的最後一個參數值。",
        "duplicate-args-category": "模板呼叫時使用重複的參數的頁面",
        "duplicate-args-category-desc": "該頁面包含重複使用參數的模板呼叫,如 <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> 或 <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>。",
        "saveprefs": "儲存",
        "restoreprefs": "還原所有預設設定 (所有項目)",
        "prefs-editing": "編輯",
-       "rows": "數:",
-       "columns": "數:",
+       "rows": "橫行數:",
+       "columns": "直行數:",
        "searchresultshead": "搜尋",
        "stub-threshold": "短頁面連結格式門檻值 ($1):",
        "stub-threshold-sample-link": "樣本",
        "rightslogtext": "此為變更使用者權限的日誌。",
        "action-read": "閱讀此頁面",
        "action-edit": "編輯此頁面",
-       "action-createpage": "建立頁面",
-       "action-createtalk": "建立討論頁面",
+       "action-createpage": "建立頁面",
+       "action-createtalk": "建立討論頁面",
        "action-createaccount": "建立此使用者帳號",
        "action-autocreateaccount": "自動建立此外部使用者帳號",
        "action-history": "檢視此頁面歷史",
        "upload-http-error": "發生 HTTP 錯誤:$1",
        "upload-copy-upload-invalid-domain": "此網域不允許複製上傳的檔案。",
        "upload-foreign-cant-upload": "此 wiki 未設定可上傳來自遠端檔案庫的請求的檔案。",
+       "upload-foreign-cant-load-config": "載入要上傳檔案到遠端檔案儲存庫的設定失敗。",
+       "upload-dialog-disabled": "此 wiki 已關閉使用此對話框上傳檔案的功能。",
        "upload-dialog-title": "上傳檔案",
        "upload-dialog-button-cancel": "取消",
        "upload-dialog-button-done": "完成",
        "sp-contributions-username": "IP 位址或使用者名稱:",
        "sp-contributions-toponly": "只顯示最新修訂的編輯",
        "sp-contributions-newonly": "只顯示建立頁面的編輯",
+       "sp-contributions-hideminor": "隱藏小修訂",
        "sp-contributions-submit": "搜尋",
        "whatlinkshere": "連結至此的頁面",
        "whatlinkshere-title": "連結至 \"$1\" 的頁面",
        "watchlistedit-normal-legend": "從監視清單中移除標題",
        "watchlistedit-normal-explain": "下方顯示在您監視清單中的標題。\n要移除標題,請勾選該標題旁的核選方塊並點選 \"{{int:Watchlistedit-normal-submit}}\"。\n您也可 [[Special:EditWatchlist/raw|編輯原始監視清單]]。",
        "watchlistedit-normal-submit": "移除標題",
-       "watchlistedit-normal-done": "已於您的監視清單中移除 $1 個標題:",
+       "watchlistedit-normal-done": "已於您的監視清單中移除 {{PLURAL:$1|$1}} 個標題:",
        "watchlistedit-raw-title": "編輯原始監視清單",
        "watchlistedit-raw-legend": "編輯原始監視清單",
        "watchlistedit-raw-explain": "下方顯示在您監視清單中的標題,您可透過編輯來新增與移除清單項目,一個標題一行。\n完成編輯後,請點選 \"{{int:Watchlistedit-raw-submit}}\"。\n您也可 [[Special:EditWatchlist|使用標準編輯器]]。",
        "limitreport-cputime-value": "$1 秒",
        "limitreport-walltime": "實際使用時間",
        "limitreport-walltime-value": "$1 秒",
-       "limitreport-ppvisitednodes": "預處理器已訪問節點計數",
+       "limitreport-ppvisitednodes": "前置處理器造訪節點計數",
        "limitreport-ppgeneratednodes": "預處理器產生節點次數",
        "limitreport-postexpandincludesize": "展開後的引用大小",
        "limitreport-postexpandincludesize-value": "$1/$2 個{{PLURAL:$2|位元組}}",
        "mw-widgets-dateinput-no-date": "未選擇日期",
        "mw-widgets-titleinput-description-new-page": "頁面不存在",
        "mw-widgets-titleinput-description-redirect": "重新導向至 $1",
-       "api-error-blacklisted": "請選擇另一個更具描述性的標題。",
        "sessionmanager-tie": "無法合併多個請求認証類型:$1。",
        "sessionprovider-generic": "$1 連線階段",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "以 cookie 為基礎的連線階段",
        "linkaccounts-success-text": "已連結帳號。",
        "linkaccounts-submit": "連結帳號",
        "unlinkaccounts": "取消連結帳號",
-       "unlinkaccounts-success": "已取消連結帳號。"
+       "unlinkaccounts-success": "已取消連結帳號。",
+       "authenticationdatachange-ignored": "認証資料變更未被處理,可能未設定提供者?"
 }
diff --git a/languages/messages/MessagesBan.php b/languages/messages/MessagesBan.php
new file mode 100644 (file)
index 0000000..79d9d1c
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+/** Basa Bali (Basa Bali)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'id';
+
index fc65e58..1cf80ce 100644 (file)
@@ -7,16 +7,17 @@
  * @file
  *
  * @author Darshan kandolkar
+ * @author The Discoverer
  */
 
 $fallback = 'hi';
 
 $namespaceNames = [
-       NS_MEDIA            => 'मिडिया',
+       NS_MEDIA            => 'माधà¥\8dयम',
        NS_SPECIAL          => 'विशेश',
        NS_TALK             => 'चर्चा',
-       NS_USER             => 'à¤\89पà¥\87à¤\97à¤\95रà¥\8dतà¥\8b',
-       NS_USER_TALK        => 'à¤\89पà¥\87à¤\97à¤\95रà¥\8dतà¥\8b_चर्चा',
+       NS_USER             => 'वापरपà¥\80',
+       NS_USER_TALK        => 'वापरपà¥\80_चर्चा',
        NS_PROJECT_TALK     => '$1_चर्चा',
        NS_FILE             => 'फायल',
        NS_FILE_TALK        => 'फायल_चर्चा',
@@ -24,8 +25,18 @@ $namespaceNames = [
        NS_MEDIAWIKI_TALK   => 'मिडियाविकी_चर्चा',
        NS_TEMPLATE         => 'प्रारूप',
        NS_TEMPLATE_TALK    => 'प्रारूप_चर्चा',
-       NS_HELP             => 'मजत',
-       NS_HELP_TALK        => 'मजत_चर्चा',
-       NS_CATEGORY         => 'श्रेणी',
-       NS_CATEGORY_TALK    => 'श्रेणी_चर्चा',
+       NS_HELP             => 'आदार',
+       NS_HELP_TALK        => 'आदार_चर्चा',
+       NS_CATEGORY         => 'वर्ग',
+       NS_CATEGORY_TALK    => 'वर्ग_चर्चा',
+];
+
+$namespaceAliases = [
+       'मजत' => NS_HELP,
+       'मजत_चर्चा' => NS_HELP_TALK,
+       'श्रेणी' => NS_CATEGORY,
+       'श्रेणी_चर्चा' => NS_CATEGORY_TALK,
+       'मिडिया' => NS_MEDIA,
+       'उपेगकर्तो' => NS_USER,
+       'उपेगकर्तो चर्चा' => NS_USER_TALK
 ];
index a8e6c77..b79f9d8 100644 (file)
@@ -183,3 +183,4 @@ $dateFormats = [
        'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
 ];
 
+$linkTrail = '/^([a-ząčęėįšųūž]+)(.*)$/sDu';
index 18c115b..cc555b6 100644 (file)
@@ -15,7 +15,7 @@ $rtl = true;
 
 $namespaceNames = [
        NS_MEDIA            => 'رسنۍ',
-       NS_SPECIAL          => 'Ú\81اÙ\86Ú«ړی',
+       NS_SPECIAL          => 'Ú\81اÙ\86Ú¯ړی',
        NS_TALK             => 'خبرې_اترې',
        NS_USER             => 'کارن',
        NS_USER_TALK        => 'د_کارن_خبرې_اترې',
@@ -33,6 +33,7 @@ $namespaceNames = [
 ];
 
 $namespaceAliases = [
+       'ځﺎﻧګړی' => NS_SPECIAL,
        'کارونکی' => NS_USER,
        'د_کارونکي_خبرې_اترې' => NS_USER_TALK,
        'انځور' => NS_FILE,
index a08297a..27d8161 100644 (file)
  */
 
 // Bail on old versions of PHP, or if composer has not been run yet to install
-// dependencies. Using dirname( __FILE__ ) here because __DIR__ is PHP5.3+.
-// @codingStandardsIgnoreStart MediaWiki.Usage.DirUsage.FunctionFound
-require_once dirname( __FILE__ ) . '/../includes/PHPVersionCheck.php';
-// @codingStandardsIgnoreEnd
+// dependencies.
+require_once __DIR__ . '/../includes/PHPVersionCheck.php';
 wfEntryPointCheck( 'cli' );
 
 /**
index 3271fd6..db3af92 100644 (file)
@@ -41,6 +41,7 @@ class BackupDumper extends Maintenance {
        public $revEndId = 0;
        public $dumpUploads = false;
        public $dumpUploadFileContents = false;
+       public $orderRevs = false;
 
        protected $reportingInterval = 100;
        protected $pageCount = 0;
@@ -271,7 +272,7 @@ class BackupDumper extends Maintenance {
                } elseif ( is_null( $this->pages ) ) {
                        # Page dumps: all or by page ID range
                        if ( $this->startId || $this->endId ) {
-                               $exporter->pagesByRange( $this->startId, $this->endId );
+                               $exporter->pagesByRange( $this->startId, $this->endId, $this->orderRevs );
                        } elseif ( $this->revStartId || $this->revEndId ) {
                                $exporter->revsByRange( $this->revStartId, $this->revEndId );
                        } else {
diff --git a/maintenance/cleanupEmptyCategories.php b/maintenance/cleanupEmptyCategories.php
new file mode 100644 (file)
index 0000000..b8a246e
--- /dev/null
@@ -0,0 +1,204 @@
+<?php
+/**
+ * Clean up empty categories in the category table.
+ *
+ * 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
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script to clean up empty categories in the category table.
+ *
+ * @ingroup Maintenance
+ * @since 1.28
+ */
+class CleanupEmptyCategories extends LoggedUpdateMaintenance {
+
+       public function __construct() {
+               parent::__construct();
+               $this->addDescription(
+                       <<<TEXT
+This script will clean up the category table by removing entries for empty
+categories without a description page and adding entries for empty categories
+with a description page. It will print out progress indicators every batch. The
+script is perfectly safe to run on large, live wikis, and running it multiple
+times is harmless. You may want to use the throttling options if it's causing
+too much load; they will not affect correctness.
+
+If the script is stopped and later resumed, you can use the --mode and --begin
+options with the last printed progress indicator to pick up where you left off.
+
+When the script has finished, it will make a note of this in the database, and
+will not run again without the --force option.
+TEXT
+               );
+
+               $this->addOption(
+                       'mode',
+                       '"add" empty categories with description pages, "remove" empty categories '
+                       . 'without description pages, or "both"',
+                       false,
+                       true
+               );
+               $this->addOption(
+                       'begin',
+                       'Only do categories whose names are alphabetically after the provided name',
+                       false,
+                       true
+               );
+               $this->addOption(
+                       'throttle',
+                       'Wait this many milliseconds after each batch. Default: 0',
+                       false,
+                       true
+               );
+       }
+
+       protected function getUpdateKey() {
+               return 'cleanup empty categories';
+       }
+
+       protected function doDBUpdates() {
+               $mode = $this->getOption( 'mode', 'both' );
+               $begin = $this->getOption( 'begin', '' );
+               $throttle = $this->getOption( 'throttle', 0 );
+
+               if ( !in_array( $mode, [ 'add', 'remove', 'both' ] ) ) {
+                       $this->output( "--mode must be 'add', 'remove', or 'both'.\n" );
+                       return false;
+               }
+
+               $dbw = $this->getDB( DB_MASTER );
+
+               $throttle = intval( $throttle );
+
+               if ( $mode === 'add' || $mode === 'both' ) {
+                       if ( $begin !== '' ) {
+                               $where = [ 'page_title > ' . $dbw->addQuotes( $begin ) ];
+                       } else {
+                               $where = [];
+                       }
+
+                       $this->output( "Adding empty categories with description pages...\n" );
+                       while ( true ) {
+                               # Find which category to update
+                               $rows = $dbw->select(
+                                       [ 'page', 'category' ],
+                                       'page_title',
+                                       array_merge( $where, [
+                                               'page_namespace' => NS_CATEGORY,
+                                               'cat_title' => null,
+                                       ] ),
+                                       __METHOD__,
+                                       [
+                                               'ORDER BY' => 'page_title',
+                                               'LIMIT' => $this->mBatchSize,
+                                       ],
+                                       [
+                                               'category' => [ 'LEFT JOIN', 'page_title = cat_title' ],
+                                       ]
+                               );
+                               if ( !$rows || $rows->numRows() <= 0 ) {
+                                       # Done, hopefully.
+                                       break;
+                               }
+
+                               foreach ( $rows as $row ) {
+                                       $name = $row->page_title;
+                                       $where = [ 'page_title > ' . $dbw->addQuotes( $name ) ];
+
+                                       # Use the row to update the category count
+                                       $cat = Category::newFromName( $name );
+                                       if ( !is_object( $cat ) ) {
+                                               $this->output( "The category named $name is not valid?!\n" );
+                                       } else {
+                                               $cat->refreshCounts();
+                                       }
+                               }
+                               $this->output( "--mode=$mode --begin=$name\n" );
+
+                               wfWaitForSlaves();
+                               usleep( $throttle * 1000 );
+                       }
+
+                       $begin = '';
+               }
+
+               if ( $mode === 'remove' || $mode === 'both' ) {
+                       if ( $begin !== '' ) {
+                               $where = [ 'cat_title > ' . $dbw->addQuotes( $begin ) ];
+                       } else {
+                               $where = [];
+                       }
+                       $i = 0;
+
+                       $this->output( "Removing empty categories without description pages...\n" );
+                       while ( true ) {
+                               # Find which category to update
+                               $rows = $dbw->select(
+                                       [ 'category', 'page' ],
+                                       'cat_title',
+                                       array_merge( $where, [
+                                               'page_title' => null,
+                                               'cat_pages' => 0,
+                                       ] ),
+                                       __METHOD__,
+                                       [
+                                               'ORDER BY' => 'cat_title',
+                                               'LIMIT' => $this->mBatchSize,
+                                       ],
+                                       [
+                                               'page' => [ 'LEFT JOIN', [
+                                                       'page_namespace' => NS_CATEGORY, 'page_title = cat_title'
+                                               ] ],
+                                       ]
+                               );
+                               if ( !$rows || $rows->numRows() <= 0 ) {
+                                       # Done, hopefully.
+                                       break;
+                               }
+                               foreach ( $rows as $row ) {
+                                       $name = $row->cat_title;
+                                       $where = [ 'cat_title > ' . $dbw->addQuotes( $name ) ];
+
+                                       # Use the row to update the category count
+                                       $cat = Category::newFromName( $name );
+                                       if ( !is_object( $cat ) ) {
+                                               $this->output( "The category named $name is not valid?!\n" );
+                                       } else {
+                                               $cat->refreshCounts();
+                                       }
+                               }
+
+                               $this->output( "--mode=remove --begin=$name\n" );
+
+                               wfWaitForSlaves();
+                               usleep( $throttle * 1000 );
+                       }
+               }
+
+               $this->output( "Category cleanup complete.\n" );
+
+               return true;
+       }
+}
+
+$maintClass = 'CleanupEmptyCategories';
+require_once RUN_MAINTENANCE_IF_MAIN;
index 7c87e10..6d2a0e9 100644 (file)
@@ -120,7 +120,7 @@ class ConvertExtensionToRegistration extends Maintenance {
                                $this->hasWarning = true;
                        } elseif ( strpos( $name, $configPrefix ) === 0 ) {
                                // Most likely a config setting
-                               $this->json['config'][substr( $name, strlen( $configPrefix ) )] = $value;
+                               $this->json['config'][substr( $name, strlen( $configPrefix ) )] = [ 'value' => $value ];
                        } elseif ( $configPrefix !== 'wg' && strpos( $name, 'wg' ) === 0 ) {
                                // Warn about this
                                $this->output( 'Warning: Skipped global "' . $name . '" (' .
index 7b92f89..4f625fc 100644 (file)
@@ -62,10 +62,6 @@ class CopyFileBackend extends Maintenance {
 
                $rateFile = $this->getOption( 'ratefile' );
 
-               if ( $this->hasOption( 'utf8only' ) && !extension_loaded( 'mbstring' ) ) {
-                       $this->error( "Cannot check for UTF-8, mbstring extension missing.", 1 ); // die
-               }
-
                foreach ( $containers as $container ) {
                        if ( $subDir != '' ) {
                                $backendRel = "$container/$subDir";
index d07a8d4..af05a81 100644 (file)
@@ -54,7 +54,7 @@ class DeleteArchivedFiles extends Maintenance {
                $this->output( "Searching for and deleting archived files...\n" );
                $res = $dbw->select(
                        'filearchive',
-                       [ 'fa_id', 'fa_storage_group', 'fa_storage_key', 'fa_sha1' ],
+                       [ 'fa_id', 'fa_storage_group', 'fa_storage_key', 'fa_sha1', 'fa_name' ],
                        '',
                        __METHOD__
                );
@@ -67,9 +67,19 @@ class DeleteArchivedFiles extends Maintenance {
                                continue;
                        }
 
+                       /** @var LocalFile $file */
+                       $file = $repo->newFile( $row->fa_name );
+                       try {
+                               $file->lock();
+                       } catch ( LocalFileLockError $e ) {
+                               $this->error( "Could not acquire lock on '{$row->fa_name}', skipping\n" );
+                               continue;
+                       }
+
                        $group = $row->fa_storage_group;
                        $id = $row->fa_id;
-                       $path = $repo->getZonePath( 'deleted' ) . '/' . $repo->getDeletedHashPath( $key ) . $key;
+                       $path = $repo->getZonePath( 'deleted' ) .
+                               '/' . $repo->getDeletedHashPath( $key ) . $key;
                        if ( isset( $row->fa_sha1 ) ) {
                                $sha1 = $row->fa_sha1;
                        } else {
@@ -96,6 +106,7 @@ class DeleteArchivedFiles extends Maintenance {
                                $this->output( "Notice - file '$key' is still in use\n" );
                        } elseif ( !$repo->quickPurge( $path ) ) {
                                $this->output( "Unable to remove file $path, skipping\n" );
+                               $file->unlock();
                                continue; // don't delete even with --force
                        } else {
                                $needForce = false;
@@ -105,12 +116,14 @@ class DeleteArchivedFiles extends Maintenance {
                                if ( $this->hasOption( 'force' ) ) {
                                        $this->output( "Got --force, deleting DB entry\n" );
                                } else {
+                                       $file->unlock();
                                        continue;
                                }
                        }
 
                        $count++;
                        $dbw->delete( 'filearchive', [ 'fa_id' => $id ], __METHOD__ );
+                       $file->unlock();
                }
 
                $this->commitTransaction( $dbw, __METHOD__ );
index d4255a0..9bf1222 100644 (file)
@@ -50,6 +50,8 @@ TEXT
                $this->addOption( 'stable', 'Dump stable versions of pages' );
                $this->addOption( 'revrange', 'Dump range of revisions specified by revstart and ' .
                        'revend parameters' );
+               $this->addOption( 'orderrevs', 'Dump revisions in ascending revision order ' .
+                       '(implies dump of a range of pages)' );
                $this->addOption( 'pagelist',
                        'Dump only pages included in the file', false, true );
                // Options
@@ -127,6 +129,7 @@ TEXT
                $this->skipFooter = $this->hasOption( 'skip-footer' );
                $this->dumpUploads = $this->hasOption( 'uploads' );
                $this->dumpUploadFileContents = $this->hasOption( 'include-files' );
+               $this->orderRevs = $this->hasOption( 'orderrevs' );
        }
 }
 
index 6d5a0e9..cfb59c6 100644 (file)
@@ -74,6 +74,9 @@ class TextPassDumper extends BackupDumper {
         */
        protected $spawnErr = false;
 
+       /**
+        * @var bool|XmlDumpWriter
+        */
        protected $xmlwriterobj = false;
 
        protected $timeExceeded = false;
index ec276c1..5b446d8 100644 (file)
@@ -111,7 +111,7 @@ By default, outputs relative paths against the parent directory of $wgUploadDire
        function outputItem( $name, $shared ) {
                $file = wfFindFile( $name );
                if ( $file && $this->filterItem( $file, $shared ) ) {
-                       $filename = $file->getPath();
+                       $filename = $file->getLocalRefPath();
                        $rel = wfRelativePath( $filename, $this->mBasePath );
                        $this->output( "$rel\n" );
                } else {
index 92547ca..4b6c619 100644 (file)
@@ -42,8 +42,6 @@ class TestFileOpPerformance extends Maintenance {
        }
 
        public function execute() {
-               Profiler::setInstance( new ProfilerSimpleText( [] ) ); // clear
-
                $backend = FileBackendGroup::singleton()->get( $this->getOption( 'b1' ) );
                $this->doPerfTest( $backend );
 
@@ -51,9 +49,6 @@ class TestFileOpPerformance extends Maintenance {
                        $backend = FileBackendGroup::singleton()->get( $this->getOption( 'b2' ) );
                        $this->doPerfTest( $backend );
                }
-
-               Profiler::instance()->setTemplated( true );
-               // NOTE: as of MW1.21, $profiler->logData() is called implicitly by doMaintenance.php.
        }
 
        protected function doPerfTest( FileBackend $backend ) {
index d44581c..c91d824 100644 (file)
@@ -244,11 +244,11 @@ class FindHooks extends Maintenance {
                                // Comma for second argument
                                '(?:\s*(,))?' .
                                // Second argument must start with array to be processed
-                               '(?:\s*array\s*\(' .
+                               '(?:\s*(?:array\s*\(|\[)' .
                                // Matching inside array - allows one deep of brackets
-                               '((?:[^\(\)]|\([^\(\)]*\))*)' .
+                               '((?:[^\(\)\[\]]|\((?-1)\)|\[(?-1)\])*)' .
                                // End
-                               '\))?/',
+                               '[\)\]])?/',
                        $content,
                        $m,
                        PREG_SET_ORDER
@@ -305,17 +305,16 @@ class FindHooks extends Maintenance {
 
                if ( $recurse === self::FIND_RECURSIVE ) {
                        $iterator = new RecursiveIteratorIterator(
-                               new RecursiveDirectoryIterator( $dir ),
-                               RecursiveIteratorIterator::SELF_FIRST | RecursiveDirectoryIterator::SKIP_DOTS
+                               new RecursiveDirectoryIterator( $dir, RecursiveDirectoryIterator::SKIP_DOTS ),
+                               RecursiveIteratorIterator::SELF_FIRST
                        );
                } else {
                        $iterator = new DirectoryIterator( $dir );
                }
 
                foreach ( $iterator as $info ) {
-                       // Ignore directories, ignore json (installer and api i18n),
-                       // ignore extension-less files like HISTORY
-                       if ( $info->isFile() && $info->getExtension() !== 'json' && $info->getExtension()
+                       // Ignore directories, work only on php files,
+                       if ( $info->isFile() && in_array( $info->getExtension(), [ 'php', 'inc' ] )
                                // Skip this file as it contains text that looks like a bad wfRunHooks() call
                                && $info->getRealPath() !== __FILE__
                        ) {
@@ -328,15 +327,12 @@ class FindHooks extends Maintenance {
        }
 
        /**
-        * Nicely output the array
+        * Nicely sort an print an array
         * @param string $msg A message to show before the value
         * @param array $arr
-        * @param bool $sort Whether to sort the array (Default: true)
         */
-       private function printArray( $msg, $arr, $sort = true ) {
-               if ( $sort ) {
-                       asort( $arr );
-               }
+       private function printArray( $msg, $arr ) {
+               asort( $arr );
 
                foreach ( $arr as $v ) {
                        $this->output( "$msg: $v\n" );
index 0d04c41..8b1d86d 100644 (file)
@@ -17,8 +17,5 @@ foreach ( glob( $base . '/*.php' ) as $file ) {
        $generator->readFile( $file );
 }
 
-// This class is not defined, but might be added by the installer
-$generator->forceClassPath( 'MyLocalSettingsGenerator', "$base/mw-config/overrides.php" );
-
 // Write out the autoload
 $generator->generateAutoload( 'maintenance/generateLocalAutoload.php' );
index e926cfd..5531ffc 100644 (file)
@@ -56,14 +56,23 @@ class ImportTextFiles extends Maintenance {
                $prefix = $this->getOption( 'prefix', '' );
 
                // Get all the arguments. A loop is required since Maintenance doesn't
-               // suppport an arbitrary number of arguments.
+               // support an arbitrary number of arguments.
                $files = [];
                $i = 0;
                while ( $arg = $this->getArg( $i++ ) ) {
                        if ( file_exists( $arg ) ) {
                                $files[$arg] = file_get_contents( $arg );
                        } else {
-                               $this->error( "Fatal error: The file '$arg' does not exist!", 1 );
+                               // use glob to support the Windows shell, which doesn't automatically
+                               // expand wildcards
+                               $found = false;
+                               foreach ( glob( $arg ) as $filename ) {
+                                       $found = true;
+                                       $files[$filename] = file_get_contents( $filename );
+                               }
+                               if ( !$found ) {
+                                       $this->error( "Fatal error: The file '$arg' does not exist!", 1 );
+                               }
                        }
                };
 
index ae3074a..3e632f0 100644 (file)
  * @ingroup Maintenance
  */
 
-// Checking for old versions of PHP is done in Maintenance.php
-// We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
-// @codingStandardsIgnoreStart MediaWiki.Usage.DirUsage.FunctionFound
-require_once dirname( __FILE__ ) . '/Maintenance.php';
-// @codingStandardsIgnoreEnd
+require_once __DIR__ . '/Maintenance.php';
 
 define( 'MW_CONFIG_CALLBACK', 'Installer::overrideConfig' );
 define( 'MEDIAWIKI_INSTALL', true );
index 4899143..9104fd7 100644 (file)
@@ -26,7 +26,7 @@ imdb|http://www.imdb.com/find?q=$1&tt=on|0|
 jargonfile|http://sunir.org/apps/meta.pl?wiki=JargonFile&redirect=$1|0|
 kmwiki|http://kmwiki.wikispaces.com/$1|0|
 linuxwiki|http://linuxwiki.de/$1|0|
-lojban|http://www.lojban.org/tiki/tiki-index.php?page=$1|0|
+lojban|http://mw.lojban.org/papri/$1|0|
 lqwiki|http://wiki.linuxquestions.org/wiki/$1|0|
 lugkr|http://www.lug-kr.de/wiki/$1|0|
 meatball|http://www.usemod.com/cgi-bin/mb.pl?$1|0|
diff --git a/maintenance/invalidateUserSessions.php b/maintenance/invalidateUserSessions.php
new file mode 100644 (file)
index 0000000..11e3372
--- /dev/null
@@ -0,0 +1,94 @@
+<?php
+/**
+ * Invalidate the sessions of certain users on the wiki.
+ * If you want to invalidate all sessions, use $wgAuthenticationTokenVersion instead.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+use MediaWiki\MediaWikiServices;
+use MediaWiki\Session\SessionManager;
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Invalidate the sessions of certain users on the wiki.
+ * If you want to invalidate all sessions, use $wgAuthenticationTokenVersion instead.
+ *
+ * @ingroup Maintenance
+ */
+class InvalidateUserSesssions extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->addDescription(
+                       'Invalidate the sessions of certain users on the wiki.'
+               );
+               $this->addOption( 'user', 'Username', false, true, 'u' );
+               $this->addOption( 'file', 'File with one username per line', false, true, 'f' );
+               $this->setBatchSize( 1000 );
+       }
+
+       public function execute() {
+               $username = $this->getOption( 'user' );
+               $file = $this->getOption( 'file' );
+
+               if ( $username === null && $file === null ) {
+                       $this->error( 'Either --user or --file is required', 1 );
+               } elseif ( $username !== null && $file !== null ) {
+                       $this->error( 'Cannot use both --user and --file', 1 );
+               }
+
+               if ( $username !== null ) {
+                       $usernames = [ $username ];
+               } else {
+                       $usernames = is_readable( $file ) ?
+                               file( $file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES ) : false;
+                       if ( $usernames === false ) {
+                               $this->error( "Could not open $file", 2 );
+                       }
+               }
+
+               $i = 0;
+               $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+               $sessionManager = SessionManager::singleton();
+               foreach ( $usernames as $username ) {
+                       $i++;
+                       $user = User::newFromName( $username );
+                       try {
+                               $sessionManager->invalidateSessionsForUser( $user );
+                               if ( $user->getId() ) {
+                                       $this->output( "Invalidated sessions for user $username\n" );
+                               } else {
+                                       # session invalidation might still work if there is a central identity provider
+                                       $this->output( "Could not find user $username, tried to invalidate anyway\n" );
+                               }
+                       } catch ( Exception $e ) {
+                               $this->output( "Failed to invalidate sessions for user $username | "
+                                       . str_replace( [ "\r", "\n" ], ' ', $e->getMessage() ) . "\n" );
+                       }
+
+                       if ( $i % $this->mBatchSize ) {
+                               $lbFactory->waitForReplication();
+                       }
+               }
+       }
+}
+
+$maintClass = "InvalidateUserSesssions";
+require_once RUN_MAINTENANCE_IF_MAIN;
index d9e2c50..068ee8c 100644 (file)
@@ -64,7 +64,8 @@
                                        "mw.Feedback*",
                                        "mw.Upload*",
                                        "mw.ForeignUpload",
-                                       "mw.ForeignStructuredUpload*"
+                                       "mw.ForeignStructuredUpload*",
+                                       "mw.GallerySlideshow"
                                ]
                        },
                        {
index 05f091f..bced265 100644 (file)
@@ -201,7 +201,7 @@ U+090C1郁|U+090C1郁|U+09B31鬱|
 U+0915D酝|U+0919E醞|U+09196醖|
 U+09170酰|U+09170酰|U+091AF醯|
 U+09178酸|U+09178酸|U+075E0痠|
-U+091C7采|U+091C7采|U+063A1採|U+057F0埰|
+U+091C7采|U+091C7采|U+063A1採|U+05BC0寀|
 U+091CC里|U+091CC里|U+088E1裡|U+088CF裏|
 U+0949F钟|U+0937E鍾|U+09418鐘|
 U+094A9钩|U+0920E鈎|U+09264鉤|
index 6cc3b68..bae5fd8 100644 (file)
@@ -64,6 +64,7 @@
 澈底 彻底
 仲介 中介
 卯足 铆足
+保鑣 保镖
 逕庭 径庭
 逕到 径到
 逕取 径取
 伏著 伏着
 視著 视着
 視著名      视著名
+視著作      视著作
+視著者      视著者
+視著稱      视著称
 蓋著 盖着
 蓋著名      盖著名
 蓋著稱      盖著称
 記錄著      记录着
 紀錄著      纪录着
 收錄著      收录着
+促著 促着
+咬著 咬着
 三十六著   三十六着
 走為上著   走为上着
 記憶體      内存
 功能變數名稱     域名
 音效卡      声卡
 字型大小   字号
-字型檔      字库
 欄位 字段
 非同步      异步
 匯流排      总线
@@ -2665,3 +2670,4 @@ A型肝炎        甲型肝炎
 行人路權   行人路权
 行人路权   行人路权
 塑膠袋      塑料袋
+烏龍麵      乌冬面
index ec9b3d7..5ec6e34 100644 (file)
 暗沟里      暗溝裏
 暗里 暗裏
 会里 會裏
-村里 村裏
+村里的      村裏的
+村里有      村裏有
 森林里      森林裏
 棺材里      棺材裏
 树林里      樹林裏
 电视里      電視裏
 公寓里      公寓裏
 窝里斗      窩裏鬥
+镇里 鎮裏
 苑裡 苑裡
 霄裡 霄裡
 岸裡 岸裡
 伏著 伏着
 視著 視着
 視著名      視著名
+視著作      視著作
+視著者      視著者
+視著稱      視著稱
 蓋著 蓋着
 蓋著名      蓋著名
 蓋著稱      蓋著稱
 記錄著      記錄着
 紀錄著      紀錄着
 收錄著      收錄着
+咬著 咬着
 三十六著   三十六着
 走為上著   走為上着
 鬧著 鬧着
 包著 包着
 系着 繫着
 颳著 颳着
+促著 促着
 榴莲 榴槤
 榴蓮 榴槤
 叱吒 叱咤
 冰淇淋      雪糕
 賓士 平治
 捷豹 積架
-雪铁龙      先進
-雪鐵龍      先進
 沃尓沃      富豪
 马自达      萬事得
 馬自達      萬事得
@@ -3026,3 +3031,4 @@ IP地址  IP位址
 獨立國家國協     獨立國家聯合體
 人行道      行人路
 塑料袋      膠袋
+烏龍麵      烏冬麵
index 9674aae..8618a93 100644 (file)
 偵蒐 侦搜
 情蒐 情搜
 蘋果 苹果
+蘋婆 苹婆
 於之莹      於之莹
 陆徵祥      陆徵祥
 瞭臺 瞭台
index 2a72501..59219ae 100644 (file)
 划着竹筏   划著竹筏
 划着独木舟        划著獨木舟
 着眼于      著眼於
+桃金娘      桃金孃
 缺省 預設
 以太网      乙太網
 光盘 光碟
 光驱 光碟機
 声卡 音效卡
-字库 字型檔
 字段 欄位
 存盘 存檔
 控件 控制項
@@ -777,5 +777,5 @@ IP地址    IP位址
 行人路權   行人路權
 行人路权   行人路權
 塑料袋      塑膠袋
-桃金娘      桃金孃
 触摸屏      觸控螢幕
+乌冬面      烏龍麵
index a9e8f3b..8fb4198 100644 (file)
 楊雅筑      楊雅筑
 尸羅精舍   尸羅精舍
 騰格里      騰格里
-村里長      村里長
 進制 進制
+強制 強制
 總裁制      總裁制
 獨裁制      獨裁制
 模范三軍   模范三軍
 复苏 復甦
 苹果 蘋果
 苹果干      蘋果乾
+苹婆 蘋婆
 龜山庄      龜山庄
 寶山庄      寶山庄
 員山庄      員山庄
index 4d18dda..463c126 100644 (file)
 皺彆
 一彆頭
 并州
+併力
 ,並力
-,并力攻
 ,并力討
+兼併
 併兼
 併骨
 併網
 櫛髮工
 鬒髮
 人髮指
-爆發指數
+爆發 #分詞
+引發
 開發
 剪其髮
 吐哺捉髮
 錢穀
 息穀
 殖穀
-川穀
 曬穀
 臧穀亡羊
 種穀
+陽穀
+布穀鳥
+穀祿
+穀城縣
 颳雪
 广部
 亂鬨鬨
 薑母
 薑湯
 薑桂
-薑是老的辣
+薑是老的辣
 吃薑
 薑老辣
 野薑
 麵製品
 乾脆麵
 磨麵
+莜麵
+雲吞麵
 冷面相
 糞穢衊面
 僕僕
 乾姐
 乾紅葡萄酒
 乾白葡萄酒
+抽乾
+排乾
+排幹部
+吸乾
 楨幹
 新幹縣
 誰幹的
 鍥而不捨
 稜登
 繃扒弔拷
-不弔
+不弔
 不通弔慶
 陪弔
 盆弔
 心繫沈
 心繫唐
 心繫黃
-心繫
+心繫
 心繫阮
 心繫父
 心繫母
 西西里
 騰格里
 阿里
-村里長
 峇里海
 里海崖
 里海茨
 電視裡
 公寓裡
 公寓里弄
+村裡的
+村裡有
+鎮裡
 裏白 #植物常用名
 烏蘇里 #分詞用
 首發
 會干擾
 高清愿
 瓷製
+陶製
 竹製
 絲製
-莜麵
 簡筑翎
 楊雅筑
 彭于晏
 于寶軒
 于承惠
 于震
+于建嶸
 於震前
 於震後
 於震中
 沖天
 豐臺
 煙臺
-陽穀
 太醜
 御製
 聖人曆
 自誇
 誇稱
 誇讚
-布穀鳥
 黎克特制
 筆桿
 袋桿
 衝着
 確係
 乃係
-穀祿
 製衣
 巨製
 不捲
index 12cfed8..48b2250 100644 (file)
@@ -336,9 +336,9 @@ CREATE INDEX /*i*/cl_timestamp ON /*_*/categorylinks (cl_to,cl_timestamp);
 CREATE INDEX /*i*/cl_collation_ext ON /*_*/categorylinks (cl_collation, cl_to, cl_type, cl_from);
 
 --
--- Track all existing categories.  Something is a category if 1) it has an en-
--- try somewhere in categorylinks, or 2) it once did.  Categories might not
--- have corresponding pages, so they need to be tracked separately.
+-- Track all existing categories. Something is a category if 1) it has an entry
+-- somewhere in categorylinks, or 2) it has a description page. Categories
+-- might not have corresponding pages, so they need to be tracked separately.
 --
 CREATE TABLE /*_*/category (
   -- Primary key
index aa5d69d..d102e08 100644 (file)
@@ -47,6 +47,9 @@ class PPFuzzTester {
        public $entryPoints = [ 'testSrvus', 'testPst', 'testPreprocess' ];
        public $verbose = false;
 
+       /**
+        * @var bool|PPFuzzTest
+        */
        private static $currentTest = false;
 
        function execute() {
index b67bc36..38556ed 100644 (file)
@@ -48,7 +48,7 @@ class RebuildFileCache extends Maintenance {
        }
 
        public function execute() {
-               global $wgUseFileCache, $wgReadOnly, $wgContentNamespaces, $wgRequestTime;
+               global $wgUseFileCache, $wgReadOnly, $wgRequestTime;
                global $wgOut;
                if ( !$wgUseFileCache ) {
                        $this->error( "Nothing to do -- \$wgUseFileCache is disabled.", true );
@@ -94,7 +94,7 @@ class RebuildFileCache extends Maintenance {
                while ( $blockEnd <= $end ) {
                        // Get the pages
                        $res = $dbr->select( 'page', [ 'page_namespace', 'page_title', 'page_id' ],
-                               [ 'page_namespace' => $wgContentNamespaces,
+                               [ 'page_namespace' => MWNamespace::getContentNamespaces(),
                                        "page_id BETWEEN $blockStart AND $blockEnd" ],
                                [ 'ORDER BY' => 'page_id ASC', 'USE INDEX' => 'PRIMARY' ]
                        );
index 837f304..131a569 100644 (file)
@@ -30,12 +30,14 @@ require_once __DIR__ . '/Maintenance.php';
  * Maintenance script to reset the user_token for all users on the wiki.
  *
  * @ingroup Maintenance
+ * @deprecated since 1.27, use $wgAuthenticationTokenVersion instead.
  */
 class ResetUserTokens extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->addDescription(
-                       'Reset the user_token of all users on the wiki. Note that this may log some of them out.'
+                       "Reset the user_token of all users on the wiki. Note that this may log some of them out.\n"
+                       . "Deprecated, use \$wgAuthenticationTokenVersion instead."
                );
                $this->addOption( 'nowarn', "Hides the 5 seconds warning", false, false );
                $this->addOption(
index 4a74322..82149a6 100644 (file)
@@ -268,9 +268,9 @@ class SyncFileBackend extends Maintenance {
                        sleep( 10 ); // wait and retry copy again
                        $status = $dst->doQuickOperations( $ops, [ 'bypassReadOnly' => 1 ] );
                }
-               $ellapsed_ms = floor( ( microtime( true ) - $t_start ) * 1000 );
+               $elapsed_ms = floor( ( microtime( true ) - $t_start ) * 1000 );
                if ( $status->isOK() && $this->getOption( 'verbose' ) ) {
-                       $this->output( "Synchronized these file(s) [{$ellapsed_ms}ms]:\n" .
+                       $this->output( "Synchronized these file(s) [{$elapsed_ms}ms]:\n" .
                                implode( "\n", $dPaths ) . "\n" );
                }
 
index 89aeb9c..9c9bdfb 100644 (file)
@@ -623,9 +623,9 @@ CREATE INDEX /*i*/cl_timestamp ON /*_*/categorylinks (cl_to,cl_timestamp);
 CREATE INDEX /*i*/cl_collation_ext ON /*_*/categorylinks (cl_collation, cl_to, cl_type, cl_from);
 
 --
--- Track all existing categories.  Something is a category if 1) it has an en-
--- try somewhere in categorylinks, or 2) it once did.  Categories might not
--- have corresponding pages, so they need to be tracked separately.
+-- Track all existing categories. Something is a category if 1) it has an entry
+-- somewhere in categorylinks, or 2) it has a description page. Categories
+-- might not have corresponding pages, so they need to be tracked separately.
 --
 CREATE TABLE /*_*/category (
   -- Primary key
index 775fa7b..b96e7eb 100755 (executable)
@@ -25,7 +25,6 @@
  * @ingroup Maintenance
  */
 
-$wgUseMasterForMaintenance = true;
 require_once __DIR__ . '/Maintenance.php';
 
 /**
@@ -83,13 +82,6 @@ class UpdateMediaWiki extends Maintenance {
                                "ABORTING (see https://bugs.php.net/bug.php?id=45996).\n",
                                true );
                }
-
-               if ( !function_exists( 'mb_strlen' ) ) {
-                       $this->error(
-                               "MediaWiki now requires the mbstring PHP extension, your system doesn't have it.\n"
-                               . "ABORTING.\n",
-                               true );
-               }
        }
 
        function execute() {
diff --git a/maintenance/updateExtensionJsonSchema.php b/maintenance/updateExtensionJsonSchema.php
new file mode 100644 (file)
index 0000000..427769f
--- /dev/null
@@ -0,0 +1,69 @@
+<?php
+
+require_once __DIR__ . '/Maintenance.php';
+
+class UpdateExtensionJsonSchema extends Maintenance {
+
+       public function __construct() {
+               parent::__construct();
+               $this->addDescription( 'Updates extension.json files to the latest manifest_version' );
+               $this->addArg( 'path', 'Location to the extension.json or skin.json you wish to convert',
+                       /* $required = */ true );
+       }
+
+       public function execute() {
+               $filename = $this->getArg( 0 );
+               if ( !is_readable( $filename ) ) {
+                       $this->error( "Error: Unable to read $filename", 1 );
+               }
+
+               $json = FormatJson::decode( file_get_contents( $filename ), true );
+               if ( $json === null ) {
+                       $this->error( "Error: Invalid JSON", 1 );
+               }
+
+               if ( !isset( $json['manifest_version'] ) ) {
+                       $json['manifest_version'] = 1;
+               }
+
+               if ( $json['manifest_version'] == ExtensionRegistry::MANIFEST_VERSION ) {
+                       $this->output( "Already at the latest version: {$json['manifest_version']}\n" );
+                       return;
+               }
+
+               while ( $json['manifest_version'] !== ExtensionRegistry::MANIFEST_VERSION ) {
+                       $json['manifest_version'] += 1;
+                       $func = "updateTo{$json['manifest_version']}";
+                       $this->$func( $json );
+               }
+
+               file_put_contents( $filename, FormatJson::encode( $json, "\t", FormatJson::ALL_OK ) . "\n" );
+               $this->output( "Updated to {$json['manifest_version']}...\n" );
+       }
+
+       protected function updateTo2( &$json ) {
+               if ( isset( $json['config'] ) ) {
+                       $config = $json['config'];
+                       $json['config'] = [];
+                       if ( isset( $config['_prefix'] ) ) {
+                               $json = wfArrayInsertAfter( $json, [
+                                       'config_prefix' => $config['_prefix']
+                               ], 'config' );
+                               unset( $config['_prefix'] );
+                       }
+
+                       foreach ( $config as $name => $value ) {
+                               if ( $name[0] !== '@' ) {
+                                       $json['config'][$name] = [ 'value' => $value ];
+                                       if ( isset( $value[ExtensionRegistry::MERGE_STRATEGY] ) ) {
+                                               $json['config'][$name]['merge_strategy'] = $value[ExtensionRegistry::MERGE_STRATEGY];
+                                               unset( $value[ExtensionRegistry::MERGE_STRATEGY] );
+                                       }
+                               }
+                       }
+               }
+       }
+}
+
+$maintClass = 'UpdateExtensionJsonSchema';
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/mw-config/overrides.php b/mw-config/overrides.php
deleted file mode 100644 (file)
index 3dfecaa..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php
-/**
- * MediaWiki installer overrides.
- * Modify this file if you are a packager who needs to modify the behavior of
- * the MediaWiki installer. Altering it is preferred over changing anything in
- * /includes.
- *
- * Note: this file doesn't gets included from a global scope, don't use globals directly.
- *
- * 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
- */
-
-/*
-
-Example of modifications:
-
-       public static function getLocalSettingsGenerator( Installer $installer ) {
-               return new MyLocalSettingsGenerator( $installer );
-       }
-
-Then add the following to the bottom of this file:
-
-class MyLocalSettingsGenerator extends LocalSettingsGenerator {
-       function getText() {
-               // Modify an existing setting
-               $this->values['wgDefaultSkin'] = 'vector';
-               // add a new setting
-               $ls = parent::getText();
-               return $ls . "\n\$wgUseTex = true;\n";
-       }
-}
-*/
-
-/**
- * @since 1.20
- */
-class InstallerOverrides {
-       /**
-        * Instantiates and returns an instance of LocalSettingsGenerator or its descendant classes
-        * @param Installer $installer
-        * @return LocalSettingsGenerator
-        */
-       public static function getLocalSettingsGenerator( Installer $installer ) {
-               return new LocalSettingsGenerator( $installer );
-       }
-
-       /**
-        * Instantiates and returns an instance of WebInstaller or its descendant classes
-        * @param WebRequest $request
-        * @return WebInstaller
-        */
-       public static function getWebInstaller( WebRequest $request ) {
-               return new WebInstaller( $request );
-       }
-
-       /**
-        * Instantiates and returns an instance of CliInstaller or its descendant classes
-        * @param string $siteName
-        * @param string|null $admin
-        * @param array $options
-        * @return CliInstaller
-        */
-       public static function getCliInstaller( $siteName, $admin = null, array $options = [] ) {
-               return new CliInstaller( $siteName, $admin, $options );
-       }
-}
diff --git a/mw-config/overrides/README b/mw-config/overrides/README
new file mode 100644 (file)
index 0000000..68e0fad
--- /dev/null
@@ -0,0 +1,22 @@
+Don't modify the installer if you want to alter its behavior, including
+the contents of generated LocalSettings.php in your package. Instead,
+you can override classes used by the installer.
+
+You can override 3 classes:
+* LocalSettingsGenerator - generates LocalSettings.php
+* WebInstaller - web installer UI
+* CliInstaller - command line installer
+
+Example override:
+
+$overrides['LocalSettingsGenerator'] = 'MyLocalSettingsGenerator';
+
+class MyLocalSettingsGenerator extends LocalSettingsGenerator {
+       function getText() {
+               // Modify an existing setting
+               $this->values['wgDefaultSkin'] = 'vector';
+               // add a new setting
+               $ls = parent::getText();
+               return $ls . "\n\$wgMiserMode = true;\n";
+       }
+}
index 6fde2e0..780e049 100644 (file)
     "grunt-contrib-watch": "1.0.0",
     "grunt-jscs": "2.8.0",
     "grunt-jsonlint": "1.0.7",
-    "grunt-karma": "0.12.2",
-    "grunt-stylelint": "0.3.0",
-    "karma": "0.13.22",
-    "karma-chrome-launcher": "0.2.2",
-    "karma-firefox-launcher": "0.1.7",
-    "karma-qunit": "0.1.9",
+    "grunt-karma": "2.0.0",
+    "grunt-stylelint": "0.4.0",
+    "karma": "1.1.0",
+    "karma-chrome-launcher": "1.0.1",
+    "karma-firefox-launcher": "1.0.0",
+    "karma-qunit": "1.0.0",
     "qunitjs": "1.22.0",
-    "stylelint-config-wikimedia": "0.1.0"
+    "stylelint-config-wikimedia": "0.2.2"
   }
 }
index 106a83b..e838a53 100644 (file)
@@ -33,6 +33,7 @@ return [
 
        // Scripts managed by the local wiki (stored in the MediaWiki namespace)
        'site' => [ 'class' => 'ResourceLoaderSiteModule' ],
+       'site.styles' => [ 'class' => 'ResourceLoaderSiteStylesModule' ],
        'noscript' => [
                'class' => 'ResourceLoaderWikiModule',
                'styles' => [ 'MediaWiki:Noscript.css' ],
@@ -840,7 +841,6 @@ return [
                'class' => 'ResourceLoaderRawFileModule',
                // Keep in sync with maintenance/jsduck/eg-iframe.html
                'scripts' => [
-                       'resources/lib/phpjs-sha1/sha1.js',
                        'resources/src/mediawiki/mediawiki.js',
                        'resources/src/mediawiki/mediawiki.requestIdleCallback.js',
                        'resources/src/mediawiki/mediawiki.errorLogger.js',
@@ -948,7 +948,7 @@ return [
        ],
        'mediawiki.content.json' => [
                'position' => 'top',
-               'styles' => 'resources/src/mediawiki/mediawiki.content.json.css',
+               'styles' => 'resources/src/mediawiki/mediawiki.content.json.less',
        ],
        'mediawiki.confirmCloseWindow' => [
                'scripts' => [
@@ -1183,6 +1183,7 @@ return [
                ],
                'messages' => [
                        'uploaddisabledtext',
+                       'upload-dialog-disabled',
                        'upload-foreign-cant-upload',
                ]
        ],
@@ -1296,7 +1297,6 @@ return [
                        'filename-thumb-name',
                        'badfilename',
                        'protectedpagetext',
-                       'api-error-blacklisted', // HACK
                ],
        ],
        'mediawiki.ForeignStructuredUpload.BookletLayout' => [
@@ -1379,11 +1379,9 @@ return [
        ],
        'mediawiki.checkboxtoggle' => [
                'scripts' => 'resources/src/mediawiki/mediawiki.checkboxtoggle.js',
-               'position' => 'top',
        ],
        'mediawiki.checkboxtoggle.styles' => [
                'styles' => 'resources/src/mediawiki/mediawiki.checkboxtoggle.css',
-               'position' => 'top',
        ],
        'mediawiki.cookie' => [
                'scripts' => 'resources/src/mediawiki/mediawiki.cookie.js',
@@ -1408,12 +1406,16 @@ return [
        /* MediaWiki Action */
 
        'mediawiki.action.edit' => [
-               'scripts' => 'resources/src/mediawiki.action/mediawiki.action.edit.js',
+               'scripts' => [
+                       'resources/src/mediawiki.action/mediawiki.action.edit.js',
+                       'resources/src/mediawiki.action/mediawiki.action.edit.stash.js',
+               ],
                'styles' => 'resources/src/mediawiki.action/mediawiki.action.edit.css',
                'dependencies' => [
                        'mediawiki.action.edit.styles',
                        'jquery.textSelection',
                        'jquery.byteLimit',
+                       'mediawiki.api',
                ],
                'position' => 'top',
        ],
@@ -1456,18 +1458,14 @@ return [
                        'previewerrortext',
                ],
        ],
-       'mediawiki.action.edit.stash' => [
-               'scripts' => 'resources/src/mediawiki.action/mediawiki.action.edit.stash.js',
-               'dependencies' => [
-                       'jquery.getAttrs',
-                       'mediawiki.api',
-               ],
-       ],
        'mediawiki.action.history' => [
-               'position' => 'top',
                'scripts' => 'resources/src/mediawiki.action/mediawiki.action.history.js',
                'styles' => 'resources/src/mediawiki.action/mediawiki.action.history.css',
        ],
+       'mediawiki.action.history.styles' => [
+               'position' => 'top',
+               'styles' => 'resources/src/mediawiki.action/mediawiki.action.history.styles.css',
+       ],
        'mediawiki.action.history.diff' => [
                'position' => 'top',
                'styles' => [
@@ -1657,6 +1655,18 @@ return [
                'position' => 'top',
                'targets' => [ 'desktop', 'mobile' ],
        ],
+       'mediawiki.page.gallery.slideshow' => [
+               'scripts' => 'resources/src/mediawiki/page/gallery-slideshow.js',
+               'position' => 'top',
+               'dependencies' => [
+                       'mediawiki.api',
+                       'mediawiki.Title',
+                       'oojs',
+                       'oojs-ui-core',
+                       'oojs-ui-widgets',
+                       'oojs-ui.styles.icons-media'
+               ]
+       ],
        'mediawiki.page.ready' => [
                'scripts' => 'resources/src/mediawiki/page/ready.js',
                'dependencies' => [
@@ -2352,7 +2362,5 @@ return [
        ],
 
        /* OOjs UI */
-       // WARNING: OOjs-UI is NOT TESTED with older browsers and is likely to break
-       // if loaded in browsers that don't support ES5
        // @see ResourcesOOUI.php
 ];
index 400a432..ac7f6c6 100644 (file)
@@ -8,7 +8,8 @@
                        "Kenrick95",
                        "McDutchie",
                        "Rv77ax",
-                       "William Surya Permana"
+                       "William Surya Permana",
+                       "Rachmat.Wahidi"
                ]
        },
        "ooui-outline-control-move-down": "Pindahkan butir ke bawah",
@@ -23,6 +24,8 @@
        "ooui-dialog-process-dismiss": "Tutup",
        "ooui-dialog-process-retry": "Coba lagi",
        "ooui-dialog-process-continue": "Lanjutkan",
+       "ooui-selectfile-button-select": "Pilih berkas",
        "ooui-selectfile-not-supported": "Peilihan berkas tidak didukung",
-       "ooui-selectfile-placeholder": "Tidak ada berkas yang terpilih"
+       "ooui-selectfile-placeholder": "Tidak ada berkas yang terpilih",
+       "ooui-selectfile-dragdrop-placeholder": "Letakkan berkas di sini"
 }
diff --git a/resources/lib/oojs-ui/i18n/inh.json b/resources/lib/oojs-ui/i18n/inh.json
new file mode 100644 (file)
index 0000000..a897ed5
--- /dev/null
@@ -0,0 +1,24 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Adam-Yourist",
+                       "ElizaMag"
+               ]
+       },
+       "ooui-outline-control-move-down": "Элемент Iолохеяккха",
+       "ooui-outline-control-move-up": "Элемент Iолакхеяккха",
+       "ooui-outline-control-remove": "ДIаяккха пункт",
+       "ooui-toolbar-more": "Кхы а",
+       "ooui-toolgroup-expand": "Дукха",
+       "ooui-toolgroup-collapse": "КӀезига",
+       "ooui-dialog-message-accept": "ОК",
+       "ooui-dialog-message-reject": "Эшац",
+       "ooui-dialog-process-error": "Харцахь хилар цхьа хIама",
+       "ooui-dialog-process-dismiss": "ДIакъовла",
+       "ooui-dialog-process-retry": "Кхы цкъа де гIорта",
+       "ooui-dialog-process-continue": "ДIаьхде",
+       "ooui-selectfile-button-select": "Файл хьахаржа",
+       "ooui-selectfile-not-supported": "Файл харжа вIаштаь дац",
+       "ooui-selectfile-placeholder": "Файл хержа яц",
+       "ooui-selectfile-dragdrop-placeholder": "Хьадехьаяккха файл укхаз"
+}
index 1024d2a..8da8ef1 100644 (file)
@@ -8,18 +8,20 @@
                        "Meursault2004"
                ]
        },
-       "ooui-outline-control-move-down": "Pindhahaken butir mangandhap",
-       "ooui-outline-control-move-up": "Pindhah kara menyang dhuwur",
-       "ooui-outline-control-remove": "Busak kara",
-       "ooui-toolbar-more": "Manèh",
-       "ooui-toolgroup-expand": "Manèh",
-       "ooui-toolgroup-collapse": "Suda",
-       "ooui-dialog-message-accept": "Oké",
-       "ooui-dialog-message-reject": "Batal",
+       "ooui-outline-control-move-down": "Lih barang mangisor",
+       "ooui-outline-control-move-up": "Lih barang mandhuwur",
+       "ooui-outline-control-remove": "Buwang barang",
+       "ooui-toolbar-more": "Liyané",
+       "ooui-toolgroup-expand": "Liyané",
+       "ooui-toolgroup-collapse": "Sacukupé",
+       "ooui-dialog-message-accept": "Ha'a",
+       "ooui-dialog-message-reject": "Wurungaké",
        "ooui-dialog-process-error": "Ana sing klèru",
        "ooui-dialog-process-dismiss": "Tutup",
        "ooui-dialog-process-retry": "Jajal manèh",
-       "ooui-dialog-process-continue": "Tutug",
-       "ooui-selectfile-not-supported": "Pilihan berkas ora disokong",
-       "ooui-selectfile-placeholder": "Ora ana berkas sing kapilih"
+       "ooui-dialog-process-continue": "Banjuraké",
+       "ooui-selectfile-button-select": "Pilih barkas",
+       "ooui-selectfile-not-supported": "Barkas pilihan ora disengkuyung",
+       "ooui-selectfile-placeholder": "Ora ana barkas sing dipilih",
+       "ooui-selectfile-dragdrop-placeholder": "Dèkèk barkas ing kéné"
 }
index 94b4687..9954744 100644 (file)
@@ -12,5 +12,6 @@
        "ooui-dialog-message-reject": "Betal bike",
        "ooui-dialog-process-retry": "Dîsa hewl bide",
        "ooui-dialog-process-continue": "Bidomîne",
+       "ooui-selectfile-button-select": "Dosyeyekê hilbijêre",
        "ooui-selectfile-placeholder": "Ti dosye nehatiye hilbijartin"
 }
diff --git a/resources/lib/oojs-ui/i18n/pnb.json b/resources/lib/oojs-ui/i18n/pnb.json
new file mode 100644 (file)
index 0000000..8bd4be8
--- /dev/null
@@ -0,0 +1,21 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Saanvel"
+               ]
+       },
+       "ooui-outline-control-move-down": "شیہ تھلے کرو",
+       "ooui-outline-control-move-up": "شیہ اتے کرو",
+       "ooui-outline-control-remove": "شیہ مٹاؤ",
+       "ooui-toolbar-more": "ہور",
+       "ooui-toolgroup-expand": "ہور",
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "مکاؤ",
+       "ooui-dialog-process-error": "کوئی رپھڑ پے گیا اے۔",
+       "ooui-dialog-process-dismiss": "مکاؤ",
+       "ooui-dialog-process-retry": "فیر کرو",
+       "ooui-dialog-process-continue": "چلاؤ",
+       "ooui-selectfile-button-select": "فائل چنو",
+       "ooui-selectfile-placeholder": "کوئی فائل نئی چنی ہوئی",
+       "ooui-selectfile-dragdrop-placeholder": "فائل ایتھے پاؤ"
+}
index 510e468..598acbc 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Lloffiwr",
-                       "Muddyb Blast Producer"
+                       "Muddyb Blast Producer",
+                       "Muddyb"
                ]
        },
        "ooui-outline-control-move-down": "Sogeza kipengee chini",
index 537a9d7..a34432f 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.4
+ * OOjs UI v0.17.6
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-31T21:50:52Z
+ * Date: 2016-07-12T20:26:03Z
  */
 ( function ( OO ) {
 
@@ -27,6 +27,15 @@ OO.ui.ApexTheme = function OoUiApexTheme() {
 
 OO.inheritClass( OO.ui.ApexTheme, OO.ui.Theme );
 
+/* Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.ApexTheme.prototype.getDialogTransitionDuration = function () {
+       return 250;
+};
+
 /* Instantiation */
 
 OO.ui.theme = new OO.ui.ApexTheme();
index fdfd3e4..152d444 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.4
+ * OOjs UI v0.17.6
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-31T21:50:56Z
+ * Date: 2016-07-12T20:26:07Z
  */
 .oo-ui-element-hidden {
        display: none !important;
 .oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
        cursor: default;
 }
+.oo-ui-buttonElement.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
+       z-index: 2;
+}
 .oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
 .oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
 .oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
 }
 .oo-ui-fieldLayout > .oo-ui-fieldLayout-help .oo-ui-fieldLayout-help-content {
        padding: 0.5em 0.75em;
-       line-height: 1.5em;
+       line-height: 1.5;
 }
 .oo-ui-fieldLayout:last-child {
        margin-bottom: 0;
 }
 .oo-ui-fieldsetLayout > .oo-ui-fieldsetLayout-help .oo-ui-fieldsetLayout-help-content {
        padding: 0.5em 0.75em;
-       line-height: 1.5em;
+       line-height: 1.5;
 }
 .oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout,
 .oo-ui-fieldsetLayout + .oo-ui-formLayout {
 .oo-ui-textInputWidget textarea {
        display: block;
        width: 100%;
-       resize: none;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
 .oo-ui-textInputWidget textarea {
        overflow: auto;
+       resize: none;
 }
 .oo-ui-textInputWidget [type="search"] {
        -webkit-appearance: textfield;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
+       cursor: default;
        -webkit-touch-callout: none;
        -webkit-user-select: none;
           -moz-user-select: none;
 .oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
        position: absolute;
 }
+.oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle {
+       cursor: pointer;
+}
 .oo-ui-dropdownWidget > .oo-ui-menuSelectWidget {
        z-index: 1;
        width: 100%;
 }
-.oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle {
-       cursor: pointer;
-}
 .oo-ui-dropdownWidget:last-child {
        margin-right: 0;
 }
index 05f3838..a191804 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.4
+ * OOjs UI v0.17.6
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-31T21:50:56Z
+ * Date: 2016-07-12T20:26:07Z
  */
 .oo-ui-element-hidden {
        display: none !important;
 .oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
        cursor: default;
 }
+.oo-ui-buttonElement.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
+       z-index: 2;
+}
 .oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
 .oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
 .oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
@@ -49,6 +54,7 @@
        text-decoration: none;
 }
 .oo-ui-buttonElement > .oo-ui-buttonElement-button:focus {
+       border-radius: 2px;
        outline: 0;
 }
 .oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
@@ -67,7 +73,6 @@
 .oo-ui-buttonElement-frameless > input.oo-ui-buttonElement-button {
        padding-left: 0.25em;
        padding-right: 0.25em;
-       color: #333333;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
        box-shadow: inset 0 0 0 1px #347bff, 0 0 0 1px #347bff;
 }
 .oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       line-height: 1.2em;
+       line-height: 1.2;
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
        position: absolute;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
        border-color: #347bff;
-       box-shadow: inset 0 0 0 1px #ffffff;
+       box-shadow: inset 0 0 0 1px #347bff, inset 0 0 0 2px #ffffff;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
        color: #ffffff;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
        border-color: #347bff;
-       box-shadow: inset 0 0 0 1px #ffffff;
+       box-shadow: inset 0 0 0 1px #347bff, inset 0 0 0 2px #ffffff;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
        color: #ffffff;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
        border-color: #d11d13;
-       box-shadow: inset 0 0 0 1px #ffffff;
+       box-shadow: inset 0 0 0 1px #d11d13, inset 0 0 0 2px #ffffff;
 }
 .oo-ui-clippableElement-clippable {
        -webkit-box-sizing: border-box;
 }
 .oo-ui-fieldLayout > .oo-ui-fieldLayout-help .oo-ui-fieldLayout-help-content {
        padding: 0.5em 0.75em;
-       line-height: 1.5em;
+       line-height: 1.5;
 }
 .oo-ui-fieldLayout:last-child {
        margin-bottom: 0;
 .oo-ui-fieldLayout-messages .oo-ui-labelWidget {
        display: table-cell;
        padding: 0;
-       line-height: 1.875em;
+       line-height: 1.875;
        vertical-align: middle;
 }
 .oo-ui-actionFieldLayout {
 }
 .oo-ui-fieldsetLayout > .oo-ui-fieldsetLayout-help .oo-ui-fieldsetLayout-help-content {
        padding: 0.5em 0.75em;
-       line-height: 1.5em;
+       line-height: 1.5;
 }
 .oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout,
 .oo-ui-fieldsetLayout + .oo-ui-formLayout {
 }
 .oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
        padding-left: 2em;
-       line-height: 1.8em;
+       line-height: 1.8;
 }
 .oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
        left: 0;
        background-color: #eeeeee;
 }
 .oo-ui-optionWidget .oo-ui-labelElement-label {
-       line-height: 1.5em;
+       line-height: 1.5;
 }
 .oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected,
 .oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed,
 .oo-ui-iconWidget {
        display: inline-block;
        vertical-align: middle;
-       line-height: 2.5em;
+       line-height: 2.5;
 }
 .oo-ui-iconWidget.oo-ui-widget-disabled {
        opacity: 0.2;
 .oo-ui-indicatorWidget {
        display: inline-block;
        vertical-align: middle;
-       line-height: 2.5em;
+       line-height: 2.5;
        margin: 0.46875em;
 }
 .oo-ui-indicatorWidget.oo-ui-widget-disabled {
        border-radius: 0;
        margin-left: -1px;
 }
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button:focus {
-       z-index: 2;
-}
 .oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
        border-bottom-left-radius: 2px;
        border-top-left-radius: 2px;
        padding: 0.25em 0;
 }
 .oo-ui-checkboxMultiselectInputWidget .oo-ui-fieldLayout .oo-ui-fieldLayout-body .oo-ui-labelElement-label {
-       line-height: 1.5em;
+       line-height: 1.5;
 }
 .oo-ui-dropdownInputWidget {
        position: relative;
        padding: 0.25em 0;
 }
 .oo-ui-radioSelectInputWidget .oo-ui-fieldLayout .oo-ui-fieldLayout-body .oo-ui-labelElement-label {
-       line-height: 1.5em;
+       line-height: 1.5;
 }
 .oo-ui-textInputWidget {
        position: relative;
 .oo-ui-textInputWidget textarea {
        display: block;
        width: 100%;
-       resize: none;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
 .oo-ui-textInputWidget textarea {
        overflow: auto;
+       resize: none;
 }
 .oo-ui-textInputWidget [type="search"] {
        -webkit-appearance: textfield;
 .oo-ui-textInputWidget input,
 .oo-ui-textInputWidget textarea {
        padding: 0.5em;
-       line-height: 1.275em;
        margin: 0;
        font-size: inherit;
        font-family: inherit;
        color: #000000;
        border: 1px solid #cccccc;
        border-radius: 2px;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
+}
+.oo-ui-textInputWidget textarea {
+       line-height: 1.275;
 }
 .oo-ui-textInputWidget .oo-ui-pendingElement-pending {
        background-color: transparent;
        border-color: #cccccc;
        box-shadow: inset 0 0 0 0.1em #cccccc;
 }
+.oo-ui-textInputWidget.oo-ui-widget-enabled :-moz-placeholder {
+       color: #595959;
+       opacity: 1;
+}
+.oo-ui-textInputWidget.oo-ui-widget-enabled ::-moz-placeholder {
+       color: #595959;
+       opacity: 1;
+}
+.oo-ui-textInputWidget.oo-ui-widget-enabled :-ms-input-placeholder {
+       color: #595959;
+}
+.oo-ui-textInputWidget.oo-ui-widget-enabled ::-webkit-input-placeholder {
+       color: #595959;
+}
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid input,
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid textarea {
        border-color: #ff0000;
 }
 .oo-ui-textInputWidget > .oo-ui-labelElement-label {
        padding: 0.4em;
-       line-height: 1.5em;
+       line-height: 1.5;
        color: #888888;
 }
 .oo-ui-textInputWidget-labelPosition-after.oo-ui-indicatorElement > .oo-ui-labelElement-label {
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
+       cursor: default;
        -webkit-touch-callout: none;
        -webkit-user-select: none;
           -moz-user-select: none;
 .oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
        position: absolute;
 }
+.oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle {
+       cursor: pointer;
+}
 .oo-ui-dropdownWidget > .oo-ui-menuSelectWidget {
        z-index: 1;
        width: 100%;
 }
-.oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle {
-       cursor: pointer;
-}
 .oo-ui-dropdownWidget:last-child {
        margin-right: 0;
 }
        overflow: hidden;
 }
 .oo-ui-multioptionWidget .oo-ui-labelElement-label {
-       line-height: 1.5em;
+       line-height: 1.5;
 }
 .oo-ui-multioptionWidget.oo-ui-widget-disabled {
        color: #cccccc;
index 6836553..2a1427b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.4
+ * OOjs UI v0.17.6
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-31T21:50:52Z
+ * Date: 2016-07-12T20:26:03Z
  */
 ( function ( OO ) {
 
@@ -1634,6 +1634,18 @@ OO.ui.Theme.prototype.updateElementClasses = function ( element ) {
                .addClass( classes.on.join( ' ' ) );
 };
 
+/**
+ * Get the transition duration in milliseconds for dialogs opening/closing
+ *
+ * The dialog should be fully rendered this many milliseconds after the
+ * ready process has executed.
+ *
+ * @return {number} Transition duration in milliseconds
+ */
+OO.ui.Theme.prototype.getDialogTransitionDuration = function () {
+       return 0;
+};
+
 /**
  * The TabIndexedElement class is an attribute mixin used to add additional functionality to an
  * element created by another class. The mixin provides a ‘tabIndex’ property, which specifies the
@@ -2219,7 +2231,7 @@ OO.ui.mixin.GroupElement.prototype.aggregate = function ( events ) {
  * @chainable
  */
 OO.ui.mixin.GroupElement.prototype.addItems = function ( items, index ) {
-       var i, len, item, event, events, currentIndex,
+       var i, len, item, itemEvent, events, currentIndex,
                itemElements = [];
 
        for ( i = 0, len = items.length; i < len; i++ ) {
@@ -2237,8 +2249,8 @@ OO.ui.mixin.GroupElement.prototype.addItems = function ( items, index ) {
                // Add the item
                if ( item.connect && item.disconnect && !$.isEmptyObject( this.aggregateItemEvents ) ) {
                        events = {};
-                       for ( event in this.aggregateItemEvents ) {
-                               events[ event ] = [ 'emit', this.aggregateItemEvents[ event ], item ];
+                       for ( itemEvent in this.aggregateItemEvents ) {
+                               events[ itemEvent ] = [ 'emit', this.aggregateItemEvents[ itemEvent ], item ];
                        }
                        item.connect( this, events );
                }
@@ -2271,22 +2283,19 @@ OO.ui.mixin.GroupElement.prototype.addItems = function ( items, index ) {
  * @chainable
  */
 OO.ui.mixin.GroupElement.prototype.removeItems = function ( items ) {
-       var i, len, item, index, remove, itemEvent;
+       var i, len, item, index, events, itemEvent;
 
        // Remove specific items
        for ( i = 0, len = items.length; i < len; i++ ) {
                item = items[ i ];
                index = this.items.indexOf( item );
                if ( index !== -1 ) {
-                       if (
-                               item.connect && item.disconnect &&
-                               !$.isEmptyObject( this.aggregateItemEvents )
-                       ) {
-                               remove = {};
-                               if ( Object.prototype.hasOwnProperty.call( this.aggregateItemEvents, itemEvent ) ) {
-                                       remove[ itemEvent ] = [ 'emit', this.aggregateItemEvents[ itemEvent ], item ];
+                       if ( item.connect && item.disconnect && !$.isEmptyObject( this.aggregateItemEvents ) ) {
+                               events = {};
+                               for ( itemEvent in this.aggregateItemEvents ) {
+                                       events[ itemEvent ] = [ 'emit', this.aggregateItemEvents[ itemEvent ], item ];
                                }
-                               item.disconnect( this, remove );
+                               item.disconnect( this, events );
                        }
                        item.setElementGroup( null );
                        this.items.splice( index, 1 );
@@ -3730,6 +3739,7 @@ OO.ui.IndicatorWidget.static.tagName = 'span';
  * @class
  * @extends OO.ui.Widget
  * @mixins OO.ui.mixin.LabelElement
+ * @mixins OO.ui.mixin.TitledElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -7583,7 +7593,7 @@ OO.ui.InputWidget.prototype.restorePreInfuseState = function ( state ) {
  * ButtonInputWidget is used to submit HTML forms and is intended to be used within
  * a OO.ui.FormLayout. If you do not need the button to work with HTML forms, you probably
  * want to use OO.ui.ButtonWidget instead. Button input widgets can be rendered as either an
- * HTML `<button/>` (the default) or an HTML `<input/>` tags. See the
+ * HTML `<button>` (the default) or an HTML `<input>` tags. See the
  * [OOjs UI documentation on MediaWiki] [1] for more information.
  *
  *     @example
@@ -7608,8 +7618,8 @@ OO.ui.InputWidget.prototype.restorePreInfuseState = function ( state ) {
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {string} [type='button'] The value of the HTML `'type'` attribute: 'button', 'submit' or 'reset'.
- * @cfg {boolean} [useInputTag=false] Use an `<input/>` tag instead of a `<button/>` tag, the default.
- *  Widgets configured to be an `<input/>` do not support {@link #icon icons} and {@link #indicator indicators},
+ * @cfg {boolean} [useInputTag=false] Use an `<input>` tag instead of a `<button>` tag, the default.
+ *  Widgets configured to be an `<input>` do not support {@link #icon icons} and {@link #indicator indicators},
  *  non-plaintext {@link #label labels}, or {@link #value values}. In general, useInputTag should only
  *  be set to `true` when there’s need to support IE 6 in a form with multiple buttons.
  */
@@ -7674,7 +7684,7 @@ OO.ui.ButtonInputWidget.prototype.getInputElement = function ( config ) {
 /**
  * Set label value.
  *
- * If #useInputTag is `true`, the label is set as the `value` of the `<input/>` tag.
+ * If #useInputTag is `true`, the label is set as the `value` of the `<input>` tag.
  *
  * @param {jQuery|string|Function|null} label Label nodes, text, a function that returns nodes or
  *  text, or `null` for no label
@@ -7700,7 +7710,7 @@ OO.ui.ButtonInputWidget.prototype.setLabel = function ( label ) {
 /**
  * Set the value of the input.
  *
- * This method is disabled for button inputs configured as {@link #useInputTag <input/> tags}, as
+ * This method is disabled for button inputs configured as {@link #useInputTag <input> tags}, as
  * they do not support {@link #value values}.
  *
  * @param {string} value New value
index 750ab66..d0de9df 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.4
+ * OOjs UI v0.17.6
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-31T21:50:52Z
+ * Date: 2016-07-12T20:26:03Z
  */
 ( function ( OO ) {
 
@@ -72,6 +72,13 @@ OO.ui.MediaWikiTheme.prototype.getElementClasses = function ( element ) {
        return classes;
 };
 
+/**
+ * @inheritdoc
+ */
+OO.ui.MediaWikiTheme.prototype.getDialogTransitionDuration = function () {
+       return 250;
+};
+
 /* Instantiation */
 
 OO.ui.theme = new OO.ui.MediaWikiTheme();
index 3f1910e..e758f82 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.4
+ * OOjs UI v0.17.6
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-31T21:50:56Z
+ * Date: 2016-07-12T20:26:07Z
  */
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
        clear: both;
 }
 .oo-ui-toolbar-bar {
-       line-height: 1em;
+       line-height: 1;
        position: relative;
 }
 .oo-ui-toolbar-actions {
index dd59a23..0c007bb 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.4
+ * OOjs UI v0.17.6
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-31T21:50:56Z
+ * Date: 2016-07-12T20:26:07Z
  */
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
@@ -33,7 +33,7 @@
        width: 1.875em;
 }
 .oo-ui-toolGroupTool > .oo-ui-popupToolGroup.oo-ui-labelElement > .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-       line-height: 2.1em;
+       line-height: 2.1;
 }
 .oo-ui-toolGroup {
        display: inline-block;
@@ -93,7 +93,7 @@
        width: 1.875em;
 }
 .oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link .oo-ui-tool-title {
-       line-height: 2.1em;
+       line-height: 2.1;
        padding: 0 0.4em;
 }
 .oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-enabled:hover {
        min-width: 3.75em;
 }
 .oo-ui-popupToolGroup.oo-ui-labelElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-       line-height: 2.6em;
+       line-height: 2.6;
        margin: 0 1em;
 }
 .oo-ui-toolbar-narrow .oo-ui-popupToolGroup.oo-ui-labelElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
        left: 0;
 }
 .oo-ui-popupToolGroup-header {
-       line-height: 2.6em;
+       line-height: 2.6;
        margin: 0 0.6em;
        font-weight: bold;
 }
 }
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel,
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-       line-height: 2em;
+       line-height: 2;
 }
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel {
        color: #888888;
        clear: both;
 }
 .oo-ui-toolbar-bar {
-       line-height: 1em;
+       line-height: 1;
        position: relative;
 }
 .oo-ui-toolbar-actions {
index 3b1e15d..66473ff 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.4
+ * OOjs UI v0.17.6
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-31T21:50:52Z
+ * Date: 2016-07-12T20:26:03Z
  */
 ( function ( OO ) {
 
@@ -1292,24 +1292,26 @@ OO.ui.ToolFactory.prototype.extract = function ( collection, used ) {
        var i, len, item, name, tool,
                names = [];
 
-       if ( collection === '*' ) {
-               for ( name in this.registry ) {
-                       tool = this.registry[ name ];
-                       if (
-                               // Only add tools by group name when auto-add is enabled
-                               tool.static.autoAddToCatchall &&
-                               // Exclude already used tools
-                               ( !used || !used[ name ] )
-                       ) {
-                               names.push( name );
-                               if ( used ) {
-                                       used[ name ] = true;
+       collection = !Array.isArray( collection ) ? [ collection ] : collection;
+
+       for ( i = 0, len = collection.length; i < len; i++ ) {
+               item = collection[ i ];
+               if ( item === '*' ) {
+                       for ( name in this.registry ) {
+                               tool = this.registry[ name ];
+                               if (
+                                       // Only add tools by group name when auto-add is enabled
+                                       tool.static.autoAddToCatchall &&
+                                       // Exclude already used tools
+                                       ( !used || !used[ name ] )
+                               ) {
+                                       names.push( name );
+                                       if ( used ) {
+                                               used[ name ] = true;
+                                       }
                                }
                        }
-               }
-       } else if ( Array.isArray( collection ) ) {
-               for ( i = 0, len = collection.length; i < len; i++ ) {
-                       item = collection[ i ];
+               } else {
                        // Allow plain strings as shorthand for named tools
                        if ( typeof item === 'string' ) {
                                item = { name: item };
index 0767ab7..e83cce5 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.4
+ * OOjs UI v0.17.6
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-31T21:50:56Z
+ * Date: 2016-07-12T20:26:07Z
  */
 .oo-ui-draggableElement-handle,
 .oo-ui-draggableElement-handle.oo-ui-widget {
@@ -17,7 +17,6 @@
        cursor:         grab;
 }
 .oo-ui-draggableElement-handle:active {
-       cursor: move;
        cursor: url(images/grabbing.cur );
        cursor: -webkit-grabbing;
        cursor:    -moz-grabbing;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-       position: absolute;
-       top: 0;
-       bottom: 0;
-       right: 0;
-       left: 0;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-       display: none;
-}
 .oo-ui-toggleSwitchWidget:last-child {
        margin-right: 0;
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
        opacity: 0.5;
 }
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover,
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip {
+       border-color: #aaaaaa;
+}
 .oo-ui-toggleSwitchWidget-grip {
        top: 0.25em;
        left: 0.25em;
        background-image:         linear-gradient(to bottom, #ffffff 0, #dddddd 100%);
        -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffffff', endColorstr='#ffdddddd' )";
 }
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover,
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip {
-       border-color: #aaaaaa;
-}
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+.oo-ui-toggleSwitchWidget-glow {
+       position: absolute;
+       top: 0;
+       bottom: 0;
+       right: 0;
+       left: 0;
        border-radius: 1em;
        box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
        -webkit-transition: opacity 250ms ease;
        background-image:    -moz-linear-gradient(top, #b0d9ee 0, #eaf4fa 100%);
        background-image:         linear-gradient(to bottom, #b0d9ee 0, #eaf4fa 100%);
        -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffb0d9ee', endColorstr='#ffeaf4fa' )";
-}
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
-       opacity: 1;
-}
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
-       left: 2.25em;
-       margin-left: -2px;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
 }
 .oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-       display: block;
        opacity: 0;
 }
 .oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
        left: 0.25em;
        margin-left: 0;
 }
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
+       opacity: 1;
+}
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+       left: 2.25em;
+       margin-left: -2px;
+}
 .oo-ui-progressBarWidget {
        max-width: 50em;
        background-color: #ffffff;
 .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
        position: absolute;
 }
+.oo-ui-widget-disabled .oo-ui-selectFileWidget-info {
+       cursor: default;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
 .oo-ui-selectFileWidget .oo-ui-selectFileWidget-clearButton {
        z-index: 2;
 }
        display: block;
 }
 .oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
 .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget,
 .oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget .oo-ui-buttonElement-button,
 .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget .oo-ui-buttonElement-button {
index 82d0b5f..375a478 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.4
+ * OOjs UI v0.17.6
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-31T21:50:56Z
+ * Date: 2016-07-12T20:26:07Z
  */
 .oo-ui-draggableElement-handle,
 .oo-ui-draggableElement-handle.oo-ui-widget {
@@ -17,7 +17,6 @@
        cursor:         grab;
 }
 .oo-ui-draggableElement-handle:active {
-       cursor: move;
        cursor: url(images/grabbing.cur );
        cursor: -webkit-grabbing;
        cursor:    -moz-grabbing;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-       position: absolute;
-       top: 0;
-       bottom: 0;
-       right: 0;
-       left: 0;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-       display: none;
-}
 .oo-ui-toggleSwitchWidget:last-child {
        margin-right: 0;
 }
        content: "";
        display: block;
        position: absolute;
-       top: 0;
-       left: 0;
-       bottom: 0;
-       right: 0;
+       top: 1px;
+       left: 1px;
+       bottom: 1px;
+       right: 1px;
        border: 1px solid transparent;
        border-radius: 1em;
        z-index: 1;
+       -webkit-transition: border-color 100ms;
+          -moz-transition: border-color 100ms;
+               transition: border-color 100ms;
 }
 .oo-ui-toggleSwitchWidget-grip {
        top: 0.35em;
+       min-width: 16px;
        width: 1.2em;
+       min-height: 16px;
        height: 1.2em;
        border-radius: 1.2em;
        background-color: #555555;
 .oo-ui-toggleSwitchWidget-glow {
        display: none;
 }
-.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
-       left: 1.9em;
-       margin-left: -2px;
-}
 .oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
        left: 0.4em;
        margin-left: 0;
 }
+.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+       left: 1.9em;
+       margin-left: -2px;
+}
 .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on {
        background-color: #347bff;
        border-color: #347bff;
 .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
        position: absolute;
 }
+.oo-ui-widget-disabled .oo-ui-selectFileWidget-info {
+       cursor: default;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
 .oo-ui-selectFileWidget .oo-ui-selectFileWidget-clearButton {
        z-index: 2;
 }
        display: block;
 }
 .oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
 .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget,
 .oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget .oo-ui-buttonElement-button,
 .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget .oo-ui-buttonElement-button {
           -moz-box-sizing: border-box;
                box-sizing: border-box;
        display: block;
-       line-height: 2.3em;
+       line-height: 2.3;
        margin: 0;
        overflow: hidden;
        white-space: nowrap;
 }
 .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input {
        border: 0;
-       line-height: 1.675em;
+       line-height: 1.675;
        margin: 0 0 0 0.2em;
        padding: 0;
        font-size: inherit;
                box-sizing: border-box;
        vertical-align: middle;
        height: 1.7em;
-       line-height: 1.7em;
+       line-height: 1.7;
        background-color: #eeeeee;
        color: #555555;
        margin: 0.1em;
index cc010a6..8d93b80 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.4
+ * OOjs UI v0.17.6
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-31T21:50:52Z
+ * Date: 2016-07-12T20:26:03Z
  */
 ( function ( OO ) {
 
@@ -374,18 +374,22 @@ OO.ui.mixin.DraggableGroupElement.prototype.reorder = function ( item, newIndex
  * @param {OO.ui.mixin.DraggableElement} item Dragged item
  */
 OO.ui.mixin.DraggableGroupElement.prototype.setDragItem = function ( item ) {
-       this.dragItem = item;
-       this.$element.on( 'dragover', this.onDragOver.bind( this ) );
-       this.$element.addClass( 'oo-ui-draggableGroupElement-dragging' );
+       if ( this.dragItem !== item ) {
+               this.dragItem = item;
+               this.$element.on( 'dragover', this.onDragOver.bind( this ) );
+               this.$element.addClass( 'oo-ui-draggableGroupElement-dragging' );
+       }
 };
 
 /**
  * Unset the current dragged item
  */
 OO.ui.mixin.DraggableGroupElement.prototype.unsetDragItem = function () {
-       this.dragItem = null;
-       this.$element.off( 'dragover' );
-       this.$element.removeClass( 'oo-ui-draggableGroupElement-dragging' );
+       if ( this.dragItem ) {
+               this.dragItem = null;
+               this.$element.off( 'dragover' );
+               this.$element.removeClass( 'oo-ui-draggableGroupElement-dragging' );
+       }
 };
 
 /**
@@ -1422,10 +1426,12 @@ OO.ui.StackLayout.prototype.updateHiddenState = function ( items, selectedItem )
                for ( i = 0, len = items.length; i < len; i++ ) {
                        if ( !selectedItem || selectedItem !== items[ i ] ) {
                                items[ i ].$element.addClass( 'oo-ui-element-hidden' );
+                               items[ i ].$element.attr( 'aria-hidden', 'true' );
                        }
                }
                if ( selectedItem ) {
                        selectedItem.$element.removeClass( 'oo-ui-element-hidden' );
+                       selectedItem.$element.removeAttr( 'aria-hidden' );
                }
        }
 };
@@ -1549,6 +1555,7 @@ OO.ui.MenuLayout.prototype.toggleMenu = function ( showMenu ) {
                this.$element
                        .toggleClass( 'oo-ui-menuLayout-showMenu', this.showMenu )
                        .toggleClass( 'oo-ui-menuLayout-hideMenu', !this.showMenu );
+               this.$menu.attr( 'aria-hidden', this.showMenu ? 'false' : 'true' );
        }
 
        return this;
@@ -1770,11 +1777,13 @@ OO.ui.BookletLayout.prototype.onStackLayoutVisibleItemChange = function ( page )
 OO.ui.BookletLayout.prototype.onStackLayoutSet = function ( page ) {
        var layout = this;
        if ( !this.scrolling && page ) {
-               page.scrollElementIntoView( { complete: function () {
-                       if ( layout.autoFocus ) {
-                               layout.focus();
+               page.scrollElementIntoView( {
+                       complete: function () {
+                               if ( layout.autoFocus ) {
+                                       layout.focus();
+                               }
                        }
-               } );
+               } );
        }
 };
 
@@ -2278,11 +2287,13 @@ OO.ui.IndexLayout.prototype.onStackLayoutFocus = function ( e ) {
 OO.ui.IndexLayout.prototype.onStackLayoutSet = function ( card ) {
        var layout = this;
        if ( card ) {
-               card.scrollElementIntoView( { complete: function () {
-                       if ( layout.autoFocus ) {
-                               layout.focus();
+               card.scrollElementIntoView( {
+                       complete: function () {
+                               if ( layout.autoFocus ) {
+                                       layout.focus();
+                               }
                        }
-               } );
+               } );
        }
 };
 
@@ -3684,13 +3695,17 @@ OO.mixinClass( OO.ui.CapsuleMultiselectWidget, OO.ui.mixin.IconElement );
 
 /**
  * Construct a OO.ui.CapsuleItemWidget (or a subclass thereof) from given label and data.
+ * May return `null` if the given label and data are not valid.
  *
  * @protected
  * @param {Mixed} data Custom data of any type.
  * @param {string} label The label text.
- * @return {OO.ui.CapsuleItemWidget}
+ * @return {OO.ui.CapsuleItemWidget|null}
  */
 OO.ui.CapsuleMultiselectWidget.prototype.createItemWidget = function ( data, label ) {
+       if ( label === '' ) {
+               return null;
+       }
        return new OO.ui.CapsuleItemWidget( { data: data, label: label } );
 };
 
@@ -3740,7 +3755,9 @@ OO.ui.CapsuleMultiselectWidget.prototype.setItemsFromData = function ( datas ) {
                if ( !item ) {
                        item = widget.createItemWidget( data, label );
                }
-               widget.addItems( [ item ], i );
+               if ( item ) {
+                       widget.addItems( [ item ], i );
+               }
        } );
 
        if ( items.length ) {
@@ -3768,9 +3785,12 @@ OO.ui.CapsuleMultiselectWidget.prototype.addItemsFromData = function ( datas ) {
                if ( !widget.getItemFromData( data ) ) {
                        item = menu.getItemFromData( data );
                        if ( item ) {
-                               items.push( widget.createItemWidget( data, item.label ) );
+                               item = widget.createItemWidget( data, item.label );
                        } else if ( widget.allowArbitrary ) {
-                               items.push( widget.createItemWidget( data, String( data ) ) );
+                               item = widget.createItemWidget( data, String( data ) );
+                       }
+                       if ( item ) {
+                               items.push( item );
                        }
                }
        } );
@@ -3789,13 +3809,15 @@ OO.ui.CapsuleMultiselectWidget.prototype.addItemsFromData = function ( datas ) {
  * @return {boolean} Whether the item was added or not
  */
 OO.ui.CapsuleMultiselectWidget.prototype.addItemFromLabel = function ( label ) {
-       var item = this.menu.getItemFromLabel( label, true );
+       var item, items;
+       item = this.menu.getItemFromLabel( label, true );
        if ( item ) {
                this.addItemsFromData( [ item.data ] );
                return true;
-       } else if ( this.allowArbitrary && this.$input.val().trim() !== '' ) {
+       } else if ( this.allowArbitrary ) {
+               items = this.getItems();
                this.addItemsFromData( [ label ] );
-               return true;
+               return !OO.compare( this.getItems(), items );
        }
        return false;
 };
index de80299..66cd523 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.4
+ * OOjs UI v0.17.6
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-31T21:50:56Z
+ * Date: 2016-07-12T20:26:07Z
  */
 .oo-ui-actionWidget.oo-ui-pendingElement-pending {
        background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
@@ -64,8 +64,7 @@
        bottom: 0;
 }
 .oo-ui-dialog-content > .oo-ui-window-foot {
-       overflow: hidden;
-       z-index: 1;
+       z-index: 3;
        bottom: 0;
 }
 .oo-ui-dialog-content > .oo-ui-window-body {
index 5aaedc1..30bf1c4 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.4
+ * OOjs UI v0.17.6
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-31T21:50:56Z
+ * Date: 2016-07-12T20:26:07Z
  */
 .oo-ui-window {
        background: transparent;
        bottom: 0;
 }
 .oo-ui-dialog-content > .oo-ui-window-foot {
-       overflow: hidden;
-       z-index: 1;
+       z-index: 3;
        bottom: 0;
 }
-.oo-ui-dialog-content > .oo-ui-window-body {
-       outline: 1px solid #aaaaaa;
-}
 .oo-ui-messageDialog-actions-horizontal {
        display: table;
        table-layout: fixed;
@@ -98,6 +94,9 @@
        display: inline;
        white-space: nowrap;
 }
+.oo-ui-messageDialog-content > .oo-ui-window-foot {
+       outline: 1px solid #aaaaaa;
+}
 .oo-ui-messageDialog-title,
 .oo-ui-messageDialog-message {
        display: block;
 }
 .oo-ui-messageDialog-title {
        font-size: 1.5em;
-       line-height: 1em;
+       line-height: 1;
        color: #000000;
 }
 .oo-ui-messageDialog-message {
        font-size: 0.9em;
-       line-height: 1.25em;
+       line-height: 1.25;
        color: #555555;
 }
 .oo-ui-messageDialog-message-verbose {
        font-size: 1.1em;
-       line-height: 1.5em;
+       line-height: 1.5;
        text-align: left;
 }
 .oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
        border-bottom-width: 0;
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget {
-       height: 3.4em;
+       min-height: 3.4em;
        margin-right: 0;
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget:last-child {
        margin-right: 0;
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
+       line-height: 3.4;
        text-align: center;
-       line-height: 3.4em;
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
        background-color: rgba(0, 0, 0, 0.05);
index 17bab01..6446302 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.4
+ * OOjs UI v0.17.6
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-31T21:50:52Z
+ * Date: 2016-07-12T20:26:03Z
  */
 ( function ( OO ) {
 
@@ -2135,10 +2135,18 @@ OO.ui.Window.prototype.initialize = function () {
  * @param {jQuery.Event} event Focus event
  */
 OO.ui.Window.prototype.onFocusTrapFocused = function ( event ) {
-       if ( this.$focusTrapBefore.is( event.target ) ) {
-               OO.ui.findFocusable( this.$content, true ).focus();
+       var backwards = this.$focusTrapBefore.is( event.target ),
+               element = OO.ui.findFocusable( this.$content, backwards );
+       if ( element ) {
+               // There's a focusable element inside the content, at the front or
+               // back depending on which focus trap we hit; select it.
+               element.focus();
        } else {
-               // this.$content is the part of the focus cycle, and is the first focusable element
+               // There's nothing focusable inside the content. As a fallback,
+               // this.$content is focusable, and focusing it will keep our focus
+               // properly trapped. It's not a *meaningful* focus, since it's just
+               // the content-div for the Window, but it's better than letting focus
+               // escape into the page.
                this.$content.focus();
        }
 };
@@ -2512,11 +2520,10 @@ OO.ui.Dialog.prototype.getSetupProcess = function ( data ) {
        return OO.ui.Dialog.parent.prototype.getSetupProcess.call( this, data )
                .next( function () {
                        var config = this.constructor.static,
-                               actions = data.actions !== undefined ? data.actions : config.actions;
+                               actions = data.actions !== undefined ? data.actions : config.actions,
+                               title = data.title !== undefined ? data.title : config.title;
 
-                       this.title.setLabel(
-                               data.title !== undefined ? data.title : this.constructor.static.title
-                       );
+                       this.title.setLabel( title ).setTitle( title );
                        this.actions.add( this.getActionWidgets( actions ) );
 
                        this.$element.on( 'keydown', this.onDialogKeyDownHandler );
@@ -3114,7 +3121,11 @@ OO.ui.ProcessDialog.prototype.initialize = function () {
                .append( this.$errors );
        this.$navigation
                .addClass( 'oo-ui-processDialog-navigation' )
-               .append( this.$safeActions, this.$location, this.$primaryActions );
+               // Note: Order of appends below is important. These are in the order
+               // we want tab to go through them. Display-order is handled entirely
+               // by CSS absolute-positioning. As such, primary actions like "done"
+               // should go first.
+               .append( this.$primaryActions, this.$location, this.$safeActions );
        this.$head.append( this.$navigation );
        this.$foot.append( this.$otherActions );
 };
index e881d7c..a9943cc 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/flag-rtl.png and b/resources/lib/oojs-ui/themes/apex/images/icons/flag-rtl.png differ
index 0f7e7ce..397a3da 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M11 6.5V5c1.4-1.5 5.2-1.2 6 0V4h1v15h-1v-7c-.8-.8-3.4-.9-5-.5V13c-1.2 1.5-4.3 1.2-5 0V6c.7.7 2.7.9 4 .5z"/>
-</svg>
+       <path d="M10.3 7.5V6c1.4-1.5 5.2-1.2 6 0V5h1v15h-1v-7c-.8-.8-3.4-.9-5-.5V14c-1.2 1.5-4.3 1.2-5 0V7c.7.7 2.7.9 4 .5z"/>
+</svg>
\ No newline at end of file
index 033adde..780cb87 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-ltr.png and b/resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-ltr.png differ
index 516a3ea..4bbd61c 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M18 2L2.03 17.97l.97 1 4-4V19h1v-5.03l2.688-2.69c.81-.02 1.645.053 2.312.22V13c1.2 1.5 4.3 1.2 5 0V6c-.493.493-1.635.725-2.72.688L19 2.968zM7 4v7.03l6.438-6.436C11.778 3.61 8.71 3.934 8 5V4z"/>
-</svg>
+       <path d="M19.9 19.6l-16-16-1.1 1.1L6 7.9V20h1v-7c.6-.6 2-.8 3.4-.7l8.4 8.4 1.1-1.1zM17 14V7c-.7.7-2.7.9-4 .5V6c-1.2-1.3-3.9-1.3-5.4-.5l8.9 9c.3-.2.4-.3.5-.5z"/>
+</svg>
\ No newline at end of file
index fca73fd..fa3696a 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-rtl.png and b/resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-rtl.png differ
index 8ed159e..5d94425 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M7 2l-1 .97 3.72 3.717C8.634 6.727 7.492 6.494 7 6v7c.7 1.2 3.8 1.5 5 0v-1.5c.667-.167 1.5-.24 2.313-.22L17 13.97V19h1v-4.03l4 4 .97-1zm7.22 2c-.952-.03-1.932.163-2.658.594L18 11.03V4h-1v1c-.4-.6-1.556-.963-2.78-1z"/>
-</svg>
+       <path d="M3.5 19.6l16-16 1.1 1.1-3.2 3.2V20h-1v-7c-.6-.6-2-.8-3.4-.7l-8.4 8.4-1.1-1.1zM6.3 14V7c.7.7 2.7.9 4 .5V6c1.2-1.3 3.9-1.3 5.4-.5l-8.9 9c-.3-.2-.4-.3-.5-.5z"/>
+</svg>
\ No newline at end of file
index e0b8859..159bdb9 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flag-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flag-rtl-invert.png differ
index 3946c4a..dbc78c6 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
-    <path d="M11 6.5V5c1.4-1.5 5.2-1.2 6 0V4h1v15h-1v-7c-.8-.8-3.4-.9-5-.5V13c-1.2 1.5-4.3 1.2-5 0V6c.7.7 2.7.9 4 .5z"/>
-</svg>
+       <path d="M10.3 7.5V6c1.4-1.5 5.2-1.2 6 0V5h1v15h-1v-7c-.8-.8-3.4-.9-5-.5V14c-1.2 1.5-4.3 1.2-5 0V7c.7.7 2.7.9 4 .5z"/>
+</svg>
\ No newline at end of file
index e881d7c..a9943cc 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flag-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flag-rtl.png differ
index 0f7e7ce..397a3da 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M11 6.5V5c1.4-1.5 5.2-1.2 6 0V4h1v15h-1v-7c-.8-.8-3.4-.9-5-.5V13c-1.2 1.5-4.3 1.2-5 0V6c.7.7 2.7.9 4 .5z"/>
-</svg>
+       <path d="M10.3 7.5V6c1.4-1.5 5.2-1.2 6 0V5h1v15h-1v-7c-.8-.8-3.4-.9-5-.5V14c-1.2 1.5-4.3 1.2-5 0V7c.7.7 2.7.9 4 .5z"/>
+</svg>
\ No newline at end of file
index 4985911..8338017 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-invert.png differ
index 0d074de..0614672 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
-    <path d="M18 2L2.03 17.97l.97 1 4-4V19h1v-5.03l2.688-2.69c.81-.02 1.645.053 2.312.22V13c1.2 1.5 4.3 1.2 5 0V6c-.493.493-1.635.725-2.72.688L19 2.968zM7 4v7.03l6.438-6.436C11.778 3.61 8.71 3.934 8 5V4z"/>
-</svg>
+       <path d="M19.9 19.6l-16-16-1.1 1.1L6 7.9V20h1v-7c.6-.6 2-.8 3.4-.7l8.4 8.4 1.1-1.1zM17 14V7c-.7.7-2.7.9-4 .5V6c-1.2-1.3-3.9-1.3-5.4-.5l8.9 9c.3-.2.4-.3.5-.5z"/>
+</svg>
\ No newline at end of file
index 033adde..780cb87 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr.png differ
index 516a3ea..4bbd61c 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M18 2L2.03 17.97l.97 1 4-4V19h1v-5.03l2.688-2.69c.81-.02 1.645.053 2.312.22V13c1.2 1.5 4.3 1.2 5 0V6c-.493.493-1.635.725-2.72.688L19 2.968zM7 4v7.03l6.438-6.436C11.778 3.61 8.71 3.934 8 5V4z"/>
-</svg>
+       <path d="M19.9 19.6l-16-16-1.1 1.1L6 7.9V20h1v-7c.6-.6 2-.8 3.4-.7l8.4 8.4 1.1-1.1zM17 14V7c-.7.7-2.7.9-4 .5V6c-1.2-1.3-3.9-1.3-5.4-.5l8.9 9c.3-.2.4-.3.5-.5z"/>
+</svg>
\ No newline at end of file
index 4e1a6d1..4f9c3ad 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-invert.png differ
index 0653df3..66a0c05 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
-    <path d="M7 2l-1 .97 3.72 3.717C8.634 6.727 7.492 6.494 7 6v7c.7 1.2 3.8 1.5 5 0v-1.5c.667-.167 1.5-.24 2.313-.22L17 13.97V19h1v-4.03l4 4 .97-1zm7.22 2c-.952-.03-1.932.163-2.658.594L18 11.03V4h-1v1c-.4-.6-1.556-.963-2.78-1z"/>
-</svg>
+       <path d="M3.5 19.6l16-16 1.1 1.1-3.2 3.2V20h-1v-7c-.6-.6-2-.8-3.4-.7l-8.4 8.4-1.1-1.1zM6.3 14V7c.7.7 2.7.9 4 .5V6c1.2-1.3 3.9-1.3 5.4-.5l-8.9 9c-.3-.2-.4-.3-.5-.5z"/>
+</svg>
\ No newline at end of file
index fca73fd..fa3696a 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl.png differ
index 8ed159e..5d94425 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M7 2l-1 .97 3.72 3.717C8.634 6.727 7.492 6.494 7 6v7c.7 1.2 3.8 1.5 5 0v-1.5c.667-.167 1.5-.24 2.313-.22L17 13.97V19h1v-4.03l4 4 .97-1zm7.22 2c-.952-.03-1.932.163-2.658.594L18 11.03V4h-1v1c-.4-.6-1.556-.963-2.78-1z"/>
-</svg>
+       <path d="M3.5 19.6l16-16 1.1 1.1-3.2 3.2V20h-1v-7c-.6-.6-2-.8-3.4-.7l-8.4 8.4-1.1-1.1zM6.3 14V7c.7.7 2.7.9 4 .5V6c1.2-1.3 3.9-1.3 5.4-.5l-8.9 9c-.3-.2-.4-.3-.5-.5z"/>
+</svg>
\ No newline at end of file
index 4c74c3e..9cd13be 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/stop-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/stop-invert.png differ
index 8b49792..2d060f3 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
-    <path d="M12 6c3.9 0 7 3.1 7 7s-3.1 7-7 7-7-3.1-7-7 3.1-7 7-7m0-1c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm-3 5h6v6H9z"/>
+       <path d="M12 5c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm3 11.1H9v-6h6v6z"/>
 </svg>
index 12a1912..77dd75f 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/stop.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/stop.png differ
index aa25e3d..4631b85 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M12 6c3.9 0 7 3.1 7 7s-3.1 7-7 7-7-3.1-7-7 3.1-7 7-7m0-1c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm-3 5h6v6H9z"/>
+       <path d="M12 5c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm3 11.1H9v-6h6v6z"/>
 </svg>
diff --git a/resources/lib/phpjs-sha1/sha1.js b/resources/lib/phpjs-sha1/sha1.js
deleted file mode 100644 (file)
index 93c533d..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-function sha1(str) {
-  //  discuss at: http://phpjs.org/functions/sha1/
-  // original by: Webtoolkit.info (http://www.webtoolkit.info/)
-  // improved by: Michael White (http://getsprink.com)
-  // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
-  //    input by: Brett Zamir (http://brett-zamir.me)
-  //   example 1: sha1('Kevin van Zonneveld');
-  //   returns 1: '54916d2e62f65b3afa6e192e6a601cdbe5cb5897'
-
-  var rotate_left = function (n, s) {
-    var t4 = (n << s) | (n >>> (32 - s));
-    return t4;
-  };
-
-  /*var lsb_hex = function (val) {
-   // Not in use; needed?
-    var str="";
-    var i;
-    var vh;
-    var vl;
-
-    for ( i=0; i<=6; i+=2 ) {
-      vh = (val>>>(i*4+4))&0x0f;
-      vl = (val>>>(i*4))&0x0f;
-      str += vh.toString(16) + vl.toString(16);
-    }
-    return str;
-  };*/
-
-  var cvt_hex = function (val) {
-    var str = '';
-    var i;
-    var v;
-
-    for (i = 7; i >= 0; i--) {
-      v = (val >>> (i * 4)) & 0x0f;
-      str += v.toString(16);
-    }
-    return str;
-  };
-
-  var blockstart;
-  var i, j;
-  var W = new Array(80);
-  var H0 = 0x67452301;
-  var H1 = 0xEFCDAB89;
-  var H2 = 0x98BADCFE;
-  var H3 = 0x10325476;
-  var H4 = 0xC3D2E1F0;
-  var A, B, C, D, E;
-  var temp;
-
-  // utf8_encode
-  str = unescape(encodeURIComponent(str));
-  var str_len = str.length;
-
-  var word_array = [];
-  for (i = 0; i < str_len - 3; i += 4) {
-    j = str.charCodeAt(i) << 24 | str.charCodeAt(i + 1) << 16 | str.charCodeAt(i + 2) << 8 | str.charCodeAt(i + 3);
-    word_array.push(j);
-  }
-
-  switch (str_len % 4) {
-  case 0:
-    i = 0x080000000;
-    break;
-  case 1:
-    i = str.charCodeAt(str_len - 1) << 24 | 0x0800000;
-    break;
-  case 2:
-    i = str.charCodeAt(str_len - 2) << 24 | str.charCodeAt(str_len - 1) << 16 | 0x08000;
-    break;
-  case 3:
-    i = str.charCodeAt(str_len - 3) << 24 | str.charCodeAt(str_len - 2) << 16 | str.charCodeAt(str_len - 1) <<
-      8 | 0x80;
-    break;
-  }
-
-  word_array.push(i);
-
-  while ((word_array.length % 16) != 14) {
-    word_array.push(0);
-  }
-
-  word_array.push(str_len >>> 29);
-  word_array.push((str_len << 3) & 0x0ffffffff);
-
-  for (blockstart = 0; blockstart < word_array.length; blockstart += 16) {
-    for (i = 0; i < 16; i++) {
-      W[i] = word_array[blockstart + i];
-    }
-    for (i = 16; i <= 79; i++) {
-      W[i] = rotate_left(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);
-    }
-
-    A = H0;
-    B = H1;
-    C = H2;
-    D = H3;
-    E = H4;
-
-    for (i = 0; i <= 19; i++) {
-      temp = (rotate_left(A, 5) + ((B & C) | (~B & D)) + E + W[i] + 0x5A827999) & 0x0ffffffff;
-      E = D;
-      D = C;
-      C = rotate_left(B, 30);
-      B = A;
-      A = temp;
-    }
-
-    for (i = 20; i <= 39; i++) {
-      temp = (rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff;
-      E = D;
-      D = C;
-      C = rotate_left(B, 30);
-      B = A;
-      A = temp;
-    }
-
-    for (i = 40; i <= 59; i++) {
-      temp = (rotate_left(A, 5) + ((B & C) | (B & D) | (C & D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff;
-      E = D;
-      D = C;
-      C = rotate_left(B, 30);
-      B = A;
-      A = temp;
-    }
-
-    for (i = 60; i <= 79; i++) {
-      temp = (rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff;
-      E = D;
-      D = C;
-      C = rotate_left(B, 30);
-      B = A;
-      A = temp;
-    }
-
-    H0 = (H0 + A) & 0x0ffffffff;
-    H1 = (H1 + B) & 0x0ffffffff;
-    H2 = (H2 + C) & 0x0ffffffff;
-    H3 = (H3 + D) & 0x0ffffffff;
-    H4 = (H4 + E) & 0x0ffffffff;
-  }
-
-  temp = cvt_hex(H0) + cvt_hex(H1) + cvt_hex(H2) + cvt_hex(H3) + cvt_hex(H4);
-  return temp.toLowerCase();
-}
index 519e39b..6ff2e01 100644 (file)
@@ -113,18 +113,19 @@ function getAccessKeyLabel( element ) {
  * @param {HTMLElement} titleElement Element with the title to update (may be the same as `element`)
  */
 function updateTooltipOnElement( element, titleElement ) {
-       var array = ( mw.msg( 'word-separator' ) + mw.msg( 'brackets' ) ).split( '$1' ),
-               regexp = new RegExp( $.map( array, mw.RegExp.escape ).join( '.*?' ) + '$' ),
-               oldTitle = titleElement.title,
-               rawTitle = oldTitle.replace( regexp, '' ),
-               newTitle = rawTitle,
-               accessKeyLabel = getAccessKeyLabel( element );
-
-       // don't add a title if the element didn't have one before
+       var oldTitle, parts, regexp, newTitle, accessKeyLabel;
+
+       oldTitle = titleElement.title;
        if ( !oldTitle ) {
+               // don't add a title if the element didn't have one before
                return;
        }
 
+       parts = ( mw.msg( 'word-separator' ) + mw.msg( 'brackets' ) ).split( '$1' );
+       regexp = new RegExp( $.map( parts, mw.RegExp.escape ).join( '.*?' ) + '$' );
+       newTitle = oldTitle.replace( regexp, '' );
+       accessKeyLabel = getAccessKeyLabel( element );
+
        if ( accessKeyLabel ) {
                // Should be build the same as in Linker::titleAttrib
                newTitle += mw.msg( 'word-separator' ) + mw.msg( 'brackets', accessKeyLabel );
index bdb5ce8..501e898 100644 (file)
                                // If this is not a custom case, do the default: wrap the
                                // contents and add the toggle link. Different elements are
                                // treated differently.
+
                                if ( $collapsible.is( 'table' ) ) {
 
                                        // If the table has a caption, collapse to the caption
                                                }
                                        }
 
+                               } else if ( $collapsible.parent().is( 'li' ) &&
+                                       $collapsible.parent().children( '.mw-collapsible' ).size() === 1
+                               ) {
+                                       // special case of one collapsible in <li> tag
+                                       $toggleLink = buildDefaultToggleLink();
+                                       $collapsible.before( $toggleLink );
                                } else if ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) {
                                        // The toggle-link will be in the first list-item
                                        $firstItem = $collapsible.find( 'li:first' );
index 38e5a1f..884ecb6 100644 (file)
                                        } else if ( selected.is( '.suggestions-special' ) ) {
                                                if ( typeof context.config.special.select === 'function' ) {
                                                        // Allow the callback to decide whether to prevent default or not
-                                                       if ( context.config.special.select.call( selected, context.data.$textbox ) === true ) {
+                                                       if ( context.config.special.select.call( selected, context.data.$textbox, 'keyboard' ) === true ) {
                                                                preventDefault = false;
                                                        }
                                                }
                                        } else {
                                                if ( typeof context.config.result.select === 'function' ) {
                                                        // Allow the callback to decide whether to prevent default or not
-                                                       if ( context.config.result.select.call( selected, context.data.$textbox ) === true ) {
+                                                       if ( context.config.result.select.call( selected, context.data.$textbox, 'keyboard' ) === true ) {
                                                                preventDefault = false;
                                                        }
                                                }
                                                                if ( $result.get( 0 ) !== $other.get( 0 ) ) {
                                                                        return;
                                                                }
+                                                               $.suggestions.highlight( context, $result, true );
+                                                               if ( typeof context.config.result.select === 'function' ) {
+                                                                       context.config.result.select.call( $result, context.data.$textbox, 'mouse' );
+                                                               }
                                                                // Don't interfere with special clicks (e.g. to open in new tab)
                                                                if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
-                                                                       $.suggestions.highlight( context, $result, true );
-                                                                       if ( typeof context.config.result.select === 'function' ) {
-                                                                               context.config.result.select.call( $result, context.data.$textbox );
-                                                                       }
                                                                        // This will hide the link we're just clicking on, which causes problems
                                                                        // when done synchronously in at least Firefox 3.6 (bug 62858).
                                                                        setTimeout( function () {
                                                                if ( $special.get( 0 ) !== $other.get( 0 ) ) {
                                                                        return;
                                                                }
+                                                               if ( typeof context.config.special.select === 'function' ) {
+                                                                       context.config.special.select.call( $special, context.data.$textbox, 'mouse' );
+                                                               }
                                                                // Don't interfere with special clicks (e.g. to open in new tab)
                                                                if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
-                                                                       if ( typeof context.config.special.select === 'function' ) {
-                                                                               context.config.special.select.call( $special, context.data.$textbox );
-                                                                       }
                                                                        // This will hide the link we're just clicking on, which causes problems
                                                                        // when done synchronously in at least Firefox 3.6 (bug 62858).
                                                                        setTimeout( function () {
                                                $.suggestions.keypress( e, context, context.data.keypressed );
                                        } )
                                        .keyup( function ( e ) {
-                                               // Some browsers won't throw keypress() for arrow keys. If we got a keydown and a keyup without a
-                                               // keypress in between, solve it
-                                               if ( context.data.keypressedCount === 0 ) {
+                                               // The keypress event is fired when a key is pressed down and that key normally
+                                               // produces a character value. We also want to handle some keys that don't
+                                               // produce a character value so we also attach to the keydown/keyup events.
+                                               // List of codes sourced from
+                                               // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
+                                               var allowed = [
+                                                       40, // up arrow
+                                                       38, // down arrow
+                                                       27, // escape
+                                                       13, // enter
+                                                       46, // delete
+                                                       8   // backspace
+                                               ];
+                                               if ( context.data.keypressedCount === 0
+                                                       && e.which === context.data.keypressed
+                                                       && $.inArray( e.which, allowed ) !== -1
+                                               ) {
                                                        $.suggestions.keypress( e, context, context.data.keypressed );
                                                }
                                        } )
index 20bfa0e..07c7d76 100644 (file)
@@ -2,65 +2,91 @@
  * Scripts for pre-emptive edit preparing on action=edit
  */
 ( function ( mw, $ ) {
+       if ( !mw.config.get( 'wgAjaxEditStash' ) ) {
+               return;
+       }
+
        $( function () {
                var idleTimeout = 3000,
                        api = new mw.Api(),
                        pending = null,
                        $form = $( '#editform' ),
                        $text = $form.find( '#wpTextbox1' ),
-                       data = {},
+                       $summary = $form.find( '#wpSummary' ),
+                       section = $form.find( '[name=wpSection]' ).val(),
+                       model = $form.find( '[name=model]' ).val(),
+                       format = $form.find( '[name=format]' ).val(),
+                       revId = $form.find( '[name=parentRevId]' ).val(),
+                       lastText = $text.textSelection( 'getContents' ),
                        timer = null;
 
-               function stashEdit( token ) {
-                       data = $form.serializeObject();
+               // Send a request to stash the edit to the API.
+               // If a request is in progress, abort it since its payload is stale and the API
+               // may limit concurrent stash parses.
+               function stashEdit() {
+                       if ( pending ) {
+                               pending.abort();
+                       }
 
-                       pending = api.post( {
-                               action: 'stashedit',
-                               token: token,
-                               title: mw.config.get( 'wgPageName' ),
-                               section: data.wpSection,
-                               sectiontitle: '',
-                               text: data.wpTextbox1,
-                               contentmodel: data.model,
-                               contentformat: data.format,
-                               baserevid: data.parentRevId
+                       api.getToken( 'csrf' ).then( function ( token ) {
+                               lastText = $text.textSelection( 'getContents' );
+
+                               pending = api.post( {
+                                       action: 'stashedit',
+                                       token: token,
+                                       title: mw.config.get( 'wgPageName' ),
+                                       section: section,
+                                       sectiontitle: '',
+                                       text: lastText,
+                                       summary: $summary.textSelection( 'getContents' ),
+                                       contentmodel: model,
+                                       contentformat: format,
+                                       baserevid: revId
+                               } );
                        } );
                }
 
-               /* Has the edit body text changed since the last stashEdit() call? */
+               // Check if edit body text changed since the last stashEdit() call or if no edit
+               // stash calls have yet been made
                function isChanged() {
-                       // Normalize line endings to CRLF, like $.fn.serializeObject does.
-                       var newText = $text.val().replace( /\r?\n/g, '\r\n' );
-                       return newText !== data.wpTextbox1;
+                       var newText = $text.textSelection( 'getContents' );
+                       return newText !== lastText;
                }
 
-               function onEditChanged() {
+               function onEditorIdle() {
                        if ( !isChanged() ) {
                                return;
                        }
 
-                       // If a request is in progress, abort it; its payload is stale.
-                       if ( pending ) {
-                               pending.abort();
-                       }
-
-                       api.getToken( 'csrf' ).then( stashEdit );
+                       stashEdit();
                }
 
-               function onKeyPress( e ) {
+               function onTextKeyUp( e ) {
                        // Ignore keystrokes that don't modify text, like cursor movements.
-                       // See <http://stackoverflow.com/q/2284844>.
-                       if ( e.which === 0 ) {
+                       // See <http://www.javascripter.net/faq/keycodes.htm> and
+                       // <http://www.quirksmode.org/js/keys.html>. We don't have to be exhaustive,
+                       // because the cost of misfiring is low.
+                       // * Key code 33-40: Page Up/Down, End, Home, arrow keys.
+                       // * Key code 16-18: Shift, Ctrl, Alt.
+                       if ( ( e.which >= 33 && e.which <= 40 ) || ( e.which >= 16 && e.which <= 18 ) ) {
                                return;
                        }
 
                        clearTimeout( timer );
+                       timer = setTimeout( onEditorIdle, idleTimeout );
+               }
 
-                       if ( pending ) {
-                               pending.abort();
+               function onFormLoaded() {
+                       if (
+                               // Reverts may involve use (undo) links; stash as they review the diff.
+                               // Since the form has a pre-filled summary, stash the edit immediately.
+                               mw.util.getParamValue( 'undo' ) !== null
+                               // Pressing "show changes" and "preview" also signify that the user will
+                               // probably save the page soon
+                               || $.inArray( $form.find( '#mw-edit-mode' ).val(), [ 'preview', 'diff' ] ) > -1
+                       ) {
+                               stashEdit();
                        }
-
-                       timer = setTimeout( onEditChanged, idleTimeout );
                }
 
                // We don't attempt to stash new section edits because in such cases
@@ -70,7 +96,9 @@
                        return;
                }
 
-               $text.on( { change: onEditChanged, keypress: onKeyPress } );
+               $text.on( { change: onEditorIdle, keyup: onTextKeyUp } );
+               $summary.on( { focus: onEditorIdle } );
+               onFormLoaded();
 
        } );
 }( mediaWiki, jQuery ) );
index 95e92ae..fd5dbc9 100644 (file)
@@ -1,8 +1,6 @@
+/* Styles for the JavaScript enhancements of the history page */
+
 #pagehistory li.before input[name="oldid"],
 #pagehistory li.after input[name="diff"] {
        visibility: hidden;
 }
-
-.updatedmarker {
-       background-color: #b7f430;
-}
index 9db6777..327c9c8 100644 (file)
@@ -93,3 +93,28 @@ td.diff-addedline .diffchange {
 td.diff-deletedline .diffchange {
        background: #feeec8;
 }
+
+/* Correct user & content directionality when viewing a diff */
+.diff-currentversion-title,
+.diff {
+       direction: ltr;
+       unicode-bidi: embed;
+}
+
+/* @noflip */ .diff-contentalign-right td {
+       direction: rtl;
+       unicode-bidi: embed;
+}
+
+/* @noflip */ .diff-contentalign-left td {
+       direction: ltr;
+       unicode-bidi: embed;
+}
+
+.diff-multi,
+.diff-otitle,
+.diff-ntitle,
+.diff-lineno {
+       direction: ltr !important;
+       unicode-bidi: embed;
+}
diff --git a/resources/src/mediawiki.action/mediawiki.action.history.styles.css b/resources/src/mediawiki.action/mediawiki.action.history.styles.css
new file mode 100644 (file)
index 0000000..5b08f95
--- /dev/null
@@ -0,0 +1,23 @@
+/* Basic styles for the history page */
+
+#pagehistory .history-user {
+       margin-left: 0.4em;
+       margin-right: 0.2em;
+}
+
+#pagehistory li {
+       border: 1px solid #fff;
+}
+
+#pagehistory li.selected {
+       background-color: #f9f9f9;
+       border: 1px dashed #aaa;
+}
+
+.mw-history-revisionactions {
+       float: right;
+}
+
+.updatedmarker {
+       background-color: #b7f430;
+}
index 99982e3..d5520a1 100644 (file)
@@ -2,32 +2,32 @@
  * File description page
  */
 
-div.mw-filepage-resolutioninfo {
+.mw-filepage-resolutioninfo {
        font-size: smaller;
 }
 
 /*
  * File histories
  */
-h2#filehistory {
+#filehistory {
        clear: both;
 }
 
-table.filehistory th,
-table.filehistory td {
+.filehistory th,
+.filehistory td {
        vertical-align: top;
 }
 
-table.filehistory th {
+.filehistory th {
        text-align: left;
 }
 
-table.filehistory td.mw-imagepage-filesize,
-table.filehistory th.mw-imagepage-filesize {
+.filehistory td.mw-imagepage-filesize,
+.filehistory th.mw-imagepage-filesize {
        white-space: nowrap;
 }
 
-table.filehistory td.filehistory-selected {
+.filehistory td.filehistory-selected {
        font-weight: bold;
 }
 
@@ -44,7 +44,7 @@ table.filehistory td.filehistory-selected {
 /*
  * filetoc
  */
-ul#filetoc {
+#filetoc {
        text-align: center;
        border: 1px solid #aaa;
        background-color: #f9f9f9;
@@ -68,3 +68,54 @@ ul#filetoc {
 #shared-image-conflict {
        font-style: italic;
 }
+
+/*
+ * Classes for Exif data display
+ */
+.mw_metadata {
+       font-size: 0.8em;
+       margin-left: 0.5em;
+       margin-bottom: 0.5em;
+       width: 400px;
+}
+
+.mw_metadata caption {
+       font-weight: bold;
+}
+
+.mw_metadata th {
+       font-weight: normal;
+       text-align: center;
+}
+
+.mw_metadata td {
+       padding: 0.1em;
+}
+
+.mw_metadata {
+       border: none;
+       border-collapse: collapse;
+}
+
+.mw_metadata td,
+.mw_metadata th {
+       border: 1px solid #aaa;
+       padding-left: 5px;
+       padding-right: 5px;
+}
+
+.mw_metadata th {
+       background-color: #f9f9f9;
+}
+
+.mw_metadata td {
+       background-color: #fcfcfc;
+}
+
+.mw_metadata ul.metadata-langlist {
+       list-style-type: none;
+       list-style-image: none;
+       padding-right: 5px;
+       padding-left: 5px;
+       margin: 0;
+}
index 4ff403a..fc16377 100644 (file)
@@ -91,30 +91,6 @@ abbr[title],
        }
 }
 
-/* Colored watchlist and recent changes numbers */
-.mw-plusminus-pos {
-       color: #006400; /* dark green */
-}
-
-.mw-plusminus-neg {
-       color: #8b0000; /* dark red */
-}
-
-.mw-plusminus-null {
-       color: #aaa; /* gray */
-}
-
-/*
- * Bidi-isolate these numbers.
- * See https://phabricator.wikimedia.org/T93484
- */
-.mw-plusminus-pos,
-.mw-plusminus-neg,
-.mw-plusminus-null {
-       unicode-bidi: -moz-isolate;
-       unicode-bidi: isolate;
-}
-
 /* Comment portions of RC entries */
 span.comment {
        font-style: italic;
@@ -284,31 +260,11 @@ p.mw-delete-editreasons {
        text-align: right;
 }
 
-/* Page history styling */
-
 /* The auto-generated edit comments */
 .autocomment {
        color: #808080;
 }
 
-#pagehistory .history-user {
-       margin-left: 0.4em;
-       margin-right: 0.2em;
-}
-
-#pagehistory li {
-       border: 1px solid #fff;
-}
-
-#pagehistory li.selected {
-       background-color: #f9f9f9;
-       border: 1px dashed #aaa;
-}
-
-.mw-history-revisionactions {
-       float: right;
-}
-
 /** Generic minor/bot/newpage styling (recent changes) */
 .newpage,
 .minoredit,
@@ -520,55 +476,6 @@ table.wikitable > caption {
        background-color: #eef;
 }
 
-/* Classes for Exif data display */
-table.mw_metadata {
-       font-size: 0.8em;
-       margin-left: 0.5em;
-       margin-bottom: 0.5em;
-       width: 400px;
-}
-
-table.mw_metadata caption {
-       font-weight: bold;
-}
-
-table.mw_metadata th {
-       font-weight: normal;
-       text-align: center;
-}
-
-table.mw_metadata td {
-       padding: 0.1em;
-}
-
-table.mw_metadata {
-       border: none;
-       border-collapse: collapse;
-}
-
-table.mw_metadata td,
-table.mw_metadata th {
-       border: 1px solid #aaa;
-       padding-left: 5px;
-       padding-right: 5px;
-}
-
-table.mw_metadata th {
-       background-color: #f9f9f9;
-}
-
-table.mw_metadata td {
-       background-color: #fcfcfc;
-}
-
-table.mw_metadata ul.metadata-langlist {
-       list-style-type: none;
-       list-style-image: none;
-       padding-right: 5px;
-       padding-left: 5px;
-       margin: 0;
-}
-
 /* Correct directionality when page dir is different from site/user dir */
 .mw-content-ltr ul,
 .mw-content-rtl .mw-content-ltr ul {
@@ -793,31 +700,6 @@ ol:lang(or) li {
        unicode-bidi: embed;
 }
 
-/* Correct user & content directionality when viewing a diff */
-.diff-currentversion-title,
-.diff {
-       direction: ltr;
-       unicode-bidi: embed;
-}
-
-/* @noflip */ .diff-contentalign-right td {
-       direction: rtl;
-       unicode-bidi: embed;
-}
-
-/* @noflip */ .diff-contentalign-left td {
-       direction: ltr;
-       unicode-bidi: embed;
-}
-
-.diff-multi,
-.diff-otitle,
-.diff-ntitle,
-.diff-lineno {
-       direction: ltr !important;
-       unicode-bidi: embed;
-}
-
 #mw-revision-info,
 #mw-revision-info-current,
 #mw-revision-nav {
index 12825de..f29897c 100644 (file)
@@ -15,7 +15,6 @@
        cursor: pointer;
        vertical-align: bottom;
        line-height: normal;
-
        font-weight: normal;
 
        & > input[type="checkbox"],
        background: @bgColor;
 
        &:hover {
-               // The inner bottom bevel should match the active background color.
                background-color: @highlightColor;
        }
 
        &:focus {
                border-color: @colorWhite;
-               box-shadow: 0 0 0 1px @highlightColor;
+               box-shadow: inset 0 0 0 1px @bgColor, inset 0 0 0 2px @colorWhite;
+               outline-width: 0;
 
-               outline: none;
-               // remove outline in Firefox
+               // Remove the inner border and padding in Firefox.
                &::-moz-focus-inner {
                        border-color: transparent;
+                       padding: 0;
                }
        }
 
        &:active,
        &.is-on,
        &.mw-ui-checked {
-               background: @activeColor;
+               background-color: @activeColor;
                box-shadow: none;
        }
 }
@@ -95,7 +94,7 @@
        text-shadow: 0 1px rgba(0, 0, 0, .1);
 
        &:disabled {
-               background: @colorGray13;
+               background-color: @colorGray13;
                border-color: @colorGray13;
 
                // make sure disabled buttons don't have hover and active states
 
        &:hover,
        &:focus {
-               background: transparent;
+               background-color: transparent;
                color: @textColor;
        }
 
index 85bf9f6..563db00 100644 (file)
@@ -253,3 +253,9 @@ div.tright {
 div.tleft {
        margin: .5em 1.4em 1.3em 0;
 }
+
+/* Hide elements that are marked as "empty" according to legacy Tidy rules
+ */
+.mw-empty-elt, .mw-empty-li {
+       display: none;
+}
diff --git a/resources/src/mediawiki.skinning/images/external link icons.svg b/resources/src/mediawiki.skinning/images/external link icons.svg
deleted file mode 100644 (file)
index 6a67993..0000000
+++ /dev/null
@@ -1,697 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="13"
-   height="110"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.48.5 r10040"
-   sodipodi:docname="external link icons.svg">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="15.999999"
-     inkscape:cx="10.40536"
-     inkscape:cy="65.686256"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer5"
-     showgrid="true"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0"
-     inkscape:window-width="1283"
-     inkscape:window-height="711"
-     inkscape:window-x="1790"
-     inkscape:window-y="-6"
-     inkscape:window-maximized="0">
-    <inkscape:grid
-       type="xygrid"
-       id="grid3246"
-       empspacing="4"
-       visible="true"
-       enabled="true"
-       snapvisiblegridlinesonly="true"
-       originx="0px"
-       originy="-27.999997px" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:groupmode="layer"
-     id="layer2"
-     inkscape:label="base"
-     style="display:none"
-     transform="translate(-505,-869.36218)">
-    <rect
-       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       id="rect4646"
-       width="13"
-       height="12.999996"
-       x="505"
-       y="885.36218" />
-    <rect
-       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       id="rect4646-4"
-       width="13"
-       height="12.999998"
-       x="505"
-       y="901.36218" />
-    <rect
-       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       id="rect4646-4-6"
-       width="13"
-       height="12.999996"
-       x="505"
-       y="917.36218"
-       inkscape:export-filename="/home/rahah/elvidishu/steak/unreal/dev/skins/external link icons/mail.png"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90" />
-    <rect
-       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       id="rect4646-4-6-9"
-       width="13"
-       height="12.999996"
-       x="505"
-       y="933.36218" />
-    <rect
-       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       id="rect4646-4-6-6"
-       width="13"
-       height="12.999996"
-       x="505"
-       y="950.36218" />
-    <rect
-       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       id="rect4646-4-6-2"
-       width="13"
-       height="12.999998"
-       x="505"
-       y="966.36218" />
-    <rect
-       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
-       id="rect4646-44"
-       width="13"
-       height="12.999996"
-       x="505"
-       y="869.36218" />
-  </g>
-  <g
-     inkscape:label="sketch 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-505,-869.36218)"
-     style="display:none"
-     sodipodi:insensitive="true">
-    <path
-       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 507,870.36218 0,5 3,0 4,4 0,-13 -4,4 z"
-       id="path3194"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccc" />
-    <path
-       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 517,869.36218 c 1,2 1,5 0,7"
-       id="path3196"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 520,867.36218 c 2,2 2,9 0,11"
-       id="path3198"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 507.93861,989.90562 0,15.99988 13,0 0,-10.99988 -5,-5 z"
-       id="path3200"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccc" />
-    <path
-       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 506.93861,918.90546 0,11.5 15,0 0,-11.5 z"
-       id="path3202"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 506.93861,918.90546 7.5,6 7.5,-6"
-       id="path3204"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccc" />
-    <path
-       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 507.93861,890.90546 3,0"
-       id="path3212"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 507.93861,893.90546 3,0"
-       id="path3214"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 507.93861,899.90546 3,0"
-       id="path3218"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 507.93861,902.90546 3,0"
-       id="path3220"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 517.93861,890.90546 3,0"
-       id="path3222"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 507.93861,896.90546 13,0"
-       id="path3224"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 517.93861,893.90546 3,0"
-       id="path3226"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 517.93861,899.90546 3,0"
-       id="path3230"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 517.93861,902.90546 3,0"
-       id="path3232"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 510.93861,890.90546 0,12 7,0 0,-12 z"
-       id="path3206"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 507.93861,888.90546 0,16"
-       id="path3208"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 520.93861,888.90546 0,16"
-       id="path3210"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 515.93861,989.90562 0,5 5,0"
-       id="path3234"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccc" />
-    <path
-       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 513.93861,969.40546 c -2,0 -5,0 -7,0 l 0,10.99995 11,5e-5 c 0,-2.33332 0,-4.66668 0,-7"
-       id="path3236"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none"
-       d="m 513.93861,976.40546 5,-4 3,3 0,-10 -10,0 3,3 -4,5"
-       id="path3242"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccc" />
-    <path
-       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 506.93861,940.40546 15,0 0,10 -6,0 -6,4 1,-4 -4,0 z"
-       id="path3244"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccc" />
-    <path
-       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 509.93861,972.40546 c 2,1 4,3 5,5"
-       id="path4641"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-  </g>
-  <g
-     inkscape:groupmode="layer"
-     id="layer4"
-     inkscape:label="sketch 2"
-     style="display:none"
-     transform="translate(0,-6.0000106)">
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 8.4921988,1.0623917 -4.0641234,4.064123 -3.2512987,0 0,5.6897733 3.2512987,0 4.0641234,4.064124 z m -1.6256494,4.064124 0,5.6897733 -1.6256493,-1.6256493 -2.438474,-1e-6 0,-2.438474 2.438474,1e-6 z"
-       id="path4755-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="m 9.3050235,5.1265157 c 0,-0.812824 0.8128245,-1.625649 1.6256495,-0.812824 0,0 0.812825,0.812824 0.812825,3.251298 0,2.4384743 -0.812825,3.2512993 -0.812825,3.2512993 -0.812825,0.812825 -1.6256495,0 -1.6256495,-0.812825 0,0 0.8128245,-0.8128243 0.8128245,-2.4384743 0,-1.625649 -0.8128245,-2.438474 -0.8128245,-2.438474 z"
-       id="path4760-1"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccsccsc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="m 11.743498,3.5008667 c 0,-0.812825 0.812824,-1.625649 1.625649,-0.812825 0,0 1.625649,1.62565 1.625649,4.876948 0,3.2512993 -1.625649,4.8769483 -1.625649,4.8769483 -0.812825,0.812825 -1.625649,0 -1.625649,-0.812824 0,0 1.625649,-1.62565 1.625649,-4.0641243 0,-2.438474 -1.625649,-4.064123 -1.625649,-4.064123 z"
-       id="path4762-8"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccsccsc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 2.8024261,23.008658 0,0.812825 10.5667209,0 0,-0.812825 z"
-       id="path4772"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 2.8024261,33.575379 10.5667209,0 0,-0.812825 -10.5667209,0 z"
-       id="path4774"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 2.8024261,25.447132 0,0.812824 2.438474,0 0,-0.812824 z m 8.1282469,0 0,0.812824 2.438474,0 0,-0.812824 z"
-       id="path4782"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 2.8024261,30.32408 0,0.812824 2.438474,0 0,-0.812824 z m 8.1282469,0 0,0.812824 2.438474,0 0,-0.812824 z"
-       id="path4778"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 2.8024261,28.698431 10.5667209,0 0,-0.812825 -10.5667209,0 z"
-       id="path4780"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="m 5.2409001,27.479194 0,1.625649 5.6897729,0 0,-1.625649 z"
-       id="path4793"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 4.4280754,23.008658 0,10.56672 7.3154226,0 0,-10.56672 z m 1.6256494,1.625649 4.0641232,0 0,7.315422 -4.0641232,0 z"
-       id="path4768"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 1.9896014,21.383009 1.6256493,0 0,13.818019 -1.6256493,0 z"
-       id="path4764"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 12.556322,21.383009 1.62565,0 0,13.818019 -1.62565,0 z"
-       id="path4766"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="m 1.9896014,44.954923 6.096185,5.689773 6.0961856,-5.689773 -0.812825,-0.812825 -1.625649,0.813196 -3.6577116,3.251298 -3.657711,-3.251298 -1.6256493,-0.813196 z"
-       id="path4800-4"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 1.1767767,43.329273 0,11.379545 13.8180193,0 0,-11.379545 z m 1.6256494,1.625649 10.5667209,0 0,8.128247 -10.5667209,0 z"
-       id="path4795-8"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 1.9896014,62.024243 -0.8128247,0.812824 0,8.128247 0.8128247,0.812825 2.438474,0 -0.8128247,3.251297 5.6897728,-3.251297 4.8769485,0 0.812824,-0.812825 0,-8.128247 -0.812824,-0.812824 z m 0.8128247,1.625649 10.5667209,0 0,6.502598 -4.0641235,0 -3.5815088,2.133664 0.9144278,-2.133664 -3.8355164,0 z"
-       id="path4802-8"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccccccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 4.4280754,82.344856 10.5667206,0 0,10.56672 -3.251298,-3.25129 -3.2512992,2.43847 -0.8128247,-0.81282 4.0641239,-3.2513 1.625649,1.62565 0,-5.68978 -5.6897729,0 1.6256494,1.62565 -3.2512987,4.06413 -0.8128247,-0.81283 2.438474,-3.2513 z"
-       id="path4807-5"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 8.4921988,85.596156 -7.3154221,0 0,10.56672 10.5667213,0 0,-7.31542 -1.62565,0.81283 0,4.87694 -7.3154219,0 0,-7.31542 4.876948,0 z"
-       id="path4809-7"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="m 8.4921988,103.47831 0,4.87694 4.8769482,0 0,-1.62565 -3.251299,0 0,-3.25129 z"
-       id="path4818-67"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 1.9896014,102.66548 0,13.81802 12.1923706,0 0,-10.13799 -3.657711,-3.68003 z m 1.6256493,1.62565 6.5025973,0 2.438474,2.43847 0,8.12825 -8.9410713,0 z"
-       id="path4813-2"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="m 3.6152507,88.847456 c 0,-0.81282 0.8128247,-0.81282 0.8128247,-0.81282 2.438474,0.81282 4.0641234,2.43847 4.8769481,4.87694 0,0 0,0.81283 -0.8128247,0.81283 -1.6256494,-2.43847 -2.438474,-3.2513 -4.8769481,-4.87695 z"
-       id="path4822-8"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-  </g>
-  <g
-     inkscape:groupmode="layer"
-     id="layer3"
-     inkscape:label="Layer"
-     style="display:none"
-     transform="translate(-10,-26.000007)">
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none"
-       d="m 19,20.999995 -4,4 -3,0 0,6 3,0 4,4 z m -1,2.5 0,9 -2.6,-2.5 -2.4,0 0,-4 2.5,0 z"
-       id="path4755"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none"
-       d="m 19.75,24.999995 c 0,-1 0.75,-1 0.75,-1 0,0 1.5,1.029412 1.5,3.5 0,2.470588 -1.5,3.5 -1.5,3.5 0,0 -0.75,0 -0.75,-1 0,0 1,-0.852941 1,-2.5 0,-1.647059 -1,-2.5 -1,-2.5 z"
-       id="path4760"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccsccsc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none"
-       d="m 22.25,23.999995 c 0,-1 0.75,-1 0.75,-1 0,0 2,1.205882 2,4.5 0,3.294118 -2,4.5 -2,4.5 0,0 -0.75,0 -0.75,-1 0,0 1.5,-1.029412 1.5,-3.5 0,-2.470588 -1.5,-3.5 -1.5,-3.5 z"
-       id="path4762"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccsccsc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none"
-       d="m 31.4375,79.875 -1,1 0,10 1,1 3,0 -1,4 7,-4 6,0 1,-1 0,-10 -1,-1 z m 1,2 13,0 0,8 -5,0 -4.40625,2.625 1.125,-2.625 -4.71875,0 z"
-       id="path4802"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccccccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none"
-       d="m 35.125,98.8125 13,0 0,13 -4,-4 -4,3 -1,-1 5,-4 2,2 0,-7 -7,0 2,2 -4,5 -1,-1 3,-4 z"
-       id="path4807"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none"
-       d="m 40.125,102.8125 -9,0 0,13 13,0 0,-9 -2,1 0,6 -9,0 0,-9 6,0 z"
-       id="path4809"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none"
-       d="m 34.125,106.8125 c 0,-1 1,-1 1,-1 3,1 5,3 6,6 0,0 0,1 -1,1 -2,-3 -3,-4 -6,-6 z"
-       id="path4822"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       d="m 12,50.499995 0,1 3,0 0,-1 -3,0 z m 9,0 0,1 3,0 0,-1 -3,0 z"
-       id="rect4841"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       d="m 12,44.499995 0,1 3,0 0,-1 -3,0 z m 9,0 0,1 3,0 0,-1 -3,0 z"
-       id="rect4843"
-       inkscape:connector-curvature="0" />
-    <path
-       inkscape:connector-curvature="0"
-       style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
-       d="m 12,52.999995 0,1 3,0 0,-1 z m 9,0 0,1 3,0 0,-1 z"
-       id="rect4843-1"
-       sodipodi:nodetypes="cccccccccc" />
-    <path
-       inkscape:connector-curvature="0"
-       style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
-       d="m 12,41.999995 0,1 3,0 0,-1 z m 9,0 0,1 3,0 0,-1 z"
-       id="rect4843-17"
-       sodipodi:nodetypes="cccccccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
-       d="m 12,47.499995 0,1 3,0 0,-1 z m 9,0 0,1 3,0 0,-1 z"
-       id="rect4841-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccc" />
-    <rect
-       style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       id="rect4835"
-       width="7"
-       height="2"
-       x="4"
-       y="27"
-       transform="translate(10,19.999995)" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none"
-       d="m 2,21 1,0 0,14 -1,0 z"
-       id="path4826"
-       inkscape:connector-curvature="0"
-       transform="translate(10,19.999995)"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none"
-       d="m 13,21 1,0 0,14 -1,0 z"
-       id="path4828"
-       inkscape:connector-curvature="0"
-       transform="translate(10,19.999995)"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none"
-       d="m 4,22 0,12 8,0 0,-12 z m 1,1 6,0 0,10 -6,0 z"
-       transform="translate(10,19.999995)"
-       id="path4830"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccc" />
-    <rect
-       style="fill:#3366bb;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       id="rect4837"
-       width="8"
-       height="1"
-       x="4"
-       y="22"
-       transform="translate(10,19.999995)" />
-    <rect
-       style="fill:#3366bb;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       id="rect4839"
-       width="8"
-       height="1"
-       x="4"
-       y="33"
-       transform="translate(10,19.999995)" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none"
-       d="m 12,64.999995 6,5 6,-5 0.53033,-1.45299 -1.28033,0.45299 -5.25,4.5 -5.25,-4.5 -1.236136,-0.53033 z"
-       id="path4910"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none"
-       d="m 11,62.999995 0,10 14,0 0,-10 z m 1,1 12,0 0,8 -12,0 z"
-       id="path4905"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="m 19,121 0,5 5,0 -1,-1 -3,0 0,-3 z"
-       id="path4818-6"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 12,121 0,14 12,0 0,-10 -4,-4 z m 1,1 6.5,0 3.5,3.5 0,8.5 -10,0 z"
-       id="path4813-3"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccc" />
-  </g>
-  <g
-     inkscape:groupmode="layer"
-     id="layer5"
-     inkscape:label="Layer#1"
-     style="opacity:0.98999999"
-     transform="translate(0,-6.0000106)">
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 7,23.000004 -3,3 -3,0 0,4 3,0 3,3 z m -1,2.500001 0,5 -1.5,-1.500001 -2.5,0 0,-2 2.5,0 z"
-       id="path4755-9-5"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="m 7.4319858,26.075368 c 0,-0.621323 0.6213237,-1.242647 1.2426477,-0.621323 0,0 0.6213228,0.621323 0.6213228,2.485294 0,1.863971 -0.6213228,2.485294 -0.6213228,2.485294 -0.621324,0.621324 -1.2426477,0 -1.2426477,-0.621323 0,0 0.6213237,-0.621324 0.6213237,-1.863971 0,-1.242648 -0.6213237,-1.863971 -0.6213237,-1.863971 z"
-       id="path4760-1-7"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccsccsc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="m 9.2959563,24.832721 c 0,-0.621324 0.6213228,-1.242647 1.2426477,-0.621324 0,0 1.242646,1.242648 1.242646,3.727942 0,2.485294 -1.242646,3.727941 -1.242646,3.727941 -0.6213249,0.621324 -1.2426477,0 -1.2426477,-0.621323 0,0 1.2426477,-1.242647 1.2426477,-3.106618 0,-1.863971 -1.2426477,-3.106618 -1.2426477,-3.106618 z"
-       id="path4762-8-3"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccsccsc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
-       d="m 2.4916056,40.000004 0,0.621323 8.0979164,0 0,-0.621323 z"
-       id="path4772-4"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
-       d="m 2.4916056,48.000004 8.0979164,0 0,-0.621324 -8.0979164,0 z"
-       id="path4774-6"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
-       d="m 2.4916056,41.919118 0,0.621323 1.8687499,0 0,-0.621323 z m 6.2291665,0 0,0.621323 1.8687499,0 0,-0.621323 z"
-       id="path4782-3"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
-       d="m 2.4916056,45.589344 0,0.621322 1.8687499,0 0,-0.621322 z m 6.2291665,0 0,0.621322 1.8687499,0 0,-0.621322 z"
-       id="path4778-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
-       d="m 2.4916056,44.404412 8.0979164,0 0,-0.621323 -8.0979164,0 z"
-       id="path4780-0"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="m 4.3603555,43.472427 0,1.242647 4.3604166,0 0,-1.242647 z"
-       id="path4793-0"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 4,40.000004 0,8 5,0 0,-8 z m 1,1 3,0 0,6 -3,0 z"
-       id="path4768-5"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 2,39.000004 1,0 0,10 -1,0 z"
-       id="path4764-1"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 10,39.000004 1,0 0,10 -1,0 z"
-       id="path4766-6"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="M 1.8400738,58.055766 6.5000005,62.405031 11.159927,58.055766 10.538604,57.434442 9.2959563,58.056049 6.5000005,60.541343 3.7040445,58.056049 2.4613977,57.434442 z"
-       id="path4800-4-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccc"
-       inkscape:export-filename="/home/rahah/elvidishu/steak/unreal/dev/skins/external link icons/mail.png"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 1,57.000008 0,8 11,0 0,-8 z m 1,1 9,0 0,6 -9,0 z"
-       id="path4795-8-2"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccc"
-       inkscape:export-filename="/home/rahah/elvidishu/steak/unreal/dev/skins/external link icons/mail.png"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="M 1.6213238,72.000004 1,72.621328 l 0,5.757352 0.6213238,0.621324 1.6894529,0 L 2.6894528,81.727943 7,79.000004 l 4.378677,0 L 12,78.37868 12,72.621328 11.378677,72.000004 z m 0.3786762,1 9,0 0,5 -4,0 L 4.0978858,79.896603 5,78.000004 l -3,0 z"
-       id="path4802-8-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccccccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 5,88.000004 7,0 0,7 -2,-2 -3,2 0,-1 3,-2.249999 1,1 0,-3.750001 -3.75,0 1,1 -2.25,3 -1,0 2,-3 z"
-       id="path4807-5-6"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 7,90.000004 -5,0 0,8 8,0 0,-5 -1,0 0,4 -6,0 0,-6 4,0 z"
-       id="path4809-7-3"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="m 7.5,105.00001 0,3 2.5,0 1,-1 -2.5,0 0,-3 z"
-       id="path4818-67-7"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 3,104 0,10 8,1e-5 0,-7 -2.5,-3 z m 1,1 4,1e-5 2,2.50001 0,5.49999 -6,0 z"
-       id="path4813-2-2"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="m 4.0827206,92.533089 c 0,-0.621319 0.6213239,-0.621319 0.6213239,-0.621319 1.8639706,0.621319 3.1066175,1.863968 3.7279413,3.727935 0,0 0,0.621328 -0.6213238,0.621328 C 6.5680151,94.397065 5.9466913,93.775738 4.0827206,92.533089 z"
-       id="path4822-8-2"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#3465ba;fill-opacity:1;stroke:none;display:inline"
-       d="m 1,8.500006 0,7.5001 1,-0.9872 0,-6.0129 2,0 2,1 4,-2e-4 0,2.0002 1,0 0,-2.5 -0.5,-0.5002 -4.5,2e-4 -2,-1 -2.5,0 z"
-       id="path3209"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccccccc" />
-    <path
-       style="fill:#16a4e8;fill-opacity:1;stroke:none;display:inline"
-       d="m 6,11.000106 -1,-10e-5 -2.5,0 -0.5,0.5 -1,4.5001 10,-10e-5 0,-4.4998 -0.5,-0.5 z m 0,1 4,-10e-5 0,3 -7.75,-1e-4 0.75,-3.0001 2,0 z"
-       id="path3215"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccccccc" />
-    <path
-       style="fill:#3465ba;fill-opacity:1;stroke:none;display:inline"
-       d="m 2,17.000006 0,1 8,0 0,-1 z"
-       id="path3247"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#3465ba;fill-opacity:1;stroke:none;display:inline"
-       d="m 5,15.500006 0,2 2,0 0,-2 c 0,-0.5 -2,-0.5 -2,0 z"
-       id="path3249"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-  </g>
-</svg>
diff --git a/resources/src/mediawiki.skinning/images/external-link-icons.svg b/resources/src/mediawiki.skinning/images/external-link-icons.svg
new file mode 100644 (file)
index 0000000..6a67993
--- /dev/null
@@ -0,0 +1,697 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="13"
+   height="110"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.5 r10040"
+   sodipodi:docname="external link icons.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="15.999999"
+     inkscape:cx="10.40536"
+     inkscape:cy="65.686256"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer5"
+     showgrid="true"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1283"
+     inkscape:window-height="711"
+     inkscape:window-x="1790"
+     inkscape:window-y="-6"
+     inkscape:window-maximized="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3246"
+       empspacing="4"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       originx="0px"
+       originy="-27.999997px" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="base"
+     style="display:none"
+     transform="translate(-505,-869.36218)">
+    <rect
+       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="rect4646"
+       width="13"
+       height="12.999996"
+       x="505"
+       y="885.36218" />
+    <rect
+       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="rect4646-4"
+       width="13"
+       height="12.999998"
+       x="505"
+       y="901.36218" />
+    <rect
+       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="rect4646-4-6"
+       width="13"
+       height="12.999996"
+       x="505"
+       y="917.36218"
+       inkscape:export-filename="/home/rahah/elvidishu/steak/unreal/dev/skins/external link icons/mail.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+    <rect
+       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="rect4646-4-6-9"
+       width="13"
+       height="12.999996"
+       x="505"
+       y="933.36218" />
+    <rect
+       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="rect4646-4-6-6"
+       width="13"
+       height="12.999996"
+       x="505"
+       y="950.36218" />
+    <rect
+       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="rect4646-4-6-2"
+       width="13"
+       height="12.999998"
+       x="505"
+       y="966.36218" />
+    <rect
+       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+       id="rect4646-44"
+       width="13"
+       height="12.999996"
+       x="505"
+       y="869.36218" />
+  </g>
+  <g
+     inkscape:label="sketch 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-505,-869.36218)"
+     style="display:none"
+     sodipodi:insensitive="true">
+    <path
+       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 507,870.36218 0,5 3,0 4,4 0,-13 -4,4 z"
+       id="path3194"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 517,869.36218 c 1,2 1,5 0,7"
+       id="path3196"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 520,867.36218 c 2,2 2,9 0,11"
+       id="path3198"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 507.93861,989.90562 0,15.99988 13,0 0,-10.99988 -5,-5 z"
+       id="path3200"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccc" />
+    <path
+       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 506.93861,918.90546 0,11.5 15,0 0,-11.5 z"
+       id="path3202"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 506.93861,918.90546 7.5,6 7.5,-6"
+       id="path3204"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <path
+       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 507.93861,890.90546 3,0"
+       id="path3212"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 507.93861,893.90546 3,0"
+       id="path3214"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 507.93861,899.90546 3,0"
+       id="path3218"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 507.93861,902.90546 3,0"
+       id="path3220"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 517.93861,890.90546 3,0"
+       id="path3222"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 507.93861,896.90546 13,0"
+       id="path3224"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 517.93861,893.90546 3,0"
+       id="path3226"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 517.93861,899.90546 3,0"
+       id="path3230"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 517.93861,902.90546 3,0"
+       id="path3232"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 510.93861,890.90546 0,12 7,0 0,-12 z"
+       id="path3206"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 507.93861,888.90546 0,16"
+       id="path3208"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 520.93861,888.90546 0,16"
+       id="path3210"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 515.93861,989.90562 0,5 5,0"
+       id="path3234"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <path
+       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 513.93861,969.40546 c -2,0 -5,0 -7,0 l 0,10.99995 11,5e-5 c 0,-2.33332 0,-4.66668 0,-7"
+       id="path3236"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none"
+       d="m 513.93861,976.40546 5,-4 3,3 0,-10 -10,0 3,3 -4,5"
+       id="path3242"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 506.93861,940.40546 15,0 0,10 -6,0 -6,4 1,-4 -4,0 z"
+       id="path3244"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccc" />
+    <path
+       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 509.93861,972.40546 c 2,1 4,3 5,5"
+       id="path4641"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="sketch 2"
+     style="display:none"
+     transform="translate(0,-6.0000106)">
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 8.4921988,1.0623917 -4.0641234,4.064123 -3.2512987,0 0,5.6897733 3.2512987,0 4.0641234,4.064124 z m -1.6256494,4.064124 0,5.6897733 -1.6256493,-1.6256493 -2.438474,-1e-6 0,-2.438474 2.438474,1e-6 z"
+       id="path4755-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="m 9.3050235,5.1265157 c 0,-0.812824 0.8128245,-1.625649 1.6256495,-0.812824 0,0 0.812825,0.812824 0.812825,3.251298 0,2.4384743 -0.812825,3.2512993 -0.812825,3.2512993 -0.812825,0.812825 -1.6256495,0 -1.6256495,-0.812825 0,0 0.8128245,-0.8128243 0.8128245,-2.4384743 0,-1.625649 -0.8128245,-2.438474 -0.8128245,-2.438474 z"
+       id="path4760-1"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccsccsc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="m 11.743498,3.5008667 c 0,-0.812825 0.812824,-1.625649 1.625649,-0.812825 0,0 1.625649,1.62565 1.625649,4.876948 0,3.2512993 -1.625649,4.8769483 -1.625649,4.8769483 -0.812825,0.812825 -1.625649,0 -1.625649,-0.812824 0,0 1.625649,-1.62565 1.625649,-4.0641243 0,-2.438474 -1.625649,-4.064123 -1.625649,-4.064123 z"
+       id="path4762-8"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccsccsc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 2.8024261,23.008658 0,0.812825 10.5667209,0 0,-0.812825 z"
+       id="path4772"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 2.8024261,33.575379 10.5667209,0 0,-0.812825 -10.5667209,0 z"
+       id="path4774"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 2.8024261,25.447132 0,0.812824 2.438474,0 0,-0.812824 z m 8.1282469,0 0,0.812824 2.438474,0 0,-0.812824 z"
+       id="path4782"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 2.8024261,30.32408 0,0.812824 2.438474,0 0,-0.812824 z m 8.1282469,0 0,0.812824 2.438474,0 0,-0.812824 z"
+       id="path4778"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 2.8024261,28.698431 10.5667209,0 0,-0.812825 -10.5667209,0 z"
+       id="path4780"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="m 5.2409001,27.479194 0,1.625649 5.6897729,0 0,-1.625649 z"
+       id="path4793"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 4.4280754,23.008658 0,10.56672 7.3154226,0 0,-10.56672 z m 1.6256494,1.625649 4.0641232,0 0,7.315422 -4.0641232,0 z"
+       id="path4768"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 1.9896014,21.383009 1.6256493,0 0,13.818019 -1.6256493,0 z"
+       id="path4764"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 12.556322,21.383009 1.62565,0 0,13.818019 -1.62565,0 z"
+       id="path4766"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="m 1.9896014,44.954923 6.096185,5.689773 6.0961856,-5.689773 -0.812825,-0.812825 -1.625649,0.813196 -3.6577116,3.251298 -3.657711,-3.251298 -1.6256493,-0.813196 z"
+       id="path4800-4"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 1.1767767,43.329273 0,11.379545 13.8180193,0 0,-11.379545 z m 1.6256494,1.625649 10.5667209,0 0,8.128247 -10.5667209,0 z"
+       id="path4795-8"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 1.9896014,62.024243 -0.8128247,0.812824 0,8.128247 0.8128247,0.812825 2.438474,0 -0.8128247,3.251297 5.6897728,-3.251297 4.8769485,0 0.812824,-0.812825 0,-8.128247 -0.812824,-0.812824 z m 0.8128247,1.625649 10.5667209,0 0,6.502598 -4.0641235,0 -3.5815088,2.133664 0.9144278,-2.133664 -3.8355164,0 z"
+       id="path4802-8"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccccccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 4.4280754,82.344856 10.5667206,0 0,10.56672 -3.251298,-3.25129 -3.2512992,2.43847 -0.8128247,-0.81282 4.0641239,-3.2513 1.625649,1.62565 0,-5.68978 -5.6897729,0 1.6256494,1.62565 -3.2512987,4.06413 -0.8128247,-0.81283 2.438474,-3.2513 z"
+       id="path4807-5"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 8.4921988,85.596156 -7.3154221,0 0,10.56672 10.5667213,0 0,-7.31542 -1.62565,0.81283 0,4.87694 -7.3154219,0 0,-7.31542 4.876948,0 z"
+       id="path4809-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="m 8.4921988,103.47831 0,4.87694 4.8769482,0 0,-1.62565 -3.251299,0 0,-3.25129 z"
+       id="path4818-67"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 1.9896014,102.66548 0,13.81802 12.1923706,0 0,-10.13799 -3.657711,-3.68003 z m 1.6256493,1.62565 6.5025973,0 2.438474,2.43847 0,8.12825 -8.9410713,0 z"
+       id="path4813-2"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="m 3.6152507,88.847456 c 0,-0.81282 0.8128247,-0.81282 0.8128247,-0.81282 2.438474,0.81282 4.0641234,2.43847 4.8769481,4.87694 0,0 0,0.81283 -0.8128247,0.81283 -1.6256494,-2.43847 -2.438474,-3.2513 -4.8769481,-4.87695 z"
+       id="path4822-8"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Layer"
+     style="display:none"
+     transform="translate(-10,-26.000007)">
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none"
+       d="m 19,20.999995 -4,4 -3,0 0,6 3,0 4,4 z m -1,2.5 0,9 -2.6,-2.5 -2.4,0 0,-4 2.5,0 z"
+       id="path4755"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none"
+       d="m 19.75,24.999995 c 0,-1 0.75,-1 0.75,-1 0,0 1.5,1.029412 1.5,3.5 0,2.470588 -1.5,3.5 -1.5,3.5 0,0 -0.75,0 -0.75,-1 0,0 1,-0.852941 1,-2.5 0,-1.647059 -1,-2.5 -1,-2.5 z"
+       id="path4760"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccsccsc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none"
+       d="m 22.25,23.999995 c 0,-1 0.75,-1 0.75,-1 0,0 2,1.205882 2,4.5 0,3.294118 -2,4.5 -2,4.5 0,0 -0.75,0 -0.75,-1 0,0 1.5,-1.029412 1.5,-3.5 0,-2.470588 -1.5,-3.5 -1.5,-3.5 z"
+       id="path4762"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccsccsc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none"
+       d="m 31.4375,79.875 -1,1 0,10 1,1 3,0 -1,4 7,-4 6,0 1,-1 0,-10 -1,-1 z m 1,2 13,0 0,8 -5,0 -4.40625,2.625 1.125,-2.625 -4.71875,0 z"
+       id="path4802"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccccccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none"
+       d="m 35.125,98.8125 13,0 0,13 -4,-4 -4,3 -1,-1 5,-4 2,2 0,-7 -7,0 2,2 -4,5 -1,-1 3,-4 z"
+       id="path4807"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none"
+       d="m 40.125,102.8125 -9,0 0,13 13,0 0,-9 -2,1 0,6 -9,0 0,-9 6,0 z"
+       id="path4809"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none"
+       d="m 34.125,106.8125 c 0,-1 1,-1 1,-1 3,1 5,3 6,6 0,0 0,1 -1,1 -2,-3 -3,-4 -6,-6 z"
+       id="path4822"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       d="m 12,50.499995 0,1 3,0 0,-1 -3,0 z m 9,0 0,1 3,0 0,-1 -3,0 z"
+       id="rect4841"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       d="m 12,44.499995 0,1 3,0 0,-1 -3,0 z m 9,0 0,1 3,0 0,-1 -3,0 z"
+       id="rect4843"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+       d="m 12,52.999995 0,1 3,0 0,-1 z m 9,0 0,1 3,0 0,-1 z"
+       id="rect4843-1"
+       sodipodi:nodetypes="cccccccccc" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+       d="m 12,41.999995 0,1 3,0 0,-1 z m 9,0 0,1 3,0 0,-1 z"
+       id="rect4843-17"
+       sodipodi:nodetypes="cccccccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+       d="m 12,47.499995 0,1 3,0 0,-1 z m 9,0 0,1 3,0 0,-1 z"
+       id="rect4841-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccc" />
+    <rect
+       style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="rect4835"
+       width="7"
+       height="2"
+       x="4"
+       y="27"
+       transform="translate(10,19.999995)" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none"
+       d="m 2,21 1,0 0,14 -1,0 z"
+       id="path4826"
+       inkscape:connector-curvature="0"
+       transform="translate(10,19.999995)"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none"
+       d="m 13,21 1,0 0,14 -1,0 z"
+       id="path4828"
+       inkscape:connector-curvature="0"
+       transform="translate(10,19.999995)"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none"
+       d="m 4,22 0,12 8,0 0,-12 z m 1,1 6,0 0,10 -6,0 z"
+       transform="translate(10,19.999995)"
+       id="path4830"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccc" />
+    <rect
+       style="fill:#3366bb;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="rect4837"
+       width="8"
+       height="1"
+       x="4"
+       y="22"
+       transform="translate(10,19.999995)" />
+    <rect
+       style="fill:#3366bb;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="rect4839"
+       width="8"
+       height="1"
+       x="4"
+       y="33"
+       transform="translate(10,19.999995)" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none"
+       d="m 12,64.999995 6,5 6,-5 0.53033,-1.45299 -1.28033,0.45299 -5.25,4.5 -5.25,-4.5 -1.236136,-0.53033 z"
+       id="path4910"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none"
+       d="m 11,62.999995 0,10 14,0 0,-10 z m 1,1 12,0 0,8 -12,0 z"
+       id="path4905"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="m 19,121 0,5 5,0 -1,-1 -3,0 0,-3 z"
+       id="path4818-6"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 12,121 0,14 12,0 0,-10 -4,-4 z m 1,1 6.5,0 3.5,3.5 0,8.5 -10,0 z"
+       id="path4813-3"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Layer#1"
+     style="opacity:0.98999999"
+     transform="translate(0,-6.0000106)">
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 7,23.000004 -3,3 -3,0 0,4 3,0 3,3 z m -1,2.500001 0,5 -1.5,-1.500001 -2.5,0 0,-2 2.5,0 z"
+       id="path4755-9-5"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="m 7.4319858,26.075368 c 0,-0.621323 0.6213237,-1.242647 1.2426477,-0.621323 0,0 0.6213228,0.621323 0.6213228,2.485294 0,1.863971 -0.6213228,2.485294 -0.6213228,2.485294 -0.621324,0.621324 -1.2426477,0 -1.2426477,-0.621323 0,0 0.6213237,-0.621324 0.6213237,-1.863971 0,-1.242648 -0.6213237,-1.863971 -0.6213237,-1.863971 z"
+       id="path4760-1-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccsccsc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="m 9.2959563,24.832721 c 0,-0.621324 0.6213228,-1.242647 1.2426477,-0.621324 0,0 1.242646,1.242648 1.242646,3.727942 0,2.485294 -1.242646,3.727941 -1.242646,3.727941 -0.6213249,0.621324 -1.2426477,0 -1.2426477,-0.621323 0,0 1.2426477,-1.242647 1.2426477,-3.106618 0,-1.863971 -1.2426477,-3.106618 -1.2426477,-3.106618 z"
+       id="path4762-8-3"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccsccsc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
+       d="m 2.4916056,40.000004 0,0.621323 8.0979164,0 0,-0.621323 z"
+       id="path4772-4"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
+       d="m 2.4916056,48.000004 8.0979164,0 0,-0.621324 -8.0979164,0 z"
+       id="path4774-6"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
+       d="m 2.4916056,41.919118 0,0.621323 1.8687499,0 0,-0.621323 z m 6.2291665,0 0,0.621323 1.8687499,0 0,-0.621323 z"
+       id="path4782-3"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
+       d="m 2.4916056,45.589344 0,0.621322 1.8687499,0 0,-0.621322 z m 6.2291665,0 0,0.621322 1.8687499,0 0,-0.621322 z"
+       id="path4778-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
+       d="m 2.4916056,44.404412 8.0979164,0 0,-0.621323 -8.0979164,0 z"
+       id="path4780-0"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="m 4.3603555,43.472427 0,1.242647 4.3604166,0 0,-1.242647 z"
+       id="path4793-0"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 4,40.000004 0,8 5,0 0,-8 z m 1,1 3,0 0,6 -3,0 z"
+       id="path4768-5"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 2,39.000004 1,0 0,10 -1,0 z"
+       id="path4764-1"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 10,39.000004 1,0 0,10 -1,0 z"
+       id="path4766-6"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="M 1.8400738,58.055766 6.5000005,62.405031 11.159927,58.055766 10.538604,57.434442 9.2959563,58.056049 6.5000005,60.541343 3.7040445,58.056049 2.4613977,57.434442 z"
+       id="path4800-4-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc"
+       inkscape:export-filename="/home/rahah/elvidishu/steak/unreal/dev/skins/external link icons/mail.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 1,57.000008 0,8 11,0 0,-8 z m 1,1 9,0 0,6 -9,0 z"
+       id="path4795-8-2"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccc"
+       inkscape:export-filename="/home/rahah/elvidishu/steak/unreal/dev/skins/external link icons/mail.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="M 1.6213238,72.000004 1,72.621328 l 0,5.757352 0.6213238,0.621324 1.6894529,0 L 2.6894528,81.727943 7,79.000004 l 4.378677,0 L 12,78.37868 12,72.621328 11.378677,72.000004 z m 0.3786762,1 9,0 0,5 -4,0 L 4.0978858,79.896603 5,78.000004 l -3,0 z"
+       id="path4802-8-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccccccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 5,88.000004 7,0 0,7 -2,-2 -3,2 0,-1 3,-2.249999 1,1 0,-3.750001 -3.75,0 1,1 -2.25,3 -1,0 2,-3 z"
+       id="path4807-5-6"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 7,90.000004 -5,0 0,8 8,0 0,-5 -1,0 0,4 -6,0 0,-6 4,0 z"
+       id="path4809-7-3"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="m 7.5,105.00001 0,3 2.5,0 1,-1 -2.5,0 0,-3 z"
+       id="path4818-67-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+       d="m 3,104 0,10 8,1e-5 0,-7 -2.5,-3 z m 1,1 4,1e-5 2,2.50001 0,5.49999 -6,0 z"
+       id="path4813-2-2"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccc" />
+    <path
+       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+       d="m 4.0827206,92.533089 c 0,-0.621319 0.6213239,-0.621319 0.6213239,-0.621319 1.8639706,0.621319 3.1066175,1.863968 3.7279413,3.727935 0,0 0,0.621328 -0.6213238,0.621328 C 6.5680151,94.397065 5.9466913,93.775738 4.0827206,92.533089 z"
+       id="path4822-8-2"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#3465ba;fill-opacity:1;stroke:none;display:inline"
+       d="m 1,8.500006 0,7.5001 1,-0.9872 0,-6.0129 2,0 2,1 4,-2e-4 0,2.0002 1,0 0,-2.5 -0.5,-0.5002 -4.5,2e-4 -2,-1 -2.5,0 z"
+       id="path3209"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccccccc" />
+    <path
+       style="fill:#16a4e8;fill-opacity:1;stroke:none;display:inline"
+       d="m 6,11.000106 -1,-10e-5 -2.5,0 -0.5,0.5 -1,4.5001 10,-10e-5 0,-4.4998 -0.5,-0.5 z m 0,1 4,-10e-5 0,3 -7.75,-1e-4 0.75,-3.0001 2,0 z"
+       id="path3215"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccccccccc" />
+    <path
+       style="fill:#3465ba;fill-opacity:1;stroke:none;display:inline"
+       d="m 2,17.000006 0,1 8,0 0,-1 z"
+       id="path3247"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#3465ba;fill-opacity:1;stroke:none;display:inline"
+       d="m 5,15.500006 0,2 2,0 0,-2 c 0,-0.5 -2,-0.5 -2,0 z"
+       id="path3249"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+  </g>
+</svg>
index bdae0dd..a06aa95 100644 (file)
 .mw-changeslist .mw-title {
        unicode-bidi: embed;
 }
+
+/* Colored watchlist and recent changes numbers */
+.mw-plusminus-pos {
+       color: #006400; /* dark green */
+}
+
+.mw-plusminus-neg {
+       color: #8b0000; /* dark red */
+}
+
+.mw-plusminus-null {
+       color: #aaa; /* gray */
+}
+
+/*
+ * Bidi-isolate these numbers.
+ * See https://phabricator.wikimedia.org/T93484
+ */
+.mw-plusminus-pos,
+.mw-plusminus-neg,
+.mw-plusminus-null {
+       unicode-bidi: -moz-isolate;
+       unicode-bidi: isolate;
+}
index 26c500d..e7a5865 100644 (file)
        margin: 1em 0 1em .4em;
 }
 /* needs extra specificity to override `.mw-body p` selector */
-.mw-body p.mw-search-nonefound {
+.mw-body .mw-search-nonefound {
        margin: 0;
 }
-.mw-search-interwiki-header {
+.mw-search-interwiki-header,
+.searchdidyoumean em,
+.searchmatch {
        font-weight: bold;
 }
 .mw-search-nonefound + .mw-search-interwiki-header {
        margin-top: 0;
 }
-div.searchresult {
+.searchresult {
        font-size: 95%;
        width: 38em;
 }
@@ -35,6 +37,9 @@ div.searchresult {
        margin-left: 0;
        float: left;
 }
+.mw-search-interwiki-header {
+       clear: both;
+}
 .mw-search-results li {
        padding-bottom: 1.2em;
        list-style: none;
@@ -52,32 +57,32 @@ div.searchresult {
        margin-top: 1em;
        border: 1px solid #c0c0c0;
 }
-.mw-search-profile-tabs div.search-types {
+.search-types {
        float: left;
        padding-left: 0.25em;
 }
-.mw-search-profile-tabs div.search-types ul {
+.search-types ul {
        margin: 0;
        padding: 0;
        list-style: none;
 }
-.mw-search-profile-tabs div.search-types ul li {
+.search-types li {
        float: left;
        margin: 0;
        padding: 0;
 }
-.mw-search-profile-tabs div.search-types ul li a {
+.search-types a {
        display: block;
        padding: 0.5em;
 }
-.mw-search-profile-tabs div.search-types ul li.current a {
+.search-types .current a {
        color: #333;
        cursor: default;
 }
-.mw-search-profile-tabs div.search-types ul li.current a:hover {
+.search-types .current a:hover {
        text-decoration: none;
 }
-#mw-search-top-table div.results-info {
+.results-info {
        float: right;
        padding: 0.5em;
        padding-right: 0.75em;
@@ -86,56 +91,57 @@ div.searchresult {
 }
 #mw-search-top-table div.oo-ui-actionFieldLayout {
        float: left;
+       width: 100%;
 }
-fieldset#mw-searchoptions {
+#mw-searchoptions {
        margin: 0;
        padding: 0.5em 0.75em 0.75em 0.75em;
-       border: none;
        background-color: #f9f9f9;
        border: 1px solid #c0c0c0;
        border-top-width: 0;
 }
-fieldset#mw-searchoptions legend {
+#mw-searchoptions legend {
        display: none;
 }
-fieldset#mw-searchoptions h4 {
+#mw-searchoptions h4 {
        padding: 0;
        margin: 0;
        float: left;
 }
-fieldset#mw-searchoptions table {
+#mw-searchoptions table {
        float: left;
        margin-right: 3em;
        border-collapse: collapse;
 }
-fieldset#mw-searchoptions table td {
+#mw-searchoptions table td {
        padding: 0 1em 0 0;
        white-space: nowrap;
 }
-fieldset#mw-searchoptions div.divider {
+#mw-searchoptions .divider {
        clear: both;
        border-bottom: 1px solid #ddd;
        padding-top: 0.5em;
        margin-bottom: 0.5em;
 }
-td#mw-search-menu {
+#mw-search-menu {
        padding-left: 6em;
        font-size: 85%;
 }
-div#mw-search-interwiki {
+#mw-search-interwiki {
        float: right;
        width: 18em;
        border: 1px solid #aaa;
        margin-top: 2ex;
 }
-div#mw-search-interwiki li {
+.searchalttitle,
+#mw-search-interwiki li {
        font-size: 95%;
 }
 .mw-search-interwiki-more {
        float: right;
        font-size: 90%;
 }
-div#mw-search-interwiki-caption {
+#mw-search-interwiki-caption {
        text-align: center;
        font-weight: bold;
        font-size: 95%;
@@ -147,18 +153,9 @@ div#mw-search-interwiki-caption {
        background-color: #ececec;
        border-top: 1px solid #bbb;
 }
-span.searchalttitle {
-       font-size: 95%;
-}
-div.searchdidyoumean {
+.searchdidyoumean {
        font-size: 127%;
        margin-top: 0.8em;
        /* Note that this color won't affect the link, as desired. */
        color: #c00;
 }
-div.searchdidyoumean em {
-       font-weight: bold;
-}
-.searchmatch {
-       font-weight: bold;
-}
index ceb93c2..d65b284 100644 (file)
@@ -40,8 +40,3 @@
 #mw-editbutton-hr {
        .background-image("images/@{button-hr}");
 }
-
-// Awful workaround for T113868, while it awaits a better fix.
-#mw-t113868 {
-       background-image: url( images/ar/button_bold.png ), url( images/ar/button_headline.png ), url( images/ar/button_italic.png ), url( images/ar/button_link.png ), url( images/ar/button_nowiki.png ), url( images/be-tarask/button_bold.png ), url( images/be-tarask/button_italic.png ), url( images/be-tarask/button_link.png ), url( images/de/button_bold.png ), url( images/de/button_italic.png ), url( images/en/button_bold.png ), url( images/en/button_extlink.png ), url( images/en/button_headline.png ), url( images/en/button_hr.png ), url( images/en/button_image.png ), url( images/en/button_italic.png ), url( images/en/button_link.png ), url( images/en/button_media.png ), url( images/en/button_nowiki.png ), url( images/en/button_sig.png ), url( images/fa/button_bold.png ), url( images/fa/button_headline.png ), url( images/fa/button_italic.png ), url( images/fa/button_link.png ), url( images/fa/button_nowiki.png ), url( images/ksh/button_italic.png ), url( images/ru/button_bold.png ), url( images/ru/button_italic.png ), url( images/ru/button_link.png );
-}
index 579bd5f..76fee23 100644 (file)
        }
 
        &:focus {
-               box-shadow: inset 0 0 0 2px @colorProgressive;
-               // Color being used to match inset shadow, not semantic reasons
                border-color: @colorProgressive;
-               // Remove focus glow on input[type="search"]
+               box-shadow: inset 0 0 0 1px @colorProgressive;
                outline: 0;
        }
 
@@ -108,6 +106,9 @@ input[type="number"],
 .mw-ui-input-inline {
        display: inline-block;
        width: auto;
+       // Make sure we limit `width` to parent element because
+       // in case of text `input` fields, `width: auto;` equals `size` attribute.
+       max-width: 100%;
 }
 
 // mw-ui-input-large
index 45f52b7..ffb7736 100644 (file)
         * @inheritdoc
         */
        CSP.createItemWidget = function ( data ) {
+               var title = mw.Title.makeTitle( NS_CATEGORY, data );
+               if ( !title ) {
+                       return null;
+               }
                return new mw.widgets.CategoryCapsuleItemWidget( {
                        apiUrl: this.api.apiUrl || undefined,
-                       title: mw.Title.makeTitle( NS_CATEGORY, data )
+                       title: title
                } );
        };
 
        CSP.getItemFromData = function ( data ) {
                // This is a bit of a hack... We have to canonicalize the data in the same way that
                // #createItemWidget and CategoryCapsuleItemWidget will do, otherwise we won't find duplicates.
-               data = mw.Title.makeTitle( NS_CATEGORY, data ).getMainText();
-               return OO.ui.mixin.GroupElement.prototype.getItemFromData.call( this, data );
+               var title = mw.Title.makeTitle( NS_CATEGORY, data );
+               if ( !title ) {
+                       return null;
+               }
+               return OO.ui.mixin.GroupElement.prototype.getItemFromData.call( this, title.getMainText() );
        };
 
        /**
index df03679..d816335 100755 (executable)
         *  used (header or content).
         */
        mw.widgets.SearchInputWidget = function MwWidgetsSearchInputWidget( config ) {
+               // The parent constructors will detach this from the DOM, and won't
+               // be reattached until after this function is completed. As such
+               // grab a handle here. If no config.$input is passed tracking of
+               // form submissions won't work.
+               var $form = config.$input ? config.$input.closest( 'form' ) : $();
+
                config = $.extend( {
                        type: 'search',
                        icon: 'search',
@@ -36,6 +42,7 @@
                // Initialization
                this.$element.addClass( 'mw-widget-searchInputWidget' );
                this.lookupMenu.$element.addClass( 'mw-widget-searchWidget-menu' );
+               this.lastLookupItems = [];
                if ( !config.pushPending ) {
                        this.pushPending = false;
                }
                        this.performSearchOnClick = config.performSearchOnClick;
                }
                this.setLookupsDisabled( !this.suggestions );
+
+               $form.on( 'submit', function () {
+                       mw.track( 'mw.widgets.SearchInputWidget', {
+                               action: 'submit-form',
+                               numberOfResults: this.lastLookupItems.length,
+                               $form: $form,
+                               inputLocation: this.dataLocation || 'header',
+                               index: this.lastLookupItems.indexOf(
+                                       this.$input.val()
+                               )
+                       } );
+               }.bind( this ) );
        };
 
        /* Setup */
        /**
         * @inheritdoc
         */
-       mw.widgets.SearchInputWidget.prototype.onLookupMenuItemChoose = function ( item ) {
-               var items;
-
-               // get items which was suggested before the input changes
-               items = this.lookupMenu.items;
-
+       mw.widgets.SearchInputWidget.prototype.onLookupMenuItemChoose = function () {
                mw.widgets.SearchInputWidget.parent.prototype.onLookupMenuItemChoose.apply( this, arguments );
 
-               mw.track( 'mw.widgets.SearchInputWidget', {
-                       action: 'click-result',
-                       numberOfResults: items.length,
-                       clickIndex: items.indexOf( item ) + 1
-               } );
-
                if ( this.performSearchOnClick ) {
                        this.$element.closest( 'form' ).submit();
                }
        };
 
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.SearchInputWidget.prototype.getLookupMenuOptionsFromData = function () {
+               var items = mw.widgets.SearchInputWidget.parent.prototype.getLookupMenuOptionsFromData.apply(
+                       this, arguments
+               );
+
+               this.lastLookupItems = items.map( function ( item ) {
+                       return item.data;
+               } );
+
+               return items;
+       };
+
 }( jQuery, mediaWiki ) );
index 84533aa..37e6e1a 100644 (file)
                this.$label.attr( 'href', config.url );
                this.$element.addClass( 'mw-widget-titleOptionWidget' );
 
+               // OOUI OptionWidgets make an effort to not be tab accessible, but
+               // adding a link inside them would undo that. So, explicitly make it
+               // not tabbable.
+               this.$label.attr( 'tabindex', '-1' );
+
                // Allow opening the link in new tab, but not regular navigation.
                this.$label.on( 'click', function ( e ) {
                        // Don't interfere with special clicks (e.g. to open in new tab)
index fdd4a8a..1732407 100644 (file)
@@ -96,6 +96,8 @@
        /**
         * Get a promise which resolves with an API repsonse for suggested
         * links for the current query.
+        *
+        * @return {jQuery.Promise} Suggestions promise
         */
        mw.widgets.TitleWidget.prototype.getSuggestionsPromise = function () {
                var req,
index 3e010d0..a8ee4c7 100644 (file)
                 */
                postWithToken: function ( tokenType, params, ajaxOptions ) {
                        var api = this,
-                               abortable;
+                               abortedPromise = $.Deferred().reject( 'http',
+                                       { textStatus: 'abort', exception: 'abort' } ).promise(),
+                               abortable,
+                               aborted;
 
-                       return ( abortable = api.getToken( tokenType, params.assert ) ).then( function ( token ) {
+                       return api.getToken( tokenType, params.assert ).then( function ( token ) {
                                params.token = token;
+                               // Request was aborted while token request was running, but we
+                               // don't want to unnecessarily abort token requests, so abort
+                               // a fake request instead
+                               if ( aborted ) {
+                                       return abortedPromise;
+                               }
+
                                return ( abortable = api.post( params, ajaxOptions ) ).then(
                                        // If no error, return to caller as-is
                                        null,
                                                        api.badToken( tokenType );
                                                        // Try again, once
                                                        params.token = undefined;
-                                                       return ( abortable = api.getToken( tokenType, params.assert ) ).then( function ( token ) {
+                                                       abortable = null;
+                                                       return api.getToken( tokenType, params.assert ).then( function ( token ) {
                                                                params.token = token;
-                                                               return ( abortable = api.post( params, ajaxOptions ) ).promise();
+                                                               if ( aborted ) {
+                                                                       return abortedPromise;
+                                                               }
+
+                                                               return ( abortable = api.post( params, ajaxOptions ) );
                                                        } );
                                                }
 
                                        }
                                );
                        } ).promise( { abort: function () {
-                               abortable.abort();
+                               if ( abortable ) {
+                                       abortable.abort();
+                               } else {
+                                       aborted = true;
+                               }
                        } } );
                },
 
index 60276cd..bb3a913 100644 (file)
                /**
                 * API helper to grab a csrf token.
                 *
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {string} return.done.token Received token.
+                * @return {jQuery.Promise} Received token.
                 */
                getEditToken: function () {
                        return this.getToken( 'csrf' );
                },
 
+               /**
+                * Create a new page.
+                *
+                * Example:
+                *
+                *     new mw.Api().create( 'Sandbox',
+                *         { summary: 'Load sand particles.' },
+                *         'Sand.'
+                *     );
+                *
+                * @since 1.28
+                * @param {mw.Title|string} title Page title
+                * @param {Object} params Edit API parameters
+                * @param {string} params.summary Edit summary
+                * @param {string} content
+                * @return {jQuery.Promise} API response
+                */
+               create: function ( title, params, content ) {
+                       return this.postWithEditToken( $.extend( {
+                               action: 'edit',
+                               title: String( title ),
+                               text: content,
+                               formatversion: '2',
+
+                               // Protect against errors and conflicts
+                               assert: mw.user.isAnon() ? undefined : 'user',
+                               createonly: true
+                       }, params ) ).then( function ( data ) {
+                               return data.edit;
+                       } );
+               },
+
+               /**
+                * Edit an existing page.
+                *
+                * To create a new page, use #create() instead.
+                *
+                * Simple transformation:
+                *
+                *     new mw.Api()
+                *         .edit( 'Sandbox', function ( revision ) {
+                *             return revision.content.replace( 'foo', 'bar' );
+                *         } )
+                *         .then( function () {
+                *             console.log( 'Saved! ');
+                *         } );
+                *
+                * Set save parameters by returning an object instead of a string:
+                *
+                *     new mw.Api().edit(
+                *         'Sandbox',
+                *         function ( revision ) {
+                *             return {
+                *                 text: revision.content.replace( 'foo', 'bar' ),
+                *                 summary: 'Replace "foo" with "bar".',
+                *                 assert: 'bot',
+                *                 minor: true
+                *             };
+                *         }
+                *     )
+                *     .then( function () {
+                *         console.log( 'Saved! ');
+                *     } );
+                *
+                * Transform asynchronously by returning a promise.
+                *
+                *     new mw.Api()
+                *         .edit( 'Sandbox', function ( revision ) {
+                *             return Spelling
+                *                 .corrections( revision.content )
+                *                 .then( function ( report ) {
+                *                     return {
+                *                         text: report.output,
+                *                         summary: report.changelog
+                *                     };
+                *                 } );
+                *         } )
+                *         .then( function () {
+                *             console.log( 'Saved! ');
+                *         } );
+                *
+                * @since 1.28
+                * @param {mw.Title|string} title Page title
+                * @param {Function} transform Callback that prepares the edit
+                * @param {Object} transform.revision Current revision
+                * @param {string} transform.revision.content Current revision content
+                * @param {string|Object|jQuery.Promise} transform.return New content, object with edit
+                *  API parameters, or promise providing one of those.
+                * @return {jQuery.Promise} Edit API response
+                */
+               edit: function ( title, transform ) {
+                       var basetimestamp, curtimestamp,
+                               api = this;
+                       return api.get( {
+                                       action: 'query',
+                                       prop: 'revisions',
+                                       rvprop: [ 'content', 'timestamp' ],
+                                       titles: String( title ),
+                                       formatversion: '2',
+                                       curtimestamp: true
+                               } )
+                               .then( function ( data ) {
+                                       var page, revision;
+                                       if ( !data.query || !data.query.pages ) {
+                                               return $.Deferred().reject( 'unknown' );
+                                       }
+                                       page = data.query.pages[ 0 ];
+                                       if ( !page || page.missing ) {
+                                               return $.Deferred().reject( 'nocreate-missing' );
+                                       }
+                                       revision = page.revisions[ 0 ];
+                                       basetimestamp = revision.timestamp;
+                                       curtimestamp = data.curtimestamp;
+                                       return transform( {
+                                               timestamp: revision.timestamp,
+                                               content: revision.content
+                                       } );
+                               } )
+                               .then( function ( params ) {
+                                       var editParams = typeof params === 'object' ? params : { text: String( params ) };
+                                       return api.postWithEditToken( $.extend( {
+                                               action: 'edit',
+                                               title: title,
+                                               formatversion: '2',
+
+                                               // Protect against errors and conflicts
+                                               assert: mw.user.isAnon() ? undefined : 'user',
+                                               basetimestamp: basetimestamp,
+                                               starttimestamp: curtimestamp,
+                                               nocreate: true
+                                       }, editParams ) );
+                               } )
+                               .then( function ( data ) {
+                                       return data.edit;
+                               } );
+               },
+
                /**
                 * Post a new section to the page.
                 *
index df21eb2..9ba562e 100644 (file)
                 */
                loadMessages: function ( messages ) {
                        return this.getMessages( messages ).then( $.proxy( mw.messages, 'set' ) );
+               },
+
+               /**
+                * Loads a set of mesages and add them to mw.messages. Only messages that are not already known
+                * are loaded. If all messages are known, the returned promise is resolved immediately.
+                *
+                * @param {Array} messages Messages to retrieve
+                * @return {jQuery.Promise}
+                */
+               loadMessagesIfMissing: function ( messages ) {
+                       var missing = messages.filter( function ( msg ) {
+                               return !mw.message( msg ).exists();
+                       } );
+
+                       if ( missing.length === 0 ) {
+                               return $.Deferred().resolve();
+                       }
+
+                       return this.getMessages( missing ).then( $.proxy( mw.messages, 'set' ) );
                }
        } );
 
index eeeab68..781c1df 100644 (file)
@@ -43,7 +43,9 @@
                // However, if the target is a remote wiki, we must check the API
                // to confirm that the target is one that this site is configured to
                // support.
-               if ( this.target === 'local' ) {
+               if ( validTargets.length === 0 ) {
+                       this.apiPromise = $.Deferred().reject( 'upload-dialog-disabled' );
+               } else if ( this.target === 'local' ) {
                        // If local uploads were requested, but they are disabled, fail.
                        if ( !mw.config.get( 'wgEnableUploads' ) ) {
                                this.apiPromise = $.Deferred().reject( 'uploaddisabledtext' );
index bbd0f1b..31e4492 100644 (file)
                        layout.emit( 'fileUploaded' );
                }, function () {
                        // These errors will be thrown while the user is on the info page.
-                       // Pretty sure it's impossible to get a warning other than 'stashfailed' here, which should
-                       // really be an error...
-                       var errorMessage = layout.getErrorMessageForStateDetails();
-                       deferred.reject( errorMessage );
+                       layout.getErrorMessageForStateDetails().then( function ( errorMessage ) {
+                               deferred.reject( errorMessage );
+                       } );
                }, function ( progress ) {
                        var elapsedTime = new Date() - startTime,
                                estimatedTotalTime = ( 1 / progress ) * elapsedTime,
                                deferred.resolve();
                                layout.emit( 'fileSaved', layout.upload.getImageInfo() );
                        }, function () {
-                               var errorMessage = layout.getErrorMessageForStateDetails();
-                               deferred.reject( errorMessage );
+                               layout.getErrorMessageForStateDetails().then( function ( errorMessage ) {
+                                       deferred.reject( errorMessage );
+                               } );
                        } );
                } );
 
         * state and state details.
         *
         * @protected
-        * @return {OO.ui.Error} Error to display for given state and details.
+        * @return {jQuery.Promise} A Promise that will be resolved with an OO.ui.Error.
         */
        mw.Upload.BookletLayout.prototype.getErrorMessageForStateDetails = function () {
                var message,
                if ( state === mw.Upload.State.ERROR ) {
                        if ( !error ) {
                                // If there's an 'exception' key, this might be a timeout, or other connection problem
-                               return new OO.ui.Error(
+                               return $.Deferred().resolve( new OO.ui.Error(
                                        $( '<p>' ).msg( 'api-error-unknownerror', JSON.stringify( stateDetails ) ),
                                        { recoverable: false }
-                               );
+                               ) );
                        }
 
-                       // HACK We should either have a hook here to allow TitleBlacklist to handle this, or just have
-                       // TitleBlacklist produce sane error messages that can be displayed without arcane knowledge
-                       if ( error.info === 'TitleBlacklist prevents this title from being created' ) {
-                               // HACK Apparently the only reliable way to determine whether TitleBlacklist was involved
-                               return new OO.ui.Error(
-                                       // HACK TitleBlacklist doesn't have a sensible message, this one is from UploadWizard
-                                       $( '<p>' ).msg( 'api-error-blacklisted' ),
-                                       { recoverable: false }
-                               );
+                       // Errors in this format are produced by TitleBlacklist and AbuseFilter. Perhaps other
+                       // extensions will follow this format in the future.
+                       if ( error.message ) {
+                               return this.upload.getApi()
+                                       .then( function ( api ) {
+                                               return api.loadMessagesIfMissing( [ error.message.key ] ).then( function () {
+                                                       if ( !mw.message( error.message.key ).exists() ) {
+                                                               return $.Deferred().reject();
+                                                       }
+                                                       return new OO.ui.Error(
+                                                               $( '<p>' ).msg( error.message.key, error.message.params || [] ),
+                                                               { recoverable: false }
+                                                       );
+                                               } );
+                                       } )
+                                       .then( null, function () {
+                                               // We failed when loading the error message, or it doesn't actually exist, fall back
+                                               return $.Deferred().resolve( new OO.ui.Error(
+                                                       $( '<p>' ).msg( 'api-error-unknownerror', JSON.stringify( stateDetails ) ),
+                                                       { recoverable: false }
+                                               ) );
+                                       } );
                        }
 
                        if ( error.code === 'protectedpage' ) {
                                        message = mw.message( 'api-error-unknownerror', JSON.stringify( stateDetails ) );
                                }
                        }
-                       return new OO.ui.Error(
+                       return $.Deferred().resolve( new OO.ui.Error(
                                $( '<p>' ).append( message.parseDom() ),
                                { recoverable: false }
-                       );
+                       ) );
                }
 
                if ( state === mw.Upload.State.WARNING ) {
                        // of importance. For example fixing the thumbnail like file name
                        // won't help the fact that the file already exists.
                        if ( warnings.stashfailed !== undefined ) {
-                               return new OO.ui.Error(
+                               return $.Deferred().resolve( new OO.ui.Error(
                                        $( '<p>' ).msg( 'api-error-stashfailed' ),
                                        { recoverable: false }
-                               );
+                               ) );
                        } else if ( warnings.exists !== undefined ) {
-                               return new OO.ui.Error(
+                               return $.Deferred().resolve( new OO.ui.Error(
                                        $( '<p>' ).msg( 'fileexists', 'File:' + warnings.exists ),
                                        { recoverable: false }
-                               );
+                               ) );
                        } else if ( warnings[ 'exists-normalized' ] !== undefined ) {
-                               return new OO.ui.Error(
+                               return $.Deferred().resolve( new OO.ui.Error(
                                        $( '<p>' ).msg( 'fileexists', 'File:' + warnings[ 'exists-normalized' ] ),
                                        { recoverable: false }
-                               );
+                               ) );
                        } else if ( warnings[ 'page-exists' ] !== undefined ) {
-                               return new OO.ui.Error(
+                               return $.Deferred().resolve( new OO.ui.Error(
                                        $( '<p>' ).msg( 'filepageexists', 'File:' + warnings[ 'page-exists' ] ),
                                        { recoverable: false }
-                               );
+                               ) );
                        } else if ( warnings.duplicate !== undefined ) {
-                               return new OO.ui.Error(
+                               return $.Deferred().resolve( new OO.ui.Error(
                                        $( '<p>' ).msg( 'api-error-duplicate', warnings.duplicate.length ),
                                        { recoverable: false }
-                               );
+                               ) );
                        } else if ( warnings[ 'thumb-name' ] !== undefined ) {
-                               return new OO.ui.Error(
+                               return $.Deferred().resolve( new OO.ui.Error(
                                        $( '<p>' ).msg( 'filename-thumb-name' ),
                                        { recoverable: false }
-                               );
+                               ) );
                        } else if ( warnings[ 'bad-prefix' ] !== undefined ) {
-                               return new OO.ui.Error(
+                               return $.Deferred().resolve( new OO.ui.Error(
                                        $( '<p>' ).msg( 'filename-bad-prefix', warnings[ 'bad-prefix' ] ),
                                        { recoverable: false }
-                               );
+                               ) );
                        } else if ( warnings[ 'duplicate-archive' ] !== undefined ) {
-                               return new OO.ui.Error(
+                               return $.Deferred().resolve( new OO.ui.Error(
                                        $( '<p>' ).msg( 'api-error-duplicate-archive', 1 ),
                                        { recoverable: false }
-                               );
+                               ) );
                        } else if ( warnings[ 'was-deleted' ] !== undefined ) {
-                               return new OO.ui.Error(
+                               return $.Deferred().resolve( new OO.ui.Error(
                                        $( '<p>' ).msg( 'api-error-was-deleted' ),
                                        { recoverable: false }
-                               );
+                               ) );
                        } else if ( warnings.badfilename !== undefined ) {
                                // Change the name if the current name isn't acceptable
                                // TODO This might not really be the best place to do this
                                this.setFilename( warnings.badfilename );
-                               return new OO.ui.Error(
+                               return $.Deferred().resolve( new OO.ui.Error(
                                        $( '<p>' ).msg( 'badfilename', warnings.badfilename )
-                               );
+                               ) );
                        } else {
-                               return new OO.ui.Error(
+                               return $.Deferred().resolve( new OO.ui.Error(
                                        // Let's get all the help we can if we can't pin point the error
                                        $( '<p>' ).msg( 'api-error-unknown-warning', JSON.stringify( stateDetails ) ),
                                        { recoverable: false }
-                               );
+                               ) );
                        }
                }
        };
index a2386b3..ab7a74e 100644 (file)
 ( function ( mw, $ ) {
        'use strict';
 
-       var $checkboxes = $( 'li input[type=checkbox]' );
+       $( function () {
+               // FIXME: This shouldn't be a global selector to avoid conflicts
+               // with unrelated content on the same page. (T131318)
+               var $checkboxes = $( 'li input[type="checkbox"]' );
 
-       function selectAll( check ) {
-               $checkboxes.prop( 'checked', check );
-       }
+               function selectAll( check ) {
+                       $checkboxes.prop( 'checked', check );
+               }
 
-       $( '.mw-checkbox-all' ).click( function ( e ) {
-               selectAll( true );
-               e.preventDefault();
-       } );
-       $( '.mw-checkbox-none' ).click( function ( e ) {
-               selectAll( false );
-               e.preventDefault();
-       } );
-       $( '.mw-checkbox-invert' ).click( function ( e ) {
-               $checkboxes.each( function () {
-                       $( this ).prop( 'checked', !$( this ).is( ':checked' ) );
+               $( '.mw-checkbox-all' ).click( function ( e ) {
+                       e.preventDefault();
+                       selectAll( true );
+               } );
+               $( '.mw-checkbox-none' ).click( function ( e ) {
+                       e.preventDefault();
+                       selectAll( false );
                } );
-               e.preventDefault();
+               $( '.mw-checkbox-invert' ).click( function ( e ) {
+                       e.preventDefault();
+                       $checkboxes.prop( 'checked', function ( i, val ) {
+                               return !val;
+                       } );
+               } );
+
        } );
 
 }( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/mediawiki.content.json.css b/resources/src/mediawiki/mediawiki.content.json.css
deleted file mode 100644 (file)
index 91fa02a..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/*!
- * CSS for styling HTML-formatted JSON Schema objects
- *
- * @file
- * @author Munaf Assaf <massaf@wikimedia.org>
- */
-
-.mw-json {
-       border-collapse: collapse;
-       border-spacing: 0;
-       font-style: normal;
-}
-
-.mw-json th,
-.mw-json td {
-       border: 1px solid #808080;
-       font-size: 16px;
-       padding: 0.5em 1em;
-}
-
-.mw-json .value,
-.mw-json-single-value {
-       background-color: #dcfae3;
-       font-family: monospace, monospace;
-       white-space: pre-wrap;
-}
-
-.mw-json-single-value {
-       background-color: #eee;
-}
-
-.mw-json-empty {
-       background-color: #fff;
-       font-style: italic;
-}
-
-.mw-json tr {
-       margin-bottom: 0.5em;
-       background-color: #eee;
-}
-
-.mw-json th {
-       background-color: #fff;
-       font-weight: normal;
-}
-
-.mw-json caption {
-       /* For stylistic reasons, suppress the caption of the outermost table */
-       display: none;
-}
-
-.mw-json table caption {
-       color: #808080;
-       display: inline-block;
-       font-size: 10px;
-       font-style: italic;
-       margin-bottom: 0.5em;
-       text-align: left;
-}
diff --git a/resources/src/mediawiki/mediawiki.content.json.less b/resources/src/mediawiki/mediawiki.content.json.less
new file mode 100644 (file)
index 0000000..91fa02a
--- /dev/null
@@ -0,0 +1,59 @@
+/*!
+ * CSS for styling HTML-formatted JSON Schema objects
+ *
+ * @file
+ * @author Munaf Assaf <massaf@wikimedia.org>
+ */
+
+.mw-json {
+       border-collapse: collapse;
+       border-spacing: 0;
+       font-style: normal;
+}
+
+.mw-json th,
+.mw-json td {
+       border: 1px solid #808080;
+       font-size: 16px;
+       padding: 0.5em 1em;
+}
+
+.mw-json .value,
+.mw-json-single-value {
+       background-color: #dcfae3;
+       font-family: monospace, monospace;
+       white-space: pre-wrap;
+}
+
+.mw-json-single-value {
+       background-color: #eee;
+}
+
+.mw-json-empty {
+       background-color: #fff;
+       font-style: italic;
+}
+
+.mw-json tr {
+       margin-bottom: 0.5em;
+       background-color: #eee;
+}
+
+.mw-json th {
+       background-color: #fff;
+       font-weight: normal;
+}
+
+.mw-json caption {
+       /* For stylistic reasons, suppress the caption of the outermost table */
+       display: none;
+}
+
+.mw-json table caption {
+       color: #808080;
+       display: inline-block;
+       font-size: 10px;
+       font-style: italic;
+       margin-bottom: 0.5em;
+       text-align: left;
+}
index 4cc7f09..c3464ea 100644 (file)
                return this.stop( true, true ).fadeOut();
        };
 
-       /**
-        * Bind a function to the jQuery object via live(), and also immediately trigger
-        * the function on the objects with an 'instant' parameter set to true.
-        *
-        * @method liveAndTestAtStart
-        * @deprecated since 1.24 Use .on() and .each() directly.
-        * @param {Function} callback
-        * @param {boolean|jQuery.Event} callback.immediate True when the event is called immediately,
-        *  an event object when triggered from an event.
-        * @chainable
-        * @return {jQuery}
-        */
-       mw.log.deprecate( $.fn, 'liveAndTestAtStart', function ( callback ) {
-               return this
-                       // Can't really migrate to .on() generically, needs knowledge of
-                       // calling code to know the correct selector. Fix callers and
-                       // get rid of this .liveAndTestAtStart() hack.
-                       .live( 'change', callback )
-                       .each( function () {
-                               callback.call( this, true );
-                       } );
-       } );
-
        function enhance( $root ) {
                var $matrixTooltips, $autocomplete,
                        // cache the separator to avoid object creation on each keypress
index 50fef14..44b9117 100644 (file)
@@ -15,6 +15,8 @@
                slice = Array.prototype.slice,
                parserDefaults = {
                        magic: {
+                               PAGENAME: mw.config.get( 'wgPageName' ),
+                               PAGENAMEE: mw.util.wikiUrlencode( mw.config.get( 'wgPageName' ) ),
                                SITENAME: mw.config.get( 'wgSiteName' )
                        },
                        // Whitelist for allowed HTML elements in wikitext.
index 1203b6a..942f4ae 100644 (file)
@@ -8,7 +8,6 @@
  * @singleton
  */
 /*jshint latedef:false */
-/*global sha1 */
 ( function ( $ ) {
        'use strict';
 
                trackHandlers = [],
                trackQueue = [];
 
+       /**
+        * FNV132 hash function
+        *
+        * This function implements the 32-bit version of FNV-1.
+        * It is equivalent to hash( 'fnv132', ... ) in PHP, except
+        * its output is base 36 rather than hex.
+        * See <https://en.wikipedia.org/wiki/FNV_hash_function>
+        *
+        * @private
+        * @param {string} str String to hash
+        * @return {string} hash as an seven-character base 36 string
+        */
+       function fnv132( str ) {
+               /*jshint bitwise:false */
+               var hash = 0x811C9DC5,
+                       i;
+
+               for ( i = 0; i < str.length; i++ ) {
+                       hash += ( hash << 1 ) + ( hash << 4 ) + ( hash << 7 ) + ( hash << 8 ) + ( hash << 24 );
+                       hash ^= str.charCodeAt( i );
+               }
+
+               hash = ( hash >>> 0 ).toString( 36 );
+               while ( hash.length < 7 ) {
+                       hash = '0' + hash;
+               }
+
+               return hash;
+       }
+
        /**
         * Create an object that can be read from or written to from methods that allow
         * interaction both with single and multiple properties at once.
                },
 
                /**
-                * Add (does not replace) parameters for `N$` placeholder values.
+                * Add (does not replace) parameters for `$N` placeholder values.
                 *
                 * @param {Array} parameters
                 * @chainable
                                cssBuffer = '',
                                cssBufferTimer = null,
                                cssCallbacks = $.Callbacks(),
-                               isIEto9 = 'documentMode' in document && document.documentMode <= 9,
                                isIE9 = document.documentMode === 9;
 
                        function getMarker() {
                         */
                        function newStyleTag( text, nextNode ) {
                                var s = document.createElement( 'style' );
-                               // Support: IE
-                               // Must attach style element to the document before setting cssText (T35305)
+
+                               s.appendChild( document.createTextNode( text ) );
                                if ( nextNode && nextNode.parentNode ) {
                                        nextNode.parentNode.insertBefore( s, nextNode );
                                } else {
                                        document.getElementsByTagName( 'head' )[ 0 ].appendChild( s );
                                }
-                               if ( s.styleSheet ) {
-                                       // Support: IE6-10
-                                       // Old IE ignores appended text nodes, access stylesheet directly.
-                                       s.styleSheet.cssText = text;
-                               } else {
-                                       // Standard behaviour
-                                       s.appendChild( document.createTextNode( text ) );
-                               }
+
                                return s;
                        }
 
                         * @param {Function} [callback]
                         */
                        function addEmbeddedCSS( cssText, callback ) {
-                               var $style, styleEl, newCssText;
+                               var $style, styleEl;
 
                                function fireCallbacks() {
                                        var oldCallbacks = cssCallbacks;
                                //
                                // Support: IE 6-9
                                // Try to re-use existing <style> tags due to the IE stylesheet limit (T33676).
-                               if ( isIEto9 ) {
+                               if ( isIE9 ) {
                                        $style = $( getMarker() ).prev();
                                        // Verify that the element before the marker actually is a <style> tag created
                                        // by mw.loader (not some other style tag, or e.g. a <meta> tag).
                                        if ( $style.data( 'ResourceLoaderDynamicStyleTag' ) ) {
                                                styleEl = $style[ 0 ];
-                                               // Support: IE 6-10
-                                               if ( styleEl.styleSheet ) {
-                                                       try {
-                                                               // Support: IE 9
-                                                               // We can't do styleSheet.cssText += cssText in IE9 because it mangles cssText on
-                                                               // write (removes @media queries). If we read it and used its value, we'd
-                                                               // accidentally apply @media-specific styles to all media. (T108727)
-                                                               if ( isIE9 ) {
-                                                                       newCssText = $style.data( 'ResourceLoaderDynamicStyleTag' ) + cssText;
-                                                                       styleEl.styleSheet.cssText = newCssText;
-                                                                       $style.data( 'ResourceLoaderDynamicStyleTag', newCssText );
-                                                               } else {
-                                                                       styleEl.styleSheet.cssText += cssText;
-                                                               }
-                                                       } catch ( e ) {
-                                                               mw.track( 'resourceloader.exception', { exception: e, source: 'stylesheet' } );
-                                                       }
-                                               } else {
-                                                       styleEl.appendChild( document.createTextNode( cssText ) );
-                                               }
+                                               styleEl.appendChild( document.createTextNode( cssText ) );
                                                fireCallbacks();
                                                return;
                                        }
 
                                $style = $( newStyleTag( cssText, getMarker() ) );
 
-                               if ( isIEto9 ) {
-                                       if ( isIE9 ) {
-                                               $style.data( 'ResourceLoaderDynamicStyleTag', cssText );
-                                       } else {
-                                               $style.data( 'ResourceLoaderDynamicStyleTag', true );
-                                       }
+                               if ( isIE9 ) {
+                                       $style.data( 'ResourceLoaderDynamicStyleTag', true );
                                }
 
                                fireCallbacks();
                                var hashes = $.map( modules, function ( module ) {
                                        return registry[ module ].version;
                                } );
-                               // Trim for consistency with server-side ResourceLoader::makeHash. It also helps
-                               // save precious space in the limited query string. Otherwise modules are more
-                               // likely to require multiple HTTP requests.
-                               return sha1( hashes.join( '' ) ).slice( 0, 12 );
+                               return fnv132( hashes.join( '' ) );
                        }
 
                        /**
                         */
                        function addLink( media, url ) {
                                var el = document.createElement( 'link' );
-                               // Support: IE
-                               // Insert in document *before* setting href
-                               $( getMarker() ).before( el );
+
                                el.rel = 'stylesheet';
                                if ( media && media !== 'all' ) {
                                        el.media = media;
                                // If you end up here from an IE exception "SCRIPT: Invalid property value.",
                                // see #addEmbeddedCSS, bug 31676, and bug 47277 for details.
                                el.href = url;
+
+                               $( getMarker() ).before( el );
                        }
 
                        /**
                                                }
                                                return;
                                        }
-                                       // Validate input
-                                       if ( typeof module !== 'string' ) {
-                                               throw new Error( 'module must be a string, not a ' + typeof module );
-                                       }
                                        if ( hasOwn.call( registry, module ) ) {
                                                throw new Error( 'module already registered: ' + module );
                                        }
                                 * @param {Object} [templates] List of key/value pairs to be added to mw#templates.
                                 */
                                implement: function ( module, script, style, messages, templates ) {
-                                       // Validate input
-                                       if ( typeof module !== 'string' ) {
-                                               throw new Error( 'module must be of type string, not ' + typeof module );
-                                       }
-                                       if ( script && !$.isFunction( script ) && !$.isArray( script ) && typeof script !== 'string' ) {
-                                               throw new Error( 'script must be of type function, array, or script; not ' + typeof script );
-                                       }
-                                       if ( style && !$.isPlainObject( style ) ) {
-                                               throw new Error( 'style must be of type object, not ' + typeof style );
-                                       }
-                                       if ( messages && !$.isPlainObject( messages ) ) {
-                                               throw new Error( 'messages must be of type object, not a ' + typeof messages );
-                                       }
-                                       if ( templates && !$.isPlainObject( templates ) ) {
-                                               throw new Error( 'templates must be of type object, not a ' + typeof templates );
-                                       }
                                        // Automatically register module
                                        if ( !hasOwn.call( registry, module ) ) {
                                                mw.loader.register( module );
                                 *         OO.compare( [ 1 ], [ 1 ] );
                                 *     } );
                                 *
-                                * @param {string|Array} dependencies Module name or array of modules names the callback
-                                *  dependends on to be ready before executing
+                                * @param {string|Array} dependencies Module name or array of modules names the
+                                *  callback depends on to be ready before executing
                                 * @param {Function} [ready] Callback to execute when all dependencies are ready
                                 * @param {Function} [error] Callback to execute if one or more dependencies failed
                                 * @return {jQuery.Promise}
                                        // Allow calling with a single dependency as a string
                                        if ( typeof dependencies === 'string' ) {
                                                dependencies = [ dependencies ];
-                                       } else if ( !$.isArray( dependencies ) ) {
-                                               // Invalid input
-                                               throw new Error( 'Dependencies must be a string or an array' );
                                        }
 
                                        if ( ready ) {
                                load: function ( modules, type ) {
                                        var filtered, l;
 
-                                       // Validate input
-                                       if ( typeof modules !== 'object' && typeof modules !== 'string' ) {
-                                               throw new Error( 'modules must be a string or an array, not a ' + typeof modules );
-                                       }
                                        // Allow calling with a url or single dependency as a string
                                        if ( typeof modules === 'string' ) {
                                                // "https://example.org/x.js", "http://example.org/x.js", "//example.org/x.js", "/x.js"
                                require: function ( moduleName ) {
                                        var state = mw.loader.getState( moduleName );
 
-                                       // Only ready mudules can be required
+                                       // Only ready modules can be required
                                        if ( state !== 'ready' ) {
                                                // Module may've forgotten to declare a dependency
                                                throw new Error( 'Module "' + moduleName + '" is not loaded.' );
index 2d603bf..7c7aca3 100644 (file)
                        mw.track( 'mediawiki.searchSuggest', {
                                action: 'render-one',
                                formData: formData,
-                               index: context.config.suggestions.indexOf( text ) + 1
+                               index: context.config.suggestions.indexOf( text )
                        } );
 
                        // this is the container <div>, jQueryfied
                }
 
                // The function used when the user makes a selection
-               function selectFunction( $input ) {
+               function selectFunction( $input, source ) {
                        var context = $input.data( 'suggestionsContext' ),
                                text = $input.val();
 
-                       mw.track( 'mediawiki.searchSuggest', {
-                               action: 'click-result',
-                               numberOfResults: context.config.suggestions.length,
-                               clickIndex: context.config.suggestions.indexOf( text ) + 1
-                       } );
+                       // Selecting via keyboard triggers a form submission. That will fire
+                       // the submit-form event in addition to this click-result event.
+                       if ( source !== 'keyboard' ) {
+                               mw.track( 'mediawiki.searchSuggest', {
+                                       action: 'click-result',
+                                       numberOfResults: context.config.suggestions.length,
+                                       index: context.config.suggestions.indexOf( text )
+                               } );
+                       }
 
                        // allow the form to be submitted
                        return true;
                        // linkParams object is modified and reused
                        formData.linkParams[ formData.textParam ] = query;
 
+                       mw.track( 'mediawiki.searchSuggest', {
+                               action: 'render-one',
+                               formData: formData,
+                               index: context.config.suggestions.indexOf( query )
+                       } );
+
                        if ( $el.children().length === 0 ) {
                                $el
                                        .append(
                        },
                        special: {
                                render: specialRenderFunction,
-                               select: function ( $input ) {
-                                       $input.closest( 'form' )
-                                               .append( $( '<input type="hidden" name="fulltext" value="1"/>' ) );
+                               select: function ( $input, source ) {
+                                       var context = $input.data( 'suggestionsContext' ),
+                                               text = $input.val();
+                                       if ( source === 'mouse' ) {
+                                               // mouse click won't trigger form submission, so we need to send a click event
+                                               mw.track( 'mediawiki.searchSuggest', {
+                                                       action: 'click-result',
+                                                       numberOfResults: context.config.suggestions.length,
+                                                       index: context.config.suggestions.indexOf( text )
+                                               } );
+                                       } else {
+                                               $input.closest( 'form' )
+                                                       .append( $( '<input type="hidden" name="fulltext" value="1"/>' ) );
+                                       }
                                        return true; // allow the form to be submitted
                                }
                        },
                                        action: 'submit-form',
                                        numberOfResults: context.config.suggestions.length,
                                        $form: context.config.$region.closest( 'form' ),
-                                       inputLocation: getInputLocation( context )
+                                       inputLocation: getInputLocation( context ),
+                                       index: context.config.suggestions.indexOf(
+                                               context.data.$textbox.val()
+                                       )
                                } );
                        } )
                        // If the form includes any fallback fulltext search buttons, remove them
diff --git a/resources/src/mediawiki/page/gallery-slideshow.js b/resources/src/mediawiki/page/gallery-slideshow.js
new file mode 100644 (file)
index 0000000..85ded44
--- /dev/null
@@ -0,0 +1,453 @@
+/*!
+ * mw.GallerySlideshow: Interface controls for the slideshow gallery
+ */
+( function ( mw, $, OO ) {
+       /**
+        * mw.GallerySlideshow encapsulates the user interface of the slideshow
+        * galleries. An object is instantiated for each `.mw-gallery-slideshow`
+        * element.
+        *
+        * @class mw.GallerySlideshow
+        * @uses mw.Title
+        * @uses mw.Api
+        * @param {jQuery} gallery The `<ul>` element of the gallery.
+        */
+       mw.GallerySlideshow = function ( gallery ) {
+               // Properties
+               this.$gallery = $( gallery );
+               this.$galleryCaption = this.$gallery.find( '.gallerycaption' );
+               this.$galleryBox = this.$gallery.find( '.gallerybox' );
+               this.$currentImage = null;
+               this.imageInfoCache = {};
+               if ( this.$gallery.parent().attr( 'id' ) !== 'mw-content-text' ) {
+                       this.$container = this.$gallery.parent();
+               }
+
+               // Initialize
+               this.drawCarousel();
+               this.setSizeRequirement();
+               this.toggleThumbnails( false );
+               this.showCurrentImage();
+
+               // Events
+               $( window ).on(
+                       'resize',
+                       OO.ui.debounce(
+                               this.setSizeRequirement.bind( this ),
+                               100
+                       )
+               );
+
+               // Disable thumbnails' link, instead show the image in the carousel
+               this.$galleryBox.on( 'click', function ( e ) {
+                       this.$currentImage = $( e.currentTarget );
+                       this.showCurrentImage();
+                       return false;
+               }.bind( this ) );
+       };
+
+       /* Properties */
+       /**
+        * @property {jQuery} $gallery The `<ul>` element of the gallery.
+        */
+
+       /**
+        * @property {jQuery} $galleryCaption The `<li>` that has the gallery caption.
+        */
+
+       /**
+        * @property {jQuery} $galleryBox Selection of `<li>` elements that have thumbnails.
+        */
+
+       /**
+        * @property {jQuery} $carousel The `<li>` elements that contains the carousel.
+        */
+
+       /**
+        * @property {jQuery} $interface The `<div>` elements that contains the interface buttons.
+        */
+
+       /**
+        * @property {jQuery} $img The `<img>` element that'll display the current image.
+        */
+
+       /**
+        * @property {jQuery} $imgLink The `<a>` element that links to the image's File page.
+        */
+
+       /**
+        * @property {jQuery} $imgCaption The `<p>` element that holds the image caption.
+        */
+
+       /**
+        * @property {jQuery} $imgContainer The `<div>` element that contains the image.
+        */
+
+       /**
+        * @property {jQuery} $currentImage The `<li>` element of the current image.
+        */
+
+       /**
+        * @property {jQuery} $container If the gallery contained in an element that is
+        *      not the main content element, then it stores that element.
+        */
+
+       /**
+        * @property {Object} imageInfoCache A key value pair of thumbnail URLs and image info.
+        */
+
+       /**
+        * @property {number} imageWidth Width of the image based on viewport size
+        */
+
+       /**
+        * @property {number} imageHeight Height of the image based on viewport size
+        *      the URLs in the required size.
+        */
+
+       /* Setup */
+       OO.initClass( mw.GallerySlideshow );
+
+       /* Methods */
+       /**
+        * Draws the carousel and the interface around it.
+        */
+       mw.GallerySlideshow.prototype.drawCarousel = function () {
+               var next, prev, toggle, interfaceElements, carouselStack;
+
+               this.$carousel = $( '<li>' ).addClass( 'gallerycarousel' );
+
+               // Buttons for the interface
+               prev = new OO.ui.ButtonWidget( {
+                       framed: false,
+                       icon: 'previous'
+               } ).on( 'click', this.prevImage.bind( this ) );
+
+               next = new OO.ui.ButtonWidget( {
+                       framed: false,
+                       icon: 'next'
+               } ).on( 'click', this.nextImage.bind( this ) );
+
+               toggle = new OO.ui.ButtonWidget( {
+                       framed: false,
+                       icon: 'imageGallery'
+               } ).on( 'click', this.toggleThumbnails.bind( this ) );
+
+               interfaceElements = new OO.ui.PanelLayout( {
+                       expanded: false,
+                       classes: [ 'mw-gallery-slideshow-buttons' ],
+                       $content: $( '<div>' ).append(
+                               prev.$element,
+                               toggle.$element,
+                               next.$element
+                       )
+               } );
+               this.$interface = interfaceElements.$element;
+
+               // Containers for the current image, caption etc.
+               this.$img = $( '<img>' );
+               this.$imgLink = $( '<a>' ).append( this.$img );
+               this.$imgCaption = $( '<p>' ).attr( 'class', 'mw-gallery-slideshow-caption' );
+               this.$imgContainer = $( '<div>' )
+                       .attr( 'class', 'mw-gallery-slideshow-img-container' )
+                       .append( this.$imgLink );
+
+               carouselStack = new OO.ui.StackLayout( {
+                       continuous: true,
+                       expanded: false,
+                       items: [
+                               interfaceElements,
+                               new OO.ui.PanelLayout( {
+                                       expanded: false,
+                                       $content: this.$imgContainer
+                               } ),
+                               new OO.ui.PanelLayout( {
+                                       expanded: false,
+                                       $content: this.$imgCaption
+                               } )
+                       ]
+               } );
+               this.$carousel.append( carouselStack.$element );
+
+               // Append below the caption or as the first element in the gallery
+               if ( this.$galleryCaption.length !== 0 ) {
+                       this.$galleryCaption.after( this.$carousel );
+               } else {
+                       this.$gallery.prepend( this.$carousel );
+               }
+       };
+
+       /**
+        * Sets the {@link #imageWidth} and {@link #imageHeight} properties
+        * based on the size of the window. Also flushes the
+        * {@link #imageInfoCache} as we'll now need URLs for a different
+        * size.
+        */
+       mw.GallerySlideshow.prototype.setSizeRequirement = function () {
+               var w, h;
+
+               if ( this.$container !== undefined ) {
+                       w = this.$container.width() * 0.9;
+                       h = ( this.$container.height() - this.getChromeHeight() ) * 0.9;
+               } else {
+                       w = this.$imgContainer.width();
+                       h = Math.min( $( window ).height() * ( 3 / 4 ), this.$imgContainer.width() ) - this.getChromeHeight();
+               }
+
+               // Only update and flush the cache if the size changed
+               if ( w !== this.imageWidth || h !== this.imageHeight ) {
+                       this.imageWidth = w;
+                       this.imageHeight = h;
+                       this.imageInfoCache = {};
+                       this.setImageSize();
+               }
+       };
+
+       /**
+        * Gets the height of the interface elements and the
+        * gallery's caption.
+        */
+       mw.GallerySlideshow.prototype.getChromeHeight = function () {
+               return this.$interface.outerHeight() + this.$galleryCaption.outerHeight();
+       };
+
+       /**
+        * Sets the height and width of {@link #$img} based on the
+        * proportion of the image and the values generated by
+        * {@link #setSizeRequirement}.
+        *
+        * @return {boolean} Whether or not the image was sized.
+        */
+       mw.GallerySlideshow.prototype.setImageSize = function () {
+               if ( this.$img === undefined || this.$thumbnail === undefined ) {
+                       return false;
+               }
+
+               // Reset height and width
+               this.$img
+                       .removeAttr( 'width' )
+                       .removeAttr( 'height' );
+
+               // Stretch image to take up the required size
+               if ( this.$thumbnail.width() > this.$thumbnail.height() ) {
+                       this.$img.attr( 'width', this.imageWidth + 'px' );
+               } else {
+                       this.$img.attr( 'height', this.imageHeight + 'px' );
+               }
+
+               // Make the image smaller in case the current image
+               // size is larger than the original file size.
+               this.getImageInfo( this.$thumbnail ).done( function ( info ) {
+                       // NOTE: There will be a jump when resizing the window
+                       // because the cache is cleared and this a new network request.
+                       if (
+                               info.thumbwidth < this.$img.width() ||
+                               info.thumbheight < this.$img.height()
+                       ) {
+                               this.$img.attr( 'width', info.thumbwidth + 'px' );
+                               this.$img.attr( 'height', info.thumbheight + 'px' );
+                       }
+               }.bind( this ) );
+
+               return true;
+       };
+
+       /**
+        * Displays the image set as {@link #$currentImage} in the carousel.
+        */
+       mw.GallerySlideshow.prototype.showCurrentImage = function () {
+               var imageLi = this.getCurrentImage(),
+                       caption = imageLi.find( '.gallerytext' );
+
+               // Highlight current thumbnail
+               this.$gallery
+                       .find( '.gallerybox.slideshow-current' )
+                       .removeClass( 'slideshow-current' );
+               imageLi.addClass( 'slideshow-current' );
+
+               // Show thumbnail stretched to the right size while the image loads
+               this.$thumbnail = imageLi.find( 'img' );
+               this.$img.attr( 'src', this.$thumbnail.attr( 'src' ) );
+               this.$imgLink.attr( 'href', imageLi.find( 'a' ).eq( 0 ).attr( 'href' ) );
+               this.setImageSize();
+
+               // Copy caption
+               this.$imgCaption
+                       .empty()
+                       .append( caption.clone() );
+
+               // Load image at the required size
+               this.loadImage( this.$thumbnail ).done( function ( info, $img ) {
+                       // Show this image to the user only if its still the current one
+                       if ( this.$thumbnail.attr( 'src' ) === $img.attr( 'src' ) ) {
+                               this.$img.attr( 'src', info.thumburl );
+                               this.setImageSize();
+
+                               // Keep the next image ready
+                               this.loadImage( this.getNextImage().find( 'img' ) );
+                       }
+               }.bind( this ) );
+       };
+
+       /**
+        * Loads the full image given the `<img>` element of the thumbnail.
+        *
+        * @param {Object} $img
+        * @return {jQuery.Promise} Resolves with the images URL and original
+        *      element once the image has loaded.
+        */
+       mw.GallerySlideshow.prototype.loadImage = function ( $img ) {
+               var img, d = $.Deferred();
+
+               this.getImageInfo( $img ).done( function ( info ) {
+                       img = new Image();
+                       img.src = info.thumburl;
+                       img.onload = function () {
+                               d.resolve( info, $img );
+                       };
+                       img.onerror = function () {
+                               d.reject();
+                       };
+               } ).fail( function () {
+                       d.reject();
+               } );
+
+               return d.promise();
+       };
+
+       /**
+        * Gets the image's info given an `<img>` element.
+        *
+        * @param {Object} $img
+        * @return {jQuery.Promise} Resolves with the image's info.
+        */
+       mw.GallerySlideshow.prototype.getImageInfo = function ( $img ) {
+               var api, title, params,
+                       imageSrc = $img.attr( 'src' );
+
+               if ( this.imageInfoCache[ imageSrc ] === undefined ) {
+                       api = new mw.Api();
+                       // TODO: This supports only gallery of images
+                       title = new mw.Title.newFromImg( $img );
+                       params = {
+                               action: 'query',
+                               formatversion: 2,
+                               titles: title.toString(),
+                               prop: 'imageinfo',
+                               iiprop: 'url'
+                       };
+
+                       // Check which dimension we need to request, based on
+                       // image and container proportions.
+                       if ( this.getDimensionToRequest( $img ) === 'height' ) {
+                               params.iiurlheight = this.imageHeight;
+                       } else {
+                               params.iiurlwidth = this.imageWidth;
+                       }
+
+                       this.imageInfoCache[ imageSrc ] = api.get( params ).then( function ( data ) {
+                               if ( OO.getProp( data, 'query', 'pages', 0, 'imageinfo', 0, 'thumburl' ) !== undefined ) {
+                                       return data.query.pages[ 0 ].imageinfo[ 0 ];
+                               } else {
+                                       return $.Deferred().reject();
+                               }
+                       } );
+               }
+
+               return this.imageInfoCache[ imageSrc ];
+       };
+
+       /**
+        * Given an image, the method checks whether to use the height
+        * or the width to request the larger image.
+        *
+        * @param {jQuery} $img
+        * @return {string}
+        */
+       mw.GallerySlideshow.prototype.getDimensionToRequest = function ( $img ) {
+               var ratio = $img.width() / $img.height();
+
+               if ( this.imageHeight * ratio <= this.imageWidth ) {
+                       return 'height';
+               } else {
+                       return 'width';
+               }
+       };
+
+       /**
+        * Toggles visibility of the thumbnails.
+        *
+        * @param {boolean} show Optional argument to control the state
+        */
+       mw.GallerySlideshow.prototype.toggleThumbnails = function ( show ) {
+               this.$galleryBox.toggle( show );
+               this.$carousel.toggleClass( 'mw-gallery-slideshow-thumbnails-toggled', show );
+       };
+
+       /**
+        * Getter method for {@link #$currentImage}
+        *
+        * @return {jQuery}
+        */
+       mw.GallerySlideshow.prototype.getCurrentImage = function () {
+               this.$currentImage = this.$currentImage || this.$galleryBox.eq( 0 );
+               return this.$currentImage;
+       };
+
+       /**
+        * Gets the image after the current one. Returns the first image if
+        * the current one is the last.
+        *
+        * @return {jQuery}
+        */
+       mw.GallerySlideshow.prototype.getNextImage = function () {
+               // Not the last image in the gallery
+               if ( this.$currentImage.next( '.gallerybox' )[ 0 ] !== undefined ) {
+                       return this.$currentImage.next( '.gallerybox' );
+               } else {
+                       return this.$galleryBox.eq( 0 );
+               }
+       };
+
+       /**
+        * Gets the image before the current one. Returns the last image if
+        * the current one is the first.
+        *
+        * @return {jQuery}
+        */
+       mw.GallerySlideshow.prototype.getPrevImage = function () {
+               // Not the first image in the gallery
+               if ( this.$currentImage.prev( '.gallerybox' )[ 0 ] !== undefined ) {
+                       return this.$currentImage.prev( '.gallerybox' );
+               } else {
+                       return this.$galleryBox.last();
+               }
+       };
+
+       /**
+        * Sets the {@link #$currentImage} to the next one and shows
+        * it in the carousel
+        */
+       mw.GallerySlideshow.prototype.nextImage = function () {
+               this.$currentImage = this.getNextImage();
+               this.showCurrentImage();
+       };
+
+       /**
+        * Sets the {@link #$currentImage} to the previous one and shows
+        * it in the carousel
+        */
+       mw.GallerySlideshow.prototype.prevImage = function () {
+               this.$currentImage = this.getPrevImage();
+               this.showCurrentImage();
+       };
+
+       // Bootstrap all slideshow galleries
+       $( function () {
+               $( '.mw-gallery-slideshow' ).each( function () {
+                       /*jshint -W031 */
+                       new mw.GallerySlideshow( this );
+                       /*jshint +W031 */
+               } );
+       } );
+}( mediaWiki, jQuery, OO ) );
index 4d43e6a..dabf475 100644 (file)
@@ -45,6 +45,16 @@ div.gallerytext {
        word-wrap: break-word;
 }
 
+.galleryfilename {
+       display: block;
+}
+
+.galleryfilename-truncate {
+       white-space: nowrap;
+       overflow: hidden;
+       text-overflow: ellipsis;
+}
+
 /* new gallery stuff */
 ul.mw-gallery-nolines li.gallerybox div.thumb {
        background-color: transparent;
@@ -90,12 +100,83 @@ ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapp
        bottom: 0;
        left: 0; /* Needed for IE */
        height: auto;
+       max-height: 40%;
+       overflow: hidden;
        font-weight: bold;
        margin: 2px; /* correspond to style on div.thumb */
 }
 
+ul.mw-gallery-packed-hover li.gallerybox:hover div.gallerytextwrapper p,
+ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper p,
+ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper p {
+       text-overflow: ellipsis;
+       white-space: nowrap;
+       overflow: hidden;
+}
+
+ul.mw-gallery-packed-hover li.gallerybox div.gallerytextwrapper:hover,
+ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper:hover,
+ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper:hover {
+       overflow: visible;
+       max-height: none;
+}
+
+ul.mw-gallery-packed-hover li.gallerybox div.gallerytextwrapper:hover p,
+ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper:hover p,
+ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper:hover p {
+       text-overflow: clip;
+       white-space: normal;
+       overflow: visible;
+}
+
 ul.mw-gallery-packed-hover,
 ul.mw-gallery-packed-overlay,
 ul.mw-gallery-packed {
        text-align: center;
 }
+
+/* Slideshow */
+ul.gallery.mw-gallery-slideshow {
+       display: block;
+       margin: 4em 0;
+}
+
+ul.gallery.mw-gallery-slideshow .gallerycaption {
+       font-size: 1.3em;
+       margin: 0;
+}
+
+ul.gallery.mw-gallery-slideshow .gallerycarousel.mw-gallery-slideshow-thumbnails-toggled {
+       margin-bottom: 1.3em;
+}
+
+ul.gallery.mw-gallery-slideshow .mw-gallery-slideshow-buttons {
+       opacity: 0.5;
+       padding: 1.3em 0;
+}
+
+ul.gallery.mw-gallery-slideshow .mw-gallery-slideshow-buttons .oo-ui-buttonElement {
+       margin: 0 2em;
+}
+
+.mw-gallery-slideshow li.gallerybox.slideshow-current {
+       background: #efefef;
+}
+
+.mw-gallery-slideshow .gallerybox > div {
+       max-width: 120px;
+}
+
+ul.mw-gallery-slideshow li.gallerybox div.thumb {
+       border: none;
+       background: transparent;
+}
+
+ul.mw-gallery-slideshow li.gallerycarousel {
+       display: block;
+       text-align: center;
+}
+
+.mw-gallery-slideshow-img-container a {
+       display: block;
+}
index cd37e33..282799a 100644 (file)
@@ -1,10 +1,5 @@
 ( function ( mw, $ ) {
 
-       // Support: MediaWiki < 1.26
-       // Cached HTML will not yet have this from OutputPage::getHeadScripts.
-       document.documentElement.className = document.documentElement.className
-               .replace( /(^|\s)client-nojs(\s|$)/, '$1client-js$2' );
-
        mw.page = {};
 
        $( function () {
index 312e745..62ee94e 100644 (file)
@@ -3,7 +3,7 @@
  *
  * This file is where we decide whether to initialise the modern run-time.
  */
-/*jshint unused: false, evil: true */
+/*jshint unused: false */
 /*globals mw, RLQ: true, NORLQ: true, $VARS, $CODE, performance */
 
 var mediaWikiLoadStart = ( new Date() ).getTime(),
index 8b100a2..2bb1d2e 100644 (file)
@@ -143,6 +143,7 @@ $wgAutoloadClasses += [
        'NewParserTest' => "$testDir/phpunit/includes/parser/NewParserTest.php",
        'MediaWikiParserTest' => "$testDir/phpunit/includes/parser/MediaWikiParserTest.php",
        'ParserTest' => "$testDir/parser/parserTest.inc",
+       'ParserTestResultNormalizer' => "$testDir/parser/parserTest.inc",
        'ParserTestParserHook' => "$testDir/parser/parserTestsParserHook.php",
 
        # tests/phpunit/includes/site
index fa0570c..d9b4f52 100644 (file)
@@ -11,5 +11,5 @@ When(/^I submit the form$/) do
 end
 
 Then(/^an error message is displayed$/) do
-  expect(on(CreateAccountPage).error_message_element.class_name).to eq 'errorbox'
+  expect(on(CreateAccountPage).error_message_element).to exist
 end
index bda0faa..9b35e99 100644 (file)
@@ -23,11 +23,11 @@ When(/^I log in without entering password$/) do
 end
 
 Then(/^error box should be visible$/) do
-  expect(on(LoginErrorPage).error_box_element).to be_visible
+  expect(on(LoginPage).error_message_element).to exist
 end
 
 Then(/^error box should not be visible$/) do
-  expect(on(LoginErrorPage).error_box_element).not_to be_visible
+  expect(on(LoginPage).error_message_element).not_to exist
 end
 
 Then(/^feedback should be (.+)$/) do |feedback|
index 9c1c3ba..20e2744 100644 (file)
@@ -4,5 +4,5 @@ class CreateAccountPage
   page_url '<%=params[:page_title]%>'
 
   button(:create_account, id: 'wpCreateaccount')
-  div(:error_message, id: 'mw-createacct-status-area')
+  element(:error_message, css: 'div#userloginForm div.error')
 end
diff --git a/tests/browser/features/support/pages/login_error_page.rb b/tests/browser/features/support/pages/login_error_page.rb
deleted file mode 100644 (file)
index 9a1805f..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-class LoginErrorPage
-  include PageObject
-
-  div(:error_box, class: 'errorbox')
-end
index 8ef1e44..4727318 100644 (file)
@@ -5,6 +5,7 @@ class LoginPage
 
   page_url 'Special:UserLogin'
 
+  element(:error_message, css: 'div#userloginForm div.error')
   div(:feedback, class: 'errorbox')
   button(:login, id: 'wpLoginAttempt')
   li(:logout, id: 'pt-logout')
index 132743f..9adc3e6 100644 (file)
@@ -82,6 +82,9 @@ class ParserTest {
 
        public $regex = "";
        private $savedGlobals = [];
+       private $useDwdiff = false;
+       private $markWhitespace = false;
+       private $normalizationFunctions = [];
 
        /**
         * Sets terminal colorization and diff/quick modes depending on OS and
@@ -116,6 +119,18 @@ class ParserTest {
                                || isset( $options['compare'] ) ) ); // redundant output
 
                $this->showOutput = isset( $options['show-output'] );
+               $this->useDwdiff = isset( $options['dwdiff'] );
+               $this->markWhitespace = isset( $options['mark-ws'] );
+
+               if ( isset( $options['norm'] ) ) {
+                       foreach ( explode( ',', $options['norm'] ) as $func ) {
+                               if ( in_array( $func, [ 'removeTbody', 'trimWhitespace' ] ) ) {
+                                       $this->normalizationFunctions[] = $func;
+                               } else {
+                                       echo "Warning: unknown normalization option \"$func\"\n";
+                               }
+                       }
+               }
 
                if ( isset( $options['filter'] ) ) {
                        $options['regex'] = $options['filter'];
@@ -149,7 +164,7 @@ class ParserTest {
                $this->runParsoid = isset( $options['run-parsoid'] );
 
                $this->djVuSupport = new DjVuSupport();
-               $this->tidySupport = new TidySupport();
+               $this->tidySupport = new TidySupport( isset( $options['use-tidy-config'] ) );
                if ( !$this->tidySupport->isEnabled() ) {
                        echo "Warning: tidy is not installed, skipping some tests\n";
                }
@@ -700,6 +715,11 @@ class ParserTest {
 
                $this->teardownGlobals();
 
+               if ( count( $this->normalizationFunctions ) ) {
+                       $result = ParserTestResultNormalizer::normalize( $result, $this->normalizationFunctions );
+                       $out = ParserTestResultNormalizer::normalize( $out, $this->normalizationFunctions );
+               }
+
                $testResult = new ParserTestResult( $desc );
                $testResult->expected = $result;
                $testResult->actual = $out;
@@ -834,8 +854,6 @@ class ParserTest {
         * @return RequestContext
         */
        private function setupGlobals( $opts = '', $config = '' ) {
-               global $IP;
-
                # Find out values for some special options.
                $lang =
                        self::getOptionValue( 'language', $opts, 'en' );
@@ -919,12 +937,8 @@ class ParserTest {
                        'wgDisableLangConversion' => false,
                        'wgDisableTitleConversion' => false,
                        // Tidy options.
-                       'wgUseTidy' => isset( $opts['tidy'] ),
-                       'wgTidyConfig' => null,
-                       'wgDebugTidy' => false,
-                       'wgTidyConf' => $IP . '/includes/tidy/tidy.conf',
-                       'wgTidyOpts' => '',
-                       'wgTidyInternal' => $this->tidySupport->isInternal(),
+                       'wgUseTidy' => false,
+                       'wgTidyConfig' => isset( $opts['tidy'] ) ? $this->tidySupport->getConfig() : null
                ];
 
                if ( $config ) {
@@ -1137,6 +1151,19 @@ class ParserTest {
                        'fileExists' => true
                ], $this->db->timestamp( '20010115123500' ), $user );
 
+               $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Audio.oga' ) );
+               $image->recordUpload2( '', 'An awesome hitsong', 'Will it play', [
+                       'size' => 12345,
+                       'width' => 0,
+                       'height' => 0,
+                       'bits' => 0,
+                       'media_type' => MEDIATYPE_AUDIO,
+                       'mime' => 'application/ogg',
+                       'metadata' => serialize( [] ),
+                       'sha1' => Wikimedia\base_convert( '', 16, 36, 31 ),
+                       'fileExists' => true
+               ], $this->db->timestamp( '20010115123500' ), $user );
+
                # A DjVu file
                $image = wfLocalFile( Title::makeTitle( NS_FILE, 'LoremIpsum.djvu' ) );
                $image->recordUpload2( '', 'Upload a DjVu', 'A DjVu', [
@@ -1252,6 +1279,8 @@ class ParserTest {
                copy( "$IP/tests/phpunit/data/parser/LoremIpsum.djvu", "$dir/5/5f/LoremIpsum.djvu" );
                wfMkdirParents( $dir . '/0/00', null, __METHOD__ );
                copy( "$IP/tests/phpunit/data/parser/320x240.ogv", "$dir/0/00/Video.ogv" );
+               wfMkdirParents( $dir . '/4/41', null, __METHOD__ );
+               copy( "$IP/tests/phpunit/data/media/say-test.ogg", "$dir/4/41/Audio.oga" );
 
                return;
        }
@@ -1301,6 +1330,7 @@ class ParserTest {
                                "$dir/thumb/0/00/Video.ogv/270px--Video.ogv.jpg",
                                "$dir/thumb/0/00/Video.ogv/320px-seek=2-Video.ogv.jpg",
                                "$dir/thumb/0/00/Video.ogv/320px-seek=3.3666666666667-Video.ogv.jpg",
+                               "$dir/4/41/Audio.oga",
                        ]
                );
 
@@ -1330,6 +1360,8 @@ class ParserTest {
                                "$dir/thumb/5/5f",
                                "$dir/thumb/5",
                                "$dir/thumb",
+                               "$dir/4/41",
+                               "$dir/4",
                                "$dir/math/f/a/5",
                                "$dir/math/f/a",
                                "$dir/math/f",
@@ -1451,6 +1483,16 @@ class ParserTest {
        protected function quickDiff( $input, $output,
                $inFileTail = 'expected', $outFileTail = 'actual'
        ) {
+               if ( $this->markWhitespace ) {
+                       $pairs = [
+                               "\n" => '¶',
+                               ' ' => '·',
+                               "\t" => '→'
+                       ];
+                       $input = strtr( $input, $pairs );
+                       $output = strtr( $output, $pairs );
+               }
+
                # Windows, or at least the fc utility, is retarded
                $slash = wfIsWindows() ? '\\' : '/';
                $prefix = wfTempDir() . "{$slash}mwParser-" . mt_rand();
@@ -1466,14 +1508,22 @@ class ParserTest {
 
                global $wgDiff3;
                // we assume that people with diff3 also have usual diff
-               $shellCommand = ( wfIsWindows() && !$wgDiff3 ) ? 'fc' : 'diff -au';
+               if ( $this->useDwdiff ) {
+                       $shellCommand = 'dwdiff -Pc';
+               } else {
+                       $shellCommand = ( wfIsWindows() && !$wgDiff3 ) ? 'fc' : 'diff -au';
+               }
 
                $diff = wfShellExec( "$shellCommand $shellInfile $shellOutfile" );
 
                unlink( $infile );
                unlink( $outfile );
 
-               return $this->colorDiff( $diff );
+               if ( $this->useDwdiff ) {
+                       return $diff;
+               } else {
+                       return $this->colorDiff( $diff );
+               }
        }
 
        /**
@@ -1681,3 +1731,84 @@ class ParserTest {
                return true;
        }
 }
+
+class ParserTestResultNormalizer {
+       protected $doc, $xpath, $invalid;
+
+       public static function normalize( $text, $funcs ) {
+               $norm = new self( $text );
+               if ( $norm->invalid ) {
+                       return $text;
+               }
+               foreach ( $funcs as $func ) {
+                       $norm->$func();
+               }
+               return $norm->serialize();
+       }
+
+       protected function __construct( $text ) {
+               $this->doc = new DOMDocument( '1.0', 'utf-8' );
+
+               // Note: parsing a supposedly XHTML document with an XML parser is not
+               // guaranteed to give accurate results. For example, it may introduce
+               // differences in the number of line breaks in <pre> tags.
+
+               MediaWiki\suppressWarnings();
+               if ( !$this->doc->loadXML( '<html><body>' . $text . '</body></html>' ) ) {
+                       $this->invalid = true;
+               }
+               MediaWiki\restoreWarnings();
+               $this->xpath = new DOMXPath( $this->doc );
+               $this->body = $this->xpath->query( '//body' )->item( 0 );
+       }
+
+       protected function removeTbody() {
+               foreach ( $this->xpath->query( '//tbody' ) as $tbody ) {
+                       while ( $tbody->firstChild ) {
+                               $child = $tbody->firstChild;
+                               $tbody->removeChild( $child );
+                               $tbody->parentNode->insertBefore( $child, $tbody );
+                       }
+                       $tbody->parentNode->removeChild( $tbody );
+               }
+       }
+
+       /**
+        * The point of this function is to produce a normalized DOM in which
+        * Tidy's output matches the output of html5depurate. Tidy both trims
+        * and pretty-prints, so this requires fairly aggressive treatment.
+        *
+        * In particular, note that Tidy converts <pre>x</pre> to <pre>\nx\n</pre>,
+        * which theoretically affects display since the second line break is not
+        * ignored by compliant HTML parsers.
+        *
+        * This function also removes empty elements, as does Tidy.
+        */
+       protected function trimWhitespace() {
+               foreach ( $this->xpath->query( '//text()' ) as $child ) {
+                       if ( strtolower( $child->parentNode->nodeName ) === 'pre' ) {
+                               // Just trim one line break from the start and end
+                               if ( substr_compare( $child->data, "\n", 0 ) === 0 ) {
+                                       $child->data = substr( $child->data, 1 );
+                               }
+                               if ( substr_compare( $child->data, "\n", -1 ) === 0 ) {
+                                       $child->data = substr( $child->data, 0, -1 );
+                               }
+                       } else {
+                               // Trim all whitespace
+                               $child->data = trim( $child->data );
+                       }
+                       if ( $child->data === '' ) {
+                               $child->parentNode->removeChild( $child );
+                       }
+               }
+       }
+
+       /**
+        * Serialize the XML DOM for comparison purposes. This does not generate HTML.
+        */
+       protected function serialize() {
+               return strtr( $this->doc->saveXML( $this->body ),
+                       [ '<body>' => '', '</body>' => '' ] );
+       }
+}
index 1f1d53b..d6d2b29 100644 (file)
@@ -35,7 +35,7 @@
 #
 # You can also set the following parser properties via test options:
 #  wgEnableUploads, wgAllowExternalImages, wgMaxTocLevel,
-#  wgLinkHolderBatchSize, wgRawHtml
+#  wgLinkHolderBatchSize, wgRawHtml, wgInterwikiMagic
 #
 # For testing purposes, temporary articles can created:
 # !!article / NAMESPACE:TITLE / !!text / ARTICLE TEXT / !!endarticle
@@ -6572,13 +6572,15 @@ T107652: <ref>s in templates that also generate table cell attributes should be
 
 !! test
 Table with row followed by newlines and table heading
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 {|
 |-
 
 ! foo
 |}
-!! html
+!! html/*
 <table>
 
 
@@ -6590,13 +6592,15 @@ Table with row followed by newlines and table heading
 
 !! test
 Table with empty line following the start tag
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 {|
 
 |-
 | foo
 |}
-!! html
+!! html/*
 <table>
 
 
@@ -7082,12 +7086,14 @@ parsoid=wt2html
 </tbody></table>
 !! end
 
+# T137406: Whitespace in the HTML
 !! test
-Strip unsupported table tags
+1. Generate correct wikitext for tables with thead/tbody/tfoot
 !! options
 parsoid=html2wt
 !! html/parsoid
 <table>
+<caption>Test</caption>
 <thead>
 <tr>
 <th>Month</th>
@@ -7113,20 +7119,53 @@ parsoid=html2wt
 </table>
 !! wikitext
 {|
-
+|+Test
 !Month
 !Savings
-
+|-
 |January
 |$100
-
 |-
 |February
 |$80
-
+|-
 |Sum
 |$180
+|}
+!! html/php+tidy
+<table>
+<caption>Test</caption>
+<tr>
+<th>Month</th>
+<th>Savings</th>
+</tr>
+<tr>
+<td>January</td>
+<td>$100</td>
+</tr>
+<tr>
+<td>February</td>
+<td>$80</td>
+</tr>
+<tr>
+<td>Sum</td>
+<td>$180</td>
+</tr>
+</table>
+!! end
 
+# T137406: No whitespace in the HTML
+!! test
+2. Generate correct wikitext for tables with thead/tbody/tfoot
+!! options
+parsoid=html2wt
+!! html/parsoid
+<table><thead><tr><th>heading</th></tr></thead><tbody><tr><td>foo</td></tr></tbody></table>
+!! wikitext
+{|
+!heading
+|-
+|foo
 |}
 !! end
 
@@ -7243,6 +7282,56 @@ parsoid=html2wt
 </table>
 !! end
 
+!! test
+Serialize wikitext list items as HTML list items when embedded in a HTML list
+!! options
+parsoid=html2wt
+!! html
+<ul data-parsoid='{"stx": "html"}'>
+<li data-parsoid='{}'>a</li>
+<li>b</li>
+</ul>
+!! wikitext
+<ul>
+<li>a</li>
+<li>b</li>
+</ul>
+!! end
+
+# SSS FIXME: Is this actually a good thing given the
+# odd nested list output that is generated by MW?
+# <ul><li>foo<ul>..</ul></li></ul> instead of
+# <ul><li>foo</li><ul>..</ul></ul>
+!! test
+Wikitext lists can be nested inside HTML lists
+!! options
+parsoid=html2wt
+!! html
+<ul data-parsoid='{"stx": "html"}'>
+<li data-parsoid='{"stx": "html"}'>a
+<ul><li>b</li></ul>
+</li>
+</ul>
+
+<ul data-parsoid='{"stx": "html"}'>
+<li>x
+<ul><li>y</li></ul>
+</li>
+</ul>
+!! wikitext
+<ul>
+<li>a
+* b
+</li>
+</ul>
+
+<ul>
+<li>x
+* y
+</li>
+</ul>
+!! end
+
 ###
 ### Internal links
 ###
@@ -8261,8 +8350,6 @@ parsoid=wt2html,wt2wt,html2html
 
 !! test
 Interlanguage link
-!! options
-parsoid=wt2html,wt2wt,html2html
 !! wikitext
 Blah blah blah
 [[zh:Chinese]]
@@ -8274,6 +8361,7 @@ Blah blah blah
 <link rel="mw:PageProp/Language" href="http://zh.wikipedia.org/wiki/Chinese"/>
 !! end
 
+## parsoid html2wt will lose the space variations
 !! test
 Interlanguage link with spacing
 !! options
@@ -8291,8 +8379,6 @@ Blah blah blah
 
 !! test
 Double interlanguage link
-!! options
-parsoid=wt2html,wt2wt,html2html
 !! wikitext
 Blah blah blah
 [[es:Spanish]]
@@ -8306,6 +8392,7 @@ Blah blah blah
 <link rel="mw:PageProp/Language" href="http://zh.wikipedia.org/wiki/Chinese"/>
 !! end
 
+## parsoid html2wt will lose the space variations
 !! test
 Interlanguage link variations
 !! options
@@ -8325,6 +8412,7 @@ Blah blah blah
 <link rel="mw:PageProp/Language" href="http://es.wikipedia.org/wiki/Foo_bar" />
 !! end
 
+## parsoid html2wt will normalize the space to _
 !! test
 Space and question mark encoding in interlanguage links (T95473)
 !! options
@@ -8385,6 +8473,34 @@ Blah blah blah
 <link rel="mw:PageProp/Language" title="Multilingual" href="http://wikisource.org/wiki/Article"/>
 !! end
 
+## PHP parser tests script needs an update
+## Parsoid html2wt will normalize output to [[:zh:Chinese]]
+!! test
+Language links render as inline links if $wgInterwikiMagic=false
+!! options
+wgInterwikiMagic=false
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+Blah blah blah
+[[zh:Chinese]]
+!! html/parsoid
+<p>Blah blah blah <a rel="mw:ExtLink" href="http://zh.wikipedia.org/wiki/Chinese" title="zh:Chinese">zh:Chinese</a></p>
+!! end
+
+## PHP parser tests script needs an update
+## Parsoid html2wt will normalize output to [[:zh:Chinese]]
+!! test
+Language links render as inline links in the Talk namespace
+!! options
+title=Talk:Foo
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+Blah blah blah
+[[zh:Chinese]]
+!! html/parsoid
+<p>Blah blah blah <a rel="mw:ExtLink" href="http://zh.wikipedia.org/wiki/Chinese" title="zh:Chinese">zh:Chinese</a></p>
+!! end
+
 !! test
 Parsoid-specific test: Wikilinks with &nbsp; should RT properly
 !! options
@@ -9870,7 +9986,7 @@ Magic Word: {{NUMBEROFFILES}}
 !! wikitext
 {{NUMBEROFFILES}}
 !! html
-<p>6
+<p>7
 </p>
 !! end
 
@@ -10939,7 +11055,7 @@ int keyword - non-existing message
 !! wikitext
 {{int:var}}
 !! html
-<p>&lt;var&gt;
+<p>⧼var⧽
 </p>
 !! end
 
@@ -18742,7 +18858,7 @@ File:Foobar.jpg
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
                        <div class="thumb" style="height: 150px;">Nonexistent.jpg</div>
                        <div class="gallerytext">
-<p><a href="/wiki/File:Nonexistent.jpg" title="File:Nonexistent.jpg">Nonexistent.jpg</a><br />
+<p><a href="/wiki/File:Nonexistent.jpg" class="galleryfilename galleryfilename-truncate" title="File:Nonexistent.jpg">Nonexistent.jpg</a>
 caption
 </p>
                        </div>
@@ -18750,14 +18866,14 @@ caption
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
                        <div class="thumb" style="height: 150px;">Nonexistent.jpg</div>
                        <div class="gallerytext">
-<p><a href="/wiki/File:Nonexistent.jpg" title="File:Nonexistent.jpg">Nonexistent.jpg</a><br />
+<p><a href="/wiki/File:Nonexistent.jpg" class="galleryfilename galleryfilename-truncate" title="File:Nonexistent.jpg">Nonexistent.jpg</a>
 </p>
                        </div>
                </div></li>
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
                        <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
-<p><a href="/wiki/File:Foobar.jpg" title="File:Foobar.jpg">Foobar.jpg</a><br />
+<p><a href="/wiki/File:Foobar.jpg" class="galleryfilename galleryfilename-truncate" title="File:Foobar.jpg">Foobar.jpg</a>
 some <b>caption</b> <a href="/wiki/Main_Page" title="Main Page">Main Page</a>
 </p>
                        </div>
@@ -18765,7 +18881,7 @@ some <b>caption</b> <a href="/wiki/Main_Page" title="Main Page">Main Page</a>
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
                        <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
-<p><a href="/wiki/File:Foobar.jpg" title="File:Foobar.jpg">Foobar.jpg</a><br />
+<p><a href="/wiki/File:Foobar.jpg" class="galleryfilename galleryfilename-truncate" title="File:Foobar.jpg">Foobar.jpg</a>
 </p>
                        </div>
                </div></li>
@@ -23091,14 +23207,12 @@ Tables: 2c. Nested in td -- no escaping needed
 parsoid=html2wt
 !! html/*
 <table>
-
 <tr>
 <td>foo!!bar
 </td></tr></table>
 
 !! wikitext
 {|
-
 |foo!!bar
 |}
 !! end
@@ -23109,14 +23223,12 @@ Tables: 3a. Nested in th
 parsoid=html2wt
 !! html/*
 <table>
-
 <tr>
 <th>foo!bar
 </th></tr></table>
 
 !! wikitext
 {|
-
 !foo!bar
 |}
 !! end
@@ -23183,7 +23295,6 @@ Tables: 4a. Escape -
 parsoid=html2wt
 !! html/*
 <table>
-
 <tr>
 <th>-bar
 </th></tr>
@@ -23193,9 +23304,7 @@ parsoid=html2wt
 
 !! wikitext
 {|
-
 !-bar
-
 |-
 |<nowiki>-bar</nowiki>
 |}
@@ -23207,7 +23316,6 @@ Tables: 4b. Escape +
 parsoid=html2wt
 !! html/*
 <table>
-
 <tr>
 <th>+bar
 </th></tr>
@@ -23217,9 +23325,7 @@ parsoid=html2wt
 
 !! wikitext
 {|
-
 !+bar
-
 |-
 |<nowiki>+bar</nowiki>
 |}
@@ -26990,6 +27096,21 @@ B <ref group="X" name="b" />
 </references>
 !! end
 
+!! test
+DOMDiff: Edits to content nested in elements with templated attributes should not be lost (T139388)
+!! options
+parsoid={
+  "modes": ["selser"],
+  "changes": [
+    [ "div:first-child", "text", "bar" ]
+  ]
+}
+!! wikitext
+<div style="{{1x|color:red;}}%">foo</div>
+!! wikitext/edited
+<div style="{{1x|color:red;}}%">bar</div>
+!! end
+
 !! test
 Empty LI (T49673)
 !! wikitext
@@ -27000,8 +27121,22 @@ Empty LI (T49673)
 !! html/php+tidy
 <ul>
 <li>a</li>
-<li class="mw-empty-li"></li>
-<li class="mw-empty-li"></li>
+<li class="mw-empty-elt"></li>
+<li class="mw-empty-elt"></li>
 <li>b</li>
 </ul>
 !! end
+
+!! test
+Thumbnail output
+!! wikitext
+[[File:Thumb.png|thumb]]
+!! html/php+tidy
+<div class="thumb tright">
+<div class="thumbinner" style="width:137px;"><a href="/wiki/File:Thumb.png" class="image"><img alt="Thumb.png" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>
+<div class="thumbcaption">
+<div class="magnify"><a href="/wiki/File:Thumb.png" class="internal" title="Enlarge"></a></div>
+</div>
+</div>
+</div>
+!! end
index b3cb89a..f961dd4 100644 (file)
@@ -27,8 +27,8 @@
 define( 'MW_PARSER_TEST', true );
 
 $options = [ 'quick', 'color', 'quiet', 'help', 'show-output',
-       'record', 'run-disabled', 'run-parsoid' ];
-$optionsWithArgs = [ 'regex', 'filter', 'seed', 'setversion', 'file' ];
+       'record', 'run-disabled', 'run-parsoid', 'dwdiff', 'mark-ws' ];
+$optionsWithArgs = [ 'regex', 'filter', 'seed', 'setversion', 'file', 'norm' ];
 
 require_once __DIR__ . '/../maintenance/commandLine.inc';
 require_once __DIR__ . '/TestsAutoLoader.php';
@@ -54,9 +54,18 @@ Options:
   --keep-uploads   Re-use the same upload directory for each test, don't delete it
   --fuzz           Do a fuzz test instead of a normal test
   --seed <n>       Start the fuzz test from the specified seed
-  --help           Show this help message
   --run-disabled   run disabled tests
   --run-parsoid    run parsoid tests (normally disabled)
+  --dwdiff         Use dwdiff to display diff output
+  --mark-ws        Mark whitespace in diffs by replacing it with symbols
+  --norm=<funcs>   Apply a comma-separated list of normalization functions to
+                   both the expected and actual output in order to resolve
+                   irrelevant differences. The accepted normalization functions
+                   are: removeTbody to remove <tbody> tags; and trimWhitespace
+                   to trim whitespace from the start and end of text nodes.
+  --use-tidy-config Use the wiki's Tidy configuration instead of known-good
+                   defaults.
+  --help           Show this help message
 
 ENDS;
        exit( 0 );
index 275ed27..85bf954 100644 (file)
@@ -30,9 +30,6 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
                        // For ResourceLoader::inDebugMode since it doesn't have context
                        'ResourceLoaderDebug' => true,
 
-                       // For ResourceLoaderContext::newDummyContext()
-                       'DefaultSkin' => 'vector',
-
                        // Avoid influence from wgInvalidateCacheOnLocalSettingsChange
                        'CacheEpoch' => '20140101000000',
 
index a2bb97a..a5d3570 100644 (file)
@@ -30,14 +30,14 @@ class ExportTest extends MediaWikiLangTestCase {
 
                $title = Title::newFromText( $pageTitle );
 
-               ob_start();
+               $sink = new DumpStringOutput;
+               $exporter->setOutputSink( $sink );
                $exporter->openStream();
                $exporter->pageByTitle( $title );
                $exporter->closeStream();
-               $xmlString = ob_get_clean();
 
                // This throws error if invalid xml output
-               $xmlObject = simplexml_load_string( $xmlString );
+               $xmlObject = simplexml_load_string( $sink );
 
                /**
                 * Check namespaces match xml
index 9f2fdfe..1d48d08 100644 (file)
@@ -413,8 +413,8 @@ class GlobalTest extends MediaWikiTestCase {
                );
        }
 
-       /** array( shorthand, expected integer ) */
        public static function provideShorthand() {
+               // Syntax: [ shorthand, expected integer ]
                return [
                        # Null, empty ...
                        [ '', -1 ],
index 082fe22..c76666d 100644 (file)
@@ -97,7 +97,7 @@ class WfBCP47Test extends MediaWikiTestCase {
                         *  az-Arab-x-AZE-derbend
                         * AZE being private, it should be lower case, hence the test above
                         * should probably be:
-                        *  array( 'az-arab-x-aze-derbend', 'az-Arab-x-AZE-derbend' ),
+                        * [ 'az-arab-x-aze-derbend', 'az-Arab-x-AZE-derbend' ],
                         */
 
                        # Private use registry values:
index 1f1c9be..cbe2e2f 100644 (file)
@@ -80,12 +80,12 @@ class WfUrlencodeTest extends MediaWikiTestCase {
 
        /**
         * Format is either:
-        *   array( 'input', 'expected' );
+        *   [ 'input', 'expected' ];
         * Or:
-        *   array( 'input',
-        *       array( 'Apache', 'expected' ),
-        *       array( 'Microsoft-IIS/7', 'expected' ),
-        *    ),
+        *   [ 'input',
+        *       [ 'Apache', 'expected' ],
+        *       [ 'Microsoft-IIS/7', 'expected' ],
+        *   ],
         * If you want to add other HTTP server name, you will have to add a new
         * testing method much like the testEncodingUrlWith() method above.
         */
index 4721793..e44db83 100644 (file)
@@ -738,6 +738,16 @@ class HtmlTest extends MediaWikiTestCase {
                                '1x.png 1x, 1_5x.png 1.5x, 2x.png 2x',
                                'pixel depth keys may omit a trailing "x"'
                        ],
+                       [
+                               [ '1'  => 'small.png', '1.5' => 'large.png', '2'  => 'large.png' ],
+                               'small.png 1x, large.png 1.5x',
+                               'omit larger duplicates'
+                       ],
+                       [
+                               [ '1'  => 'small.png', '2'  => 'large.png', '1.5' => 'large.png' ],
+                               'small.png 1x, large.png 1.5x',
+                               'omit larger duplicates in irregular order'
+                       ],
                ];
        }
 
index 4c2e02b..ae0b4be 100644 (file)
@@ -106,8 +106,8 @@ class HttpTest extends MediaWikiTestCase {
                        # (\S+) - host part is made of anything not whitespaces
                        // commented these out in order to remove @group Broken
                        // @todo are these valid tests? if so, fix Http::isValidURI so it can handle them
-                       // array( false, 'http://!"èèè¿¿¿~~\'', 'hostname is made of any non whitespace' ),
-                       // array( false, 'http://exam:ple.org/', 'hostname can not use colons!' ),
+                       // [ false, 'http://!"èèè¿¿¿~~\'', 'hostname is made of any non whitespace' ],
+                       // [ false, 'http://exam:ple.org/', 'hostname can not use colons!' ],
 
                        # (:[0-9]+)? - port number
                        [ true, 'http://example.org:80/' ],
@@ -212,11 +212,11 @@ class HttpTest extends MediaWikiTestCase {
                        [ 'CURLAUTH_DIGEST' ],
                        [ 'CURLAUTH_GSSNEGOTIATE' ],
                        [ 'CURLAUTH_NTLM' ],
-                       // array( 'CURLCLOSEPOLICY_CALLBACK' ), // removed in PHP 5.6.0
-                       // array( 'CURLCLOSEPOLICY_LEAST_RECENTLY_USED' ), // removed in PHP 5.6.0
-                       // array( 'CURLCLOSEPOLICY_LEAST_TRAFFIC' ), // removed in PHP 5.6.0
-                       // array( 'CURLCLOSEPOLICY_OLDEST' ), // removed in PHP 5.6.0
-                       // array( 'CURLCLOSEPOLICY_SLOWEST' ), // removed in PHP 5.6.0
+                       // [ 'CURLCLOSEPOLICY_CALLBACK' ], // removed in PHP 5.6.0
+                       // [ 'CURLCLOSEPOLICY_LEAST_RECENTLY_USED' ], // removed in PHP 5.6.0
+                       // [ 'CURLCLOSEPOLICY_LEAST_TRAFFIC' ], // removed in PHP 5.6.0
+                       // [ 'CURLCLOSEPOLICY_OLDEST' ], // removed in PHP 5.6.0
+                       // [ 'CURLCLOSEPOLICY_SLOWEST' ], // removed in PHP 5.6.0
                        [ 'CURLE_ABORTED_BY_CALLBACK' ],
                        [ 'CURLE_BAD_CALLING_ORDER' ],
                        [ 'CURLE_BAD_CONTENT_ENCODING' ],
@@ -268,7 +268,7 @@ class HttpTest extends MediaWikiTestCase {
                        [ 'CURLE_RECV_ERROR' ],
                        [ 'CURLE_SEND_ERROR' ],
                        [ 'CURLE_SHARE_IN_USE' ],
-                       // array( 'CURLE_SSH' ), // not present in HHVM 3.3.0-dev
+                       // [ 'CURLE_SSH' ], // not present in HHVM 3.3.0-dev
                        [ 'CURLE_SSL_CACERT' ],
                        [ 'CURLE_SSL_CERTPROBLEM' ],
                        [ 'CURLE_SSL_CIPHER' ],
@@ -286,14 +286,14 @@ class HttpTest extends MediaWikiTestCase {
                        [ 'CURLFTPAUTH_DEFAULT' ],
                        [ 'CURLFTPAUTH_SSL' ],
                        [ 'CURLFTPAUTH_TLS' ],
-                       // array( 'CURLFTPMETHOD_MULTICWD' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLFTPMETHOD_NOCWD' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLFTPMETHOD_SINGLECWD' ), // not present in HHVM 3.3.0-dev
+                       // [ 'CURLFTPMETHOD_MULTICWD' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLFTPMETHOD_NOCWD' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLFTPMETHOD_SINGLECWD' ], // not present in HHVM 3.3.0-dev
                        [ 'CURLFTPSSL_ALL' ],
                        [ 'CURLFTPSSL_CONTROL' ],
                        [ 'CURLFTPSSL_NONE' ],
                        [ 'CURLFTPSSL_TRY' ],
-                       // array( 'CURLINFO_CERTINFO' ), // not present in HHVM 3.3.0-dev
+                       // [ 'CURLINFO_CERTINFO' ], // not present in HHVM 3.3.0-dev
                        [ 'CURLINFO_CONNECT_TIME' ],
                        [ 'CURLINFO_CONTENT_LENGTH_DOWNLOAD' ],
                        [ 'CURLINFO_CONTENT_LENGTH_UPLOAD' ],
@@ -308,7 +308,7 @@ class HttpTest extends MediaWikiTestCase {
                        [ 'CURLINFO_PRIVATE' ],
                        [ 'CURLINFO_REDIRECT_COUNT' ],
                        [ 'CURLINFO_REDIRECT_TIME' ],
-                       // array( 'CURLINFO_REDIRECT_URL' ), // not present in HHVM 3.3.0-dev
+                       // [ 'CURLINFO_REDIRECT_URL' ], // not present in HHVM 3.3.0-dev
                        [ 'CURLINFO_REQUEST_SIZE' ],
                        [ 'CURLINFO_SIZE_DOWNLOAD' ],
                        [ 'CURLINFO_SIZE_UPLOAD' ],
@@ -329,8 +329,8 @@ class HttpTest extends MediaWikiTestCase {
                        [ 'CURLOPT_BUFFERSIZE' ],
                        [ 'CURLOPT_CAINFO' ],
                        [ 'CURLOPT_CAPATH' ],
-                       // array( 'CURLOPT_CERTINFO' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLOPT_CLOSEPOLICY' ), // removed in PHP 5.6.0
+                       // [ 'CURLOPT_CERTINFO' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLOPT_CLOSEPOLICY' ], // removed in PHP 5.6.0
                        [ 'CURLOPT_CONNECTTIMEOUT' ],
                        [ 'CURLOPT_CONNECTTIMEOUT_MS' ],
                        [ 'CURLOPT_COOKIE' ],
@@ -354,8 +354,8 @@ class HttpTest extends MediaWikiTestCase {
                        [ 'CURLOPT_FTPPORT' ],
                        [ 'CURLOPT_FTPSSLAUTH' ],
                        [ 'CURLOPT_FTP_CREATE_MISSING_DIRS' ],
-                       // array( 'CURLOPT_FTP_FILEMETHOD' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLOPT_FTP_SKIP_PASV_IP' ), // not present in HHVM 3.3.0-dev
+                       // [ 'CURLOPT_FTP_FILEMETHOD' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLOPT_FTP_SKIP_PASV_IP' ], // not present in HHVM 3.3.0-dev
                        [ 'CURLOPT_FTP_SSL' ],
                        [ 'CURLOPT_FTP_USE_EPRT' ],
                        [ 'CURLOPT_FTP_USE_EPSV' ],
@@ -371,14 +371,14 @@ class HttpTest extends MediaWikiTestCase {
                        [ 'CURLOPT_INFILESIZE' ],
                        [ 'CURLOPT_INTERFACE' ],
                        [ 'CURLOPT_IPRESOLVE' ],
-                       // array( 'CURLOPT_KEYPASSWD' ), // not present in HHVM 3.3.0-dev
+                       // [ 'CURLOPT_KEYPASSWD' ], // not present in HHVM 3.3.0-dev
                        [ 'CURLOPT_KRB4LEVEL' ],
                        [ 'CURLOPT_LOW_SPEED_LIMIT' ],
                        [ 'CURLOPT_LOW_SPEED_TIME' ],
                        [ 'CURLOPT_MAXCONNECTS' ],
                        [ 'CURLOPT_MAXREDIRS' ],
-                       // array( 'CURLOPT_MAX_RECV_SPEED_LARGE' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLOPT_MAX_SEND_SPEED_LARGE' ), // not present in HHVM 3.3.0-dev
+                       // [ 'CURLOPT_MAX_RECV_SPEED_LARGE' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLOPT_MAX_SEND_SPEED_LARGE' ], // not present in HHVM 3.3.0-dev
                        [ 'CURLOPT_NETRC' ],
                        [ 'CURLOPT_NOBODY' ],
                        [ 'CURLOPT_NOPROGRESS' ],
@@ -390,7 +390,7 @@ class HttpTest extends MediaWikiTestCase {
                        [ 'CURLOPT_POSTREDIR' ],
                        [ 'CURLOPT_PRIVATE' ],
                        [ 'CURLOPT_PROGRESSFUNCTION' ],
-                       // array( 'CURLOPT_PROTOCOLS' ), // not present in HHVM 3.3.0-dev
+                       // [ 'CURLOPT_PROTOCOLS' ], // not present in HHVM 3.3.0-dev
                        [ 'CURLOPT_PROXY' ],
                        [ 'CURLOPT_PROXYAUTH' ],
                        [ 'CURLOPT_PROXYPORT' ],
@@ -402,14 +402,14 @@ class HttpTest extends MediaWikiTestCase {
                        [ 'CURLOPT_RANGE' ],
                        [ 'CURLOPT_READDATA' ],
                        [ 'CURLOPT_READFUNCTION' ],
-                       // array( 'CURLOPT_REDIR_PROTOCOLS' ), // not present in HHVM 3.3.0-dev
+                       // [ 'CURLOPT_REDIR_PROTOCOLS' ], // not present in HHVM 3.3.0-dev
                        [ 'CURLOPT_REFERER' ],
                        [ 'CURLOPT_RESUME_FROM' ],
                        [ 'CURLOPT_RETURNTRANSFER' ],
-                       // array( 'CURLOPT_SSH_AUTH_TYPES' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLOPT_SSH_HOST_PUBLIC_KEY_MD5' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLOPT_SSH_PRIVATE_KEYFILE' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLOPT_SSH_PUBLIC_KEYFILE' ), // not present in HHVM 3.3.0-dev
+                       // [ 'CURLOPT_SSH_AUTH_TYPES' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLOPT_SSH_HOST_PUBLIC_KEY_MD5' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLOPT_SSH_PRIVATE_KEYFILE' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLOPT_SSH_PUBLIC_KEYFILE' ], // not present in HHVM 3.3.0-dev
                        [ 'CURLOPT_SSLCERT' ],
                        [ 'CURLOPT_SSLCERTPASSWD' ],
                        [ 'CURLOPT_SSLCERTTYPE' ],
@@ -437,28 +437,28 @@ class HttpTest extends MediaWikiTestCase {
                        [ 'CURLOPT_VERBOSE' ],
                        [ 'CURLOPT_WRITEFUNCTION' ],
                        [ 'CURLOPT_WRITEHEADER' ],
-                       // array( 'CURLPROTO_ALL' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLPROTO_DICT' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLPROTO_FILE' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLPROTO_FTP' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLPROTO_FTPS' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLPROTO_HTTP' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLPROTO_HTTPS' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLPROTO_LDAP' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLPROTO_LDAPS' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLPROTO_SCP' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLPROTO_SFTP' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLPROTO_TELNET' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLPROTO_TFTP' ), // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_ALL' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_DICT' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_FILE' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_FTP' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_FTPS' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_HTTP' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_HTTPS' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_LDAP' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_LDAPS' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_SCP' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_SFTP' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_TELNET' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_TFTP' ], // not present in HHVM 3.3.0-dev
                        [ 'CURLPROXY_HTTP' ],
-                       // array( 'CURLPROXY_SOCKS4' ), // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROXY_SOCKS4' ], // not present in HHVM 3.3.0-dev
                        [ 'CURLPROXY_SOCKS5' ],
-                       // array( 'CURLSSH_AUTH_DEFAULT' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLSSH_AUTH_HOST' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLSSH_AUTH_KEYBOARD' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLSSH_AUTH_NONE' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLSSH_AUTH_PASSWORD' ), // not present in HHVM 3.3.0-dev
-                       // array( 'CURLSSH_AUTH_PUBLICKEY' ), // not present in HHVM 3.3.0-dev
+                       // [ 'CURLSSH_AUTH_DEFAULT' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLSSH_AUTH_HOST' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLSSH_AUTH_KEYBOARD' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLSSH_AUTH_NONE' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLSSH_AUTH_PASSWORD' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLSSH_AUTH_PUBLICKEY' ], // not present in HHVM 3.3.0-dev
                        [ 'CURLVERSION_NOW' ],
                        [ 'CURL_HTTP_VERSION_1_0' ],
                        [ 'CURL_HTTP_VERSION_1_1' ],
index b7f7880..63753f9 100644 (file)
@@ -429,6 +429,7 @@ class LinkerTest extends MediaWikiLangTestCase {
         * @covers Linker::getLinkColour
         */
        public function testGetLinkColour() {
+               $this->hideDeprecated( 'Linker::getLinkColour' );
                $linkCache = MediaWikiServices::getInstance()->getLinkCache();
                $foobarTitle = Title::makeTitle( NS_MAIN, 'FooBar' );
                $redirectTitle = Title::makeTitle( NS_MAIN, 'Redirect' );
index ca01aef..24db445 100644 (file)
@@ -387,7 +387,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
                $wgContentNamespaces = 5;
                $this->assertEquals( [ NS_MAIN ], MWNamespace::getContentNamespaces() );
 
-               # test $wgContentNamespaces === array()
+               # test $wgContentNamespaces === []
                $wgContentNamespaces = [];
                $this->assertEquals( [ NS_MAIN ], MWNamespace::getContentNamespaces() );
 
@@ -474,7 +474,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
         * global $wgCapitalLink setting to have extended coverage.
         *
         * MWNamespace::isCapitalized() rely on two global settings:
-        *   $wgCapitalLinkOverrides = array(); by default
+        *   $wgCapitalLinkOverrides = []; by default
         *   $wgCapitalLinks = true; by default
         * This function test $wgCapitalLinks
         *
index bca3982..70e4aea 100644 (file)
@@ -102,7 +102,7 @@ class MWTimestampTest extends MediaWikiLangTestCase {
 
        /**
         * Returns a list of valid timestamps in the format:
-        * array( type, timestamp_of_type, timestamp_in_MW )
+        * [ type, timestamp_of_type, timestamp_in_MW ]
         */
        public static function provideValidTimestamps() {
                return [
@@ -124,7 +124,7 @@ class MWTimestampTest extends MediaWikiLangTestCase {
 
        /**
         * Returns a list of out of range timestamps in the format:
-        * array( type, timestamp_of_type )
+        * [ type, timestamp_of_type ]
         */
        public static function provideOutOfRangeTimestamps() {
                return [
index 0e13721..d20344d 100644 (file)
@@ -315,6 +315,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                        'DBLoadBalancerFactory' => [ 'DBLoadBalancerFactory', 'LBFactory' ],
                        'DBLoadBalancer' => [ 'DBLoadBalancer', 'LoadBalancer' ],
                        'WatchedItemStore' => [ 'WatchedItemStore', WatchedItemStore::class ],
+                       'WatchedItemQueryService' => [ 'WatchedItemQueryService', WatchedItemQueryService::class ],
                        'GenderCache' => [ 'GenderCache', GenderCache::class ],
                        'LinkCache' => [ 'LinkCache', LinkCache::class ],
                        'LinkRenderer' => [ 'LinkRenderer', LinkRenderer::class ],
index 8aa1361..4c689ab 100644 (file)
@@ -223,13 +223,13 @@ class MessageTest extends MediaWikiLangTestCase {
         */
        public function testToStringKey() {
                $this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->text() );
-               $this->assertEquals( '<i-dont-exist-evar>', wfMessage( 'i-dont-exist-evar' )->text() );
-               $this->assertEquals( '<i<dont>exist-evar>', wfMessage( 'i<dont>exist-evar' )->text() );
-               $this->assertEquals( '<i-dont-exist-evar>', wfMessage( 'i-dont-exist-evar' )->plain() );
-               $this->assertEquals( '<i<dont>exist-evar>', wfMessage( 'i<dont>exist-evar' )->plain() );
-               $this->assertEquals( '&lt;i-dont-exist-evar&gt;', wfMessage( 'i-dont-exist-evar' )->escaped() );
+               $this->assertEquals( '⧼i-dont-exist-evar⧽', wfMessage( 'i-dont-exist-evar' )->text() );
+               $this->assertEquals( '⧼i&lt;dont&gt;exist-evar⧽', wfMessage( 'i<dont>exist-evar' )->text() );
+               $this->assertEquals( '⧼i-dont-exist-evar⧽', wfMessage( 'i-dont-exist-evar' )->plain() );
+               $this->assertEquals( '⧼i&lt;dont&gt;exist-evar⧽', wfMessage( 'i<dont>exist-evar' )->plain() );
+               $this->assertEquals( '⧼i-dont-exist-evar⧽', wfMessage( 'i-dont-exist-evar' )->escaped() );
                $this->assertEquals(
-                       '&lt;i&lt;dont&gt;exist-evar&gt;',
+                       '⧼i&lt;dont&gt;exist-evar⧽',
                        wfMessage( 'i<dont>exist-evar' )->escaped()
                );
        }
@@ -237,8 +237,10 @@ class MessageTest extends MediaWikiLangTestCase {
        public static function provideToString() {
                return [
                        [ 'mainpage', 'Main Page' ],
-                       [ 'i-dont-exist-evar', '<i-dont-exist-evar>' ],
-                       [ 'i-dont-exist-evar', '&lt;i-dont-exist-evar&gt;', 'escaped' ],
+                       [ 'i-dont-exist-evar', '⧼i-dont-exist-evar⧽' ],
+                       [ 'i-dont-exist-evar', '⧼i-dont-exist-evar⧽', 'escaped' ],
+                       [ 'script>alert(1)</script', '⧼script&gt;alert(1)&lt;/script⧽', 'escaped' ],
+                       [ 'script>alert(1)</script', '⧼script&gt;alert(1)&lt;/script⧽' ],
                ];
        }
 
@@ -589,6 +591,10 @@ class MessageTest extends MediaWikiLangTestCase {
        public function testNewFromSpecifier( $value, $expectedText ) {
                $message = Message::newFromSpecifier( $value );
                $this->assertInstanceOf( Message::class, $message );
+               if ( $value instanceof Message ) {
+                       $this->assertInstanceOf( get_class( $value ), $message );
+                       $this->assertEquals( $value, $message );
+               }
                $this->assertSame( $expectedText, $message->text() );
        }
 
@@ -602,6 +608,7 @@ class MessageTest extends MediaWikiLangTestCase {
                        'array' => [ [ 'youhavenewmessages', 'foo', 'bar' ], 'You have foo (bar).' ],
                        'Message' => [ new Message( 'youhavenewmessages', [ 'foo', 'bar' ] ), 'You have foo (bar).' ],
                        'RawMessage' => [ new RawMessage( 'foo ($1)', [ 'bar' ] ), 'foo (bar)' ],
+                       'ApiMessage' => [ new ApiMessage( [ 'mainpage' ], 'code', [ 'data' ] ), 'Main Page' ],
                        'MessageSpecifier' => [ $messageSpecifier, 'Main Page' ],
                        'nested RawMessage' => [ [ new RawMessage( 'foo ($1)', [ 'bar' ] ) ], 'foo (bar)' ],
                ];
index 72d7166..26529e8 100644 (file)
@@ -248,7 +248,7 @@ class SanitizerTest extends MediaWikiTestCase {
        }
 
        public static function provideDeprecatedAttributes() {
-               /** array( <attribute>, <element>, [message] ) */
+               /** [ <attribute>, <element>, [message] ] */
                return [
                        [ 'clear="left"', 'br' ],
                        [ 'clear="all"', 'br' ],
@@ -276,7 +276,7 @@ class SanitizerTest extends MediaWikiTestCase {
        }
 
        public static function provideCssCommentsFixtures() {
-               /** array( <expected>, <css>, [message] ) */
+               /** [ <expected>, <css>, [message] ] */
                return [
                        // Valid comments spanning entire input
                        [ '/**/', '/**/' ],
@@ -353,7 +353,7 @@ class SanitizerTest extends MediaWikiTestCase {
        }
 
        public static function provideEscapeIdReferenceList() {
-               /** array( <reference list>, <individual id 1>, <individual id 2> ) */
+               /** [ <reference list>, <individual id 1>, <individual id 2> ] */
                return [
                        [ 'foo bar', 'foo', 'bar' ],
                        [ '#1 #2', '#1', '#2' ],
index 782fab0..474a481 100644 (file)
@@ -376,9 +376,9 @@ class StatusTest extends MediaWikiLangTestCase {
                $status->warning( 'fooBar!' );
                $testCases['1StringWarning'] = [
                        $status,
-                       "<fooBar!>",
+                       "⧼fooBar!⧽",
                        "(wrap-short: (fooBar!))",
-                       "<p>&lt;fooBar!&gt;\n</p>",
+                       "<p>⧼fooBar!⧽\n</p>",
                        "<p>(wrap-short: (fooBar!))\n</p>",
                ];
 
@@ -387,9 +387,9 @@ class StatusTest extends MediaWikiLangTestCase {
                $status->warning( 'fooBar2!' );
                $testCases['2StringWarnings'] = [
                        $status,
-                       "* <fooBar!>\n* <fooBar2!>\n",
+                       "* ⧼fooBar!⧽\n* ⧼fooBar2!⧽\n",
                        "(wrap-long: * (fooBar!)\n* (fooBar2!)\n)",
-                       "<ul><li> &lt;fooBar!&gt;</li>\n<li> &lt;fooBar2!&gt;</li></ul>\n",
+                       "<ul><li> ⧼fooBar!⧽</li>\n<li> ⧼fooBar2!⧽</li></ul>\n",
                        "<p>(wrap-long: * (fooBar!)\n</p>\n<ul><li> (fooBar2!)</li></ul>\n<p>)\n</p>",
                ];
 
@@ -397,9 +397,9 @@ class StatusTest extends MediaWikiLangTestCase {
                $status->warning( new Message( 'fooBar!', [ 'foo', 'bar' ] ) );
                $testCases['1MessageWarning'] = [
                        $status,
-                       "<fooBar!>",
+                       "⧼fooBar!⧽",
                        "(wrap-short: (fooBar!: foo, bar))",
-                       "<p>&lt;fooBar!&gt;\n</p>",
+                       "<p>⧼fooBar!⧽\n</p>",
                        "<p>(wrap-short: (fooBar!: foo, bar))\n</p>",
                ];
 
@@ -408,9 +408,9 @@ class StatusTest extends MediaWikiLangTestCase {
                $status->warning( new Message( 'fooBar2!' ) );
                $testCases['2MessageWarnings'] = [
                        $status,
-                       "* <fooBar!>\n* <fooBar2!>\n",
+                       "* ⧼fooBar!⧽\n* ⧼fooBar2!⧽\n",
                        "(wrap-long: * (fooBar!: foo, bar)\n* (fooBar2!)\n)",
-                       "<ul><li> &lt;fooBar!&gt;</li>\n<li> &lt;fooBar2!&gt;</li></ul>\n",
+                       "<ul><li> ⧼fooBar!⧽</li>\n<li> ⧼fooBar2!⧽</li></ul>\n",
                        "<p>(wrap-long: * (fooBar!: foo, bar)\n</p>\n<ul><li> (fooBar2!)</li></ul>\n<p>)\n</p>",
                ];
 
index 8b8cbcd..86f4ae7 100644 (file)
@@ -6,25 +6,19 @@
  */
 class TestUser {
        /**
-        * @deprecated Since 1.25. Use TestUser::getUser()->getName()
-        * @private
         * @var string
         */
-       public $username;
+       private $username;
 
        /**
-        * @deprecated Since 1.25. Use TestUser::getPassword()
-        * @private
         * @var string
         */
-       public $password;
+       private $password;
 
        /**
-        * @deprecated Since 1.25. Use TestUser::getUser()
-        * @private
         * @var User
         */
-       public $user;
+       private $user;
 
        private function assertNotReal() {
                global $wgDBprefix;
index be22260..0c813da 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+use MediaWiki\MediaWikiServices;
 
 /**
  * @author Addshore
@@ -63,7 +64,9 @@ class WatchedItemIntegrationTest extends MediaWikiTestCase {
                        WatchedItem::fromUserTitle( $user, $title )->getNotificationTimestamp()
                );
 
-               WatchedItem::fromUserTitle( $user, $title )->resetNotificationTimestamp();
+               MediaWikiServices::getInstance()->getWatchedItemStore()->resetNotificationTimestamp(
+                       $user, $title
+               );
                $this->assertNull( WatchedItem::fromUserTitle( $user, $title )->getNotificationTimestamp() );
        }
 
@@ -107,7 +110,9 @@ class WatchedItemIntegrationTest extends MediaWikiTestCase {
                $user = $this->getUser();
                $title = Title::newFromText( 'WatchedItemIntegrationTestPage' );
                WatchedItem::fromUserTitle( $user, $title )->addWatch();
-               WatchedItem::fromUserTitle( $user, $title )->resetNotificationTimestamp();
+               MediaWikiServices::getInstance()->getWatchedItemStore()->resetNotificationTimestamp(
+                       $user, $title
+               );
 
                $this->assertEquals(
                        null,
diff --git a/tests/phpunit/includes/WatchedItemQueryServiceUnitTest.php b/tests/phpunit/includes/WatchedItemQueryServiceUnitTest.php
new file mode 100644 (file)
index 0000000..1d232fe
--- /dev/null
@@ -0,0 +1,1312 @@
+<?php
+
+/**
+ * @covers WatchedItemQueryService
+ */
+class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
+
+       /**
+        * @return PHPUnit_Framework_MockObject_MockObject|DatabaseBase
+        */
+       private function getMockDb() {
+               $mock = $this->getMockBuilder( DatabaseBase::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               $mock->expects( $this->any() )
+                       ->method( 'makeList' )
+                       ->with(
+                               $this->isType( 'array' ),
+                               $this->isType( 'int' )
+                       )
+                       ->will( $this->returnCallback( function( $a, $conj ) {
+                               $sqlConj = $conj === LIST_AND ? ' AND ' : ' OR ';
+                               return join( $sqlConj, array_map( function( $s ) {
+                                       return '(' . $s . ')';
+                               }, $a
+                               ) );
+                       } ) );
+
+               $mock->expects( $this->any() )
+                       ->method( 'addQuotes' )
+                       ->will( $this->returnCallback( function( $value ) {
+                               return "'$value'";
+                       } ) );
+
+               $mock->expects( $this->any() )
+                       ->method( 'timestamp' )
+                       ->will( $this->returnArgument( 0 ) );
+
+               $mock->expects( $this->any() )
+                       ->method( 'bitAnd' )
+                       ->willReturnCallback( function( $a, $b ) {
+                               return "($a & $b)";
+                       } );
+
+               return $mock;
+       }
+
+       /**
+        * @param $mockDb
+        * @return PHPUnit_Framework_MockObject_MockObject|LoadBalancer
+        */
+       private function getMockLoadBalancer( $mockDb ) {
+               $mock = $this->getMockBuilder( LoadBalancer::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $mock->expects( $this->any() )
+                       ->method( 'getConnection' )
+                       ->with( DB_SLAVE )
+                       ->will( $this->returnValue( $mockDb ) );
+               return $mock;
+       }
+
+       /**
+        * @param int $id
+        * @return PHPUnit_Framework_MockObject_MockObject|User
+        */
+       private function getMockNonAnonUserWithId( $id ) {
+               $mock = $this->getMock( User::class );
+               $mock->expects( $this->any() )
+                       ->method( 'isAnon' )
+                       ->will( $this->returnValue( false ) );
+               $mock->expects( $this->any() )
+                       ->method( 'getId' )
+                       ->will( $this->returnValue( $id ) );
+               return $mock;
+       }
+
+       /**
+        * @param int $id
+        * @return PHPUnit_Framework_MockObject_MockObject|User
+        */
+       private function getMockUnrestrictedNonAnonUserWithId( $id ) {
+               $mock = $this->getMockNonAnonUserWithId( $id );
+               $mock->expects( $this->any() )
+                       ->method( 'isAllowed' )
+                       ->will( $this->returnValue( true ) );
+               $mock->expects( $this->any() )
+                       ->method( 'isAllowedAny' )
+                       ->will( $this->returnValue( true ) );
+               $mock->expects( $this->any() )
+                       ->method( 'useRCPatrol' )
+                       ->will( $this->returnValue( true ) );
+               return $mock;
+       }
+
+       /**
+        * @param int $id
+        * @param string $notAllowedAction
+        * @return PHPUnit_Framework_MockObject_MockObject|User
+        */
+       private function getMockNonAnonUserWithIdAndRestrictedPermissions( $id, $notAllowedAction ) {
+               $mock = $this->getMockNonAnonUserWithId( $id );
+
+               $mock->expects( $this->any() )
+                       ->method( 'isAllowed' )
+                       ->will( $this->returnCallback( function( $action ) use ( $notAllowedAction ) {
+                               return $action !== $notAllowedAction;
+                       } ) );
+               $mock->expects( $this->any() )
+                       ->method( 'isAllowedAny' )
+                       ->will( $this->returnCallback( function() use ( $notAllowedAction ) {
+                               $actions = func_get_args();
+                               return !in_array( $notAllowedAction, $actions );
+                       } ) );
+
+               return $mock;
+       }
+
+       /**
+        * @param int $id
+        * @return PHPUnit_Framework_MockObject_MockObject|User
+        */
+       private function getMockNonAnonUserWithIdAndNoPatrolRights( $id ) {
+               $mock = $this->getMockNonAnonUserWithId( $id );
+
+               $mock->expects( $this->any() )
+                       ->method( 'isAllowed' )
+                       ->will( $this->returnValue( true ) );
+               $mock->expects( $this->any() )
+                       ->method( 'isAllowedAny' )
+                       ->will( $this->returnValue( true ) );
+
+               $mock->expects( $this->any() )
+                       ->method( 'useRCPatrol' )
+                       ->will( $this->returnValue( false ) );
+               $mock->expects( $this->any() )
+                       ->method( 'useNPPatrol' )
+                       ->will( $this->returnValue( false ) );
+
+               return $mock;
+       }
+
+       private function getMockAnonUser() {
+               $mock = $this->getMock( User::class );
+               $mock->expects( $this->any() )
+                       ->method( 'isAnon' )
+                       ->will( $this->returnValue( true ) );
+               return $mock;
+       }
+
+       private function getFakeRow( array $rowValues ) {
+               $fakeRow = new stdClass();
+               foreach ( $rowValues as $valueName => $value ) {
+                       $fakeRow->$valueName = $value;
+               }
+               return $fakeRow;
+       }
+
+       public function testGetWatchedItemsWithRecentChangeInfo() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'select' )
+                       ->with(
+                               [ 'recentchanges', 'watchlist', 'page' ],
+                               [
+                                       'rc_id',
+                                       'rc_namespace',
+                                       'rc_title',
+                                       'rc_timestamp',
+                                       'rc_type',
+                                       'rc_deleted',
+                                       'wl_notificationtimestamp',
+                                       'rc_cur_id',
+                                       'rc_this_oldid',
+                                       'rc_last_oldid',
+                               ],
+                               [
+                                       'wl_user' => 1,
+                                       '(rc_this_oldid=page_latest) OR (rc_type=3)',
+                               ],
+                               $this->isType( 'string' ),
+                               [],
+                               [
+                                       'watchlist' => [
+                                               'INNER JOIN',
+                                               [
+                                                       'wl_namespace=rc_namespace',
+                                                       'wl_title=rc_title'
+                                               ]
+                                       ],
+                                       'page' => [
+                                               'LEFT JOIN',
+                                               'rc_cur_id=page_id',
+                                       ],
+                               ]
+                       )
+                       ->will( $this->returnValue( [
+                               $this->getFakeRow( [
+                                       'rc_id' => 1,
+                                       'rc_namespace' => 0,
+                                       'rc_title' => 'Foo1',
+                                       'rc_timestamp' => '20151212010101',
+                                       'rc_type' => RC_NEW,
+                                       'rc_deleted' => 0,
+                                       'wl_notificationtimestamp' => '20151212010101',
+                               ] ),
+                               $this->getFakeRow( [
+                                       'rc_id' => 2,
+                                       'rc_namespace' => 1,
+                                       'rc_title' => 'Foo2',
+                                       'rc_timestamp' => '20151212010102',
+                                       'rc_type' => RC_NEW,
+                                       'rc_deleted' => 0,
+                                       'wl_notificationtimestamp' => null,
+                               ] ),
+                       ] ) );
+
+               $queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
+               $user = $this->getMockUnrestrictedNonAnonUserWithId( 1 );
+
+               $items = $queryService->getWatchedItemsWithRecentChangeInfo( $user );
+
+               $this->assertInternalType( 'array', $items );
+               $this->assertCount( 2, $items );
+
+               foreach ( $items as list( $watchedItem, $recentChangeInfo ) ) {
+                       $this->assertInstanceOf( WatchedItem::class, $watchedItem );
+                       $this->assertInternalType( 'array', $recentChangeInfo );
+               }
+
+               $this->assertEquals(
+                       new WatchedItem( $user, new TitleValue( 0, 'Foo1' ), '20151212010101' ),
+                       $items[0][0]
+               );
+               $this->assertEquals(
+                       [
+                               'rc_id' => 1,
+                               'rc_namespace' => 0,
+                               'rc_title' => 'Foo1',
+                               'rc_timestamp' => '20151212010101',
+                               'rc_type' => RC_NEW,
+                               'rc_deleted' => 0,
+                       ],
+                       $items[0][1]
+               );
+
+               $this->assertEquals(
+                       new WatchedItem( $user, new TitleValue( 1, 'Foo2' ), null ),
+                       $items[1][0]
+               );
+               $this->assertEquals(
+                       [
+                               'rc_id' => 2,
+                               'rc_namespace' => 1,
+                               'rc_title' => 'Foo2',
+                               'rc_timestamp' => '20151212010102',
+                               'rc_type' => RC_NEW,
+                               'rc_deleted' => 0,
+                       ],
+                       $items[1][1]
+               );
+       }
+
+       public function getWatchedItemsWithRecentChangeInfoOptionsProvider() {
+               return [
+                       [
+                               [ 'includeFields' => [ WatchedItemQueryService::INCLUDE_FLAGS ] ],
+                               [ 'rc_type', 'rc_minor', 'rc_bot' ],
+                               [],
+                               [],
+                       ],
+                       [
+                               [ 'includeFields' => [ WatchedItemQueryService::INCLUDE_USER ] ],
+                               [ 'rc_user_text' ],
+                               [],
+                               [],
+                       ],
+                       [
+                               [ 'includeFields' => [ WatchedItemQueryService::INCLUDE_USER_ID ] ],
+                               [ 'rc_user' ],
+                               [],
+                               [],
+                       ],
+                       [
+                               [ 'includeFields' => [ WatchedItemQueryService::INCLUDE_COMMENT ] ],
+                               [ 'rc_comment' ],
+                               [],
+                               [],
+                       ],
+                       [
+                               [ 'includeFields' => [ WatchedItemQueryService::INCLUDE_PATROL_INFO ] ],
+                               [ 'rc_patrolled', 'rc_log_type' ],
+                               [],
+                               [],
+                       ],
+                       [
+                               [ 'includeFields' => [ WatchedItemQueryService::INCLUDE_SIZES ] ],
+                               [ 'rc_old_len', 'rc_new_len' ],
+                               [],
+                               [],
+                       ],
+                       [
+                               [ 'includeFields' => [ WatchedItemQueryService::INCLUDE_LOG_INFO ] ],
+                               [ 'rc_logid', 'rc_log_type', 'rc_log_action', 'rc_params' ],
+                               [],
+                               [],
+                       ],
+                       [
+                               [ 'namespaceIds' => [ 0, 1 ] ],
+                               [],
+                               [ 'wl_namespace' => [ 0, 1 ] ],
+                               [],
+                       ],
+                       [
+                               [ 'namespaceIds' => [ 0, "1; DROP TABLE watchlist;\n--" ] ],
+                               [],
+                               [ 'wl_namespace' => [ 0, 1 ] ],
+                               [],
+                       ],
+                       [
+                               [ 'rcTypes' => [ RC_EDIT, RC_NEW ] ],
+                               [],
+                               [ 'rc_type' => [ RC_EDIT, RC_NEW ] ],
+                               [],
+                       ],
+                       [
+                               [ 'dir' => WatchedItemQueryService::DIR_OLDER ],
+                               [],
+                               [],
+                               [ 'ORDER BY' => [ 'rc_timestamp DESC', 'rc_id DESC' ] ]
+                       ],
+                       [
+                               [ 'dir' => WatchedItemQueryService::DIR_NEWER ],
+                               [],
+                               [],
+                               [ 'ORDER BY' => [ 'rc_timestamp', 'rc_id' ] ]
+                       ],
+                       [
+                               [ 'dir' => WatchedItemQueryService::DIR_OLDER, 'start' => '20151212010101' ],
+                               [],
+                               [ "rc_timestamp <= '20151212010101'" ],
+                               [ 'ORDER BY' => [ 'rc_timestamp DESC', 'rc_id DESC' ] ]
+                       ],
+                       [
+                               [ 'dir' => WatchedItemQueryService::DIR_OLDER, 'end' => '20151212010101' ],
+                               [],
+                               [ "rc_timestamp >= '20151212010101'" ],
+                               [ 'ORDER BY' => [ 'rc_timestamp DESC', 'rc_id DESC' ] ]
+                       ],
+                       [
+                               [
+                                       'dir' => WatchedItemQueryService::DIR_OLDER,
+                                       'start' => '20151212020101',
+                                       'end' => '20151212010101'
+                               ],
+                               [],
+                               [ "rc_timestamp <= '20151212020101'", "rc_timestamp >= '20151212010101'" ],
+                               [ 'ORDER BY' => [ 'rc_timestamp DESC', 'rc_id DESC' ] ]
+                       ],
+                       [
+                               [ 'dir' => WatchedItemQueryService::DIR_NEWER, 'start' => '20151212010101' ],
+                               [],
+                               [ "rc_timestamp >= '20151212010101'" ],
+                               [ 'ORDER BY' => [ 'rc_timestamp', 'rc_id' ] ]
+                       ],
+                       [
+                               [ 'dir' => WatchedItemQueryService::DIR_NEWER, 'end' => '20151212010101' ],
+                               [],
+                               [ "rc_timestamp <= '20151212010101'" ],
+                               [ 'ORDER BY' => [ 'rc_timestamp', 'rc_id' ] ]
+                       ],
+                       [
+                               [
+                                       'dir' => WatchedItemQueryService::DIR_NEWER,
+                                       'start' => '20151212010101',
+                                       'end' => '20151212020101'
+                               ],
+                               [],
+                               [ "rc_timestamp >= '20151212010101'", "rc_timestamp <= '20151212020101'" ],
+                               [ 'ORDER BY' => [ 'rc_timestamp', 'rc_id' ] ]
+                       ],
+                       [
+                               [ 'limit' => 10 ],
+                               [],
+                               [],
+                               [ 'LIMIT' => 10 ],
+                       ],
+                       [
+                               [ 'limit' => "10; DROP TABLE watchlist;\n--" ],
+                               [],
+                               [],
+                               [ 'LIMIT' => 10 ],
+                       ],
+                       [
+                               [ 'filters' => [ WatchedItemQueryService::FILTER_MINOR ] ],
+                               [],
+                               [ 'rc_minor != 0' ],
+                               [],
+                       ],
+                       [
+                               [ 'filters' => [ WatchedItemQueryService::FILTER_NOT_MINOR ] ],
+                               [],
+                               [ 'rc_minor = 0' ],
+                               [],
+                       ],
+                       [
+                               [ 'filters' => [ WatchedItemQueryService::FILTER_BOT ] ],
+                               [],
+                               [ 'rc_bot != 0' ],
+                               [],
+                       ],
+                       [
+                               [ 'filters' => [ WatchedItemQueryService::FILTER_NOT_BOT ] ],
+                               [],
+                               [ 'rc_bot = 0' ],
+                               [],
+                       ],
+                       [
+                               [ 'filters' => [ WatchedItemQueryService::FILTER_ANON ] ],
+                               [],
+                               [ 'rc_user = 0' ],
+                               [],
+                       ],
+                       [
+                               [ 'filters' => [ WatchedItemQueryService::FILTER_NOT_ANON ] ],
+                               [],
+                               [ 'rc_user != 0' ],
+                               [],
+                       ],
+                       [
+                               [ 'filters' => [ WatchedItemQueryService::FILTER_PATROLLED ] ],
+                               [],
+                               [ 'rc_patrolled != 0' ],
+                               [],
+                       ],
+                       [
+                               [ 'filters' => [ WatchedItemQueryService::FILTER_NOT_PATROLLED ] ],
+                               [],
+                               [ 'rc_patrolled = 0' ],
+                               [],
+                       ],
+                       [
+                               [ 'filters' => [ WatchedItemQueryService::FILTER_UNREAD ] ],
+                               [],
+                               [ 'rc_timestamp >= wl_notificationtimestamp' ],
+                               [],
+                       ],
+                       [
+                               [ 'filters' => [ WatchedItemQueryService::FILTER_NOT_UNREAD ] ],
+                               [],
+                               [ 'wl_notificationtimestamp IS NULL OR rc_timestamp < wl_notificationtimestamp' ],
+                               [],
+                       ],
+                       [
+                               [ 'onlyByUser' => 'SomeOtherUser' ],
+                               [],
+                               [ 'rc_user_text' => 'SomeOtherUser' ],
+                               [],
+                       ],
+                       [
+                               [ 'notByUser' => 'SomeOtherUser' ],
+                               [],
+                               [ "rc_user_text != 'SomeOtherUser'" ],
+                               [],
+                       ],
+                       [
+                               [ 'startFrom' => [ '20151212010101', 123 ], 'dir' => WatchedItemQueryService::DIR_OLDER ],
+                               [],
+                               [
+                                       "(rc_timestamp < '20151212010101') OR ((rc_timestamp = '20151212010101') AND (rc_id <= 123))"
+                               ],
+                               [ 'ORDER BY' => [ 'rc_timestamp DESC', 'rc_id DESC' ] ],
+                       ],
+                       [
+                               [ 'startFrom' => [ '20151212010101', 123 ], 'dir' => WatchedItemQueryService::DIR_NEWER ],
+                               [],
+                               [
+                                       "(rc_timestamp > '20151212010101') OR ((rc_timestamp = '20151212010101') AND (rc_id >= 123))"
+                               ],
+                               [ 'ORDER BY' => [ 'rc_timestamp', 'rc_id' ] ],
+                       ],
+                       [
+                               [
+                                       'startFrom' => [ '20151212010101', "123; DROP TABLE watchlist;\n--" ],
+                                       'dir' => WatchedItemQueryService::DIR_OLDER
+                               ],
+                               [],
+                               [
+                                       "(rc_timestamp < '20151212010101') OR ((rc_timestamp = '20151212010101') AND (rc_id <= 123))"
+                               ],
+                               [ 'ORDER BY' => [ 'rc_timestamp DESC', 'rc_id DESC' ] ],
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider getWatchedItemsWithRecentChangeInfoOptionsProvider
+        */
+       public function testGetWatchedItemsWithRecentChangeInfo_optionsAndEmptyResult(
+               array $options,
+               array $expectedExtraFields,
+               array $expectedExtraConds,
+               array $expectedDbOptions
+       ) {
+               $expectedFields = array_merge(
+                       [
+                               'rc_id',
+                               'rc_namespace',
+                               'rc_title',
+                               'rc_timestamp',
+                               'rc_type',
+                               'rc_deleted',
+                               'wl_notificationtimestamp',
+
+                               'rc_cur_id',
+                               'rc_this_oldid',
+                               'rc_last_oldid',
+                       ],
+                       $expectedExtraFields
+               );
+               $expectedConds = array_merge(
+                       [ 'wl_user' => 1, '(rc_this_oldid=page_latest) OR (rc_type=3)', ],
+                       $expectedExtraConds
+               );
+
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'select' )
+                       ->with(
+                               [ 'recentchanges', 'watchlist', 'page' ],
+                               $expectedFields,
+                               $expectedConds,
+                               $this->isType( 'string' ),
+                               $expectedDbOptions,
+                               [
+                                       'watchlist' => [
+                                               'INNER JOIN',
+                                               [
+                                                       'wl_namespace=rc_namespace',
+                                                       'wl_title=rc_title'
+                                               ]
+                                       ],
+                                       'page' => [
+                                               'LEFT JOIN',
+                                               'rc_cur_id=page_id',
+                                       ],
+                               ]
+                       )
+                       ->will( $this->returnValue( [] ) );
+
+               $queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
+               $user = $this->getMockUnrestrictedNonAnonUserWithId( 1 );
+
+               $items = $queryService->getWatchedItemsWithRecentChangeInfo( $user, $options );
+
+               $this->assertEmpty( $items );
+       }
+
+       public function filterPatrolledOptionProvider() {
+               return [
+                       [ WatchedItemQueryService::FILTER_PATROLLED ],
+                       [ WatchedItemQueryService::FILTER_NOT_PATROLLED ],
+               ];
+       }
+
+       /**
+        * @dataProvider filterPatrolledOptionProvider
+        */
+       public function testGetWatchedItemsWithRecentChangeInfo_filterPatrolledAndUserWithNoPatrolRights(
+               $filtersOption
+       ) {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'select' )
+                       ->with(
+                               [ 'recentchanges', 'watchlist', 'page' ],
+                               $this->isType( 'array' ),
+                               [ 'wl_user' => 1, '(rc_this_oldid=page_latest) OR (rc_type=3)' ],
+                               $this->isType( 'string' ),
+                               $this->isType( 'array' ),
+                               $this->isType( 'array' )
+                       )
+                       ->will( $this->returnValue( [] ) );
+
+               $user = $this->getMockNonAnonUserWithIdAndNoPatrolRights( 1 );
+
+               $queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
+               $items = $queryService->getWatchedItemsWithRecentChangeInfo(
+                       $user,
+                       [ 'filters' => [ $filtersOption ] ]
+               );
+
+               $this->assertEmpty( $items );
+       }
+
+       public function mysqlIndexOptimizationProvider() {
+               return [
+                       [
+                               'mysql',
+                               [],
+                               [ "rc_timestamp > ''" ],
+                       ],
+                       [
+                               'mysql',
+                               [ 'start' => '20151212010101', 'dir' => WatchedItemQueryService::DIR_OLDER ],
+                               [ "rc_timestamp <= '20151212010101'" ],
+                       ],
+                       [
+                               'mysql',
+                               [ 'end' => '20151212010101', 'dir' => WatchedItemQueryService::DIR_OLDER ],
+                               [ "rc_timestamp >= '20151212010101'" ],
+                       ],
+                       [
+                               'postgres',
+                               [],
+                               [],
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider mysqlIndexOptimizationProvider
+        */
+       public function testGetWatchedItemsWithRecentChangeInfo_mysqlIndexOptimization(
+               $dbType,
+               array $options,
+               array $expectedExtraConds
+       ) {
+               $commonConds = [ 'wl_user' => 1, '(rc_this_oldid=page_latest) OR (rc_type=3)' ];
+               $conds = array_merge( $commonConds, $expectedExtraConds );
+
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'select' )
+                       ->with(
+                               [ 'recentchanges', 'watchlist', 'page' ],
+                               $this->isType( 'array' ),
+                               $conds,
+                               $this->isType( 'string' ),
+                               $this->isType( 'array' ),
+                               $this->isType( 'array' )
+                       )
+                       ->will( $this->returnValue( [] ) );
+               $mockDb->expects( $this->any() )
+                       ->method( 'getType' )
+                       ->will( $this->returnValue( $dbType ) );
+
+               $queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
+               $user = $this->getMockUnrestrictedNonAnonUserWithId( 1 );
+
+               $items = $queryService->getWatchedItemsWithRecentChangeInfo( $user, $options );
+
+               $this->assertEmpty( $items );
+       }
+
+       public function userPermissionRelatedExtraChecksProvider() {
+               return [
+                       [
+                               [],
+                               'deletedhistory',
+                               [
+                                       '(rc_type != ' . RC_LOG . ') OR ((rc_deleted & ' . LogPage::DELETED_ACTION . ') != ' .
+                                               LogPage::DELETED_ACTION . ')'
+                               ],
+                       ],
+                       [
+                               [],
+                               'suppressrevision',
+                               [
+                                       '(rc_type != ' . RC_LOG . ') OR (' .
+                                               '(rc_deleted & ' . ( LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED ) . ') != ' .
+                                               ( LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED ) . ')'
+                               ],
+                       ],
+                       [
+                               [],
+                               'viewsuppressed',
+                               [
+                                       '(rc_type != ' . RC_LOG . ') OR (' .
+                                               '(rc_deleted & ' . ( LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED ) . ') != ' .
+                                               ( LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED ) . ')'
+                               ],
+                       ],
+                       [
+                               [ 'onlyByUser' => 'SomeOtherUser' ],
+                               'deletedhistory',
+                               [
+                                       'rc_user_text' => 'SomeOtherUser',
+                                       '(rc_deleted & ' . Revision::DELETED_USER . ') != ' . Revision::DELETED_USER,
+                                       '(rc_type != ' . RC_LOG . ') OR ((rc_deleted & ' . LogPage::DELETED_ACTION . ') != ' .
+                                               LogPage::DELETED_ACTION . ')'
+                               ],
+                       ],
+                       [
+                               [ 'onlyByUser' => 'SomeOtherUser' ],
+                               'suppressrevision',
+                               [
+                                       'rc_user_text' => 'SomeOtherUser',
+                                       '(rc_deleted & ' . ( Revision::DELETED_USER | Revision::DELETED_RESTRICTED ) . ') != ' .
+                                               ( Revision::DELETED_USER | Revision::DELETED_RESTRICTED ),
+                                       '(rc_type != ' . RC_LOG . ') OR (' .
+                                               '(rc_deleted & ' . ( LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED ) . ') != ' .
+                                               ( LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED ) . ')'
+                               ],
+                       ],
+                       [
+                               [ 'onlyByUser' => 'SomeOtherUser' ],
+                               'viewsuppressed',
+                               [
+                                       'rc_user_text' => 'SomeOtherUser',
+                                       '(rc_deleted & ' . ( Revision::DELETED_USER | Revision::DELETED_RESTRICTED ) . ') != ' .
+                                               ( Revision::DELETED_USER | Revision::DELETED_RESTRICTED ),
+                                       '(rc_type != ' . RC_LOG . ') OR (' .
+                                               '(rc_deleted & ' . ( LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED ) . ') != ' .
+                                               ( LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED ) . ')'
+                               ],
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider userPermissionRelatedExtraChecksProvider
+        */
+       public function testGetWatchedItemsWithRecentChangeInfo_userPermissionRelatedExtraChecks(
+               array $options,
+               $notAllowedAction,
+               array $expectedExtraConds
+       ) {
+               $commonConds = [ 'wl_user' => 1, '(rc_this_oldid=page_latest) OR (rc_type=3)' ];
+               $conds = array_merge( $commonConds, $expectedExtraConds );
+
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'select' )
+                       ->with(
+                               [ 'recentchanges', 'watchlist', 'page' ],
+                               $this->isType( 'array' ),
+                               $conds,
+                               $this->isType( 'string' ),
+                               $this->isType( 'array' ),
+                               $this->isType( 'array' )
+                       )
+                       ->will( $this->returnValue( [] ) );
+
+               $user = $this->getMockNonAnonUserWithIdAndRestrictedPermissions( 1, $notAllowedAction );
+
+               $queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
+               $items = $queryService->getWatchedItemsWithRecentChangeInfo( $user, $options );
+
+               $this->assertEmpty( $items );
+       }
+
+       public function testGetWatchedItemsWithRecentChangeInfo_allRevisionsOptionAndEmptyResult() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'select' )
+                       ->with(
+                               [ 'recentchanges', 'watchlist' ],
+                               [
+                                       'rc_id',
+                                       'rc_namespace',
+                                       'rc_title',
+                                       'rc_timestamp',
+                                       'rc_type',
+                                       'rc_deleted',
+                                       'wl_notificationtimestamp',
+
+                                       'rc_cur_id',
+                                       'rc_this_oldid',
+                                       'rc_last_oldid',
+                               ],
+                               [ 'wl_user' => 1, ],
+                               $this->isType( 'string' ),
+                               [],
+                               [
+                                       'watchlist' => [
+                                               'INNER JOIN',
+                                               [
+                                                       'wl_namespace=rc_namespace',
+                                                       'wl_title=rc_title'
+                                               ]
+                                       ],
+                               ]
+                       )
+                       ->will( $this->returnValue( [] ) );
+
+               $queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
+               $user = $this->getMockUnrestrictedNonAnonUserWithId( 1 );
+
+               $items = $queryService->getWatchedItemsWithRecentChangeInfo( $user, [ 'allRevisions' => true ] );
+
+               $this->assertEmpty( $items );
+       }
+
+       public function getWatchedItemsWithRecentChangeInfoInvalidOptionsProvider() {
+               return [
+                       [
+                               [ 'rcTypes' => [ 1337 ] ],
+                               'Bad value for parameter $options[\'rcTypes\']',
+                       ],
+                       [
+                               [ 'rcTypes' => [ 'edit' ] ],
+                               'Bad value for parameter $options[\'rcTypes\']',
+                       ],
+                       [
+                               [ 'rcTypes' => [ RC_EDIT, 1337 ] ],
+                               'Bad value for parameter $options[\'rcTypes\']',
+                       ],
+                       [
+                               [ 'dir' => 'foo' ],
+                               'Bad value for parameter $options[\'dir\']',
+                       ],
+                       [
+                               [ 'start' => '20151212010101' ],
+                               'Bad value for parameter $options[\'dir\']: must be provided',
+                       ],
+                       [
+                               [ 'end' => '20151212010101' ],
+                               'Bad value for parameter $options[\'dir\']: must be provided',
+                       ],
+                       [
+                               [ 'startFrom' => [ '20151212010101', 123 ] ],
+                               'Bad value for parameter $options[\'dir\']: must be provided',
+                       ],
+                       [
+                               [ 'dir' => WatchedItemQueryService::DIR_OLDER, 'startFrom' => '20151212010101' ],
+                               'Bad value for parameter $options[\'startFrom\']: must be a two-element array',
+                       ],
+                       [
+                               [ 'dir' => WatchedItemQueryService::DIR_OLDER, 'startFrom' => [ '20151212010101' ] ],
+                               'Bad value for parameter $options[\'startFrom\']: must be a two-element array',
+                       ],
+                       [
+                               [
+                                       'dir' => WatchedItemQueryService::DIR_OLDER,
+                                       'startFrom' => [ '20151212010101', 123, 'foo' ]
+                               ],
+                               'Bad value for parameter $options[\'startFrom\']: must be a two-element array',
+                       ],
+                       [
+                               [ 'watchlistOwner' => $this->getMockUnrestrictedNonAnonUserWithId( 2 ) ],
+                               'Bad value for parameter $options[\'watchlistOwnerToken\']',
+                       ],
+                       [
+                               [ 'watchlistOwner' => 'Other User', 'watchlistOwnerToken' => 'some-token' ],
+                               'Bad value for parameter $options[\'watchlistOwner\']',
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider getWatchedItemsWithRecentChangeInfoInvalidOptionsProvider
+        */
+       public function testGetWatchedItemsWithRecentChangeInfo_invalidOptions(
+               array $options,
+               $expectedInExceptionMessage
+       ) {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->never() )
+                       ->method( $this->anything() );
+
+               $queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
+               $user = $this->getMockUnrestrictedNonAnonUserWithId( 1 );
+
+               $this->setExpectedException( InvalidArgumentException::class, $expectedInExceptionMessage );
+               $queryService->getWatchedItemsWithRecentChangeInfo( $user, $options );
+       }
+
+       public function testGetWatchedItemsWithRecentChangeInfo_usedInGeneratorOptionAndEmptyResult() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'select' )
+                       ->with(
+                               [ 'recentchanges', 'watchlist', 'page' ],
+                               [
+                                       'rc_id',
+                                       'rc_namespace',
+                                       'rc_title',
+                                       'rc_timestamp',
+                                       'rc_type',
+                                       'rc_deleted',
+                                       'wl_notificationtimestamp',
+                                       'rc_cur_id',
+                               ],
+                               [ 'wl_user' => 1, '(rc_this_oldid=page_latest) OR (rc_type=3)' ],
+                               $this->isType( 'string' ),
+                               [],
+                               [
+                                       'watchlist' => [
+                                               'INNER JOIN',
+                                               [
+                                                       'wl_namespace=rc_namespace',
+                                                       'wl_title=rc_title'
+                                               ]
+                                       ],
+                                       'page' => [
+                                               'LEFT JOIN',
+                                               'rc_cur_id=page_id',
+                                       ],
+                               ]
+                       )
+                       ->will( $this->returnValue( [] ) );
+
+               $queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
+               $user = $this->getMockUnrestrictedNonAnonUserWithId( 1 );
+
+               $items = $queryService->getWatchedItemsWithRecentChangeInfo(
+                       $user,
+                       [ 'usedInGenerator' => true ]
+               );
+
+               $this->assertEmpty( $items );
+       }
+
+       public function testGetWatchedItemsWithRecentChangeInfo_usedInGeneratorAllRevisionsOptions() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'select' )
+                       ->with(
+                               [ 'recentchanges', 'watchlist' ],
+                               [
+                                       'rc_id',
+                                       'rc_namespace',
+                                       'rc_title',
+                                       'rc_timestamp',
+                                       'rc_type',
+                                       'rc_deleted',
+                                       'wl_notificationtimestamp',
+                                       'rc_this_oldid',
+                               ],
+                               [ 'wl_user' => 1 ],
+                               $this->isType( 'string' ),
+                               [],
+                               [
+                                       'watchlist' => [
+                                               'INNER JOIN',
+                                               [
+                                                       'wl_namespace=rc_namespace',
+                                                       'wl_title=rc_title'
+                                               ]
+                                       ],
+                               ]
+                       )
+                       ->will( $this->returnValue( [] ) );
+
+               $queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
+               $user = $this->getMockUnrestrictedNonAnonUserWithId( 1 );
+
+               $items = $queryService->getWatchedItemsWithRecentChangeInfo(
+                       $user,
+                       [ 'usedInGenerator' => true, 'allRevisions' => true, ]
+               );
+
+               $this->assertEmpty( $items );
+       }
+
+       public function testGetWatchedItemsWithRecentChangeInfo_watchlistOwnerOptionAndEmptyResult() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'select' )
+                       ->with(
+                               $this->isType( 'array' ),
+                               $this->isType( 'array' ),
+                               [
+                                       'wl_user' => 2,
+                                       '(rc_this_oldid=page_latest) OR (rc_type=3)',
+                               ],
+                               $this->isType( 'string' ),
+                               $this->isType( 'array' ),
+                               $this->isType( 'array' )
+                       )
+                       ->will( $this->returnValue( [] ) );
+
+               $queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
+               $user = $this->getMockUnrestrictedNonAnonUserWithId( 1 );
+               $otherUser = $this->getMockUnrestrictedNonAnonUserWithId( 2 );
+               $otherUser->expects( $this->once() )
+                       ->method( 'getOption' )
+                       ->with( 'watchlisttoken' )
+                       ->willReturn( '0123456789abcdef' );
+
+               $items = $queryService->getWatchedItemsWithRecentChangeInfo(
+                       $user,
+                       [ 'watchlistOwner' => $otherUser, 'watchlistOwnerToken' => '0123456789abcdef' ]
+               );
+
+               $this->assertEmpty( $items );
+       }
+
+       public function invalidWatchlistTokenProvider() {
+               return [
+                       [ 'wrongToken' ],
+                       [ '' ],
+               ];
+       }
+
+       /**
+        * @dataProvider invalidWatchlistTokenProvider
+        */
+       public function testGetWatchedItemsWithRecentChangeInfo_watchlistOwnerAndInvalidToken( $token ) {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->never() )
+                       ->method( $this->anything() );
+
+               $queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
+               $user = $this->getMockUnrestrictedNonAnonUserWithId( 1 );
+               $otherUser = $this->getMockUnrestrictedNonAnonUserWithId( 2 );
+               $otherUser->expects( $this->once() )
+                       ->method( 'getOption' )
+                       ->with( 'watchlisttoken' )
+                       ->willReturn( '0123456789abcdef' );
+
+               $this->setExpectedException( UsageException::class, 'Incorrect watchlist token provided' );
+               $queryService->getWatchedItemsWithRecentChangeInfo(
+                       $user,
+                       [ 'watchlistOwner' => $otherUser, 'watchlistOwnerToken' => $token ]
+               );
+       }
+
+       public function testGetWatchedItemsForUser() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'select' )
+                       ->with(
+                               'watchlist',
+                               [ 'wl_namespace', 'wl_title', 'wl_notificationtimestamp' ],
+                               [ 'wl_user' => 1 ]
+                       )
+                       ->will( $this->returnValue( [
+                               $this->getFakeRow( [
+                                       'wl_namespace' => 0,
+                                       'wl_title' => 'Foo1',
+                                       'wl_notificationtimestamp' => '20151212010101',
+                               ] ),
+                               $this->getFakeRow( [
+                                       'wl_namespace' => 1,
+                                       'wl_title' => 'Foo2',
+                                       'wl_notificationtimestamp' => null,
+                               ] ),
+                       ] ) );
+
+               $queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
+               $user = $this->getMockNonAnonUserWithId( 1 );
+
+               $items = $queryService->getWatchedItemsForUser( $user );
+
+               $this->assertInternalType( 'array', $items );
+               $this->assertCount( 2, $items );
+               $this->assertContainsOnlyInstancesOf( WatchedItem::class, $items );
+               $this->assertEquals(
+                       new WatchedItem( $user, new TitleValue( 0, 'Foo1' ), '20151212010101' ),
+                       $items[0]
+               );
+               $this->assertEquals(
+                       new WatchedItem( $user, new TitleValue( 1, 'Foo2' ), null ),
+                       $items[1]
+               );
+       }
+
+       public function provideGetWatchedItemsForUserOptions() {
+               return [
+                       [
+                               [ 'namespaceIds' => [ 0, 1 ], ],
+                               [ 'wl_namespace' => [ 0, 1 ], ],
+                               []
+                       ],
+                       [
+                               [ 'sort' => WatchedItemQueryService::SORT_ASC, ],
+                               [],
+                               [ 'ORDER BY' => [ 'wl_namespace ASC', 'wl_title ASC' ] ]
+                       ],
+                       [
+                               [
+                                       'namespaceIds' => [ 0 ],
+                                       'sort' => WatchedItemQueryService::SORT_ASC,
+                               ],
+                               [ 'wl_namespace' => [ 0 ], ],
+                               [ 'ORDER BY' => 'wl_title ASC' ]
+                       ],
+                       [
+                               [ 'limit' => 10 ],
+                               [],
+                               [ 'LIMIT' => 10 ]
+                       ],
+                       [
+                               [
+                                       'namespaceIds' => [ 0, "1; DROP TABLE watchlist;\n--" ],
+                                       'limit' => "10; DROP TABLE watchlist;\n--",
+                               ],
+                               [ 'wl_namespace' => [ 0, 1 ], ],
+                               [ 'LIMIT' => 10 ]
+                       ],
+                       [
+                               [ 'filter' => WatchedItemQueryService::FILTER_CHANGED ],
+                               [ 'wl_notificationtimestamp IS NOT NULL' ],
+                               []
+                       ],
+                       [
+                               [ 'filter' => WatchedItemQueryService::FILTER_NOT_CHANGED ],
+                               [ 'wl_notificationtimestamp IS NULL' ],
+                               []
+                       ],
+                       [
+                               [ 'sort' => WatchedItemQueryService::SORT_DESC, ],
+                               [],
+                               [ 'ORDER BY' => [ 'wl_namespace DESC', 'wl_title DESC' ] ]
+                       ],
+                       [
+                               [
+                                       'namespaceIds' => [ 0 ],
+                                       'sort' => WatchedItemQueryService::SORT_DESC,
+                               ],
+                               [ 'wl_namespace' => [ 0 ], ],
+                               [ 'ORDER BY' => 'wl_title DESC' ]
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideGetWatchedItemsForUserOptions
+        */
+       public function testGetWatchedItemsForUser_optionsAndEmptyResult(
+               array $options,
+               array $expectedConds,
+               array $expectedDbOptions
+       ) {
+               $mockDb = $this->getMockDb();
+               $user = $this->getMockNonAnonUserWithId( 1 );
+
+               $expectedConds = array_merge( [ 'wl_user' => 1 ], $expectedConds );
+               $mockDb->expects( $this->once() )
+                       ->method( 'select' )
+                       ->with(
+                               'watchlist',
+                               [ 'wl_namespace', 'wl_title', 'wl_notificationtimestamp' ],
+                               $expectedConds,
+                               $this->isType( 'string' ),
+                               $expectedDbOptions
+                       )
+                       ->will( $this->returnValue( [] ) );
+
+               $queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
+
+               $items = $queryService->getWatchedItemsForUser( $user, $options );
+               $this->assertEmpty( $items );
+       }
+
+       public function provideGetWatchedItemsForUser_fromUntilStartFromOptions() {
+               return [
+                       [
+                               [
+                                       'from' => new TitleValue( 0, 'SomeDbKey' ),
+                                       'sort' => WatchedItemQueryService::SORT_ASC
+                               ],
+                               [ "(wl_namespace > 0) OR ((wl_namespace = 0) AND (wl_title >= 'SomeDbKey'))", ],
+                               [ 'ORDER BY' => [ 'wl_namespace ASC', 'wl_title ASC' ] ]
+                       ],
+                       [
+                               [
+                                       'from' => new TitleValue( 0, 'SomeDbKey' ),
+                                       'sort' => WatchedItemQueryService::SORT_DESC,
+                               ],
+                               [ "(wl_namespace < 0) OR ((wl_namespace = 0) AND (wl_title <= 'SomeDbKey'))", ],
+                               [ 'ORDER BY' => [ 'wl_namespace DESC', 'wl_title DESC' ] ]
+                       ],
+                       [
+                               [
+                                       'until' => new TitleValue( 0, 'SomeDbKey' ),
+                                       'sort' => WatchedItemQueryService::SORT_ASC
+                               ],
+                               [ "(wl_namespace < 0) OR ((wl_namespace = 0) AND (wl_title <= 'SomeDbKey'))", ],
+                               [ 'ORDER BY' => [ 'wl_namespace ASC', 'wl_title ASC' ] ]
+                       ],
+                       [
+                               [
+                                       'until' => new TitleValue( 0, 'SomeDbKey' ),
+                                       'sort' => WatchedItemQueryService::SORT_DESC
+                               ],
+                               [ "(wl_namespace > 0) OR ((wl_namespace = 0) AND (wl_title >= 'SomeDbKey'))", ],
+                               [ 'ORDER BY' => [ 'wl_namespace DESC', 'wl_title DESC' ] ]
+                       ],
+                       [
+                               [
+                                       'from' => new TitleValue( 0, 'AnotherDbKey' ),
+                                       'until' => new TitleValue( 0, 'SomeOtherDbKey' ),
+                                       'startFrom' => new TitleValue( 0, 'SomeDbKey' ),
+                                       'sort' => WatchedItemQueryService::SORT_ASC
+                               ],
+                               [
+                                       "(wl_namespace > 0) OR ((wl_namespace = 0) AND (wl_title >= 'AnotherDbKey'))",
+                                       "(wl_namespace < 0) OR ((wl_namespace = 0) AND (wl_title <= 'SomeOtherDbKey'))",
+                                       "(wl_namespace > 0) OR ((wl_namespace = 0) AND (wl_title >= 'SomeDbKey'))",
+                               ],
+                               [ 'ORDER BY' => [ 'wl_namespace ASC', 'wl_title ASC' ] ]
+                       ],
+                       [
+                               [
+                                       'from' => new TitleValue( 0, 'SomeOtherDbKey' ),
+                                       'until' => new TitleValue( 0, 'AnotherDbKey' ),
+                                       'startFrom' => new TitleValue( 0, 'SomeDbKey' ),
+                                       'sort' => WatchedItemQueryService::SORT_DESC
+                               ],
+                               [
+                                       "(wl_namespace < 0) OR ((wl_namespace = 0) AND (wl_title <= 'SomeOtherDbKey'))",
+                                       "(wl_namespace > 0) OR ((wl_namespace = 0) AND (wl_title >= 'AnotherDbKey'))",
+                                       "(wl_namespace < 0) OR ((wl_namespace = 0) AND (wl_title <= 'SomeDbKey'))",
+                               ],
+                               [ 'ORDER BY' => [ 'wl_namespace DESC', 'wl_title DESC' ] ]
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideGetWatchedItemsForUser_fromUntilStartFromOptions
+        */
+       public function testGetWatchedItemsForUser_fromUntilStartFromOptions(
+               array $options,
+               array $expectedConds,
+               array $expectedDbOptions
+       ) {
+               $user = $this->getMockNonAnonUserWithId( 1 );
+
+               $expectedConds = array_merge( [ 'wl_user' => 1 ], $expectedConds );
+
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->any() )
+                       ->method( 'addQuotes' )
+                       ->will( $this->returnCallback( function( $value ) {
+                               return "'$value'";
+                       } ) );
+               $mockDb->expects( $this->any() )
+                       ->method( 'makeList' )
+                       ->with(
+                               $this->isType( 'array' ),
+                               $this->isType( 'int' )
+                       )
+                       ->will( $this->returnCallback( function( $a, $conj ) {
+                               $sqlConj = $conj === LIST_AND ? ' AND ' : ' OR ';
+                               return join( $sqlConj, array_map( function( $s ) {
+                                       return '(' . $s . ')';
+                               }, $a
+                               ) );
+                       } ) );
+               $mockDb->expects( $this->once() )
+                       ->method( 'select' )
+                       ->with(
+                               'watchlist',
+                               [ 'wl_namespace', 'wl_title', 'wl_notificationtimestamp' ],
+                               $expectedConds,
+                               $this->isType( 'string' ),
+                               $expectedDbOptions
+                       )
+                       ->will( $this->returnValue( [] ) );
+
+               $queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
+
+               $items = $queryService->getWatchedItemsForUser( $user, $options );
+               $this->assertEmpty( $items );
+       }
+
+       public function getWatchedItemsForUserInvalidOptionsProvider() {
+               return [
+                       [
+                               [ 'sort' => 'foo' ],
+                               'Bad value for parameter $options[\'sort\']'
+                       ],
+                       [
+                               [ 'filter' => 'foo' ],
+                               'Bad value for parameter $options[\'filter\']'
+                       ],
+                       [
+                               [ 'from' => new TitleValue( 0, 'SomeDbKey' ), ],
+                               'Bad value for parameter $options[\'sort\']: must be provided'
+                       ],
+                       [
+                               [ 'until' => new TitleValue( 0, 'SomeDbKey' ), ],
+                               'Bad value for parameter $options[\'sort\']: must be provided'
+                       ],
+                       [
+                               [ 'startFrom' => new TitleValue( 0, 'SomeDbKey' ), ],
+                               'Bad value for parameter $options[\'sort\']: must be provided'
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider getWatchedItemsForUserInvalidOptionsProvider
+        */
+       public function testGetWatchedItemsForUser_invalidOptionThrowsException(
+               array $options,
+               $expectedInExceptionMessage
+       ) {
+               $queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $this->getMockDb() ) );
+
+               $this->setExpectedException( InvalidArgumentException::class, $expectedInExceptionMessage );
+               $queryService->getWatchedItemsForUser( $this->getMockNonAnonUserWithId( 1 ), $options );
+       }
+
+       public function testGetWatchedItemsForUser_userNotAllowedToViewWatchlist() {
+               $mockDb = $this->getMockDb();
+
+               $mockDb->expects( $this->never() )
+                       ->method( $this->anything() );
+
+               $queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
+
+               $items = $queryService->getWatchedItemsForUser( $this->getMockAnonUser() );
+               $this->assertEmpty( $items );
+       }
+
+}
index 2d2e726..030d9d5 100644 (file)
@@ -2444,10 +2444,10 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
        public function testUpdateNotificationTimestamp_watchersExist() {
                $mockDb = $this->getMockDb();
                $mockDb->expects( $this->once() )
-                       ->method( 'select' )
+                       ->method( 'selectFieldValues' )
                        ->with(
-                               [ 'watchlist' ],
-                               [ 'wl_user' ],
+                               'watchlist',
+                               'wl_user',
                                [
                                        'wl_user != 1',
                                        'wl_namespace' => 0,
@@ -2455,18 +2455,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                                        'wl_notificationtimestamp IS NULL'
                                ]
                        )
-                       ->will(
-                               $this->returnValue( [
-                                       $this->getFakeRow( [ 'wl_user' => '2' ] ),
-                                       $this->getFakeRow( [ 'wl_user' => '3' ] )
-                               ] )
-                       );
-               $mockDb->expects( $this->once() )
-                       ->method( 'onTransactionIdle' )
-                       ->with( $this->isType( 'callable' ) )
-                       ->will( $this->returnCallback( function( $callable ) {
-                               $callable();
-                       } ) );
+                       ->will( $this->returnValue( [ '2', '3' ] ) );
                $mockDb->expects( $this->once() )
                        ->method( 'update' )
                        ->with(
@@ -2502,10 +2491,10 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
        public function testUpdateNotificationTimestamp_noWatchers() {
                $mockDb = $this->getMockDb();
                $mockDb->expects( $this->once() )
-                       ->method( 'select' )
+                       ->method( 'selectFieldValues' )
                        ->with(
-                               [ 'watchlist' ],
-                               [ 'wl_user' ],
+                               'watchlist',
+                               'wl_user',
                                [
                                        'wl_user != 1',
                                        'wl_namespace' => 0,
@@ -2516,8 +2505,6 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                        ->will(
                                $this->returnValue( [] )
                        );
-               $mockDb->expects( $this->never() )
-                       ->method( 'onTransactionIdle' );
                $mockDb->expects( $this->never() )
                        ->method( 'update' );
 
@@ -2551,19 +2538,10 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                                $this->getFakeRow( [ 'wl_notificationtimestamp' => '20151212010101' ] )
                        ) );
                $mockDb->expects( $this->once() )
-                       ->method( 'select' )
+                       ->method( 'selectFieldValues' )
                        ->will(
-                               $this->returnValue( [
-                                       $this->getFakeRow( [ 'wl_user' => '2' ] ),
-                                       $this->getFakeRow( [ 'wl_user' => '3' ] )
-                               ] )
+                               $this->returnValue( [ '2', '3' ] )
                        );
-               $mockDb->expects( $this->once() )
-                       ->method( 'onTransactionIdle' )
-                       ->with( $this->isType( 'callable' ) )
-                       ->will( $this->returnCallback( function( $callable ) {
-                               $callable();
-                       } ) );
                $mockDb->expects( $this->once() )
                        ->method( 'update' );
 
index 0182eb7..7e1ff3d 100644 (file)
@@ -78,35 +78,6 @@ class WatchedItemUnitTest extends MediaWikiTestCase {
                $this->assertEquals( $timestamp, $item->getNotificationTimestamp() );
        }
 
-       /**
-        * @dataProvider provideUserTitleTimestamp
-        */
-       public function testResetNotificationTimestamp( $user, $linkTarget, $timestamp ) {
-               $force = 'XXX';
-               $oldid = 999;
-
-               $store = $this->getMockWatchedItemStore();
-               $store->expects( $this->once() )
-                       ->method( 'resetNotificationTimestamp' )
-                       ->with( $user, $this->isInstanceOf( Title::class ), $force, $oldid )
-                       ->will( $this->returnCallback(
-                               function ( $user, Title $title, $force, $oldid ) use ( $linkTarget ) {
-                                       /** @var LinkTarget $linkTarget */
-                                       $this->assertInstanceOf( 'Title', $title );
-                                       $this->assertSame( $linkTarget->getDBkey(), $title->getDBkey() );
-                                       $this->assertSame( $linkTarget->getFragment(), $title->getFragment() );
-                                       $this->assertSame( $linkTarget->getNamespace(), $title->getNamespace() );
-                                       $this->assertSame( $linkTarget->getText(), $title->getText() );
-
-                                       return true;
-                               }
-                       ) );
-               $this->setService( 'WatchedItemStore', $store );
-
-               $item = new WatchedItem( $user, $linkTarget, $timestamp );
-               $item->resetNotificationTimestamp( $force, $oldid );
-       }
-
        public function testAddWatch() {
                $title = Title::newFromText( 'SomeTitle' );
                $timestamp = null;
@@ -176,38 +147,4 @@ class WatchedItemUnitTest extends MediaWikiTestCase {
                WatchedItem::duplicateEntries( $oldTitle, $newTitle );
        }
 
-       public function testBatchAddWatch() {
-               $itemOne = new WatchedItem( $this->getMockUser( 1 ), new TitleValue( 0, 'Title1' ), null );
-               $itemTwo = new WatchedItem(
-                       $this->getMockUser( 3 ),
-                       Title::newFromText( 'Title2' ),
-                       '20150101010101'
-               );
-
-               $store = $this->getMockWatchedItemStore();
-               $store->expects( $this->exactly( 2 ) )
-                       ->method( 'addWatchBatchForUser' );
-               $store->expects( $this->at( 0 ) )
-                       ->method( 'addWatchBatchForUser' )
-                       ->with(
-                               $itemOne->getUser(),
-                               [
-                                       $itemOne->getTitle()->getSubjectPage(),
-                                       $itemOne->getTitle()->getTalkPage(),
-                               ]
-                       );
-               $store->expects( $this->at( 1 ) )
-                       ->method( 'addWatchBatchForUser' )
-                       ->with(
-                               $itemTwo->getUser(),
-                               [
-                                       $itemTwo->getTitle()->getSubjectPage(),
-                                       $itemTwo->getTitle()->getTalkPage(),
-                               ]
-                       );
-               $this->setService( 'WatchedItemStore', $store );
-
-               WatchedItem::batchAddWatch( [ $itemOne, $itemTwo ] );
-       }
-
 }
index 4e22e3c..12878b3 100644 (file)
@@ -15,6 +15,7 @@ class WikiMapTest extends MediaWikiLangTestCase {
                        'wgServer' => [
                                'enwiki' => 'http://en.example.org',
                                'ruwiki' => '//ru.example.org',
+                               'nopathwiki' => '//nopath.example.org',
                        ],
                        'wgArticlePath' => [
                                'enwiki' => '/w/$1',
@@ -46,6 +47,8 @@ class WikiMapTest extends MediaWikiLangTestCase {
                        'nlwiki (sites)' => [ $nlwiki, 'nlwiki', false ],
                        'enwiktionary (sites)' => [ $enwiktionary, 'enwiktionary', false ],
                        'non MediaWiki site' => [ null, 'spam', false ],
+                       'boguswiki' => [ null, 'boguswiki' ],
+                       'nopathwiki' => [ null, 'nopathwiki' ],
                ];
        }
 
index 2f8ffcc..155a9dd 100644 (file)
@@ -19,7 +19,7 @@ class ApiLoginTest extends ApiTestCase {
                        'wsTokenSecrets' => [ 'login' => 'foobar' ],
                ];
                $data = $this->doApiRequest( [ 'action' => 'login',
-                       'lgname' => '', 'lgpassword' => self::$users['sysop']->password,
+                       'lgname' => '', 'lgpassword' => self::$users['sysop']->getPassword(),
                        'lgtoken' => (string)( new MediaWiki\Session\Token( 'foobar', '' ) )
                ], $session );
                $this->assertEquals( $wgDisableAuthManager ? 'NoName' : 'Failed', $data[0]['login']['result'] );
@@ -29,6 +29,7 @@ class ApiLoginTest extends ApiTestCase {
                global $wgServer, $wgDisableAuthManager;
 
                $user = self::$users['sysop'];
+               $userName = $user->getUser()->getName();
                $user->getUser()->logout();
 
                if ( !isset( $wgServer ) ) {
@@ -36,7 +37,7 @@ class ApiLoginTest extends ApiTestCase {
                }
                $ret = $this->doApiRequest( [
                        "action" => "login",
-                       "lgname" => $user->username,
+                       "lgname" => $userName,
                        "lgpassword" => "bad",
                ] );
 
@@ -52,7 +53,7 @@ class ApiLoginTest extends ApiTestCase {
                        [
                                "action" => "login",
                                "lgtoken" => $token,
-                               "lgname" => $user->username,
+                               "lgname" => $userName,
                                "lgpassword" => "badnowayinhell",
                        ],
                        $ret[2]
@@ -74,12 +75,14 @@ class ApiLoginTest extends ApiTestCase {
                }
 
                $user = self::$users['sysop'];
+               $userName = $user->getUser()->getName();
+               $password = $user->getPassword();
                $user->getUser()->logout();
 
                $ret = $this->doApiRequest( [
                                "action" => "login",
-                               "lgname" => $user->username,
-                               "lgpassword" => $user->password,
+                               "lgname" => $userName,
+                               "lgpassword" => $password,
                        ]
                );
 
@@ -95,8 +98,8 @@ class ApiLoginTest extends ApiTestCase {
                        [
                                "action" => "login",
                                "lgtoken" => $token,
-                               "lgname" => $user->username,
-                               "lgpassword" => $user->password,
+                               "lgname" => $userName,
+                               "lgpassword" => $password,
                        ],
                        $ret[2]
                );
@@ -122,12 +125,14 @@ class ApiLoginTest extends ApiTestCase {
                        $this->markTestIncomplete( 'This test needs $wgServer to be set in LocalSettings.php' );
                }
                $user = self::$users['sysop'];
+               $userName = $user->getUser()->getName();
+               $password = $user->getPassword();
 
                $req = MWHttpRequest::factory( self::$apiUrl . "?action=login&format=xml",
                        [ "method" => "POST",
                                "postData" => [
-                                       "lgname" => $user->username,
-                                       "lgpassword" => $user->password
+                                       "lgname" => $userName,
+                                       "lgpassword" => $password
                                ]
                        ],
                        __METHOD__
@@ -146,8 +151,8 @@ class ApiLoginTest extends ApiTestCase {
 
                $req->setData( [
                        "lgtoken" => $token,
-                       "lgname" => $user->username,
-                       "lgpassword" => $user->password ] );
+                       "lgname" => $userName,
+                       "lgpassword" => $password ] );
                $req->execute();
 
                $cj = $req->getCookieJar();
@@ -162,11 +167,14 @@ class ApiLoginTest extends ApiTestCase {
        }
 
        public function testRunLogin() {
-               $sysopUser = self::$users['sysop'];
+               $user = self::$users['sysop'];
+               $userName = $user->getUser()->getName();
+               $password = $user->getPassword();
+
                $data = $this->doApiRequest( [
                        'action' => 'login',
-                       'lgname' => $sysopUser->username,
-                       'lgpassword' => $sysopUser->password ] );
+                       'lgname' => $userName,
+                       'lgpassword' => $password ] );
 
                $this->assertArrayHasKey( "login", $data[0] );
                $this->assertArrayHasKey( "result", $data[0]['login'] );
@@ -176,8 +184,8 @@ class ApiLoginTest extends ApiTestCase {
                $data = $this->doApiRequest( [
                        'action' => 'login',
                        "lgtoken" => $token,
-                       "lgname" => $sysopUser->username,
-                       "lgpassword" => $sysopUser->password ], $data[2] );
+                       "lgname" => $userName,
+                       "lgpassword" => $password ], $data[2] );
 
                $this->assertArrayHasKey( "login", $data[0] );
                $this->assertArrayHasKey( "result", $data[0]['login'] );
@@ -244,7 +252,7 @@ class ApiLoginTest extends ApiTestCase {
                        __METHOD__
                );
 
-               $lgName = $user->username . BotPassword::getSeparator() . 'foo';
+               $lgName = $user->getUser()->getName() . BotPassword::getSeparator() . 'foo';
 
                $ret = $this->doApiRequest( [
                        'action' => 'login',
diff --git a/tests/phpunit/includes/api/ApiOpenSearchTest.php b/tests/phpunit/includes/api/ApiOpenSearchTest.php
new file mode 100644 (file)
index 0000000..fd5b3a9
--- /dev/null
@@ -0,0 +1,66 @@
+<?php
+
+use MediaWiki\MediaWikiServices;
+
+class ApiOpenSearchTest extends MediaWikiTestCase {
+       public function testGetAllowedParams() {
+               $config = $this->replaceSearchEngineConfig();
+               $config->expects( $this->any() )
+                       ->method( 'getSearchTypes' )
+                       ->will( $this->returnValue( [ 'the one ring' ] ) );
+
+               $engine = $this->replaceSearchEngine();
+               $engine->expects( $this->any() )
+                       ->method( 'getProfiles' )
+                       ->will( $this->returnValueMap( [
+                               [ SearchEngine::COMPLETION_PROFILE_TYPE, [
+                                       [
+                                               'name' => 'normal',
+                                               'desc-message' => 'normal-message',
+                                               'default' => true,
+                                       ],
+                                       [
+                                               'name' => 'strict',
+                                               'desc-message' => 'strict-message',
+                                       ],
+                               ] ],
+                       ] ) );
+
+               $api = $this->createApi();
+               $params = $api->getAllowedParams();
+
+               $this->assertArrayNotHasKey( 'offset', $params );
+               $this->assertArrayHasKey( 'qiprofile', $params, print_r( $params, true ) );
+               $this->assertEquals( 'normal', $params['qiprofile'][ApiBase::PARAM_DFLT] );
+       }
+
+       private function replaceSearchEngineConfig() {
+               $config = $this->getMockBuilder( 'SearchEngineConfig' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $this->setService( 'SearchEngineConfig', $config );
+
+               return $config;
+       }
+
+       private function replaceSearchEngine() {
+               $engine = $this->getMockBuilder( 'SearchEngine' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $engineFactory = $this->getMockBuilder( 'SearchEngineFactory' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $engineFactory->expects( $this->any() )
+                       ->method( 'create' )
+                       ->will( $this->returnValue( $engine ) );
+               $this->setService( 'SearchEngineFactory', $engineFactory );
+
+               return $engine;
+       }
+
+       private function createApi() {
+               $ctx = new RequestContext();
+               $apiMain = new ApiMain( $ctx );
+               return new ApiOpenSearch( $apiMain, 'opensearch', '' );
+       }
+}
index def9c5d..eaeb3ae 100644 (file)
@@ -229,7 +229,10 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        private function getTitleFormatter() {
-               return new MediaWikiTitleCodec( Language::factory( 'en' ), GenderCache::singleton() );
+               return new MediaWikiTitleCodec(
+                       Language::factory( 'en' ),
+                       MediaWikiServices::getInstance()->getGenderCache()
+               );
        }
 
        private function getPrefixedText( LinkTarget $target ) {
@@ -818,8 +821,13 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
                );
                $this->watchPages( $user, [ $target ] );
 
-               $resultMinor = $this->doListWatchlistRequest( [ 'wlshow' => 'minor', 'wlprop' => 'flags' ] );
-               $resultNotMinor = $this->doListWatchlistRequest( [ 'wlshow' => '!minor', 'wlprop' => 'flags' ] );
+               $resultMinor = $this->doListWatchlistRequest( [
+                       'wlshow' => WatchedItemQueryService::FILTER_MINOR,
+                       'wlprop' => 'flags'
+               ] );
+               $resultNotMinor = $this->doListWatchlistRequest( [
+                       'wlshow' => WatchedItemQueryService::FILTER_NOT_MINOR, 'wlprop' => 'flags'
+               ] );
 
                $this->assertArraySubsetsEqual(
                        $this->getItemsFromApiResponse( $resultMinor ),
@@ -842,8 +850,12 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
                );
                $this->watchPages( $user, [ $target ] );
 
-               $resultBot = $this->doListWatchlistRequest( [ 'wlshow' => 'bot' ] );
-               $resultNotBot = $this->doListWatchlistRequest( [ 'wlshow' => '!bot' ] );
+               $resultBot = $this->doListWatchlistRequest( [
+                       'wlshow' => WatchedItemQueryService::FILTER_BOT
+               ] );
+               $resultNotBot = $this->doListWatchlistRequest( [
+                       'wlshow' => WatchedItemQueryService::FILTER_NOT_BOT
+               ] );
 
                $this->assertArraySubsetsEqual(
                        $this->getItemsFromApiResponse( $resultBot ),
@@ -867,11 +879,11 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
 
                $resultAnon = $this->doListWatchlistRequest( [
                        'wlprop' => 'user',
-                       'wlshow' => 'anon'
+                       'wlshow' => WatchedItemQueryService::FILTER_ANON
                ] );
                $resultNotAnon = $this->doListWatchlistRequest( [
                        'wlprop' => 'user',
-                       'wlshow' => '!anon'
+                       'wlshow' => WatchedItemQueryService::FILTER_NOT_ANON
                ] );
 
                $this->assertArraySubsetsEqual(
@@ -911,11 +923,11 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
 
                $resultUnread = $this->doListWatchlistRequest( [
                        'wlprop' => 'notificationtimestamp|title',
-                       'wlshow' => 'unread'
+                       'wlshow' => WatchedItemQueryService::FILTER_UNREAD
                ] );
                $resultNotUnread = $this->doListWatchlistRequest( [
                        'wlprop' => 'notificationtimestamp|title',
-                       'wlshow' => '!unread'
+                       'wlshow' => WatchedItemQueryService::FILTER_NOT_UNREAD
                ] );
 
                $this->assertEquals(
@@ -948,11 +960,11 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
 
                $resultPatrolled = $this->doListWatchlistRequest( [
                        'wlprop' => 'patrol',
-                       'wlshow' => 'patrolled'
+                       'wlshow' => WatchedItemQueryService::FILTER_PATROLLED
                ], $user );
                $resultNotPatrolled = $this->doListWatchlistRequest( [
                        'wlprop' => 'patrol',
-                       'wlshow' => '!patrolled'
+                       'wlshow' => WatchedItemQueryService::FILTER_NOT_PATROLLED
                ], $user );
 
                $this->assertEquals(
diff --git a/tests/phpunit/includes/api/ApiQueryWatchlistRawIntegrationTest.php b/tests/phpunit/includes/api/ApiQueryWatchlistRawIntegrationTest.php
new file mode 100644 (file)
index 0000000..582c076
--- /dev/null
@@ -0,0 +1,542 @@
+<?php
+
+use MediaWiki\MediaWikiServices;
+
+/**
+ * @group API
+ * @group Database
+ * @group medium
+ *
+ * @covers ApiQueryWatchlistRaw
+ */
+class ApiQueryWatchlistRawIntegrationTest extends ApiTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+               self::$users['ApiQueryWatchlistRawIntegrationTestUser']
+                       = $this->getMutableTestUser();
+               self::$users['ApiQueryWatchlistRawIntegrationTestUser2']
+                       = $this->getMutableTestUser();
+               $this->doLogin( 'ApiQueryWatchlistRawIntegrationTestUser' );
+       }
+
+       private function getLoggedInTestUser() {
+               return self::$users['ApiQueryWatchlistRawIntegrationTestUser']->getUser();
+       }
+
+       private function getNotLoggedInTestUser() {
+               return self::$users['ApiQueryWatchlistRawIntegrationTestUser2']->getUser();
+       }
+
+       private function getWatchedItemStore() {
+               return MediaWikiServices::getInstance()->getWatchedItemStore();
+       }
+
+       private function doListWatchlistRawRequest( array $params = [] ) {
+               return $this->doApiRequest( array_merge(
+                       [ 'action' => 'query', 'list' => 'watchlistraw' ],
+                       $params
+               ) );
+       }
+
+       private function doGeneratorWatchlistRawRequest( array $params = [] ) {
+               return $this->doApiRequest( array_merge(
+                       [ 'action' => 'query', 'generator' => 'watchlistraw' ],
+                       $params
+               ) );
+       }
+
+       private function getItemsFromApiResponse( array $response ) {
+               return $response[0]['watchlistraw'];
+       }
+
+       public function testListWatchlistRaw_returnsWatchedItems() {
+               $store = $this->getWatchedItemStore();
+               $store->addWatch(
+                       $this->getLoggedInTestUser(),
+                       new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage' )
+               );
+
+               $result = $this->doListWatchlistRawRequest();
+
+               $this->assertArrayHasKey( 'watchlistraw', $result[0] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'ns' => 0,
+                                       'title' => 'ApiQueryWatchlistRawIntegrationTestPage',
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testPropChanged_addsNotificationTimestamp() {
+               $target = new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage' );
+               $otherUser = $this->getNotLoggedInTestUser();
+
+               $store = $this->getWatchedItemStore();
+
+               $store->addWatch( $this->getLoggedInTestUser(), $target );
+               $store->updateNotificationTimestamp(
+                       $otherUser,
+                       $target,
+                       '20151212010101'
+               );
+
+               $result = $this->doListWatchlistRawRequest( [ 'wrprop' => 'changed' ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'ns' => 0,
+                                       'title' => 'ApiQueryWatchlistRawIntegrationTestPage',
+                                       'changed' => '2015-12-12T01:01:01Z',
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testNamespaceParam() {
+               $store = $this->getWatchedItemStore();
+
+               $store->addWatchBatchForUser( $this->getLoggedInTestUser(), [
+                       new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage' ),
+                       new TitleValue( 1, 'ApiQueryWatchlistRawIntegrationTestPage' ),
+               ] );
+
+               $result = $this->doListWatchlistRawRequest( [ 'wrnamespace' => '0' ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'ns' => 0,
+                                       'title' => 'ApiQueryWatchlistRawIntegrationTestPage',
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testShowChangedParams() {
+               $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage' );
+               $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistRawIntegrationTestPage' );
+               $otherUser = $this->getNotLoggedInTestUser();
+
+               $store = $this->getWatchedItemStore();
+
+               $store->addWatchBatchForUser( $this->getLoggedInTestUser(), [
+                       $subjectTarget,
+                       $talkTarget,
+               ] );
+               $store->updateNotificationTimestamp(
+                       $otherUser,
+                       $subjectTarget,
+                       '20151212010101'
+               );
+
+               $resultChanged = $this->doListWatchlistRawRequest(
+                       [ 'wrprop' => 'changed', 'wrshow' => WatchedItemQueryService::FILTER_CHANGED ]
+               );
+               $resultNotChanged = $this->doListWatchlistRawRequest(
+                       [ 'wrprop' => 'changed', 'wrshow' => WatchedItemQueryService::FILTER_NOT_CHANGED ]
+               );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'ns' => 0,
+                                       'title' => 'ApiQueryWatchlistRawIntegrationTestPage',
+                                       'changed' => '2015-12-12T01:01:01Z',
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $resultChanged )
+               );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'ns' => 1,
+                                       'title' => 'Talk:ApiQueryWatchlistRawIntegrationTestPage',
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $resultNotChanged )
+               );
+       }
+
+       public function testLimitParam() {
+               $store = $this->getWatchedItemStore();
+
+               $store->addWatchBatchForUser( $this->getLoggedInTestUser(), [
+                       new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
+                       new TitleValue( 1, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
+                       new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage2' ),
+               ] );
+
+               $resultWithoutLimit = $this->doListWatchlistRawRequest();
+               $resultWithLimit = $this->doListWatchlistRawRequest( [ 'wrlimit' => 2 ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'ns' => 0,
+                                       'title' => 'ApiQueryWatchlistRawIntegrationTestPage1',
+                               ],
+                               [
+                                       'ns' => 0,
+                                       'title' => 'ApiQueryWatchlistRawIntegrationTestPage2',
+                               ],
+                               [
+                                       'ns' => 1,
+                                       'title' => 'Talk:ApiQueryWatchlistRawIntegrationTestPage1',
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $resultWithoutLimit )
+               );
+               $this->assertEquals(
+                       [
+                               [
+                                       'ns' => 0,
+                                       'title' => 'ApiQueryWatchlistRawIntegrationTestPage1',
+                               ],
+                               [
+                                       'ns' => 0,
+                                       'title' => 'ApiQueryWatchlistRawIntegrationTestPage2',
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $resultWithLimit )
+               );
+
+               $this->assertArrayNotHasKey( 'continue', $resultWithoutLimit[0] );
+               $this->assertArrayHasKey( 'continue', $resultWithLimit[0] );
+               $this->assertArrayHasKey( 'wrcontinue', $resultWithLimit[0]['continue'] );
+       }
+
+       public function testDirParams() {
+               $store = $this->getWatchedItemStore();
+
+               $store->addWatchBatchForUser( $this->getLoggedInTestUser(), [
+                       new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
+                       new TitleValue( 1, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
+                       new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage2' ),
+               ] );
+
+               $resultDirAsc = $this->doListWatchlistRawRequest( [ 'wrdir' => 'ascending' ] );
+               $resultDirDesc = $this->doListWatchlistRawRequest( [ 'wrdir' => 'descending' ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'ns' => 0,
+                                       'title' => 'ApiQueryWatchlistRawIntegrationTestPage1',
+                               ],
+                               [
+                                       'ns' => 0,
+                                       'title' => 'ApiQueryWatchlistRawIntegrationTestPage2',
+                               ],
+                               [
+                                       'ns' => 1,
+                                       'title' => 'Talk:ApiQueryWatchlistRawIntegrationTestPage1',
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $resultDirAsc )
+               );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'ns' => 1,
+                                       'title' => 'Talk:ApiQueryWatchlistRawIntegrationTestPage1',
+                               ],
+                               [
+                                       'ns' => 0,
+                                       'title' => 'ApiQueryWatchlistRawIntegrationTestPage2',
+                               ],
+                               [
+                                       'ns' => 0,
+                                       'title' => 'ApiQueryWatchlistRawIntegrationTestPage1',
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $resultDirDesc )
+               );
+       }
+
+       public function testAscendingIsDefaultOrder() {
+               $store = $this->getWatchedItemStore();
+
+               $store->addWatchBatchForUser( $this->getLoggedInTestUser(), [
+                       new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
+                       new TitleValue( 1, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
+                       new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage2' ),
+               ] );
+
+               $resultNoDir = $this->doListWatchlistRawRequest();
+               $resultAscDir = $this->doListWatchlistRawRequest( [ 'wrdir' => 'ascending' ] );
+
+               $this->assertEquals(
+                       $this->getItemsFromApiResponse( $resultNoDir ),
+                       $this->getItemsFromApiResponse( $resultAscDir )
+               );
+       }
+
+       public function testFromTitleParam() {
+               $store = $this->getWatchedItemStore();
+
+               $store->addWatchBatchForUser( $this->getLoggedInTestUser(), [
+                       new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
+                       new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage2' ),
+                       new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage3' ),
+               ] );
+
+               $result = $this->doListWatchlistRawRequest( [
+                       'wrfromtitle' => 'ApiQueryWatchlistRawIntegrationTestPage2',
+               ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'ns' => 0,
+                                       'title' => 'ApiQueryWatchlistRawIntegrationTestPage2',
+                               ],
+                               [
+                                       'ns' => 0,
+                                       'title' => 'ApiQueryWatchlistRawIntegrationTestPage3',
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testToTitleParam() {
+               $store = $this->getWatchedItemStore();
+
+               $store->addWatchBatchForUser( $this->getLoggedInTestUser(), [
+                       new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
+                       new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage2' ),
+                       new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage3' ),
+               ] );
+
+               $result = $this->doListWatchlistRawRequest( [
+                       'wrtotitle' => 'ApiQueryWatchlistRawIntegrationTestPage2',
+               ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'ns' => 0,
+                                       'title' => 'ApiQueryWatchlistRawIntegrationTestPage1',
+                               ],
+                               [
+                                       'ns' => 0,
+                                       'title' => 'ApiQueryWatchlistRawIntegrationTestPage2',
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testContinueParam() {
+               $store = $this->getWatchedItemStore();
+
+               $store->addWatchBatchForUser( $this->getLoggedInTestUser(), [
+                       new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
+                       new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage2' ),
+                       new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage3' ),
+               ] );
+
+               $firstResult = $this->doListWatchlistRawRequest( [ 'wrlimit' => 2 ] );
+               $continuationParam = $firstResult[0]['continue']['wrcontinue'];
+
+               $this->assertEquals( '0|ApiQueryWatchlistRawIntegrationTestPage3', $continuationParam );
+
+               $continuedResult = $this->doListWatchlistRawRequest( [ 'wrcontinue' => $continuationParam ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'ns' => 0,
+                                       'title' => 'ApiQueryWatchlistRawIntegrationTestPage3',
+                               ]
+                       ],
+                       $this->getItemsFromApiResponse( $continuedResult )
+               );
+       }
+
+       public function fromTitleToTitleContinueComboProvider() {
+               return [
+                       [
+                               [
+                                       'wrfromtitle' => 'ApiQueryWatchlistRawIntegrationTestPage1',
+                                       'wrtotitle' => 'ApiQueryWatchlistRawIntegrationTestPage2',
+                               ],
+                               [
+                                       [ 'ns' => 0, 'title' => 'ApiQueryWatchlistRawIntegrationTestPage1' ],
+                                       [ 'ns' => 0, 'title' => 'ApiQueryWatchlistRawIntegrationTestPage2' ],
+                               ],
+                       ],
+                       [
+                               [
+                                       'wrfromtitle' => 'ApiQueryWatchlistRawIntegrationTestPage1',
+                                       'wrcontinue' => '0|ApiQueryWatchlistRawIntegrationTestPage3',
+                               ],
+                               [
+                                       [ 'ns' => 0, 'title' => 'ApiQueryWatchlistRawIntegrationTestPage3' ],
+                               ],
+                       ],
+                       [
+                               [
+                                       'wrtotitle' => 'ApiQueryWatchlistRawIntegrationTestPage3',
+                                       'wrcontinue' => '0|ApiQueryWatchlistRawIntegrationTestPage2',
+                               ],
+                               [
+                                       [ 'ns' => 0, 'title' => 'ApiQueryWatchlistRawIntegrationTestPage2' ],
+                                       [ 'ns' => 0, 'title' => 'ApiQueryWatchlistRawIntegrationTestPage3' ],
+                               ],
+                       ],
+                       [
+                               [
+                                       'wrfromtitle' => 'ApiQueryWatchlistRawIntegrationTestPage1',
+                                       'wrtotitle' => 'ApiQueryWatchlistRawIntegrationTestPage3',
+                                       'wrcontinue' => '0|ApiQueryWatchlistRawIntegrationTestPage3',
+                               ],
+                               [
+                                       [ 'ns' => 0, 'title' => 'ApiQueryWatchlistRawIntegrationTestPage3' ],
+                               ],
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider fromTitleToTitleContinueComboProvider
+        */
+       public function testFromTitleToTitleContinueCombo( array $params, array $expectedItems ) {
+               $store = $this->getWatchedItemStore();
+
+               $store->addWatchBatchForUser( $this->getLoggedInTestUser(), [
+                       new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
+                       new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage2' ),
+                       new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage3' ),
+               ] );
+
+               $result = $this->doListWatchlistRawRequest( $params );
+
+               $this->assertEquals( $expectedItems, $this->getItemsFromApiResponse( $result ) );
+       }
+
+       public function fromTitleToTitleContinueSelfContradictoryComboProvider() {
+               return [
+                       [
+                               [
+                                       'wrfromtitle' => 'ApiQueryWatchlistRawIntegrationTestPage2',
+                                       'wrtotitle' => 'ApiQueryWatchlistRawIntegrationTestPage1',
+                               ]
+                       ],
+                       [
+                               [
+                                       'wrfromtitle' => 'ApiQueryWatchlistRawIntegrationTestPage1',
+                                       'wrtotitle' => 'ApiQueryWatchlistRawIntegrationTestPage2',
+                                       'wrdir' => 'descending',
+                               ]
+                       ],
+                       [
+                               [
+                                       'wrtotitle' => 'ApiQueryWatchlistRawIntegrationTestPage1',
+                                       'wrcontinue' => '0|ApiQueryWatchlistRawIntegrationTestPage2',
+                               ]
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider fromTitleToTitleContinueSelfContradictoryComboProvider
+        */
+       public function testFromTitleToTitleContinueSelfContradictoryCombo( array $params ) {
+               $store = $this->getWatchedItemStore();
+
+               $store->addWatchBatchForUser( $this->getLoggedInTestUser(), [
+                       new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
+                       new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage2' ),
+               ] );
+
+               $result = $this->doListWatchlistRawRequest( $params );
+
+               $this->assertEmpty( $this->getItemsFromApiResponse( $result ) );
+               $this->assertArrayNotHasKey( 'continue', $result[0] );
+       }
+
+       public function testOwnerAndTokenParams() {
+               $otherUser = $this->getNotLoggedInTestUser();
+               $otherUser->setOption( 'watchlisttoken', '1234567890' );
+               $otherUser->saveSettings();
+
+               $store = $this->getWatchedItemStore();
+               $store->addWatchBatchForUser( $otherUser, [
+                       new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
+                       new TitleValue( 1, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
+               ] );
+
+               $result = $this->doListWatchlistRawRequest( [
+                       'wrowner' => $otherUser->getName(),
+                       'wrtoken' => '1234567890',
+               ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'ns' => 0,
+                                       'title' => 'ApiQueryWatchlistRawIntegrationTestPage1',
+                               ],
+                               [
+                                       'ns' => 1,
+                                       'title' => 'Talk:ApiQueryWatchlistRawIntegrationTestPage1',
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testOwnerAndTokenParams_wrongToken() {
+               $otherUser = $this->getNotLoggedInTestUser();
+               $otherUser->setOption( 'watchlisttoken', '1234567890' );
+               $otherUser->saveSettings();
+
+               $this->setExpectedException( UsageException::class, 'Incorrect watchlist token provided' );
+
+               $this->doListWatchlistRawRequest( [
+                       'wrowner' => $otherUser->getName(),
+                       'wrtoken' => 'wrong-token',
+               ] );
+       }
+
+       public function testOwnerAndTokenParams_userHasNoWatchlistToken() {
+               $this->setExpectedException( UsageException::class, 'Incorrect watchlist token provided' );
+
+               $this->doListWatchlistRawRequest( [
+                       'wrowner' => $this->getNotLoggedInTestUser()->getName(),
+                       'wrtoken' => 'some-watchlist-token',
+               ] );
+       }
+
+       public function testGeneratorWatchlistRawPropInfo_returnsWatchedItems() {
+               $store = $this->getWatchedItemStore();
+               $store->addWatch(
+                       $this->getLoggedInTestUser(),
+                       new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage' )
+               );
+
+               $result = $this->doGeneratorWatchlistRawRequest( [ 'prop' => 'info' ] );
+
+               $this->assertArrayHasKey( 'query', $result[0] );
+               $this->assertArrayHasKey( 'pages', $result[0]['query'] );
+               $this->assertCount( 1, $result[0]['query']['pages'] );
+
+               // $result[0]['query']['pages'] uses page ids as keys
+               $item = array_values( $result[0]['query']['pages'] )[0];
+
+               $this->assertEquals( 0, $item['ns'] );
+               $this->assertEquals( 'ApiQueryWatchlistRawIntegrationTestPage', $item['title'] );
+       }
+
+}
diff --git a/tests/phpunit/includes/api/ApiStashEditTest.php b/tests/phpunit/includes/api/ApiStashEditTest.php
new file mode 100644 (file)
index 0000000..e2462c6
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * @covers ApiStashEdit
+ * @group API
+ * @group medium
+ * @group Database
+ */
+class ApiStashEditTest extends ApiTestCase {
+
+       public function testBasicEdit() {
+               $this->doLogin();
+               $apiResult = $this->doApiRequestWithToken(
+                       [
+                               'action' => 'stashedit',
+                               'title' => 'ApistashEdit_Page',
+                               'contentmodel' => 'wikitext',
+                               'contentformat' => 'text/x-wiki',
+                               'text' => 'Text for ' . __METHOD__ . ' page',
+                               'baserevid' => 0,
+                       ]
+               );
+               $apiResult = $apiResult[0];
+               $this->assertArrayHasKey( 'stashedit', $apiResult );
+               $this->assertEquals( 'stashed', $apiResult['stashedit']['status'] );
+       }
+
+}
index e90b46f..ac4d2c9 100644 (file)
@@ -24,7 +24,7 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                $this->setMwGlobals( [
                        'wgAuth' => $wgDisableAuthManager ? new AuthPlugin : new MediaWiki\Auth\AuthManagerAuthPlugin,
                        'wgRequest' => new FauxRequest( [] ),
-                       'wgUser' => self::$users['sysop']->user,
+                       'wgUser' => self::$users['sysop']->getUser(),
                ] );
 
                $this->apiContext = new ApiTestContext();
@@ -158,8 +158,8 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
 
                $data = $this->doApiRequest( [
                        'action' => 'login',
-                       'lgname' => $testUser->username,
-                       'lgpassword' => $testUser->password ] );
+                       'lgname' => $testUser->getUser()->getName(),
+                       'lgpassword' => $testUser->getPassword() ] );
 
                $token = $data[0]['login']['token'];
 
@@ -167,8 +167,8 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                        [
                                'action' => 'login',
                                'lgtoken' => $token,
-                               'lgname' => $testUser->username,
-                               'lgpassword' => $testUser->password,
+                               'lgname' => $testUser->getUser()->getName(),
+                               'lgpassword' => $testUser->getPassword(),
                        ],
                        $data[2]
                );
@@ -183,11 +183,11 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                return $data;
        }
 
-       protected function getTokenList( $user, $session = null ) {
+       protected function getTokenList( TestUser $user, $session = null ) {
                $data = $this->doApiRequest( [
                        'action' => 'tokens',
                        'type' => 'edit|delete|protect|move|block|unblock|watch'
-               ], $session, false, $user->user );
+               ], $session, false, $user->getUser() );
 
                if ( !array_key_exists( 'tokens', $data[0] ) ) {
                        throw new MWException( 'Api failed to return a token list' );
index fbe9789..1f7c00b 100644 (file)
@@ -15,10 +15,10 @@ class ApiTokensTest extends ApiTestCase {
                }
        }
 
-       protected function runTokenTest( $user ) {
+       protected function runTokenTest( TestUser $user ) {
                $tokens = $this->getTokenList( $user );
 
-               $rights = $user->user->getRights();
+               $rights = $user->getUser()->getRights();
 
                $this->assertArrayHasKey( 'edittoken', $tokens );
                $this->assertArrayHasKey( 'movetoken', $tokens );
index 873917e..de2b56b 100644 (file)
@@ -27,11 +27,13 @@ class ApiUploadTest extends ApiTestCaseUpload {
         */
        public function testLogin() {
                $user = self::$users['uploader'];
+               $userName = $user->getUser()->getName();
+               $password = $user->getPassword();
 
                $params = [
                        'action' => 'login',
-                       'lgname' => $user->username,
-                       'lgpassword' => $user->password
+                       'lgname' => $userName,
+                       'lgpassword' => $password
                ];
                list( $result, , $session ) = $this->doApiRequest( $params );
                $this->assertArrayHasKey( "login", $result );
@@ -42,8 +44,8 @@ class ApiUploadTest extends ApiTestCaseUpload {
                $params = [
                        'action' => 'login',
                        'lgtoken' => $token,
-                       'lgname' => $user->username,
-                       'lgpassword' => $user->password
+                       'lgname' => $userName,
+                       'lgpassword' => $password
                ];
                list( $result, , $session ) = $this->doApiRequest( $params, $session );
                $this->assertArrayHasKey( "login", $result );
index d254e81..580ef6c 100644 (file)
@@ -175,7 +175,12 @@ class ConfirmLinkSecondaryAuthenticationProviderTest extends \MediaWikiTestCase
                $this->assertCount( 1, $res->neededRequests );
                $req = $res->neededRequests[0];
                $this->assertInstanceOf( ConfirmLinkAuthenticationRequest::class, $req );
-               $this->assertEquals( $reqs, \TestingAccessWrapper::newFromObject( $req )->linkRequests );
+               $expectReqs = $this->getLinkRequests();
+               foreach ( $expectReqs as $r ) {
+                       $r->action = AuthManager::ACTION_CHANGE;
+                       $r->username = $user->getName();
+               }
+               $this->assertEquals( $expectReqs, \TestingAccessWrapper::newFromObject( $req )->linkRequests );
        }
 
        public function testContinueLinkAttempt() {
index edee6fc..3548002 100644 (file)
@@ -334,22 +334,23 @@ class LegacyHookPreAuthenticationProviderTest extends \MediaWikiTestCase {
         * @param string|null $failMsg
         */
        public function testTestUserForCreation( $error, $failMsg ) {
+               $testUser = self::getTestUser()->getUser();
+               $provider = $this->getProvider();
+               $options = [ 'flags' => \User::READ_LOCKING, 'creating' => true ];
+
                $this->hook( 'AbortNewAccount', $this->never() );
                $this->hook( 'AbortAutoAccount', $this->once() )
-                       ->will( $this->returnCallback( function ( $user, &$abortError ) use ( $error ) {
+                       ->will( $this->returnCallback( function ( $user, &$abortError ) use ( $testUser, $error ) {
                                $this->assertInstanceOf( 'User', $user );
-                               $this->assertSame( 'UTSysop', $user->getName() );
+                               $this->assertSame( $testUser->getName(), $user->getName() );
                                $abortError = $error;
                                return $error === null;
                        } ) );
-
-               $status = $this->getProvider()->testUserForCreation(
-                       \User::newFromName( 'UTSysop' ), AuthManager::AUTOCREATE_SOURCE_SESSION
+               $status = $provider->testUserForCreation(
+                       $testUser, AuthManager::AUTOCREATE_SOURCE_SESSION, $options
                );
-
                $this->unhook( 'AbortNewAccount' );
                $this->unhook( 'AbortAutoAccount' );
-
                if ( $failMsg === null ) {
                        $this->assertEquals( \StatusValue::newGood(), $status, 'should succeed' );
                } else {
@@ -360,54 +361,11 @@ class LegacyHookPreAuthenticationProviderTest extends \MediaWikiTestCase {
                }
 
                $this->hook( 'AbortAutoAccount', $this->never() );
-               $this->hook( 'AbortNewAccount', $this->once() )
-                       ->will( $this->returnCallback(
-                               function ( $user, &$abortError, &$abortStatus ) use ( $error ) {
-                                       $this->assertInstanceOf( 'User', $user );
-                                       $this->assertSame( 'UTSysop', $user->getName() );
-                                       $abortError = $error;
-                                       return $error === null;
-                               }
-                       ) );
-               $status = $this->getProvider()->testUserForCreation( \User::newFromName( 'UTSysop' ), false );
+               $this->hook( 'AbortNewAccount', $this->never() );
+               $status = $provider->testUserForCreation( $testUser, false, $options );
                $this->unhook( 'AbortNewAccount' );
                $this->unhook( 'AbortAutoAccount' );
-               if ( $failMsg === null ) {
-                       $this->assertEquals( \StatusValue::newGood(), $status, 'should succeed' );
-               } else {
-                       $this->assertInstanceOf( 'StatusValue', $status, 'should fail (type)' );
-                       $this->assertFalse( $status->isOk(), 'should fail (ok)' );
-                       $errors = $status->getErrors();
-                       $msg = $errors[0]['message'];
-                       $this->assertInstanceOf( \Message::class, $msg );
-                       $this->assertEquals(
-                               'createaccount-hook-aborted', $msg->getKey(), 'should fail (message)'
-                       );
-               }
-
-               if ( $error !== false ) {
-                       $this->hook( 'AbortAutoAccount', $this->never() );
-                       $this->hook( 'AbortNewAccount', $this->once() )
-                               ->will( $this->returnCallback(
-                                       function ( $user, &$abortError, &$abortStatus ) use ( $error ) {
-                                               $this->assertInstanceOf( 'User', $user );
-                                               $this->assertSame( 'UTSysop', $user->getName() );
-                                               $abortStatus = $error ? \Status::newFatal( $error ) : \Status::newGood();
-                                               return $error === null;
-                                       }
-                       ) );
-                       $status = $this->getProvider()->testUserForCreation( \User::newFromName( 'UTSysop' ), false );
-                       $this->unhook( 'AbortNewAccount' );
-                       $this->unhook( 'AbortAutoAccount' );
-                       if ( $failMsg === null ) {
-                               $this->assertEquals( \StatusValue::newGood(), $status, 'should succeed' );
-                       } else {
-                               $this->assertInstanceOf( 'StatusValue', $status, 'should fail (type)' );
-                               $this->assertFalse( $status->isOk(), 'should fail (ok)' );
-                               $errors = $status->getErrors();
-                               $this->assertEquals( $failMsg, $errors[0]['message'], 'should fail (message)' );
-                       }
-               }
+               $this->assertEquals( \StatusValue::newGood(), $status, 'should succeed' );
        }
 
        public static function provideTestUserForCreation() {
index 16f210b..ccabab6 100644 (file)
@@ -35,9 +35,7 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                        'wgArticlePath' => '/wiki/$1'
                ] );
 
-               $this->linkRenderer = new LinkRenderer(
-                       MediaWikiServices::getInstance()->getTitleFormatter()
-               );
+               $this->linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
        }
 
        public function testNewFromRecentChange() {
index cac3d43..ae51a6c 100644 (file)
@@ -103,9 +103,7 @@ class TestRecentChangesHelper {
                $rcCacheFactory = new RCCacheEntryFactory(
                        new RequestContext(),
                        [ 'diff' => 'diff', 'cur' => 'cur', 'last' => 'last' ],
-                       new LinkRenderer(
-                               MediaWikiServices::getInstance()->getTitleFormatter()
-                       )
+                       MediaWikiServices::getInstance()->getLinkRenderer()
                );
                return $rcCacheFactory->newFromRecentChange( $recentChange, false );
        }
index a2aef35..d2078d7 100644 (file)
@@ -101,15 +101,15 @@ class CssContentTest extends JavaScriptContentTest {
         */
        public static function provideGetRedirectTarget() {
                // @codingStandardsIgnoreStart Generic.Files.LineLength
-               return array(
-                       array( 'MediaWiki:MonoBook.css', "/* #REDIRECT */@import url(//example.org/w/index.php?title=MediaWiki:MonoBook.css&action=raw&ctype=text/css);" ),
-                       array( 'User:FooBar/common.css', "/* #REDIRECT */@import url(//example.org/w/index.php?title=User:FooBar/common.css&action=raw&ctype=text/css);" ),
-                       array( 'Gadget:FooBaz.css', "/* #REDIRECT */@import url(//example.org/w/index.php?title=Gadget:FooBaz.css&action=raw&ctype=text/css);" ),
+               return [
+                       [ 'MediaWiki:MonoBook.css', "/* #REDIRECT */@import url(//example.org/w/index.php?title=MediaWiki:MonoBook.css&action=raw&ctype=text/css);" ],
+                       [ 'User:FooBar/common.css', "/* #REDIRECT */@import url(//example.org/w/index.php?title=User:FooBar/common.css&action=raw&ctype=text/css);" ],
+                       [ 'Gadget:FooBaz.css', "/* #REDIRECT */@import url(//example.org/w/index.php?title=Gadget:FooBaz.css&action=raw&ctype=text/css);" ],
                        # No #REDIRECT comment
-                       array( null, "@import url(//example.org/w/index.php?title=Gadget:FooBaz.css&action=raw&ctype=text/css);" ),
+                       [ null, "@import url(//example.org/w/index.php?title=Gadget:FooBaz.css&action=raw&ctype=text/css);" ],
                        # Wrong domain
-                       array( null, "/* #REDIRECT */@import url(//example.com/w/index.php?title=Gadget:FooBaz.css&action=raw&ctype=text/css);" ),
-               );
+                       [ null, "/* #REDIRECT */@import url(//example.com/w/index.php?title=Gadget:FooBaz.css&action=raw&ctype=text/css);" ],
+               ];
                // @codingStandardsIgnoreEnd
        }
 
index 492fec6..e8681c7 100644 (file)
@@ -9,4 +9,45 @@ class TextContentHandlerTest extends MediaWikiLangTestCase {
                $this->assertTrue( $handler->supportsDirectEditing(), 'direct editing is supported' );
        }
 
+       /**
+        * @covers SearchEngine::makeSearchFieldMapping
+        * @covers ContentHandler::getFieldsForSearchIndex
+        */
+       public function testFieldsForIndex() {
+               $handler = new TextContentHandler();
+
+               $mockEngine = $this->getMock( 'SearchEngine' );
+
+               $mockEngine->expects( $this->atLeastOnce() )
+                       ->method( 'makeSearchFieldMapping' )
+                       ->willReturnCallback( function ( $name, $type ) {
+                               $mockField =
+                                       $this->getMockBuilder( 'SearchIndexFieldDefinition' )
+                                               ->setConstructorArgs( [ $name, $type ] )
+                                               ->getMock();
+                               $mockField->expects( $this->atLeastOnce() )->method( 'getMapping' )->willReturn( [
+                                               'testData' => 'test',
+                                               'name' => $name,
+                                               'type' => $type,
+                                       ] );
+                               return $mockField;
+                       } );
+
+               /**
+                * @var $mockEngine SearchEngine
+                */
+               $fields = $handler->getFieldsForSearchIndex( $mockEngine );
+               $mappedFields = [];
+               foreach ( $fields as $name => $field ) {
+                       $this->assertInstanceOf( 'SearchIndexField', $field );
+                       /**
+                        * @var $field SearchIndexField
+                        */
+                       $mappedFields[$name] = $field->getMapping( $mockEngine );
+               }
+               $this->assertArrayHasKey( 'language', $mappedFields );
+               $this->assertEquals( 'test', $mappedFields['language']['testData'] );
+               $this->assertEquals( 'language', $mappedFields['language']['name'] );
+       }
+
 }
index bb747c7..bb7eb79 100644 (file)
@@ -250,26 +250,71 @@ class DatabaseMysqlBaseTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideComparePositions
         */
-       function testHasReached( MySQLMasterPos $lowerPos, MySQLMasterPos $higherPos ) {
-               $this->assertTrue( $higherPos->hasReached( $lowerPos ) );
-               $this->assertTrue( $higherPos->hasReached( $higherPos ) );
-               $this->assertTrue( $lowerPos->hasReached( $lowerPos ) );
-               $this->assertFalse( $lowerPos->hasReached( $higherPos ) );
+       function testHasReached( MySQLMasterPos $lowerPos, MySQLMasterPos $higherPos, $match ) {
+               if ( $match ) {
+                       $this->assertTrue( $lowerPos->channelsMatch( $higherPos ) );
+
+                       $this->assertTrue( $higherPos->hasReached( $lowerPos ) );
+                       $this->assertTrue( $higherPos->hasReached( $higherPos ) );
+                       $this->assertTrue( $lowerPos->hasReached( $lowerPos ) );
+                       $this->assertFalse( $lowerPos->hasReached( $higherPos ) );
+               } else { // channels don't match
+                       $this->assertFalse( $lowerPos->channelsMatch( $higherPos ) );
+
+                       $this->assertFalse( $higherPos->hasReached( $lowerPos ) );
+                       $this->assertFalse( $lowerPos->hasReached( $higherPos ) );
+               }
        }
 
        function provideComparePositions() {
                return [
+                       // Binlog style
                        [
                                new MySQLMasterPos( 'db1034-bin.000976', '843431247' ),
-                               new MySQLMasterPos( 'db1034-bin.000976', '843431248' )
+                               new MySQLMasterPos( 'db1034-bin.000976', '843431248' ),
+                               true
                        ],
                        [
                                new MySQLMasterPos( 'db1034-bin.000976', '999' ),
-                               new MySQLMasterPos( 'db1034-bin.000976', '1000' )
+                               new MySQLMasterPos( 'db1034-bin.000976', '1000' ),
+                               true
                        ],
                        [
                                new MySQLMasterPos( 'db1034-bin.000976', '999' ),
-                               new MySQLMasterPos( 'db1035-bin.000976', '1000' )
+                               new MySQLMasterPos( 'db1035-bin.000976', '1000' ),
+                               false
+                       ],
+                       // MySQL GTID style
+                       [
+                               new MySQLMasterPos( 'db1-bin.2', '1', '3E11FA47-71CA-11E1-9E33-C80AA9429562:23' ),
+                               new MySQLMasterPos( 'db1-bin.2', '2', '3E11FA47-71CA-11E1-9E33-C80AA9429562:24' ),
+                               true
+                       ],
+                       [
+                               new MySQLMasterPos( 'db1-bin.2', '1', '3E11FA47-71CA-11E1-9E33-C80AA9429562:99' ),
+                               new MySQLMasterPos( 'db1-bin.2', '2', '3E11FA47-71CA-11E1-9E33-C80AA9429562:100' ),
+                               true
+                       ],
+                       [
+                               new MySQLMasterPos( 'db1-bin.2', '1', '3E11FA47-71CA-11E1-9E33-C80AA9429562:99' ),
+                               new MySQLMasterPos( 'db1-bin.2', '2', '1E11FA47-71CA-11E1-9E33-C80AA9429562:100' ),
+                               false
+                       ],
+                       // MariaDB GTID style
+                       [
+                               new MySQLMasterPos( 'db1-bin.2', '1', '255-11-23' ),
+                               new MySQLMasterPos( 'db1-bin.2', '2', '255-11-24' ),
+                               true
+                       ],
+                       [
+                               new MySQLMasterPos( 'db1-bin.2', '1', '255-11-99' ),
+                               new MySQLMasterPos( 'db1-bin.2', '2', '255-11-100' ),
+                               true
+                       ],
+                       [
+                               new MySQLMasterPos( 'db1-bin.2', '1', '255-11-999' ),
+                               new MySQLMasterPos( 'db1-bin.2', '2', '254-11-1000' ),
+                               false
                        ],
                ];
        }
index 0730529..723f1c3 100644 (file)
@@ -239,12 +239,15 @@ class DatabaseTest extends MediaWikiTestCase {
                $db = $this->db;
 
                $db->setFlag( DBO_TRX );
+               $called = false;
                $flagSet = null;
-               $db->onTransactionIdle( function() use ( $db, &$flagSet ) {
+               $db->onTransactionIdle( function() use ( $db, &$flagSet, &$called ) {
+                       $called = true;
                        $flagSet = $db->getFlag( DBO_TRX );
                } );
                $this->assertFalse( $flagSet, 'DBO_TRX off in callback' );
                $this->assertTrue( $db->getFlag( DBO_TRX ), 'DBO_TRX restored to default' );
+               $this->assertTrue( $called, 'Callback reached' );
 
                $db->clearFlag( DBO_TRX );
                $flagSet = null;
@@ -260,4 +263,30 @@ class DatabaseTest extends MediaWikiTestCase {
                } );
                $this->assertFalse( $db->getFlag( DBO_TRX ), 'DBO_TRX restored to default' );
        }
+
+       public function testTransactionResolution() {
+               $db = $this->db;
+
+               $db->clearFlag( DBO_TRX );
+               $db->begin( __METHOD__ );
+               $called = false;
+               $db->onTransactionResolution( function() use ( $db, &$called ) {
+                       $called = true;
+                       $db->setFlag( DBO_TRX );
+               } );
+               $db->commit( __METHOD__ );
+               $this->assertFalse( $db->getFlag( DBO_TRX ), 'DBO_TRX restored to default' );
+               $this->assertTrue( $called, 'Callback reached' );
+
+               $db->clearFlag( DBO_TRX );
+               $db->begin( __METHOD__ );
+               $called = false;
+               $db->onTransactionResolution( function() use ( $db, &$called ) {
+                       $called = true;
+                       $db->setFlag( DBO_TRX );
+               } );
+               $db->rollback( __METHOD__ );
+               $this->assertFalse( $db->getFlag( DBO_TRX ), 'DBO_TRX restored to default' );
+               $this->assertTrue( $called, 'Callback reached' );
+       }
 }
index e29d207..d6249bb 100644 (file)
@@ -23,9 +23,6 @@ namespace MediaWiki\Logger\Monolog;
 use MediaWikiTestCase;
 use Monolog\Logger;
 
-// not available in the version of phpunit mw uses, so copied into repo
-require_once __DIR__ . '/../../../phpunit/ConsecutiveParametersMatcher.php';
-
 class KafkaHandlerTest extends MediaWikiTestCase {
 
        protected function setUp() {
@@ -58,6 +55,9 @@ class KafkaHandlerTest extends MediaWikiTestCase {
                $produce->expects( $this->once() )
                        ->method( 'setMessages' )
                        ->with( $expect, $this->anything(), $this->anything() );
+               $produce->expects( $this->any() )
+                       ->method( 'send' )
+                       ->will( $this->returnValue( true ) );
 
                $handler = new KafkaHandler( $produce, $options );
                $handler->handle( [
@@ -89,6 +89,9 @@ class KafkaHandlerTest extends MediaWikiTestCase {
                $produce->expects( $this->any() )
                        ->method( 'getAvailablePartitions' )
                        ->will( $this->throwException( new \Kafka\Exception ) );
+               $produce->expects( $this->any() )
+                       ->method( 'send' )
+                       ->will( $this->returnValue( true ) );
 
                if ( $expectException ) {
                        $this->setExpectedException( 'Kafka\Exception' );
@@ -147,6 +150,9 @@ class KafkaHandlerTest extends MediaWikiTestCase {
                        ->will( $this->returnValue( [ 'A' ] ) );
                $mockMethod = $produce->expects( $this->exactly( 2 ) )
                        ->method( 'setMessages' );
+               $produce->expects( $this->any() )
+                       ->method( 'send' )
+                       ->will( $this->returnValue( true ) );
                // evil hax
                \TestingAccessWrapper::newFromObject( $mockMethod )->matcher->parametersMatcher =
                        new \PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters( [
@@ -181,6 +187,9 @@ class KafkaHandlerTest extends MediaWikiTestCase {
                $produce->expects( $this->once() )
                        ->method( 'setMessages' )
                        ->with( $this->anything(), $this->anything(), [ 'words', 'lines' ] );
+               $produce->expects( $this->any() )
+                       ->method( 'send' )
+                       ->will( $this->returnValue( true ) );
 
                $formatter = $this->getMock( 'Monolog\Formatter\FormatterInterface' );
                $formatter->expects( $this->any() )
index 4aeddc6..254cfbd 100644 (file)
@@ -1139,16 +1139,16 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->tearDownFiles();
                $this->doTestStreamFile( $path, $content, $alreadyExists );
                $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->tearDownFiles();
+               $this->doTestStreamFile( $path, $content, $alreadyExists );
+               $this->tearDownFiles();
        }
 
        private function doTestStreamFile( $path, $content ) {
                $backendName = $this->backendClass();
 
-               // Test doStreamFile() directly to avoid header madness
-               $class = new ReflectionClass( $this->backend );
-               $method = $class->getMethod( 'doStreamFile' );
-               $method->setAccessible( true );
-
                if ( $content !== null ) {
                        $this->prepare( [ 'dir' => dirname( $path ) ] );
                        $status = $this->create( [ 'dst' => $path, 'content' => $content ] );
@@ -1156,18 +1156,19 @@ class FileBackendTest extends MediaWikiTestCase {
                                "Creation of file at $path succeeded ($backendName)." );
 
                        ob_start();
-                       $method->invokeArgs( $this->backend, [ [ 'src' => $path ] ] );
+                       $this->backend->streamFile( [ 'src' => $path, 'headless' => 1, 'allowOB' => 1 ] );
                        $data = ob_get_contents();
                        ob_end_clean();
 
                        $this->assertEquals( $content, $data, "Correct content streamed from '$path'" );
                } else { // 404 case
                        ob_start();
-                       $method->invokeArgs( $this->backend, [ [ 'src' => $path ] ] );
+                       $this->backend->streamFile( [ 'src' => $path, 'headless' => 1, 'allowOB' => 1 ] );
                        $data = ob_get_contents();
                        ob_end_clean();
 
-                       $this->assertEquals( '', $data, "Correct content streamed from '$path' ($backendName)" );
+                       $this->assertRegExp( '#<h1>File not found</h1>#', $data,
+                               "Correct content streamed from '$path' ($backendName)" );
                }
        }
 
@@ -1181,6 +1182,53 @@ class FileBackendTest extends MediaWikiTestCase {
                return $cases;
        }
 
+       public function testStreamFileRange() {
+               $this->backend = $this->singleBackend;
+               $this->tearDownFiles();
+               $this->doTestStreamFileRange();
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->tearDownFiles();
+               $this->doTestStreamFileRange();
+               $this->tearDownFiles();
+       }
+
+       private function doTestStreamFileRange() {
+               $backendName = $this->backendClass();
+
+               $base = self::baseStorePath();
+               $path = "$base/unittest-cont1/e/b/z/range_file.txt";
+               $content = "0123456789ABCDEF";
+
+               $this->prepare( [ 'dir' => dirname( $path ) ] );
+               $status = $this->create( [ 'dst' => $path, 'content' => $content ] );
+               $this->assertGoodStatus( $status,
+                       "Creation of file at $path succeeded ($backendName)." );
+
+               static $ranges = [
+                       'bytes=0-0'   => '0',
+                       'bytes=0-3'   => '0123',
+                       'bytes=4-8'   => '45678',
+                       'bytes=15-15' => 'F',
+                       'bytes=14-15' => 'EF',
+                       'bytes=-5'    => 'BCDEF',
+                       'bytes=-1'    => 'F',
+                       'bytes=10-16' => 'ABCDEF',
+                       'bytes=10-99' => 'ABCDEF',
+               ];
+
+               foreach ( $ranges as $range => $chunk ) {
+                       ob_start();
+                       $this->backend->streamFile( [ 'src' => $path, 'headless' => 1, 'allowOB' => 1,
+                               'options' => [ 'range' => $range ] ] );
+                       $data = ob_get_contents();
+                       ob_end_clean();
+
+                       $this->assertEquals( $chunk, $data, "Correct chunk streamed from '$path' for '$range'" );
+               }
+       }
+
        /**
         * @dataProvider provider_testGetFileContents
         * @covers FileBackend::getFileContents
@@ -1516,7 +1564,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        [ "$base/unittest-cont1/e/a/z/some_file1.txt", true ],
                        [ "$base/unittest-cont2/a/z/some_file2.txt", true ],
                        # Specific to FS backend with no basePath field set
-                       # array( "$base/unittest-cont3/a/z/some_file3.txt", false ),
+                       # [ "$base/unittest-cont3/a/z/some_file3.txt", false ],
                ];
        }
 
index 5e5e921..09d31fc 100644 (file)
@@ -124,7 +124,7 @@ class FakeDatabase extends DatabaseBase {
         *
         * Example:
         * $id = $dbw->nextSequenceValue( 'page_page_id_seq' );
-        * $dbw->insert( 'page', array( 'page_id' => $id ) );
+        * $dbw->insert( 'page', [ 'page_id' => $id ] );
         * $id = $dbw->insertId();
         *
         * @return int
index 80efcb3..7f9a772 100644 (file)
@@ -30,6 +30,32 @@ class XmlTypeCheckTest extends PHPUnit_Framework_TestCase {
                $this->assertFalse( $testXML->wellFormed );
        }
 
+       /**
+        * Verify we check for recursive entity DOS
+        *
+        * (If the DOS isn't properly handled, the test runner will probably go OOM...)
+        */
+       public function testRecursiveEntity() {
+               $xml = <<<'XML'
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE foo [
+       <!ENTITY test "&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;">
+       <!ENTITY a "&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;">
+       <!ENTITY b "&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;">
+       <!ENTITY c "&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;">
+       <!ENTITY d "&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;">
+       <!ENTITY e "&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;">
+       <!ENTITY f "&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;">
+       <!ENTITY g "-00000000000000000000000000000000000000000000000000000000000000000000000-">
+]>
+<foo>
+<bar>&test;</bar>
+</foo>
+XML;
+               $check = XmlTypeCheck::newFromString( $xml );
+               $this->assertFalse( $check->wellFormed );
+       }
+
        /**
         * @covers XMLTypeCheck::processingInstructionHandler
         */
index 3a4aab4..6a3cd15 100644 (file)
@@ -217,9 +217,23 @@ class WANObjectCacheTest extends MediaWikiTestCase {
 
                // Acquire a lock to verify that getWithSetCallback uses lockTSE properly
                $this->internalCache->lock( $key, 0 );
-               $ret = $cache->getWithSetCallback( $key, 30, $func, [ 'lockTSE' => 5 ] );
-               $this->assertEquals( $value, $ret );
+
+               $checkKeys = [ wfRandomString() ]; // new check keys => force misses
+               $ret = $cache->getWithSetCallback( $key, 30, $func,
+                       [ 'lockTSE' => 5, 'checkKeys' => $checkKeys ] );
+               $this->assertEquals( $value, $ret, 'Old value used' );
                $this->assertEquals( 1, $calls, 'Callback was not used' );
+
+               $cache->delete( $key );
+               $ret = $cache->getWithSetCallback( $key, 30, $func,
+                       [ 'lockTSE' => 5, 'checkKeys' => $checkKeys ] );
+               $this->assertEquals( $value, $ret, 'Callback was used; interim saved' );
+               $this->assertEquals( 2, $calls, 'Callback was used; interim saved' );
+
+               $ret = $cache->getWithSetCallback( $key, 30, $func,
+                       [ 'lockTSE' => 5, 'checkKeys' => $checkKeys ] );
+               $this->assertEquals( $value, $ret, 'Callback was not used; used interim' );
+               $this->assertEquals( 2, $calls, 'Callback was not used; used interim' );
        }
 
        /**
@@ -253,6 +267,59 @@ class WANObjectCacheTest extends MediaWikiTestCase {
                $this->assertEquals( 1, $calls, 'Callback was not used' );
        }
 
+       /**
+        * @covers WANObjectCache::getWithSetCallback()
+        * @covers WANObjectCache::doGetWithSetCallback()
+        */
+       public function testBusyValue() {
+               $cache = $this->cache;
+               $key = wfRandomString();
+               $value = wfRandomString();
+               $busyValue = wfRandomString();
+
+               $calls = 0;
+               $func = function() use ( &$calls, $value ) {
+                       ++$calls;
+                       return $value;
+               };
+
+               $ret = $cache->getWithSetCallback( $key, 30, $func, [ 'busyValue' => $busyValue ] );
+               $this->assertEquals( $value, $ret );
+               $this->assertEquals( 1, $calls, 'Value was populated' );
+
+               // Acquire a lock to verify that getWithSetCallback uses busyValue properly
+               $this->internalCache->lock( $key, 0 );
+
+               $checkKeys = [ wfRandomString() ]; // new check keys => force misses
+               $ret = $cache->getWithSetCallback( $key, 30, $func,
+                       [ 'busyValue' => $busyValue, 'checkKeys' => $checkKeys ] );
+               $this->assertEquals( $value, $ret, 'Callback used' );
+               $this->assertEquals( 2, $calls, 'Callback used' );
+
+               $ret = $cache->getWithSetCallback( $key, 30, $func,
+                       [ 'lockTSE' => 30, 'busyValue' => $busyValue, 'checkKeys' => $checkKeys ] );
+               $this->assertEquals( $value, $ret, 'Old value used' );
+               $this->assertEquals( 2, $calls, 'Callback was not used' );
+
+               $cache->delete( $key ); // no value at all anymore and still locked
+               $ret = $cache->getWithSetCallback( $key, 30, $func,
+                       [ 'busyValue' => $busyValue, 'checkKeys' => $checkKeys ] );
+               $this->assertEquals( $busyValue, $ret, 'Callback was not used; used busy value' );
+               $this->assertEquals( 2, $calls, 'Callback was not used; used busy value' );
+
+               $this->internalCache->unlock( $key );
+               $ret = $cache->getWithSetCallback( $key, 30, $func,
+                       [ 'lockTSE' => 30, 'busyValue' => $busyValue, 'checkKeys' => $checkKeys ] );
+               $this->assertEquals( $value, $ret, 'Callback was used; saved interim' );
+               $this->assertEquals( 3, $calls, 'Callback was used; saved interim' );
+
+               $this->internalCache->lock( $key, 0 );
+               $ret = $cache->getWithSetCallback( $key, 30, $func,
+                       [ 'busyValue' => $busyValue, 'checkKeys' => $checkKeys ] );
+               $this->assertEquals( $value, $ret, 'Callback was not used; used interim' );
+               $this->assertEquals( 3, $calls, 'Callback was not used; used interim' );
+       }
+
        /**
         * @covers WANObjectCache::getMulti()
         */
index ed28b79..bf12f80 100644 (file)
@@ -14,9 +14,15 @@ class LinkRendererFactoryTest extends MediaWikiLangTestCase {
         */
        private $titleFormatter;
 
+       /**
+        * @var LinkCache
+        */
+       private $linkCache;
+
        public function setUp() {
                parent::setUp();
                $this->titleFormatter = MediaWikiServices::getInstance()->getTitleFormatter();
+               $this->linkCache = MediaWikiServices::getInstance()->getLinkCache();
        }
 
        public static function provideCreateFromLegacyOptions() {
@@ -48,7 +54,7 @@ class LinkRendererFactoryTest extends MediaWikiLangTestCase {
         * @dataProvider provideCreateFromLegacyOptions
         */
        public function testCreateFromLegacyOptions( $options, $func, $val ) {
-               $factory = new LinkRendererFactory( $this->titleFormatter );
+               $factory = new LinkRendererFactory( $this->titleFormatter, $this->linkCache );
                $linkRenderer = $factory->createFromLegacyOptions(
                        $options
                );
@@ -57,16 +63,17 @@ class LinkRendererFactoryTest extends MediaWikiLangTestCase {
        }
 
        public function testCreate() {
-               $factory = new LinkRendererFactory( $this->titleFormatter );
+               $factory = new LinkRendererFactory( $this->titleFormatter, $this->linkCache );
                $this->assertInstanceOf( LinkRenderer::class, $factory->create() );
        }
 
        public function testCreateForUser() {
+               /** @var PHPUnit_Framework_MockObject_MockObject|User $user */
                $user = $this->getMock( User::class, [ 'getStubThreshold' ] );
                $user->expects( $this->once() )
                        ->method( 'getStubThreshold' )
                        ->willReturn( 15 );
-               $factory = new LinkRendererFactory( $this->titleFormatter );
+               $factory = new LinkRendererFactory( $this->titleFormatter, $this->linkCache );
                $linkRenderer = $factory->createForUser( $user );
                $this->assertInstanceOf( LinkRenderer::class, $linkRenderer );
                $this->assertEquals( 15, $linkRenderer->getStubThreshold() );
index b78592b..91789c5 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\Linker\LinkRendererFactory;
 use MediaWiki\MediaWikiServices;
 
 /**
@@ -9,9 +10,9 @@ use MediaWiki\MediaWikiServices;
 class LinkRendererTest extends MediaWikiLangTestCase {
 
        /**
-        * @var TitleFormatter
+        * @var LinkRendererFactory
         */
-       private $titleFormatter;
+       private $factory;
 
        public function setUp() {
                parent::setUp();
@@ -22,12 +23,13 @@ class LinkRendererTest extends MediaWikiLangTestCase {
                        'wgScriptPath' => '/w',
                        'wgScript' => '/w/index.php',
                ] );
-               $this->titleFormatter = MediaWikiServices::getInstance()->getTitleFormatter();
+               $this->factory = MediaWikiServices::getInstance()->getLinkRendererFactory();
+
        }
 
        public function testMergeAttribs() {
                $target = new TitleValue( NS_SPECIAL, 'Blankpage' );
-               $linkRenderer = new LinkRenderer( $this->titleFormatter );
+               $linkRenderer = $this->factory->create();
                $link = $linkRenderer->makeBrokenLink( $target, null, [
                        // Appended to class
                        'class' => 'foobar',
@@ -46,7 +48,7 @@ class LinkRendererTest extends MediaWikiLangTestCase {
 
        public function testMakeKnownLink() {
                $target = new TitleValue( NS_MAIN, 'Foobar' );
-               $linkRenderer = new LinkRenderer( $this->titleFormatter );
+               $linkRenderer = $this->factory->create();
 
                // Query added
                $this->assertEquals(
@@ -73,7 +75,7 @@ class LinkRendererTest extends MediaWikiLangTestCase {
        public function testMakeBrokenLink() {
                $target = new TitleValue( NS_MAIN, 'Foobar' );
                $special = new TitleValue( NS_SPECIAL, 'Foobar' );
-               $linkRenderer = new LinkRenderer( $this->titleFormatter );
+               $linkRenderer = $this->factory->create();
 
                // action=edit&redlink=1 added
                $this->assertEquals(
@@ -105,7 +107,7 @@ class LinkRendererTest extends MediaWikiLangTestCase {
        }
 
        public function testMakeLink() {
-               $linkRenderer = new LinkRenderer( $this->titleFormatter );
+               $linkRenderer = $this->factory->create();
                $foobar = new TitleValue( NS_SPECIAL, 'Foobar' );
                $blankpage = new TitleValue( NS_SPECIAL, 'Blankpage' );
                $this->assertEquals(
@@ -131,4 +133,57 @@ class LinkRendererTest extends MediaWikiLangTestCase {
                        $linkRenderer->makeLink( $foobar, new HtmlArmor( '<script>evil()</script>' ) )
                );
        }
+
+       public function testGetLinkClasses() {
+               $titleFormatter = MediaWikiServices::getInstance()->getTitleFormatter();
+               $linkCache = new LinkCache( $titleFormatter );
+               $foobarTitle = new TitleValue( NS_MAIN, 'FooBar' );
+               $redirectTitle = new TitleValue( NS_MAIN, 'Redirect' );
+               $userTitle = new TitleValue( NS_USER, 'Someuser' );
+               $linkCache->addGoodLinkObj(
+                       1, // id
+                       $foobarTitle,
+                       10, // len
+                       0 // redir
+               );
+               $linkCache->addGoodLinkObj(
+                       2, // id
+                       $redirectTitle,
+                       10, // len
+                       1 // redir
+               );
+
+               $linkCache->addGoodLinkObj(
+                       3, // id
+                       $userTitle,
+                       10, // len
+                       0 // redir
+               );
+
+               $linkRenderer = new LinkRenderer( $titleFormatter, $linkCache );
+               $linkRenderer->setStubThreshold( 0 );
+               $this->assertEquals(
+                       '',
+                       $linkRenderer->getLinkClasses( $foobarTitle )
+               );
+
+               $linkRenderer->setStubThreshold( 20 );
+               $this->assertEquals(
+                       'stub',
+                       $linkRenderer->getLinkClasses( $foobarTitle )
+               );
+
+               $linkRenderer->setStubThreshold( 0 );
+               $this->assertEquals(
+                       'mw-redirect',
+                       $linkRenderer->getLinkClasses( $redirectTitle )
+               );
+
+               $linkRenderer->setStubThreshold( 20 );
+               $this->assertEquals(
+                       '',
+                       $linkRenderer->getLinkClasses( $userTitle )
+               );
+       }
+
 }
diff --git a/tests/phpunit/includes/objectcache/RESTBagOStuffTest.php b/tests/phpunit/includes/objectcache/RESTBagOStuffTest.php
new file mode 100644 (file)
index 0000000..ebeb109
--- /dev/null
@@ -0,0 +1,88 @@
+<?php
+/**
+ * @group BagOStuff
+ */
+class RESTBagOStuffTest extends MediaWikiTestCase {
+
+       /**
+        * @var MultiHttpClient
+        */
+       private $client;
+       /**
+        * @var RESTBagOStuff
+        */
+       private $bag;
+
+       public function setUp() {
+               parent::setUp();
+               $this->client =
+                       $this->getMockBuilder( 'MultiHttpClient' )
+                               ->setConstructorArgs( [ [] ] )
+                               ->setMethods( [ 'run' ] )
+                               ->getMock();
+               $this->bag = new RESTBagOStuff( [ 'client' => $this->client, 'url' => 'http://test/rest/' ] );
+       }
+
+       public function testGet() {
+               $this->client->expects( $this->once() )->method( 'run' )->with( [
+                       'method' => 'GET',
+                       'url' => 'http://test/rest/42xyz42'
+                   // list( $rcode, $rdesc, $rhdrs, $rbody, $rerr )
+               ] )->willReturn( [ 200, 'OK', [], 's:8:"somedata";', 0 ] );
+               $result = $this->bag->get( '42xyz42' );
+               $this->assertEquals( 'somedata', $result );
+       }
+
+       public function testGetNotExist() {
+               $this->client->expects( $this->once() )->method( 'run' )->with( [
+                       'method' => 'GET',
+                       'url' => 'http://test/rest/42xyz42'
+                       // list( $rcode, $rdesc, $rhdrs, $rbody, $rerr )
+               ] )->willReturn( [ 404, 'Not found', [], 'Nothing to see here', 0 ] );
+               $result = $this->bag->get( '42xyz42' );
+               $this->assertFalse( $result );
+       }
+
+       public function testGetBadClient() {
+               $this->client->expects( $this->once() )->method( 'run' )->with( [
+                       'method' => 'GET',
+                       'url' => 'http://test/rest/42xyz42'
+                       // list( $rcode, $rdesc, $rhdrs, $rbody, $rerr )
+               ] )->willReturn( [ 0, '', [], '', 'cURL has failed you today' ] );
+               $result = $this->bag->get( '42xyz42' );
+               $this->assertFalse( $result );
+               $this->assertEquals( BagOStuff::ERR_UNREACHABLE, $this->bag->getLastError() );
+       }
+
+       public function testGetBadServer() {
+               $this->client->expects( $this->once() )->method( 'run' )->with( [
+                       'method' => 'GET',
+                       'url' => 'http://test/rest/42xyz42'
+                       // list( $rcode, $rdesc, $rhdrs, $rbody, $rerr )
+               ] )->willReturn( [ 500, 'Too busy', [], 'Server is too busy', '' ] );
+               $result = $this->bag->get( '42xyz42' );
+               $this->assertFalse( $result );
+               $this->assertEquals( BagOStuff::ERR_UNEXPECTED, $this->bag->getLastError() );
+       }
+
+       public function testPut() {
+               $this->client->expects( $this->once() )->method( 'run' )->with( [
+                       'method' => 'PUT',
+                       'url' => 'http://test/rest/42xyz42',
+                   'body' => 's:8:"postdata";'
+                       // list( $rcode, $rdesc, $rhdrs, $rbody, $rerr )
+               ] )->willReturn( [ 200, 'OK', [], 'Done', 0 ] );
+               $result = $this->bag->set( '42xyz42', 'postdata' );
+               $this->assertTrue( $result );
+       }
+
+       public function testDelete() {
+               $this->client->expects( $this->once() )->method( 'run' )->with( [
+                       'method' => 'DELETE',
+                       'url' => 'http://test/rest/42xyz42',
+                       // list( $rcode, $rdesc, $rhdrs, $rbody, $rerr )
+               ] )->willReturn( [ 200, 'OK', [], 'Done', 0 ] );
+               $result = $this->bag->delete( '42xyz42' );
+               $this->assertTrue( $result );
+       }
+}
index cf87a98..705a34a 100644 (file)
@@ -2,13 +2,16 @@
 /**
  * @group BagOStuff
  */
-class RedisBagOStuffTest extends MediaWikiTestCase {
+class RedisBagOStuffTest extends PHPUnit_Framework_TestCase {
        /** @var RedisBagOStuff */
        private $cache;
 
        protected function setUp() {
                parent::setUp();
-               $this->cache = TestingAccessWrapper::newFromObject( new RedisBagOStuff( [ 'servers' => [] ] ) );
+               $cache = $this->getMockBuilder( 'RedisBagOStuff' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $this->cache = TestingAccessWrapper::newFromObject( $cache );
        }
 
        /**
index 354ddd4..c56626f 100644 (file)
@@ -163,12 +163,8 @@ class NewParserTest extends MediaWikiTestCase {
                $this->djVuSupport = new DjVuSupport();
                // Tidy support
                $this->tidySupport = new TidySupport();
-               $tmpGlobals['wgTidyConfig'] = null;
+               $tmpGlobals['wgTidyConfig'] = $this->tidySupport->getConfig();
                $tmpGlobals['wgUseTidy'] = false;
-               $tmpGlobals['wgDebugTidy'] = false;
-               $tmpGlobals['wgTidyConf'] = $IP . '/includes/tidy/tidy.conf';
-               $tmpGlobals['wgTidyOpts'] = '';
-               $tmpGlobals['wgTidyInternal'] = $this->tidySupport->isInternal();
 
                $this->setMwGlobals( $tmpGlobals );
 
@@ -324,7 +320,21 @@ class NewParserTest extends MediaWikiTestCase {
                        ], $this->db->timestamp( '20010115123500' ), $user );
                }
 
-               # A DjVu file
+               $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Audio.oga' ) );
+               if ( !$this->db->selectField( 'image', '1', [ 'img_name' => $image->getName() ] ) ) {
+                       $image->recordUpload2( '', 'An awesome hitsong ', 'Will it play', [
+                                       'size'        => 12345,
+                                       'width'       => 0,
+                                       'height'      => 0,
+                                       'bits'        => 0,
+                                       'media_type'  => MEDIATYPE_AUDIO,
+                                       'mime'        => 'application/ogg',
+                                       'metadata'    => serialize( [] ),
+                                       'sha1'        => Wikimedia\base_convert( '', 16, 36, 32 ),
+                                       'fileExists'  => true
+                       ], $this->db->timestamp( '20010115123500' ), $user );
+               }
+
                # A DjVu file
                $image = wfLocalFile( Title::makeTitle( NS_FILE, 'LoremIpsum.djvu' ) );
                if ( !$this->db->selectField( 'image', '1', [ 'img_name' => $image->getName() ] ) ) {
@@ -438,7 +448,8 @@ class NewParserTest extends MediaWikiTestCase {
                        'wgMathDirectory' => $uploadDir . '/math',
                        'wgDefaultLanguageVariant' => $variant,
                        'wgLinkHolderBatchSize' => $linkHolderBatchSize,
-                       'wgUseTidy' => isset( $opts['tidy'] ),
+                       'wgUseTidy' => false,
+                       'wgTidyConfig' => isset( $opts['tidy'] ) ? $this->tidySupport->getConfig() : null
                ];
 
                if ( $config ) {
diff --git a/tests/phpunit/includes/phpunit/ConsecutiveParametersMatcher.php b/tests/phpunit/includes/phpunit/ConsecutiveParametersMatcher.php
deleted file mode 100644 (file)
index 8de467f..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-<?php
-// @codingStandardsIgnoreFile
-/*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Invocation matcher which looks for sets of specific parameters in the invocations.
- *
- * Checks the parameters of the incoming invocations, the parameter list is
- * checked against the defined constraints in $parameters. If the constraint
- * is met it will return true in matches().
- *
- * It takes a list of match groups and and increases a call index after each invocation.
- * So the first invocation uses the first group of constraints, the second the next and so on.
- */
-class PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters extends PHPUnit_Framework_MockObject_Matcher_StatelessInvocation
-{
-    /**
-     * @var array
-     */
-    private $_parameterGroups = array();
-
-    /**
-     * @var array
-     */
-    private $_invocations = array();
-
-    /**
-     * @param array $parameterGroups
-     */
-    public function __construct(array $parameterGroups)
-    {
-        foreach ($parameterGroups as $index => $parameters) {
-            foreach ($parameters as $parameter) {
-                if (!($parameter instanceof \PHPUnit_Framework_Constraint)) {
-                    $parameter = new \PHPUnit_Framework_Constraint_IsEqual($parameter);
-                }
-                $this->_parameterGroups[$index][] = $parameter;
-            }
-        }
-    }
-
-    /**
-     * @return string
-     */
-    public function toString()
-    {
-        $text = 'with consecutive parameters';
-
-        return $text;
-    }
-
-    /**
-     * @param  PHPUnit_Framework_MockObject_Invocation $invocation
-     * @return bool
-     */
-    public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
-    {
-        $this->_invocations[] = $invocation;
-        $callIndex            = count($this->_invocations) - 1;
-        $this->verifyInvocation($invocation, $callIndex);
-
-        return false;
-    }
-
-    public function verify()
-    {
-        foreach ($this->_invocations as $callIndex => $invocation) {
-            $this->verifyInvocation($invocation, $callIndex);
-        }
-    }
-
-    /**
-     * Verify a single invocation
-     *
-     * @param  PHPUnit_Framework_MockObject_Invocation      $invocation
-     * @param  int                                          $callIndex
-     * @throws PHPUnit_Framework_ExpectationFailedException
-     */
-    private function verifyInvocation(PHPUnit_Framework_MockObject_Invocation $invocation, $callIndex)
-    {
-
-        if (isset($this->_parameterGroups[$callIndex])) {
-            $parameters = $this->_parameterGroups[$callIndex];
-        } else {
-          // no parameter assertion for this call index
-            return;
-        }
-
-        if ($invocation === null) {
-            throw new PHPUnit_Framework_ExpectationFailedException(
-                'Mocked method does not exist.'
-            );
-        }
-
-        if (count($invocation->parameters) < count($parameters)) {
-            throw new PHPUnit_Framework_ExpectationFailedException(
-                sprintf(
-                    'Parameter count for invocation %s is too low.',
-                    $invocation->toString()
-                )
-            );
-        }
-
-        foreach ($parameters as $i => $parameter) {
-            $parameter->evaluate(
-                $invocation->parameters[$i],
-                sprintf(
-                    'Parameter %s for invocation #%d %s does not match expected ' .
-                    'value.',
-                    $i,
-                    $callIndex,
-                    $invocation->toString()
-                )
-            );
-        }
-    }
-}
diff --git a/tests/phpunit/includes/phpunit/LICENSE b/tests/phpunit/includes/phpunit/LICENSE
deleted file mode 100644 (file)
index fe178b0..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-PHPUnit
-
-Copyright (c) 2001-2014, Sebastian Bergmann <sebastian@phpunit.de>.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
- * Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in
-   the documentation and/or other materials provided with the
-   distribution.
-
- * Neither the name of Sebastian Bergmann nor the names of his
-   contributors may be used to endorse or promote products derived
-   from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
diff --git a/tests/phpunit/includes/phpunit/README b/tests/phpunit/includes/phpunit/README
deleted file mode 100644 (file)
index 3ec3fd9..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-This directory contains classes duplicated from new versions of phpunit
-that also work in the older php 3.7.37 used by wmf CI servers.
index 4aa4f41..1dfcd82 100644 (file)
@@ -14,7 +14,7 @@ class CoreVersionCheckerTest extends PHPUnit_Framework_TestCase {
 
        public static function provideCheck() {
                return [
-                       // array( $wgVersion, constraint, expected )
+                       // [ $wgVersion, constraint, expected ]
                        [ '1.25alpha', '>= 1.26', false ],
                        [ '1.25.0', '>= 1.26', false ],
                        [ '1.26alpha', '>= 1.26', true ],
index 0120d79..11995de 100644 (file)
@@ -2,11 +2,12 @@
 
 class ExtensionProcessorTest extends MediaWikiTestCase {
 
-       private $dir;
+       private $dir, $dirname;
 
        public function setUp() {
                parent::setUp();
                $this->dir = __DIR__ . '/FooBar/extension.json';
+               $this->dirname = dirname( $this->dir );
        }
 
        /**
@@ -108,9 +109,9 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers ExtensionProcessor::extractConfig
+        * @covers ExtensionProcessor::extractConfig1
         */
-       public function testExtractConfig() {
+       public function testExtractConfig1() {
                $processor = new ExtensionProcessor;
                $info = [
                        'config' => [
@@ -136,6 +137,35 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                $this->assertEquals( 'somevalue', $extracted['globals']['egBar'] );
        }
 
+       /**
+        * @covers ExtensionProcessor::extractConfig2
+        */
+       public function testExtractConfig2() {
+               $processor = new ExtensionProcessor;
+               $info = [
+                       'config' => [
+                               'Bar' => [ 'value' => 'somevalue' ],
+                               'Foo' => [ 'value' => 10 ],
+                               'Path' => [ 'value' => 'foo.txt', 'path' => true ],
+                       ],
+               ] + self::$default;
+               $info2 = [
+                       'config' => [
+                               'Bar' => [ 'value' => 'somevalue' ],
+                       ],
+                       'config_prefix' => 'eg',
+                       'name' => 'FooBar2',
+               ];
+               $processor->extractInfo( $this->dir, $info, 2 );
+               $processor->extractInfo( $this->dir, $info2, 2 );
+               $extracted = $processor->getExtractedInfo();
+               $this->assertEquals( 'somevalue', $extracted['globals']['wgBar'] );
+               $this->assertEquals( 10, $extracted['globals']['wgFoo'] );
+               $this->assertEquals( "{$this->dirname}/foo.txt", $extracted['globals']['wgPath'] );
+               // Custom prefix:
+               $this->assertEquals( 'somevalue', $extracted['globals']['egBar'] );
+       }
+
        public static function provideExtractExtensionMessagesFiles() {
                $dir = __DIR__ . '/FooBar/';
                return [
@@ -414,6 +444,26 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                        ]
                ];
        }
+
+       public function testGlobalSettingsDocumentedInSchema() {
+               global $IP;
+               $globalSettings = TestingAccessWrapper::newFromClass(
+                       ExtensionProcessor::class )->globalSettings;
+
+               $schema = FormatJson::decode(
+                       file_get_contents( "$IP/docs/extension.schema.json" ),
+                       true
+               );
+               $missing = [];
+               foreach ( $globalSettings as $global ) {
+                       if ( !isset( $schema['properties'][$global] ) ) {
+                               $missing[] = $global;
+                       }
+               }
+
+               $this->assertEquals( [], $missing,
+                       "The following global settings are not documented in docs/extension.schema.json" );
+       }
 }
 
 /**
index 72ea495..9b62b82 100644 (file)
@@ -5,7 +5,7 @@ class ResourceLoaderStartUpModuleTest extends ResourceLoaderTestCase {
        // Version hash for a blank file module.
        // Result of ResourceLoader::makeHash(), ResourceLoaderTestModule
        // and ResourceLoaderFileModule::getDefinitionSummary().
-       protected static $blankVersion = 'GqV9IPpY';
+       protected static $blankVersion = '09p30q0';
 
        protected static function expandPlaceholders( $text ) {
                return strtr( $text, [
index e6bb5a7..85834d7 100644 (file)
@@ -49,12 +49,6 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
                        'scripts' => [ 'MediaWiki:Common.js' ],
                ];
 
-               $variableParams = [
-                       'allowVariables' => true,
-                       'styles' => [ 'MediaWiki:Common.css', 'MediaWiki:{skin}.css' ],
-                       'scripts' => [ 'MediaWiki:Common.js', 'MediaWiki:{skin}.js' ],
-               ];
-
                return [
                        [ [], new HashConfig( $settings ), [] ],
                        [ $params, new HashConfig( $settings ), [
@@ -73,12 +67,6 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
                                ),
                                []
                        ],
-                       [ $variableParams, new HashConfig( $settings ), [
-                               'MediaWiki:Common.js' => [ 'type' => 'script' ],
-                               'MediaWiki:vector.js' => [ 'type' => 'script' ],
-                               'MediaWiki:Common.css' => [ 'type' => 'style' ],
-                               'MediaWiki:vector.css' => [ 'type' => 'style' ]
-                       ] ],
                ];
        }
 
index 055e982..f084c64 100644 (file)
@@ -50,6 +50,10 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                        return;
                }
 
+               // Reset the search type back to default - some extensions may have
+               // overridden it.
+               $this->setMwGlobals( [ 'wgSearchType' => null ] );
+
                $this->insertPage( 'Not_Main_Page', 'This is not a main page' );
                $this->insertPage(
                        'Talk:Not_Main_Page',
@@ -153,4 +157,49 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                        "Title power search failed" );
        }
 
+       /**
+        * @covers SearchEngine::getSearchIndexFields
+        */
+       public function testSearchIndexFields() {
+               /**
+                * @var $mockEngine SearchEngine
+                */
+               $mockEngine = $this->getMock( 'SearchEngine', [ 'makeSearchFieldMapping' ] );
+
+               $mockFieldBuilder = function ( $name, $type ) {
+                       $mockField =
+                               $this->getMockBuilder( 'SearchIndexFieldDefinition' )->setConstructorArgs( [
+                                       $name,
+                                       $type
+                               ] )->getMock();
+                       $mockField->expects( $this->any() )->method( 'getMapping' )->willReturn( [
+                               'testData' => 'test',
+                               'name' => $name,
+                               'type' => $type,
+                       ] );
+                       return $mockField;
+               };
+
+               $mockEngine->expects( $this->atLeastOnce() )
+                       ->method( 'makeSearchFieldMapping' )
+                       ->willReturnCallback( $mockFieldBuilder );
+
+               // Not using mock since PHPUnit mocks do not work properly with references in params
+               $this->mergeMwGlobalArrayValue( 'wgHooks',
+                       [ 'SearchIndexFields' => [ [ $this, 'hookSearchIndexFields', $mockFieldBuilder ] ] ] );
+
+               $fields = $mockEngine->getSearchIndexFields();
+               $this->assertArrayHasKey( 'language', $fields );
+               $this->assertArrayHasKey( 'category', $fields );
+               $this->assertInstanceOf( 'SearchIndexField', $fields['testField'] );
+
+               $mapping = $fields['testField']->getMapping( $mockEngine );
+               $this->assertArrayHasKey( 'testData', $mapping );
+               $this->assertEquals( 'test', $mapping['testData'] );
+       }
+
+       public function hookSearchIndexFields( $mockFieldBuilder, &$fields, SearchEngine $engine ) {
+               $fields['testField'] = $mockFieldBuilder( "testField", SearchIndexField::INDEX_TYPE_TEXT );
+               return true;
+       }
 }
diff --git a/tests/phpunit/includes/search/SearchIndexFieldTest.php b/tests/phpunit/includes/search/SearchIndexFieldTest.php
new file mode 100644 (file)
index 0000000..ec046a7
--- /dev/null
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * @group Search
+ * @covers SearchIndexFieldDefinition
+ */
+class SearchIndexFieldTest extends MediaWikiTestCase {
+
+       public function getMergeCases() {
+               return [
+                       [ 0, 'test', 0, 'test', true ],
+                       [ SearchIndexField::INDEX_TYPE_NESTED, 'test',
+                         SearchIndexField::INDEX_TYPE_NESTED, 'test', false ],
+                       [ 0, 'test', 0, 'test2', true ],
+                       [ 0, 'test', 1, 'test', false ],
+               ];
+       }
+
+       /**
+        * @dataProvider getMergeCases
+        */
+       public function testMerge( $t1, $n1, $t2, $n2, $result ) {
+               $field1 = $this->getMockBuilder( 'SearchIndexFieldDefinition' )
+                       ->setMethods( [ 'getMapping' ] )
+                       ->setConstructorArgs( [ $n1, $t1 ] )->getMock();
+               $field2 = $this->getMockBuilder( 'SearchIndexFieldDefinition' )
+                       ->setMethods( [ 'getMapping' ] )
+                       ->setConstructorArgs( [ $n2, $t2 ] )->getMock();
+
+               if ( $result ) {
+                       $this->assertNotFalse( $field1->merge( $field2 ) );
+               } else {
+                       $this->assertFalse( $field1->merge( $field2 ) );
+               }
+
+               $field1->setFlag( 0xFF );
+               $this->assertFalse( $field1->merge( $field2 ) );
+       }
+}
index b35b685..da4b06e 100644 (file)
@@ -22,7 +22,6 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                        'CookieHttpOnly' => true,
                        'SessionName' => false,
                        'CookieExpiration' => 100,
-                       'ExtendedLoginCookies' => [ 'UserID', 'Token' ],
                        'ExtendedLoginCookieExpiration' => 200,
                ] );
        }
@@ -148,6 +147,14 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                $this->assertTrue( $provider->persistsSessionId() );
                $this->assertTrue( $provider->canChangeUser() );
 
+               $extendedCookies = [ 'UserID', 'UserName', 'Token' ];
+
+               $this->assertEquals(
+                       $extendedCookies,
+                       \TestingAccessWrapper::newFromObject( $provider )->getExtendedLoginCookies(),
+                       'List of extended cookies (subclasses can add values, but we\'re calling the core one here)'
+               );
+
                $msg = $provider->whyNoSession();
                $this->assertInstanceOf( 'Message', $msg );
                $this->assertSame( 'sessionprovider-nocookies', $msg->getKey() );
@@ -506,10 +513,10 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                        'httpOnly' => $config->get( 'CookieHttpOnly' ),
                        'raw' => false,
                ];
+
+               $normalExpiry = $config->get( 'CookieExpiration' );
                $extendedExpiry = $config->get( 'ExtendedLoginCookieExpiration' );
                $extendedExpiry = (int)( $extendedExpiry === null ? 0 : $extendedExpiry );
-               $this->assertEquals( [ 'UserID', 'Token' ], $config->get( 'ExtendedLoginCookies' ),
-                       'sanity check' );
                $expect = [
                        'MySessionName' => [
                                'value' => (string)$sessionId,
@@ -517,10 +524,11 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                        ] + $defaults,
                        'xUserID' => [
                                'value' => (string)$user->getId(),
-                               'expire' => $extendedExpiry,
+                               'expire' => $remember ? $extendedExpiry : $normalExpiry,
                        ] + $defaults,
                        'xUserName' => [
                                'value' => $user->getName(),
+                               'expire' => $remember ? $extendedExpiry : $normalExpiry
                        ] + $defaults,
                        'xToken' => [
                                'value' => $remember ? $user->getToken() : '',
@@ -807,12 +815,20 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                $provider->setConfig( $config );
                $provider->setManager( SessionManager::singleton() );
 
-               $this->assertSame( 200, $provider->getLoginCookieExpiration( 'Token' ) );
-               $this->assertSame( 100, $provider->getLoginCookieExpiration( 'User' ) );
+               // First cookie is an extended cookie, remember me true
+               $this->assertSame( 200, $provider->getLoginCookieExpiration( 'Token', true ) );
+               $this->assertSame( 100, $provider->getLoginCookieExpiration( 'User', true ) );
+
+               // First cookie is an extended cookie, remember me false
+               $this->assertSame( 100, $provider->getLoginCookieExpiration( 'UserID', false ) );
+               $this->assertSame( 100, $provider->getLoginCookieExpiration( 'User', false ) );
 
                $config->set( 'ExtendedLoginCookieExpiration', null );
 
-               $this->assertSame( 100, $provider->getLoginCookieExpiration( 'Token' ) );
-               $this->assertSame( 100, $provider->getLoginCookieExpiration( 'User' ) );
+               $this->assertSame( 100, $provider->getLoginCookieExpiration( 'Token', true ) );
+               $this->assertSame( 100, $provider->getLoginCookieExpiration( 'User', true ) );
+
+               $this->assertSame( 100, $provider->getLoginCookieExpiration( 'Token', false ) );
+               $this->assertSame( 100, $provider->getLoginCookieExpiration( 'User', false ) );
        }
 }
index 316fd89..32dd7f2 100644 (file)
@@ -67,20 +67,6 @@ class DBSiteStoreTest extends MediaWikiTestCase {
                }
        }
 
-       /**
-        * @covers DBSiteStore::getSites
-        * @covers DBSiteStore::setLanguageCodeMapping
-        */
-       public function testLanguageCodeMapping() {
-               TestSites::insertIntoDb();
-
-               $store = $this->newDBSiteStore();
-               $store->setLanguageCodeMapping( [ 'no' => 'nb' ] );
-
-               $site = $store->getSite( 'nowiki' );
-               $this->assertEquals( $site->getLanguageCode(), 'nb' );
-       }
-
        /**
         * @covers DBSiteStore::saveSites
         */
index bebda79..7984795 100644 (file)
@@ -98,15 +98,4 @@ class FileBasedSiteLookupTest extends PHPUnit_Framework_TestCase {
                return tempnam( sys_get_temp_dir(), 'mw-test-sitelist' );
        }
 
-       public function testLanguageCodeMapping() {
-               $sites = $this->getSites();
-               $cacheBuilder = $this->newSitesCacheFileBuilder( $sites );
-               $cacheBuilder->build();
-
-               $cache = new FileBasedSiteLookup( $this->cacheFile );
-               $cache->setLanguageCodeMapping( [ 'en' => 'fa' ] );
-
-               $this->assertEquals( $cache->getSite( 'enwiktionary' )->getLanguageCode(), 'fa' );
-       }
-
 }
index 3f67b2b..64cdbaa 100644 (file)
@@ -29,36 +29,15 @@ use MediaWiki\Site\MediaWikiPageNameNormalizer;
  */
 class MediaWikiPageNameNormalizerTest extends PHPUnit_Framework_TestCase {
 
-       protected function setUp() {
-               parent::setUp();
-
-               static $connectivity = null;
-
-               if ( $connectivity === null ) {
-                       // Check whether we have (reasonable fast) connectivity
-                       $res = Http::get(
-                               'https://www.wikidata.org/w/api.php?action=query&meta=siteinfo&format=json',
-                               [ 'timeout' => 3 ],
-                               __METHOD__
-                       );
-
-                       if ( $res === false || strpos( $res, '"sitename":"Wikidata"' ) === false ) {
-                               $connectivity = false;
-                       } else {
-                               $connectivity = true;
-                       }
-               }
-
-               if ( !$connectivity ) {
-                       $this->markTestSkipped( 'MediaWikiPageNameNormalizerTest needs internet connectivity.' );
-               }
-       }
-
        /**
         * @dataProvider normalizePageTitleProvider
         */
-       public function testNormalizePageTitle( $expected, $pageName ) {
-               $normalizer = new MediaWikiPageNameNormalizer();
+       public function testNormalizePageTitle( $expected, $pageName, $getResponse ) {
+               MediaWikiPageNameNormalizerTestMockHttp::$response = $getResponse;
+
+               $normalizer = new MediaWikiPageNameNormalizer(
+                       new MediaWikiPageNameNormalizerTestMockHttp()
+               );
 
                $this->assertSame(
                        $expected,
@@ -67,19 +46,70 @@ class MediaWikiPageNameNormalizerTest extends PHPUnit_Framework_TestCase {
        }
 
        public function normalizePageTitleProvider() {
-               // Note: This makes (very conservative) assumptions about pages on Wikidata
-               // existing or not.
+               // Response are taken from wikidata and kkwiki using the following API request
+               // api.php?action=query&prop=info&redirects=1&converttitles=1&format=json&titles=…
                return [
                        'universe (Q1)' => [
-                               'Q1', 'Q1'
+                               'Q1',
+                               'Q1',
+                               '{"batchcomplete":"","query":{"pages":{"129":{"pageid":129,"ns":0,'
+                               . '"title":"Q1","contentmodel":"wikibase-item","pagelanguage":"en",'
+                               . '"pagelanguagehtmlcode":"en","pagelanguagedir":"ltr",'
+                               . '"touched":"2016-06-23T05:11:21Z","lastrevid":350004448,"length":58001}}}}'
                        ],
                        'Q404 redirects to Q395' => [
-                               'Q395', 'Q404'
+                               'Q395',
+                               'Q404',
+                               '{"batchcomplete":"","query":{"redirects":[{"from":"Q404","to":"Q395"}],"pages"'
+                               . ':{"601":{"pageid":601,"ns":0,"title":"Q395","contentmodel":"wikibase-item",'
+                               . '"pagelanguage":"en","pagelanguagehtmlcode":"en","pagelanguagedir":"ltr",'
+                               . '"touched":"2016-06-23T08:00:20Z","lastrevid":350021914,"length":60108}}}}'
+                       ],
+                       'D converted to Д (Latin to Cyrillic) (taken from kkwiki)' => [
+                               'Д',
+                               'D',
+                               '{"batchcomplete":"","query":{"converted":[{"from":"D","to":"\u0414"}],'
+                               . '"pages":{"510541":{"pageid":510541,"ns":0,"title":"\u0414",'
+                               . '"contentmodel":"wikitext","pagelanguage":"kk","pagelanguagehtmlcode":"kk",'
+                               . '"pagelanguagedir":"ltr","touched":"2015-11-22T09:16:18Z",'
+                               . '"lastrevid":2373618,"length":3501}}}}'
                        ],
                        'there is no Q0' => [
-                               false, 'Q0'
-                       ]
+                               false,
+                               'Q0',
+                               '{"batchcomplete":"","query":{"pages":{"-1":{"ns":0,"title":"Q0",'
+                               . '"missing":"","contentmodel":"wikibase-item","pagelanguage":"en",'
+                               . '"pagelanguagehtmlcode":"en","pagelanguagedir":"ltr"}}}}'
+                       ],
+                       'invalid title' => [
+                               false,
+                               '{{',
+                               '{"batchcomplete":"","query":{"pages":{"-1":{"title":"{{",'
+                               . '"invalidreason":"The requested page title contains invalid '
+                               . 'characters: \"{\".","invalid":""}}}}'
+                       ],
+                       'error on get' => [ false, 'ABC', false ]
                ];
        }
 
 }
+
+/**
+ * @private
+ * @see Http
+ */
+class MediaWikiPageNameNormalizerTestMockHttp extends Http {
+
+       /**
+        * @var mixed
+        */
+       public static $response;
+
+       public static function get( $url, $options = [], $caller = __METHOD__ ) {
+               PHPUnit_Framework_Assert::assertInternalType( 'string', $url );
+               PHPUnit_Framework_Assert::assertInternalType( 'array', $options );
+               PHPUnit_Framework_Assert::assertInternalType( 'string', $caller );
+
+               return self::$response;
+       }
+}
index 4ea9686..3fa8a9f 100644 (file)
@@ -29,10 +29,10 @@ class SpecialSearchTest extends MediaWikiTestCase {
                        $this->newUserWithSearchNS( $userOptions )
                );
                /*
-               $context->setRequest( new FauxRequest( array(
+               $context->setRequest( new FauxRequest( [
                        'ns5'=>true,
                        'ns6'=>true,
-               ) ));
+               ] ));
                 */
                $context->setRequest( new FauxRequest( $requested ) );
                $search = new SpecialSearch();
diff --git a/tests/phpunit/includes/tidy/BalancerTest.php b/tests/phpunit/includes/tidy/BalancerTest.php
new file mode 100644 (file)
index 0000000..f69ecaf
--- /dev/null
@@ -0,0 +1,155 @@
+<?php
+
+class BalancerTest extends MediaWikiTestCase {
+       private $balancer;
+
+       /**
+        * Anything that needs to happen before your tests should go here.
+        */
+       protected function setUp() {
+               // Be sure to do call the parent setup and teardown functions.
+               // This makes sure that all the various cleanup and restorations
+               // happen as they should (including the restoration for setMwGlobals).
+               parent::setUp();
+               $this->balancer = new MediaWiki\Tidy\Balancer( [
+                       'strict' => false, /* not strict */
+                       'allowedHtmlElements' => null, /* no sanitization */
+                       'tidyCompat' => false, /* standard parser */
+                       'allowComments' => true, /* comment parsing */
+               ] );
+       }
+
+       /**
+        * @covers MediaWiki\Tidy\Balancer::balance
+        * @dataProvider provideBalancerTests
+        */
+       public function testBalancer( $description, $input, $expected ) {
+               $output = $this->balancer->balance( $input );
+
+               // Ignore self-closing tags
+               $output = preg_replace( '/\s*\/>/', '>', $output );
+
+               $this->assertEquals( $expected, $output, $description );
+       }
+
+       public static function provideBalancerTests() {
+               // Get the tests from html5lib-tests.json
+               $json = json_decode( file_get_contents(
+                       __DIR__ . '/html5lib-tests.json'
+               ), true );
+               // Munge this slightly into the format phpunit expects
+               // for providers, and filter out HTML constructs which
+               // the balancer doesn't support.
+               $tests = [];
+               $okre = "~ \A
+                       (?i:<!DOCTYPE\ html>)?
+                       <html><head></head><body>
+                       .*
+                       </body></html>
+               \z ~xs";
+               foreach ( $json as $filename => $cases ) {
+                       foreach ( $cases as $case ) {
+                               $html = $case['document']['html'];
+                               if ( !preg_match( $okre, $html ) ) {
+                                       // Skip tests which involve stuff in the <head> or
+                                       // weird doctypes.
+                                       continue;
+                               }
+                               // We used to do this:
+                               //   $html = substr( $html, strlen( $start ), -strlen( $end ) );
+                               // But now we use a different field in the test case,
+                               // which reports how domino would parse this case in a
+                               // no-quirks <body> context.  (The original test case may
+                               // have had a different context, or relied on quirks mode.)
+                               $html = $case['document']['noQuirksBodyHtml'];
+                               // Normalize case of SVG attributes.
+                               $html = str_replace( 'foreignObject', 'foreignobject', $html );
+                               // Normalize case of MathML attributes.
+                               $html = str_replace( 'definitionURL', 'definitionurl', $html );
+
+                               if (
+                                       isset( $case['document']['props']['comment'] ) &&
+                                       preg_match( ',<!--[^>]*<,', $html )
+                               ) {
+                                       // Skip tests which include HTML comments containing
+                                       // the < character, which we don't support.
+                                       continue;
+                               }
+                               if ( strpos( $case['data'], '<![CDATA[' ) !== false ) {
+                                       // Skip tests involving <![CDATA[ ]]> quoting.
+                                       continue;
+                               }
+                               if (
+                                       stripos( $case['data'], '<!DOCTYPE' ) !== false &&
+                                       stripos( $case['data'], '<!DOCTYPE html>' ) === false
+                               ) {
+                                       // Skip tests involving unusual doctypes.
+                                       continue;
+                               }
+                               $literalre = "~ <rdar: | <isindex | < /? (
+                                       html | head | body | frame | frameset | plaintext
+                               ) > ~xi";
+                               if ( preg_match( $literalre, $case['data'] ) ) {
+                                       // Skip tests involving some literal tags, which are
+                                       // unsupported but don't show up in the expected output.
+                                       continue;
+                               }
+                               if (
+                                       isset( $case['document']['props']['tags']['iframe'] ) ||
+                                       isset( $case['document']['props']['tags']['noembed'] ) ||
+                                       isset( $case['document']['props']['tags']['noscript'] ) ||
+                                       isset( $case['document']['props']['tags']['script'] ) ||
+                                       isset( $case['document']['props']['tags']['svg script'] ) ||
+                                       isset( $case['document']['props']['tags']['svg title'] ) ||
+                                       isset( $case['document']['props']['tags']['title'] ) ||
+                                       isset( $case['document']['props']['tags']['xmp'] )
+                               ) {
+                                       // Skip tests with unsupported tags which *do* show
+                                       // up in the expected output.
+                                       continue;
+                               }
+                               if (
+                                       $filename === 'entities01.dat' ||
+                                       $filename === 'entities02.dat' ||
+                                       preg_match( '/&([a-z]+|#x[0-9A-F]+);/i', $case['data'] ) ||
+                                       preg_match( '/^(&|&#|&#X|&#x|&#45|&x-test|&AMP)$/', $case['data'] )
+                               ) {
+                                       // Skip tests involving entity encoding.
+                                       continue;
+                               }
+                               if (
+                                       isset( $case['document']['props']['tagWithLt'] ) ||
+                                       isset( $case['document']['props']['attrWithFunnyChar'] ) ||
+                                       preg_match( ':^(</b test|<di|<foo bar=qux/>)$:', $case['data'] ) ||
+                                       preg_match( ':</p<p>:', $case['data'] ) ||
+                                       preg_match( ':<b &=&amp>|<p/x/y/z>:', $case['data'] )
+                               ) {
+                                       // Skip tests with funny tag or attribute names,
+                                       // which are really tests of the HTML tokenizer, not
+                                       // the tree builder.
+                                       continue;
+                               }
+                               if (
+                                       preg_match( ':encoding=" text/html "|type=" hidden":', $case['data'] )
+                               ) {
+                                       // The Sanitizer normalizes whitespace in attribute
+                                       // values, which makes this test case invalid.
+                                       continue;
+                               }
+                               if ( $filename === 'plain-text-unsafe.dat' ) {
+                                       // Skip tests with ASCII null, etc.
+                                       continue;
+                               }
+                               $data = preg_replace(
+                                       '~<!DOCTYPE html>~i', '', $case['data']
+                               );
+                               $tests[] = [
+                                       $filename, # use better description?
+                                       $data,
+                                       $html
+                               ];
+                       }
+               }
+               return $tests;
+       }
+}
diff --git a/tests/phpunit/includes/tidy/html5lib-tests.json b/tests/phpunit/includes/tidy/html5lib-tests.json
new file mode 100644 (file)
index 0000000..beb3659
--- /dev/null
@@ -0,0 +1,78905 @@
+{
+  "adoption01.dat": [
+    {
+      "data": "<a><p></a></p>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,10): adoption-agency-1.3"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a"
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "a"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a></a><p><a></a></p></body></html>",
+        "noQuirksBodyHtml": "<a></a><p><a></a></p>"
+      }
+    },
+    {
+      "data": "<a>1<p>2</a>3</p>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,12): adoption-agency-1.3"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "children": [
+                      {
+                        "text": "1"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "a",
+                        "children": [
+                          {
+                            "text": "2"
+                          }
+                        ]
+                      },
+                      {
+                        "text": "3"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a>1</a><p><a>2</a>3</p></body></html>",
+        "noQuirksBodyHtml": "<a>1</a><p><a>2</a>3</p>"
+      }
+    },
+    {
+      "data": "<a>1<button>2</a>3</button>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,17): adoption-agency-1.3"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "button": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "children": [
+                      {
+                        "text": "1"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "button",
+                    "children": [
+                      {
+                        "tag": "a",
+                        "children": [
+                          {
+                            "text": "2"
+                          }
+                        ]
+                      },
+                      {
+                        "text": "3"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a>1</a><button><a>2</a>3</button></body></html>",
+        "noQuirksBodyHtml": "<a>1</a><button><a>2</a>3</button>"
+      }
+    },
+    {
+      "data": "<a>1<b>2</a>3</b>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,12): adoption-agency-1.3"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "b": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "children": [
+                      {
+                        "text": "1"
+                      },
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": "2"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "text": "3"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a>1<b>2</b></a><b>3</b></body></html>",
+        "noQuirksBodyHtml": "<a>1<b>2</b></a><b>3</b>"
+      }
+    },
+    {
+      "data": "<a>1<div>2<div>3</a>4</div>5</div>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,20): adoption-agency-1.3",
+        "(1,20): adoption-agency-1.3"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "children": [
+                      {
+                        "text": "1"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "a",
+                        "children": [
+                          {
+                            "text": "2"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "div",
+                        "children": [
+                          {
+                            "tag": "a",
+                            "children": [
+                              {
+                                "text": "3"
+                              }
+                            ]
+                          },
+                          {
+                            "text": "4"
+                          }
+                        ]
+                      },
+                      {
+                        "text": "5"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a>1</a><div><a>2</a><div><a>3</a>4</div>5</div></body></html>",
+        "noQuirksBodyHtml": "<a>1</a><div><a>2</a><div><a>3</a>4</div>5</div>"
+      }
+    },
+    {
+      "data": "<table><a>1<p>2</a>3</p>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,10): unexpected-start-tag-implies-table-voodoo",
+        "(1,11): unexpected-character-implies-table-voodoo",
+        "(1,14): unexpected-start-tag-implies-table-voodoo",
+        "(1,15): unexpected-character-implies-table-voodoo",
+        "(1,19): unexpected-end-tag-implies-table-voodoo",
+        "(1,19): adoption-agency-1.3",
+        "(1,20): unexpected-character-implies-table-voodoo",
+        "(1,24): unexpected-end-tag-implies-table-voodoo",
+        "(1,24): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "p": true,
+            "table": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "children": [
+                      {
+                        "text": "1"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "a",
+                        "children": [
+                          {
+                            "text": "2"
+                          }
+                        ]
+                      },
+                      {
+                        "text": "3"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a>1</a><p><a>2</a>3</p><table></table></body></html>",
+        "noQuirksBodyHtml": "<a>1</a><p><a>2</a>3</p><table></table>"
+      }
+    },
+    {
+      "data": "<b><b><a><p></a>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,16): adoption-agency-1.3",
+        "(1,16): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "a": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "tag": "a"
+                          },
+                          {
+                            "tag": "p",
+                            "children": [
+                              {
+                                "tag": "a"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><b><b><a></a><p><a></a></p></b></b></body></html>",
+        "noQuirksBodyHtml": "<b><b><a></a><p><a></a></p></b></b>"
+      }
+    },
+    {
+      "data": "<b><a><b><p></a>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,16): adoption-agency-1.3",
+        "(1,16): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "a": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "a",
+                        "children": [
+                          {
+                            "tag": "b"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "tag": "p",
+                            "children": [
+                              {
+                                "tag": "a"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><b><a><b></b></a><b><p><a></a></p></b></b></body></html>",
+        "noQuirksBodyHtml": "<b><a><b></b></a><b><p><a></a></p></b></b>"
+      }
+    },
+    {
+      "data": "<a><b><b><p></a>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,16): adoption-agency-1.3",
+        "(1,16): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "b": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "tag": "b"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "tag": "p",
+                            "children": [
+                              {
+                                "tag": "a"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a><b><b></b></b></a><b><b><p><a></a></p></b></b></body></html>",
+        "noQuirksBodyHtml": "<a><b><b></b></b></a><b><b><p><a></a></p></b></b>"
+      }
+    },
+    {
+      "data": "<p>1<s id=\"A\">2<b id=\"B\">3</p>4</s>5</b>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,30): unexpected-end-tag",
+        "(1,35): adoption-agency-1.3"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "s": true,
+            "b": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "1"
+                      },
+                      {
+                        "tag": "s",
+                        "attrs": [
+                          {
+                            "name": "id",
+                            "value": "A"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "text": "2"
+                          },
+                          {
+                            "tag": "b",
+                            "attrs": [
+                              {
+                                "name": "id",
+                                "value": "B"
+                              }
+                            ],
+                            "children": [
+                              {
+                                "text": "3"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "s",
+                    "attrs": [
+                      {
+                        "name": "id",
+                        "value": "A"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "tag": "b",
+                        "attrs": [
+                          {
+                            "name": "id",
+                            "value": "B"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "text": "4"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "b",
+                    "attrs": [
+                      {
+                        "name": "id",
+                        "value": "B"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "5"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><p>1<s id=\"A\">2<b id=\"B\">3</b></s></p><s id=\"A\"><b id=\"B\">4</b></s><b id=\"B\">5</b></body></html>",
+        "noQuirksBodyHtml": "<p>1<s id=\"A\">2<b id=\"B\">3</b></s></p><s id=\"A\"><b id=\"B\">4</b></s><b id=\"B\">5</b>"
+      }
+    },
+    {
+      "data": "<table><a>1<td>2</td>3</table>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,10): unexpected-start-tag-implies-table-voodoo",
+        "(1,11): unexpected-character-implies-table-voodoo",
+        "(1,15): unexpected-cell-in-table-body",
+        "(1,30): unexpected-implied-end-tag-in-table-view"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "children": [
+                      {
+                        "text": "1"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "a",
+                    "children": [
+                      {
+                        "text": "3"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "text": "2"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a>1</a><a>3</a><table><tbody><tr><td>2</td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<a>1</a><a>3</a><table><tbody><tr><td>2</td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<table>A<td>B</td>C</table>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,8): unexpected-character-implies-table-voodoo",
+        "(1,12): unexpected-cell-in-table-body",
+        "(1,22): unexpected-character-implies-table-voodoo"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "AC"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "text": "B"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>AC<table><tbody><tr><td>B</td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "AC<table><tbody><tr><td>B</td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<a><svg><tr><input></a>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,23): unexpected-end-tag",
+        "(1,23): adoption-agency-1.3"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "svg svg": true,
+            "svg tr": true,
+            "svg input": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "children": [
+                      {
+                        "tag": "svg",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "ns": "http://www.w3.org/2000/svg",
+                            "children": [
+                              {
+                                "tag": "input",
+                                "ns": "http://www.w3.org/2000/svg"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a><svg><tr><input></input></tr></svg></a></body></html>",
+        "noQuirksBodyHtml": "<a><svg><tr><input></input></tr></svg></a>"
+      }
+    },
+    {
+      "data": "<div><a><b><div><div><div><div><div><div><div><div><div><div></a>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,65): adoption-agency-1.3",
+        "(1,65): adoption-agency-1.3",
+        "(1,65): adoption-agency-1.3",
+        "(1,65): adoption-agency-1.3",
+        "(1,65): adoption-agency-1.3",
+        "(1,65): adoption-agency-1.3",
+        "(1,65): adoption-agency-1.3",
+        "(1,65): adoption-agency-1.3",
+        "(1,65): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "a": true,
+            "b": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "a",
+                        "children": [
+                          {
+                            "tag": "b"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "tag": "div",
+                            "children": [
+                              {
+                                "tag": "a"
+                              },
+                              {
+                                "tag": "div",
+                                "children": [
+                                  {
+                                    "tag": "a"
+                                  },
+                                  {
+                                    "tag": "div",
+                                    "children": [
+                                      {
+                                        "tag": "a"
+                                      },
+                                      {
+                                        "tag": "div",
+                                        "children": [
+                                          {
+                                            "tag": "a"
+                                          },
+                                          {
+                                            "tag": "div",
+                                            "children": [
+                                              {
+                                                "tag": "a"
+                                              },
+                                              {
+                                                "tag": "div",
+                                                "children": [
+                                                  {
+                                                    "tag": "a"
+                                                  },
+                                                  {
+                                                    "tag": "div",
+                                                    "children": [
+                                                      {
+                                                        "tag": "a"
+                                                      },
+                                                      {
+                                                        "tag": "div",
+                                                        "children": [
+                                                          {
+                                                            "tag": "a",
+                                                            "children": [
+                                                              {
+                                                                "tag": "div",
+                                                                "children": [
+                                                                  {
+                                                                    "tag": "div"
+                                                                  }
+                                                                ]
+                                                              }
+                                                            ]
+                                                          }
+                                                        ]
+                                                      }
+                                                    ]
+                                                  }
+                                                ]
+                                              }
+                                            ]
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div><a><b></b></a><b><div><a></a><div><a></a><div><a></a><div><a></a><div><a></a><div><a></a><div><a></a><div><a><div><div></div></div></a></div></div></div></div></div></div></div></div></b></div></body></html>",
+        "noQuirksBodyHtml": "<div><a><b></b></a><b><div><a></a><div><a></a><div><a></a><div><a></a><div><a></a><div><a></a><div><a></a><div><a><div><div></div></div></a></div></div></div></div></div></div></div></div></b></div>"
+      }
+    },
+    {
+      "data": "<div><a><b><u><i><code><div></a>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,32): adoption-agency-1.3",
+        "(1,32): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "a": true,
+            "b": true,
+            "u": true,
+            "i": true,
+            "code": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "a",
+                        "children": [
+                          {
+                            "tag": "b",
+                            "children": [
+                              {
+                                "tag": "u",
+                                "children": [
+                                  {
+                                    "tag": "i",
+                                    "children": [
+                                      {
+                                        "tag": "code"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "u",
+                        "children": [
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "tag": "code",
+                                "children": [
+                                  {
+                                    "tag": "div",
+                                    "children": [
+                                      {
+                                        "tag": "a"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div><a><b><u><i><code></code></i></u></b></a><u><i><code><div><a></a></div></code></i></u></div></body></html>",
+        "noQuirksBodyHtml": "<div><a><b><u><i><code></code></i></u></b></a><u><i><code><div><a></a></div></code></i></u></div>"
+      }
+    },
+    {
+      "data": "<b><b><b><b>x</b></b></b></b>y",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "tag": "b",
+                            "children": [
+                              {
+                                "tag": "b",
+                                "children": [
+                                  {
+                                    "text": "x"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "text": "y"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><b><b><b><b>x</b></b></b></b>y</body></html>",
+        "noQuirksBodyHtml": "<b><b><b><b>x</b></b></b></b>y"
+      }
+    },
+    {
+      "data": "<p><b><b><b><b><p>x",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,18): unexpected-end-tag",
+        "(1,19): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "b": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "tag": "b",
+                            "children": [
+                              {
+                                "tag": "b",
+                                "children": [
+                                  {
+                                    "tag": "b"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "tag": "b",
+                            "children": [
+                              {
+                                "tag": "b",
+                                "children": [
+                                  {
+                                    "text": "x"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><p><b><b><b><b></b></b></b></b></p><p><b><b><b>x</b></b></b></p></body></html>",
+        "noQuirksBodyHtml": "<p><b><b><b><b></b></b></b></b></p><p><b><b><b>x</b></b></b></p>"
+      }
+    }
+  ],
+  "adoption02.dat": [
+    {
+      "data": "<b>1<i>2<p>3</b>4",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,16): adoption-agency-1.3",
+        "(1,17): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "i": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "text": "1"
+                      },
+                      {
+                        "tag": "i",
+                        "children": [
+                          {
+                            "text": "2"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "i",
+                    "children": [
+                      {
+                        "tag": "p",
+                        "children": [
+                          {
+                            "tag": "b",
+                            "children": [
+                              {
+                                "text": "3"
+                              }
+                            ]
+                          },
+                          {
+                            "text": "4"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><b>1<i>2</i></b><i><p><b>3</b>4</p></i></body></html>",
+        "noQuirksBodyHtml": "<b>1<i>2</i></b><i><p><b>3</b>4</p></i>"
+      }
+    },
+    {
+      "data": "<a><div><style></style><address><a>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,35): unexpected-start-tag-implies-end-tag",
+        "(1,35): adoption-agency-1.3",
+        "(1,35): adoption-agency-1.3",
+        "(1,35): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "div": true,
+            "style": true,
+            "address": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a"
+                  },
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "a",
+                        "children": [
+                          {
+                            "tag": "style"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "address",
+                        "children": [
+                          {
+                            "tag": "a"
+                          },
+                          {
+                            "tag": "a"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a></a><div><a><style></style></a><address><a></a><a></a></address></div></body></html>",
+        "noQuirksBodyHtml": "<a></a><div><a><style></style></a><address><a></a><a></a></address></div>"
+      }
+    }
+  ],
+  "comments01.dat": [
+    {
+      "data": "FOO<!-- BAR -->BAZ",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "comment": " BAR "
+                  },
+                  {
+                    "text": "BAZ"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<!-- BAR -->BAZ</body></html>",
+        "noQuirksBodyHtml": "FOO<!-- BAR -->BAZ"
+      }
+    },
+    {
+      "data": "FOO<!-- BAR --!>BAZ",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,15): unexpected-bang-after-double-dash-in-comment"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "comment": " BAR "
+                  },
+                  {
+                    "text": "BAZ"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<!-- BAR -->BAZ</body></html>",
+        "noQuirksBodyHtml": "FOO<!-- BAR -->BAZ"
+      }
+    },
+    {
+      "data": "FOO<!-- BAR --   >BAZ",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,15): unexpected-char-in-comment",
+        "(1,21): eof-in-comment"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "comment": " BAR --   >BAZ"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<!-- BAR --   >BAZ--></body></html>",
+        "noQuirksBodyHtml": "FOO<!-- BAR --   >BAZ-->"
+      }
+    },
+    {
+      "data": "FOO<!-- BAR -- <QUX> -- MUX -->BAZ",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,15): unexpected-char-in-comment",
+        "(1,24): unexpected-char-in-comment"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "comment": " BAR -- <QUX> -- MUX "
+                  },
+                  {
+                    "text": "BAZ"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<!-- BAR -- <QUX> -- MUX -->BAZ</body></html>",
+        "noQuirksBodyHtml": "FOO<!-- BAR -- <QUX> -- MUX -->BAZ"
+      }
+    },
+    {
+      "data": "FOO<!-- BAR -- <QUX> -- MUX --!>BAZ",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,15): unexpected-char-in-comment",
+        "(1,24): unexpected-char-in-comment",
+        "(1,31): unexpected-bang-after-double-dash-in-comment"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "comment": " BAR -- <QUX> -- MUX "
+                  },
+                  {
+                    "text": "BAZ"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<!-- BAR -- <QUX> -- MUX -->BAZ</body></html>",
+        "noQuirksBodyHtml": "FOO<!-- BAR -- <QUX> -- MUX -->BAZ"
+      }
+    },
+    {
+      "data": "FOO<!-- BAR -- <QUX> -- MUX -- >BAZ",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,15): unexpected-char-in-comment",
+        "(1,24): unexpected-char-in-comment",
+        "(1,31): unexpected-char-in-comment",
+        "(1,35): eof-in-comment"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "comment": " BAR -- <QUX> -- MUX -- >BAZ"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<!-- BAR -- <QUX> -- MUX -- >BAZ--></body></html>",
+        "noQuirksBodyHtml": "FOO<!-- BAR -- <QUX> -- MUX -- >BAZ-->"
+      }
+    },
+    {
+      "data": "FOO<!---->BAZ",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "comment": ""
+                  },
+                  {
+                    "text": "BAZ"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<!---->BAZ</body></html>",
+        "noQuirksBodyHtml": "FOO<!---->BAZ"
+      }
+    },
+    {
+      "data": "FOO<!--->BAZ",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,9): incorrect-comment"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "comment": ""
+                  },
+                  {
+                    "text": "BAZ"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<!---->BAZ</body></html>",
+        "noQuirksBodyHtml": "FOO<!---->BAZ"
+      }
+    },
+    {
+      "data": "FOO<!-->BAZ",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,8): incorrect-comment"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "comment": ""
+                  },
+                  {
+                    "text": "BAZ"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<!---->BAZ</body></html>",
+        "noQuirksBodyHtml": "FOO<!---->BAZ"
+      }
+    },
+    {
+      "data": "<?xml version=\"1.0\">Hi",
+      "errors": [
+        "(1,1): expected-tag-name-but-got-question-mark",
+        "(1,22): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "comment": "?xml version=\"1.0\""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hi"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!--?xml version=\"1.0\"--><html><head></head><body>Hi</body></html>",
+        "noQuirksBodyHtml": "<!--?xml version=\"1.0\"-->Hi"
+      }
+    },
+    {
+      "data": "<?xml version=\"1.0\">",
+      "errors": [
+        "(1,1): expected-tag-name-but-got-question-mark",
+        "(1,20): expected-doctype-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "comment": "?xml version=\"1.0\""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!--?xml version=\"1.0\"--><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": "<!--?xml version=\"1.0\"-->"
+      }
+    },
+    {
+      "data": "<?xml version",
+      "errors": [
+        "(1,1): expected-tag-name-but-got-question-mark",
+        "(1,13): expected-doctype-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "comment": "?xml version"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!--?xml version--><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": "<!--?xml version-->"
+      }
+    },
+    {
+      "data": "FOO<!----->BAZ",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,10): unexpected-dash-after-double-dash-in-comment"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "comment": "-"
+                  },
+                  {
+                    "text": "BAZ"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<!----->BAZ</body></html>",
+        "noQuirksBodyHtml": "FOO<!----->BAZ"
+      }
+    },
+    {
+      "data": "<html><!-- comment --><title>Comment before head</title>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "title": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "comment": " comment "
+              },
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "Comment before head"
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><!-- comment --><head><title>Comment before head</title></head><body></body></html>",
+        "noQuirksBodyHtml": "<!-- comment --><title>Comment before head</title>"
+      }
+    }
+  ],
+  "doctype01.dat": [
+    {
+      "data": "<!DOCTYPE html>Hello",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!dOctYpE HtMl>Hello",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPEhtml>Hello",
+      "errors": [
+        "(1,9): need-space-after-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE>Hello",
+      "errors": [
+        "(1,9): need-space-after-doctype",
+        "(1,10): expected-doctype-name-but-got-right-bracket",
+        "(1,10): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": ""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE ><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE >Hello",
+      "errors": [
+        "(1,11): expected-doctype-name-but-got-right-bracket",
+        "(1,11): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": ""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE ><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE potato>Hello",
+      "errors": [
+        "(1,17): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "potato"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE potato >Hello",
+      "errors": [
+        "(1,18): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "potato"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE potato taco>Hello",
+      "errors": [
+        "(1,17): expected-space-or-right-bracket-in-doctype",
+        "(1,22): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "potato"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE potato taco \"ddd>Hello",
+      "errors": [
+        "(1,17): expected-space-or-right-bracket-in-doctype",
+        "(1,27): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "potato"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE potato sYstEM>Hello",
+      "errors": [
+        "(1,24): unexpected-char-in-doctype",
+        "(1,24): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "potato"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE potato sYstEM    >Hello",
+      "errors": [
+        "(1,28): unexpected-char-in-doctype",
+        "(1,28): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "potato"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE   potato       sYstEM  ggg>Hello",
+      "errors": [
+        "(1,34): unexpected-char-in-doctype",
+        "(1,37): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "potato"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE potato SYSTEM taco  >Hello",
+      "errors": [
+        "(1,25): unexpected-char-in-doctype",
+        "(1,31): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "potato"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE potato SYSTEM 'taco\"'>Hello",
+      "errors": [
+        "(1,32): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "potato \"\" \"taco\"\""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE potato SYSTEM \"taco\">Hello",
+      "errors": [
+        "(1,31): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "potato \"\" \"taco\""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE potato SYSTEM \"tai'co\">Hello",
+      "errors": [
+        "(1,33): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "potato \"\" \"tai'co\""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE potato SYSTEMtaco \"ddd\">Hello",
+      "errors": [
+        "(1,24): unexpected-char-in-doctype",
+        "(1,34): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "potato"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE potato grass SYSTEM taco>Hello",
+      "errors": [
+        "(1,17): expected-space-or-right-bracket-in-doctype",
+        "(1,35): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "potato"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE potato pUbLIc>Hello",
+      "errors": [
+        "(1,24): unexpected-end-of-doctype",
+        "(1,24): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "potato"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE potato pUbLIc >Hello",
+      "errors": [
+        "(1,25): unexpected-end-of-doctype",
+        "(1,25): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "potato"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE potato pUbLIcgoof>Hello",
+      "errors": [
+        "(1,24): unexpected-char-in-doctype",
+        "(1,28): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "potato"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE potato PUBLIC goof>Hello",
+      "errors": [
+        "(1,25): unexpected-char-in-doctype",
+        "(1,29): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "potato"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE potato PUBLIC \"go'of\">Hello",
+      "errors": [
+        "(1,32): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "potato \"go'of\" \"\""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE potato PUBLIC 'go'of'>Hello",
+      "errors": [
+        "(1,29): unexpected-char-in-doctype",
+        "(1,32): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "potato \"go\" \"\""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE potato PUBLIC 'go:hh   of' >Hello",
+      "errors": [
+        "(1,38): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "potato \"go:hh   of\" \"\""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE potato PUBLIC \"W3C-//dfdf\" SYSTEM ggg>Hello",
+      "errors": [
+        "(1,38): unexpected-char-in-doctype",
+        "(1,48): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "potato \"W3C-//dfdf\" \"\""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\n   \"http://www.w3.org/TR/html4/strict.dtd\">Hello",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE ...>Hello",
+      "errors": [
+        "(1,14): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "..."
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Hello"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE ...><html><head></head><body>Hello</body></html>",
+        "noQuirksBodyHtml": "Hello"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">",
+      "errors": [
+        "(2,58): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\"\n\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">",
+      "errors": [
+        "(2,54): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!DOCTYPE root-element [SYSTEM OR PUBLIC FPI] \"uri\" [ \n<!-- internal declarations -->\n]>",
+      "errors": [
+        "(1,23): expected-space-or-right-bracket-in-doctype",
+        "(2,30): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "doctype": "root-element"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "]>",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE root-element><html><head></head><body>]&gt;</body></html>",
+        "noQuirksBodyHtml": "\n]&gt;"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html PUBLIC\n  \"-//WAPFORUM//DTD XHTML Mobile 1.0//EN\"\n    \"http://www.wapforum.org/DTD/xhtml-mobile10.dtd\">",
+      "errors": [
+        "(3,53): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html \"-//WAPFORUM//DTD XHTML Mobile 1.0//EN\" \"http://www.wapforum.org/DTD/xhtml-mobile10.dtd\""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!DOCTYPE HTML SYSTEM \"http://www.w3.org/DTD/HTML4-strict.dtd\"><body><b>Mine!</b></body>",
+      "errors": [
+        "(1,63): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html \"\" \"http://www.w3.org/DTD/HTML4-strict.dtd\""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "text": "Mine!"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><b>Mine!</b></body></html>",
+        "noQuirksBodyHtml": "<b>Mine!</b>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\"http://www.w3.org/TR/html4/strict.dtd\">",
+      "errors": [
+        "(1,50): unexpected-char-in-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"'http://www.w3.org/TR/html4/strict.dtd'>",
+      "errors": [
+        "(1,50): unexpected-char-in-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!DOCTYPE HTML PUBLIC\"-//W3C//DTD HTML 4.01//EN\"'http://www.w3.org/TR/html4/strict.dtd'>",
+      "errors": [
+        "(1,21): unexpected-char-in-doctype",
+        "(1,49): unexpected-char-in-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!DOCTYPE HTML PUBLIC'-//W3C//DTD HTML 4.01//EN''http://www.w3.org/TR/html4/strict.dtd'>",
+      "errors": [
+        "(1,21): unexpected-char-in-doctype",
+        "(1,49): unexpected-char-in-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    }
+  ],
+  "domjs-unsafe.dat": [
+    {
+      "data": "<svg><![CDATA[foo\nbar]]>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(2,6): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "foo\nbar"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>foo\nbar</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>foo\nbar</svg>"
+      }
+    },
+    {
+      "data": "<svg><![CDATA[foo\rbar]]>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(2,6): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "foo\nbar"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>foo\nbar</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>foo\nbar</svg>"
+      }
+    },
+    {
+      "data": "<svg><![CDATA[foo\r\nbar]]>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(2,6): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "foo\nbar"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>foo\nbar</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>foo\nbar</svg>"
+      }
+    },
+    {
+      "data": "<script>a='\u0000'</script>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,12): invalid-codepoint"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "a='�'",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script>a='�'</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script>a='�'</script>"
+      }
+    },
+    {
+      "data": "<script type=\"data\"><!--\u0000</script>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag",
+        "(1,25): invalid-codepoint"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "data"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "<!--�",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script type=\"data\"><!--�</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script type=\"data\"><!--�</script>"
+      }
+    },
+    {
+      "data": "<script type=\"data\"><!--foo\u0000</script>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag",
+        "(1,28): invalid-codepoint"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "data"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "<!--foo�",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script type=\"data\"><!--foo�</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script type=\"data\"><!--foo�</script>"
+      }
+    },
+    {
+      "data": "<script type=\"data\"><!-- foo-\u0000</script>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag",
+        "(1,30): invalid-codepoint"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "data"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "<!-- foo-�",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script type=\"data\"><!-- foo-�</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script type=\"data\"><!-- foo-�</script>"
+      }
+    },
+    {
+      "data": "<script type=\"data\"><!-- foo--\u0000</script>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag",
+        "(1,31): invalid-codepoint"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "data"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "<!-- foo--�",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script type=\"data\"><!-- foo--�</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script type=\"data\"><!-- foo--�</script>"
+      }
+    },
+    {
+      "data": "<script type=\"data\"><!-- foo-",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag",
+        "(1,29): expected-script-data-but-got-eof",
+        "(1,29): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "data"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "<!-- foo-",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script type=\"data\"><!-- foo-</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script type=\"data\"><!-- foo-</script>"
+      }
+    },
+    {
+      "data": "<script type=\"data\"><!-- foo-<</script>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "data"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "<!-- foo-<",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script type=\"data\"><!-- foo-<</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script type=\"data\"><!-- foo-<</script>"
+      }
+    },
+    {
+      "data": "<script type=\"data\"><!-- foo-<S",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag",
+        "(1,31): expected-script-data-but-got-eof",
+        "(1,31): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "data"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "<!-- foo-<S",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script type=\"data\"><!-- foo-<S</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script type=\"data\"><!-- foo-<S</script>"
+      }
+    },
+    {
+      "data": "<script type=\"data\"><!-- foo-</SCRIPT>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "data"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "<!-- foo-",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script type=\"data\"><!-- foo-</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script type=\"data\"><!-- foo-</script>"
+      }
+    },
+    {
+      "data": "<script type=\"data\"><!--<p></script>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "data"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "<!--<p>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script type=\"data\"><!--<p></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script type=\"data\"><!--<p></script>"
+      }
+    },
+    {
+      "data": "<script type=\"data\"><!--<script></script></script>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "data"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "<!--<script></script>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script type=\"data\"><!--<script></script></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script type=\"data\"><!--<script></script></script>"
+      }
+    },
+    {
+      "data": "<script type=\"data\"><!--<script>\u0000</script></script>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag",
+        "(1,33): invalid-codepoint"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "data"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "<!--<script>�</script>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script type=\"data\"><!--<script>�</script></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script type=\"data\"><!--<script>�</script></script>"
+      }
+    },
+    {
+      "data": "<script type=\"data\"><!--<script>-\u0000</script></script>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag",
+        "(1,34): invalid-codepoint"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "data"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "<!--<script>-�</script>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script type=\"data\"><!--<script>-�</script></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script type=\"data\"><!--<script>-�</script></script>"
+      }
+    },
+    {
+      "data": "<script type=\"data\"><!--<script>--\u0000</script></script>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag",
+        "(1,35): invalid-codepoint"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "data"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "<!--<script>--�</script>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script type=\"data\"><!--<script>--�</script></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script type=\"data\"><!--<script>--�</script></script>"
+      }
+    },
+    {
+      "data": "<script type=\"data\"><!--<script>---</script></script>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "data"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "<!--<script>---</script>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script type=\"data\"><!--<script>---</script></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script type=\"data\"><!--<script>---</script></script>"
+      }
+    },
+    {
+      "data": "<script type=\"data\"><!--<script></scrip></SCRIPT></script>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "data"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "<!--<script></scrip></SCRIPT>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script type=\"data\"><!--<script></scrip></SCRIPT></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script type=\"data\"><!--<script></scrip></SCRIPT></script>"
+      }
+    },
+    {
+      "data": "<script type=\"data\"><!--<script></scrip </SCRIPT></script>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "data"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "<!--<script></scrip </SCRIPT>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script type=\"data\"><!--<script></scrip </SCRIPT></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script type=\"data\"><!--<script></scrip </SCRIPT></script>"
+      }
+    },
+    {
+      "data": "<script type=\"data\"><!--<script></scrip/</SCRIPT></script>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "data"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "<!--<script></scrip/</SCRIPT>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script type=\"data\"><!--<script></scrip/</SCRIPT></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script type=\"data\"><!--<script></scrip/</SCRIPT></script>"
+      }
+    },
+    {
+      "data": "<script type=\"data\"></scrip/></script>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "data"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "</scrip/>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script type=\"data\"></scrip/></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script type=\"data\"></scrip/></script>"
+      }
+    },
+    {
+      "data": "<script type=\"data\"></scrip ></script>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "data"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "</scrip >",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script type=\"data\"></scrip ></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script type=\"data\"></scrip ></script>"
+      }
+    },
+    {
+      "data": "<script type=\"data\"><!--</scrip></script>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "data"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "<!--</scrip>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script type=\"data\"><!--</scrip></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script type=\"data\"><!--</scrip></script>"
+      }
+    },
+    {
+      "data": "<script type=\"data\"><!--</scrip </script>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "data"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "<!--</scrip ",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script type=\"data\"><!--</scrip </script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script type=\"data\"><!--</scrip </script>"
+      }
+    },
+    {
+      "data": "<script type=\"data\"><!--</scrip/</script>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "data"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "<!--</scrip/",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script type=\"data\"><!--</scrip/</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script type=\"data\"><!--</scrip/</script>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><!DOCTYPE html>",
+      "errors": [
+        "(1,30): unexpected-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<html><!DOCTYPE html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,21): unexpected-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<html><head><!DOCTYPE html></head>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,27): unexpected-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<html><head></head><!DOCTYPE html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,34): unexpected-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<body></body><!DOCTYPE html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,28): unexpected-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<table><!DOCTYPE html></table>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,22): unexpected-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table></table></body></html>",
+        "noQuirksBodyHtml": "<table></table>"
+      }
+    },
+    {
+      "data": "<select><!DOCTYPE html></select>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,23): unexpected-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><select></select></body></html>",
+        "noQuirksBodyHtml": "<select></select>"
+      }
+    },
+    {
+      "data": "<table><colgroup><!DOCTYPE html></colgroup></table>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,32): unexpected-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "colgroup": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "colgroup"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><colgroup></colgroup></table></body></html>",
+        "noQuirksBodyHtml": "<table><colgroup></colgroup></table>"
+      }
+    },
+    {
+      "data": "<table><colgroup><!--test--></colgroup></table>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "colgroup": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "colgroup",
+                        "children": [
+                          {
+                            "comment": "test"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><colgroup><!--test--></colgroup></table></body></html>",
+        "noQuirksBodyHtml": "<table><colgroup><!--test--></colgroup></table>"
+      }
+    },
+    {
+      "data": "<table><colgroup><html></colgroup></table>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,23): non-html-root"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "colgroup": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "colgroup"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><colgroup></colgroup></table></body></html>",
+        "noQuirksBodyHtml": "<table><colgroup></colgroup></table>"
+      }
+    },
+    {
+      "data": "<table><colgroup> foo</colgroup></table>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,32): foster-parenting-character-in-table",
+        "(1,32): foster-parenting-character-in-table",
+        "(1,32): foster-parenting-character-in-table",
+        "(1,32): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "colgroup": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "foo"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "colgroup",
+                        "children": [
+                          {
+                            "text": " "
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>foo<table><colgroup> </colgroup></table></body></html>",
+        "noQuirksBodyHtml": "foo<table><colgroup> </colgroup></table>"
+      }
+    },
+    {
+      "data": "<select><!--test--></select>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "comment": "test"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><select><!--test--></select></body></html>",
+        "noQuirksBodyHtml": "<select><!--test--></select>"
+      }
+    },
+    {
+      "data": "<select><html></select>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,14): non-html-root"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><select></select></body></html>",
+        "noQuirksBodyHtml": "<select></select>"
+      }
+    },
+    {
+      "data": "<frameset><html></frameset>",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag",
+        "(1,16): non-html-root"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<frameset></frameset><html>",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag",
+        "(1,27): non-html-root"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<frameset></frameset><!DOCTYPE html>",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag",
+        "(1,36): unexpected-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<html><body></body></html><!DOCTYPE html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,41): unexpected-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<svg><!DOCTYPE html></svg>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,20): unexpected-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg></svg></body></html>",
+        "noQuirksBodyHtml": "<svg></svg>"
+      }
+    },
+    {
+      "data": "<svg><font></font></svg>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg font": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "font",
+                        "ns": "http://www.w3.org/2000/svg"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg><font></font></svg></body></html>",
+        "noQuirksBodyHtml": "<svg><font></font></svg>"
+      }
+    },
+    {
+      "data": "<svg><font id=foo></font></svg>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg font": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "font",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "attrs": [
+                          {
+                            "name": "id",
+                            "value": "foo"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg><font id=\"foo\"></font></svg></body></html>",
+        "noQuirksBodyHtml": "<svg><font id=\"foo\"></font></svg>"
+      }
+    },
+    {
+      "data": "<svg><font size=4></font></svg>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,18): unexpected-html-element-in-foreign-content",
+        "(1,31): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "font": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg"
+                  },
+                  {
+                    "tag": "font",
+                    "attrs": [
+                      {
+                        "name": "size",
+                        "value": "4"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg></svg><font size=\"4\"></font></body></html>",
+        "noQuirksBodyHtml": "<svg><font size=\"4\"></font></svg>"
+      }
+    },
+    {
+      "data": "<svg><font color=red></font></svg>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,21): unexpected-html-element-in-foreign-content",
+        "(1,34): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "font": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg"
+                  },
+                  {
+                    "tag": "font",
+                    "attrs": [
+                      {
+                        "name": "color",
+                        "value": "red"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg></svg><font color=\"red\"></font></body></html>",
+        "noQuirksBodyHtml": "<svg><font color=\"red\"></font></svg>"
+      }
+    },
+    {
+      "data": "<svg><font font=sans></font></svg>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg font": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "font",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "attrs": [
+                          {
+                            "name": "font",
+                            "value": "sans"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg><font font=\"sans\"></font></svg></body></html>",
+        "noQuirksBodyHtml": "<svg><font font=\"sans\"></font></svg>"
+      }
+    }
+  ],
+  "entities01.dat": [
+    {
+      "data": "FOO&gt;BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO>BAR",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO&gt;BAR</body></html>",
+        "noQuirksBodyHtml": "FOO&gt;BAR"
+      }
+    },
+    {
+      "data": "FOO&gtBAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,6): named-entity-without-semicolon"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO>BAR",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO&gt;BAR</body></html>",
+        "noQuirksBodyHtml": "FOO&gt;BAR"
+      }
+    },
+    {
+      "data": "FOO&gt BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,6): named-entity-without-semicolon"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO> BAR",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO&gt; BAR</body></html>",
+        "noQuirksBodyHtml": "FOO&gt; BAR"
+      }
+    },
+    {
+      "data": "FOO&gt;;;BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO>;;BAR",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO&gt;;;BAR</body></html>",
+        "noQuirksBodyHtml": "FOO&gt;;;BAR"
+      }
+    },
+    {
+      "data": "I'm &notit; I tell you",
+      "errors": [
+        "(1,4): expected-doctype-but-got-chars",
+        "(1,9): named-entity-without-semicolon"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "I'm ¬it; I tell you"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>I'm ¬it; I tell you</body></html>",
+        "noQuirksBodyHtml": "I'm ¬it; I tell you"
+      }
+    },
+    {
+      "data": "I'm &notin; I tell you",
+      "errors": [
+        "(1,4): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "I'm ∉ I tell you"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>I'm ∉ I tell you</body></html>",
+        "noQuirksBodyHtml": "I'm ∉ I tell you"
+      }
+    },
+    {
+      "data": "FOO& BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO& BAR",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO&amp; BAR</body></html>",
+        "noQuirksBodyHtml": "FOO&amp; BAR"
+      }
+    },
+    {
+      "data": "FOO&<BAR>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,9): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "bar": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO&",
+                    "escaped": true
+                  },
+                  {
+                    "tag": "bar"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO&amp;<bar></bar></body></html>",
+        "noQuirksBodyHtml": "FOO&amp;<bar></bar>"
+      }
+    },
+    {
+      "data": "FOO&&&&gt;BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO&&&>BAR",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO&amp;&amp;&amp;&gt;BAR</body></html>",
+        "noQuirksBodyHtml": "FOO&amp;&amp;&amp;&gt;BAR"
+      }
+    },
+    {
+      "data": "FOO&#41;BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO)BAR"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO)BAR</body></html>",
+        "noQuirksBodyHtml": "FOO)BAR"
+      }
+    },
+    {
+      "data": "FOO&#x41;BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOOABAR"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOOABAR</body></html>",
+        "noQuirksBodyHtml": "FOOABAR"
+      }
+    },
+    {
+      "data": "FOO&#X41;BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOOABAR"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOOABAR</body></html>",
+        "noQuirksBodyHtml": "FOOABAR"
+      }
+    },
+    {
+      "data": "FOO&#BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,5): expected-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO&#BAR",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO&amp;#BAR</body></html>",
+        "noQuirksBodyHtml": "FOO&amp;#BAR"
+      }
+    },
+    {
+      "data": "FOO&#ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,5): expected-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO&#ZOO",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO&amp;#ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO&amp;#ZOO"
+      }
+    },
+    {
+      "data": "FOO&#xBAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,7): expected-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOOºR"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOOºR</body></html>",
+        "noQuirksBodyHtml": "FOOºR"
+      }
+    },
+    {
+      "data": "FOO&#xZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,6): expected-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO&#xZOO",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO&amp;#xZOO</body></html>",
+        "noQuirksBodyHtml": "FOO&amp;#xZOO"
+      }
+    },
+    {
+      "data": "FOO&#XZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,6): expected-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO&#XZOO",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO&amp;#XZOO</body></html>",
+        "noQuirksBodyHtml": "FOO&amp;#XZOO"
+      }
+    },
+    {
+      "data": "FOO&#41BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,7): numeric-entity-without-semicolon"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO)BAR"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO)BAR</body></html>",
+        "noQuirksBodyHtml": "FOO)BAR"
+      }
+    },
+    {
+      "data": "FOO&#x41BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,10): numeric-entity-without-semicolon"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO䆺R"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO䆺R</body></html>",
+        "noQuirksBodyHtml": "FOO䆺R"
+      }
+    },
+    {
+      "data": "FOO&#x41ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,8): numeric-entity-without-semicolon"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOOAZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOOAZOO</body></html>",
+        "noQuirksBodyHtml": "FOOAZOO"
+      }
+    },
+    {
+      "data": "FOO&#x0000;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO�ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO�ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO�ZOO"
+      }
+    },
+    {
+      "data": "FOO&#x0078;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOOxZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOOxZOO</body></html>",
+        "noQuirksBodyHtml": "FOOxZOO"
+      }
+    },
+    {
+      "data": "FOO&#x0079;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOOyZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOOyZOO</body></html>",
+        "noQuirksBodyHtml": "FOOyZOO"
+      }
+    },
+    {
+      "data": "FOO&#x0080;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO€ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO€ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO€ZOO"
+      }
+    },
+    {
+      "data": "FOO&#x0081;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO\81ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO\81ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO\81ZOO"
+      }
+    },
+    {
+      "data": "FOO&#x0082;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO‚ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO‚ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO‚ZOO"
+      }
+    },
+    {
+      "data": "FOO&#x0083;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOOƒZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOOƒZOO</body></html>",
+        "noQuirksBodyHtml": "FOOƒZOO"
+      }
+    },
+    {
+      "data": "FOO&#x0084;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO„ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO„ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO„ZOO"
+      }
+    },
+    {
+      "data": "FOO&#x0085;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO…ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO…ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO…ZOO"
+      }
+    },
+    {
+      "data": "FOO&#x0086;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO†ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO†ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO†ZOO"
+      }
+    },
+    {
+      "data": "FOO&#x0087;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO‡ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO‡ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO‡ZOO"
+      }
+    },
+    {
+      "data": "FOO&#x0088;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOOˆZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOOˆZOO</body></html>",
+        "noQuirksBodyHtml": "FOOˆZOO"
+      }
+    },
+    {
+      "data": "FOO&#x0089;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO‰ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO‰ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO‰ZOO"
+      }
+    },
+    {
+      "data": "FOO&#x008A;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOOŠZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOOŠZOO</body></html>",
+        "noQuirksBodyHtml": "FOOŠZOO"
+      }
+    },
+    {
+      "data": "FOO&#x008B;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO‹ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO‹ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO‹ZOO"
+      }
+    },
+    {
+      "data": "FOO&#x008C;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOOŒZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOOŒZOO</body></html>",
+        "noQuirksBodyHtml": "FOOŒZOO"
+      }
+    },
+    {
+      "data": "FOO&#x008D;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO\8dZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO\8dZOO</body></html>",
+        "noQuirksBodyHtml": "FOO\8dZOO"
+      }
+    },
+    {
+      "data": "FOO&#x008E;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOOŽZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOOŽZOO</body></html>",
+        "noQuirksBodyHtml": "FOOŽZOO"
+      }
+    },
+    {
+      "data": "FOO&#x008F;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO\8fZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO\8fZOO</body></html>",
+        "noQuirksBodyHtml": "FOO\8fZOO"
+      }
+    },
+    {
+      "data": "FOO&#x0090;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO\90ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO\90ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO\90ZOO"
+      }
+    },
+    {
+      "data": "FOO&#x0091;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO‘ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO‘ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO‘ZOO"
+      }
+    },
+    {
+      "data": "FOO&#x0092;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO’ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO’ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO’ZOO"
+      }
+    },
+    {
+      "data": "FOO&#x0093;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO“ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO“ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO“ZOO"
+      }
+    },
+    {
+      "data": "FOO&#x0094;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO”ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO”ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO”ZOO"
+      }
+    },
+    {
+      "data": "FOO&#x0095;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO•ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO•ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO•ZOO"
+      }
+    },
+    {
+      "data": "FOO&#x0096;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO–ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO–ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO–ZOO"
+      }
+    },
+    {
+      "data": "FOO&#x0097;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO—ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO—ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO—ZOO"
+      }
+    },
+    {
+      "data": "FOO&#x0098;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO˜ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO˜ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO˜ZOO"
+      }
+    },
+    {
+      "data": "FOO&#x0099;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO™ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO™ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO™ZOO"
+      }
+    },
+    {
+      "data": "FOO&#x009A;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOOšZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOOšZOO</body></html>",
+        "noQuirksBodyHtml": "FOOšZOO"
+      }
+    },
+    {
+      "data": "FOO&#x009B;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO›ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO›ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO›ZOO"
+      }
+    },
+    {
+      "data": "FOO&#x009C;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOOœZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOOœZOO</body></html>",
+        "noQuirksBodyHtml": "FOOœZOO"
+      }
+    },
+    {
+      "data": "FOO&#x009D;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO\9dZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO\9dZOO</body></html>",
+        "noQuirksBodyHtml": "FOO\9dZOO"
+      }
+    },
+    {
+      "data": "FOO&#x009E;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOOžZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOOžZOO</body></html>",
+        "noQuirksBodyHtml": "FOOžZOO"
+      }
+    },
+    {
+      "data": "FOO&#x009F;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOOŸZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOOŸZOO</body></html>",
+        "noQuirksBodyHtml": "FOOŸZOO"
+      }
+    },
+    {
+      "data": "FOO&#x00A0;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO ZOO",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO&nbsp;ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO&nbsp;ZOO"
+      }
+    },
+    {
+      "data": "FOO&#xD7FF;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO퟿ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO퟿ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO퟿ZOO"
+      }
+    },
+    {
+      "data": "FOO&#xD800;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO�ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO�ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO�ZOO"
+      }
+    },
+    {
+      "data": "FOO&#xD801;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO�ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO�ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO�ZOO"
+      }
+    },
+    {
+      "data": "FOO&#xDFFE;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO�ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO�ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO�ZOO"
+      }
+    },
+    {
+      "data": "FOO&#xDFFF;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO�ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO�ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO�ZOO"
+      }
+    },
+    {
+      "data": "FOO&#xE000;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOOZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOOZOO</body></html>",
+        "noQuirksBodyHtml": "FOOZOO"
+      }
+    },
+    {
+      "data": "FOO&#x10FFFE;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,13): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO􏿾ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO􏿾ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO􏿾ZOO"
+      }
+    },
+    {
+      "data": "FOO&#x1087D4;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO􈟔ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO􈟔ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO􈟔ZOO"
+      }
+    },
+    {
+      "data": "FOO&#x10FFFF;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,13): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO􏿿ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO􏿿ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO􏿿ZOO"
+      }
+    },
+    {
+      "data": "FOO&#x110000;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,13): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO�ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO�ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO�ZOO"
+      }
+    },
+    {
+      "data": "FOO&#xFFFFFF;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,13): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO�ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO�ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO�ZOO"
+      }
+    },
+    {
+      "data": "FOO&#11111111111",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,13): illegal-codepoint-for-numeric-entity",
+        "(1,13): eof-in-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO�"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO�</body></html>",
+        "noQuirksBodyHtml": "FOO�"
+      }
+    },
+    {
+      "data": "FOO&#1111111111",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,13): illegal-codepoint-for-numeric-entity",
+        "(1,13): eof-in-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO�"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO�</body></html>",
+        "noQuirksBodyHtml": "FOO�"
+      }
+    },
+    {
+      "data": "FOO&#111111111111",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,13): illegal-codepoint-for-numeric-entity",
+        "(1,13): eof-in-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO�"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO�</body></html>",
+        "noQuirksBodyHtml": "FOO�"
+      }
+    },
+    {
+      "data": "FOO&#11111111111ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,13): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO�ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO�ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO�ZOO"
+      }
+    },
+    {
+      "data": "FOO&#1111111111ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,13): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO�ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO�ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO�ZOO"
+      }
+    },
+    {
+      "data": "FOO&#111111111111ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,13): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO�ZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO�ZOO</body></html>",
+        "noQuirksBodyHtml": "FOO�ZOO"
+      }
+    }
+  ],
+  "entities02.dat": [
+    {
+      "data": "<div bar=\"ZZ&gt;YY\"></div>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "attrs": [
+                      {
+                        "name": "bar",
+                        "value": "ZZ>YY"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div bar=\"ZZ>YY\"></div></body></html>",
+        "noQuirksBodyHtml": "<div bar=\"ZZ>YY\"></div>"
+      }
+    },
+    {
+      "data": "<div bar=\"ZZ&\"></div>",
+      "errors": [
+        "(1,15): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "attrs": [
+                      {
+                        "name": "bar",
+                        "value": "ZZ&",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div bar=\"ZZ&amp;\"></div></body></html>",
+        "noQuirksBodyHtml": "<div bar=\"ZZ&amp;\"></div>"
+      }
+    },
+    {
+      "data": "<div bar='ZZ&'></div>",
+      "errors": [
+        "(1,15): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "attrs": [
+                      {
+                        "name": "bar",
+                        "value": "ZZ&",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div bar=\"ZZ&amp;\"></div></body></html>",
+        "noQuirksBodyHtml": "<div bar=\"ZZ&amp;\"></div>"
+      }
+    },
+    {
+      "data": "<div bar=ZZ&></div>",
+      "errors": [
+        "(1,13): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "attrs": [
+                      {
+                        "name": "bar",
+                        "value": "ZZ&",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div bar=\"ZZ&amp;\"></div></body></html>",
+        "noQuirksBodyHtml": "<div bar=\"ZZ&amp;\"></div>"
+      }
+    },
+    {
+      "data": "<div bar=\"ZZ&gt=YY\"></div>",
+      "errors": [
+        "(1,15): named-entity-without-semicolon",
+        "(1,20): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "attrs": [
+                      {
+                        "name": "bar",
+                        "value": "ZZ&gt=YY",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div bar=\"ZZ&amp;gt=YY\"></div></body></html>",
+        "noQuirksBodyHtml": "<div bar=\"ZZ&amp;gt=YY\"></div>"
+      }
+    },
+    {
+      "data": "<div bar=\"ZZ&gt0YY\"></div>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "attrs": [
+                      {
+                        "name": "bar",
+                        "value": "ZZ&gt0YY",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div bar=\"ZZ&amp;gt0YY\"></div></body></html>",
+        "noQuirksBodyHtml": "<div bar=\"ZZ&amp;gt0YY\"></div>"
+      }
+    },
+    {
+      "data": "<div bar=\"ZZ&gt9YY\"></div>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "attrs": [
+                      {
+                        "name": "bar",
+                        "value": "ZZ&gt9YY",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div bar=\"ZZ&amp;gt9YY\"></div></body></html>",
+        "noQuirksBodyHtml": "<div bar=\"ZZ&amp;gt9YY\"></div>"
+      }
+    },
+    {
+      "data": "<div bar=\"ZZ&gtaYY\"></div>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "attrs": [
+                      {
+                        "name": "bar",
+                        "value": "ZZ&gtaYY",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div bar=\"ZZ&amp;gtaYY\"></div></body></html>",
+        "noQuirksBodyHtml": "<div bar=\"ZZ&amp;gtaYY\"></div>"
+      }
+    },
+    {
+      "data": "<div bar=\"ZZ&gtZYY\"></div>",
+      "errors": [
+        "(1,20): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "attrs": [
+                      {
+                        "name": "bar",
+                        "value": "ZZ&gtZYY",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div bar=\"ZZ&amp;gtZYY\"></div></body></html>",
+        "noQuirksBodyHtml": "<div bar=\"ZZ&amp;gtZYY\"></div>"
+      }
+    },
+    {
+      "data": "<div bar=\"ZZ&gt YY\"></div>",
+      "errors": [
+        "(1,15): named-entity-without-semicolon",
+        "(1,20): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "attrs": [
+                      {
+                        "name": "bar",
+                        "value": "ZZ> YY"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div bar=\"ZZ> YY\"></div></body></html>",
+        "noQuirksBodyHtml": "<div bar=\"ZZ> YY\"></div>"
+      }
+    },
+    {
+      "data": "<div bar=\"ZZ&gt\"></div>",
+      "errors": [
+        "(1,15): named-entity-without-semicolon",
+        "(1,17): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "attrs": [
+                      {
+                        "name": "bar",
+                        "value": "ZZ>"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div bar=\"ZZ>\"></div></body></html>",
+        "noQuirksBodyHtml": "<div bar=\"ZZ>\"></div>"
+      }
+    },
+    {
+      "data": "<div bar='ZZ&gt'></div>",
+      "errors": [
+        "(1,15): named-entity-without-semicolon",
+        "(1,17): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "attrs": [
+                      {
+                        "name": "bar",
+                        "value": "ZZ>"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div bar=\"ZZ>\"></div></body></html>",
+        "noQuirksBodyHtml": "<div bar=\"ZZ>\"></div>"
+      }
+    },
+    {
+      "data": "<div bar=ZZ&gt></div>",
+      "errors": [
+        "(1,14): named-entity-without-semicolon",
+        "(1,15): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "attrs": [
+                      {
+                        "name": "bar",
+                        "value": "ZZ>"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div bar=\"ZZ>\"></div></body></html>",
+        "noQuirksBodyHtml": "<div bar=\"ZZ>\"></div>"
+      }
+    },
+    {
+      "data": "<div bar=\"ZZ&pound_id=23\"></div>",
+      "errors": [
+        "(1,18): named-entity-without-semicolon",
+        "(1,26): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "attrs": [
+                      {
+                        "name": "bar",
+                        "value": "ZZ£_id=23"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div bar=\"ZZ£_id=23\"></div></body></html>",
+        "noQuirksBodyHtml": "<div bar=\"ZZ£_id=23\"></div>"
+      }
+    },
+    {
+      "data": "<div bar=\"ZZ&prod_id=23\"></div>",
+      "errors": [
+        "(1,25): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "attrs": [
+                      {
+                        "name": "bar",
+                        "value": "ZZ&prod_id=23",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div bar=\"ZZ&amp;prod_id=23\"></div></body></html>",
+        "noQuirksBodyHtml": "<div bar=\"ZZ&amp;prod_id=23\"></div>"
+      }
+    },
+    {
+      "data": "<div bar=\"ZZ&pound;_id=23\"></div>",
+      "errors": [
+        "(1,27): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "attrs": [
+                      {
+                        "name": "bar",
+                        "value": "ZZ£_id=23"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div bar=\"ZZ£_id=23\"></div></body></html>",
+        "noQuirksBodyHtml": "<div bar=\"ZZ£_id=23\"></div>"
+      }
+    },
+    {
+      "data": "<div bar=\"ZZ&prod;_id=23\"></div>",
+      "errors": [
+        "(1,26): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "attrs": [
+                      {
+                        "name": "bar",
+                        "value": "ZZ∏_id=23"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div bar=\"ZZ∏_id=23\"></div></body></html>",
+        "noQuirksBodyHtml": "<div bar=\"ZZ∏_id=23\"></div>"
+      }
+    },
+    {
+      "data": "<div bar=\"ZZ&pound=23\"></div>",
+      "errors": [
+        "(1,18): named-entity-without-semicolon",
+        "(1,23): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "attrs": [
+                      {
+                        "name": "bar",
+                        "value": "ZZ&pound=23",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div bar=\"ZZ&amp;pound=23\"></div></body></html>",
+        "noQuirksBodyHtml": "<div bar=\"ZZ&amp;pound=23\"></div>"
+      }
+    },
+    {
+      "data": "<div bar=\"ZZ&prod=23\"></div>",
+      "errors": [
+        "(1,22): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "attrs": [
+                      {
+                        "name": "bar",
+                        "value": "ZZ&prod=23",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div bar=\"ZZ&amp;prod=23\"></div></body></html>",
+        "noQuirksBodyHtml": "<div bar=\"ZZ&amp;prod=23\"></div>"
+      }
+    },
+    {
+      "data": "<div>ZZ&pound_id=23</div>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,13): named-entity-without-semicolon"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": "ZZ£_id=23"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div>ZZ£_id=23</div></body></html>",
+        "noQuirksBodyHtml": "<div>ZZ£_id=23</div>"
+      }
+    },
+    {
+      "data": "<div>ZZ&prod_id=23</div>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": "ZZ&prod_id=23",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div>ZZ&amp;prod_id=23</div></body></html>",
+        "noQuirksBodyHtml": "<div>ZZ&amp;prod_id=23</div>"
+      }
+    },
+    {
+      "data": "<div>ZZ&pound;_id=23</div>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": "ZZ£_id=23"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div>ZZ£_id=23</div></body></html>",
+        "noQuirksBodyHtml": "<div>ZZ£_id=23</div>"
+      }
+    },
+    {
+      "data": "<div>ZZ&prod;_id=23</div>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": "ZZ∏_id=23"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div>ZZ∏_id=23</div></body></html>",
+        "noQuirksBodyHtml": "<div>ZZ∏_id=23</div>"
+      }
+    },
+    {
+      "data": "<div>ZZ&pound=23</div>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,13): named-entity-without-semicolon"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": "ZZ£=23"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div>ZZ£=23</div></body></html>",
+        "noQuirksBodyHtml": "<div>ZZ£=23</div>"
+      }
+    },
+    {
+      "data": "<div>ZZ&prod=23</div>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": "ZZ&prod=23",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div>ZZ&amp;prod=23</div></body></html>",
+        "noQuirksBodyHtml": "<div>ZZ&amp;prod=23</div>"
+      }
+    },
+    {
+      "data": "<div>ZZ&AElig=</div>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": "ZZÆ="
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div>ZZÆ=</div></body></html>",
+        "noQuirksBodyHtml": "<div>ZZÆ=</div>"
+      }
+    }
+  ],
+  "foreign-fragment.dat": [
+    {
+      "data": "<nobr>X",
+      "errors": [
+        "6: HTML start tag “nobr” in a foreign namespace context.",
+        "7: End of file seen and there were open elements.",
+        "6: Unclosed element “nobr”."
+      ],
+      "fragment": {
+        "name": "path",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "svg nobr": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "nobr",
+            "ns": "http://www.w3.org/2000/svg",
+            "children": [
+              {
+                "text": "X"
+              }
+            ]
+          }
+        ],
+        "html": "<nobr>X</nobr>",
+        "noQuirksBodyHtml": "<nobr>X</nobr>"
+      }
+    },
+    {
+      "data": "<font color></font>X",
+      "errors": [
+        "12: HTML start tag “font” in a foreign namespace context."
+      ],
+      "fragment": {
+        "name": "path",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "svg font": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "font",
+            "ns": "http://www.w3.org/2000/svg",
+            "attrs": [
+              {
+                "name": "color",
+                "value": ""
+              }
+            ]
+          },
+          {
+            "text": "X"
+          }
+        ],
+        "html": "<font color=\"\"></font>X",
+        "noQuirksBodyHtml": "<font color=\"\"></font>X"
+      }
+    },
+    {
+      "data": "<font></font>X",
+      "errors": [],
+      "fragment": {
+        "name": "path",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "svg font": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "font",
+            "ns": "http://www.w3.org/2000/svg"
+          },
+          {
+            "text": "X"
+          }
+        ],
+        "html": "<font></font>X",
+        "noQuirksBodyHtml": "<font></font>X"
+      }
+    },
+    {
+      "data": "<g></path>X",
+      "errors": [
+        "10: End tag “path” did not match the name of the current open element (“g”).",
+        "11: End of file seen and there were open elements.",
+        "3: Unclosed element “g”."
+      ],
+      "fragment": {
+        "name": "path",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "svg g": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "g",
+            "ns": "http://www.w3.org/2000/svg",
+            "children": [
+              {
+                "text": "X"
+              }
+            ]
+          }
+        ],
+        "html": "<g>X</g>",
+        "noQuirksBodyHtml": "<g>X</g>"
+      }
+    },
+    {
+      "data": "</path>X",
+      "errors": [
+        "5: Stray end tag “path”."
+      ],
+      "fragment": {
+        "name": "path",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {}
+        },
+        "tree": [
+          {
+            "text": "X"
+          }
+        ],
+        "html": "X",
+        "noQuirksBodyHtml": "X"
+      }
+    },
+    {
+      "data": "</foreignObject>X",
+      "errors": [
+        "5: Stray end tag “foreignobject”."
+      ],
+      "fragment": {
+        "name": "foreignObject",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {}
+        },
+        "tree": [
+          {
+            "text": "X"
+          }
+        ],
+        "html": "X",
+        "noQuirksBodyHtml": "X"
+      }
+    },
+    {
+      "data": "</desc>X",
+      "errors": [
+        "5: Stray end tag “desc”."
+      ],
+      "fragment": {
+        "name": "desc",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {}
+        },
+        "tree": [
+          {
+            "text": "X"
+          }
+        ],
+        "html": "X",
+        "noQuirksBodyHtml": "X"
+      }
+    },
+    {
+      "data": "</title>X",
+      "errors": [
+        "5: Stray end tag “title”."
+      ],
+      "fragment": {
+        "name": "title",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {}
+        },
+        "tree": [
+          {
+            "text": "X"
+          }
+        ],
+        "html": "X",
+        "noQuirksBodyHtml": "X"
+      }
+    },
+    {
+      "data": "</svg>X",
+      "errors": [
+        "5: Stray end tag “svg”."
+      ],
+      "fragment": {
+        "name": "svg",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {}
+        },
+        "tree": [
+          {
+            "text": "X"
+          }
+        ],
+        "html": "X",
+        "noQuirksBodyHtml": "X"
+      }
+    },
+    {
+      "data": "</mfenced>X",
+      "errors": [
+        "5: Stray end tag “mfenced”."
+      ],
+      "fragment": {
+        "name": "mfenced",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {}
+        },
+        "tree": [
+          {
+            "text": "X"
+          }
+        ],
+        "html": "X",
+        "noQuirksBodyHtml": "X"
+      }
+    },
+    {
+      "data": "</malignmark>X",
+      "errors": [
+        "5: Stray end tag “malignmark”."
+      ],
+      "fragment": {
+        "name": "malignmark",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {}
+        },
+        "tree": [
+          {
+            "text": "X"
+          }
+        ],
+        "html": "X",
+        "noQuirksBodyHtml": "X"
+      }
+    },
+    {
+      "data": "</math>X",
+      "errors": [
+        "5: Stray end tag “math”."
+      ],
+      "fragment": {
+        "name": "math",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {}
+        },
+        "tree": [
+          {
+            "text": "X"
+          }
+        ],
+        "html": "X",
+        "noQuirksBodyHtml": "X"
+      }
+    },
+    {
+      "data": "</annotation-xml>X",
+      "errors": [
+        "5: Stray end tag “annotation-xml”."
+      ],
+      "fragment": {
+        "name": "annotation-xml",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {}
+        },
+        "tree": [
+          {
+            "text": "X"
+          }
+        ],
+        "html": "X",
+        "noQuirksBodyHtml": "X"
+      }
+    },
+    {
+      "data": "</mtext>X",
+      "errors": [
+        "5: Stray end tag “mtext”."
+      ],
+      "fragment": {
+        "name": "mtext",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {}
+        },
+        "tree": [
+          {
+            "text": "X"
+          }
+        ],
+        "html": "X",
+        "noQuirksBodyHtml": "X"
+      }
+    },
+    {
+      "data": "</mi>X",
+      "errors": [
+        "5: Stray end tag “mi”."
+      ],
+      "fragment": {
+        "name": "mi",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {}
+        },
+        "tree": [
+          {
+            "text": "X"
+          }
+        ],
+        "html": "X",
+        "noQuirksBodyHtml": "X"
+      }
+    },
+    {
+      "data": "</mo>X",
+      "errors": [
+        "5: Stray end tag “mo”."
+      ],
+      "fragment": {
+        "name": "mo",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {}
+        },
+        "tree": [
+          {
+            "text": "X"
+          }
+        ],
+        "html": "X",
+        "noQuirksBodyHtml": "X"
+      }
+    },
+    {
+      "data": "</mn>X",
+      "errors": [
+        "5: Stray end tag “mn”."
+      ],
+      "fragment": {
+        "name": "mn",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {}
+        },
+        "tree": [
+          {
+            "text": "X"
+          }
+        ],
+        "html": "X",
+        "noQuirksBodyHtml": "X"
+      }
+    },
+    {
+      "data": "</ms>X",
+      "errors": [
+        "5: Stray end tag “ms”."
+      ],
+      "fragment": {
+        "name": "ms",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {}
+        },
+        "tree": [
+          {
+            "text": "X"
+          }
+        ],
+        "html": "X",
+        "noQuirksBodyHtml": "X"
+      }
+    },
+    {
+      "data": "<b></b><mglyph/><i></i><malignmark/><u></u><ms/>X",
+      "errors": [
+        "51: Self-closing syntax (“/>”) used on a non-void HTML element. Ignoring the slash and treating as a start tag.",
+        "52: End of file seen and there were open elements.",
+        "51: Unclosed element “ms”."
+      ],
+      "fragment": {
+        "name": "ms",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "b": true,
+            "math mglyph": true,
+            "i": true,
+            "math malignmark": true,
+            "u": true,
+            "ms": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "b"
+          },
+          {
+            "tag": "mglyph",
+            "ns": "http://www.w3.org/1998/Math/MathML"
+          },
+          {
+            "tag": "i"
+          },
+          {
+            "tag": "malignmark",
+            "ns": "http://www.w3.org/1998/Math/MathML"
+          },
+          {
+            "tag": "u"
+          },
+          {
+            "tag": "ms",
+            "children": [
+              {
+                "text": "X"
+              }
+            ]
+          }
+        ],
+        "html": "<b></b><mglyph></mglyph><i></i><malignmark></malignmark><u></u><ms>X</ms>",
+        "noQuirksBodyHtml": "<b></b><mglyph><i></i><malignmark><u></u><ms>X</ms></malignmark></mglyph>"
+      }
+    },
+    {
+      "data": "<malignmark></malignmark>",
+      "errors": [],
+      "fragment": {
+        "name": "ms",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math malignmark": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "malignmark",
+            "ns": "http://www.w3.org/1998/Math/MathML"
+          }
+        ],
+        "html": "<malignmark></malignmark>",
+        "noQuirksBodyHtml": "<malignmark></malignmark>"
+      }
+    },
+    {
+      "data": "<div></div>",
+      "errors": [],
+      "fragment": {
+        "name": "ms",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "div"
+          }
+        ],
+        "html": "<div></div>",
+        "noQuirksBodyHtml": "<div></div>"
+      }
+    },
+    {
+      "data": "<figure></figure>",
+      "errors": [],
+      "fragment": {
+        "name": "ms",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "figure": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "figure"
+          }
+        ],
+        "html": "<figure></figure>",
+        "noQuirksBodyHtml": "<figure></figure>"
+      }
+    },
+    {
+      "data": "<b></b><mglyph/><i></i><malignmark/><u></u><mn/>X",
+      "errors": [
+        "51: Self-closing syntax (“/>”) used on a non-void HTML element. Ignoring the slash and treating as a start tag.",
+        "52: End of file seen and there were open elements.",
+        "51: Unclosed element “mn”."
+      ],
+      "fragment": {
+        "name": "mn",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "b": true,
+            "math mglyph": true,
+            "i": true,
+            "math malignmark": true,
+            "u": true,
+            "mn": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "b"
+          },
+          {
+            "tag": "mglyph",
+            "ns": "http://www.w3.org/1998/Math/MathML"
+          },
+          {
+            "tag": "i"
+          },
+          {
+            "tag": "malignmark",
+            "ns": "http://www.w3.org/1998/Math/MathML"
+          },
+          {
+            "tag": "u"
+          },
+          {
+            "tag": "mn",
+            "children": [
+              {
+                "text": "X"
+              }
+            ]
+          }
+        ],
+        "html": "<b></b><mglyph></mglyph><i></i><malignmark></malignmark><u></u><mn>X</mn>",
+        "noQuirksBodyHtml": "<b></b><mglyph><i></i><malignmark><u></u><mn>X</mn></malignmark></mglyph>"
+      }
+    },
+    {
+      "data": "<malignmark></malignmark>",
+      "errors": [],
+      "fragment": {
+        "name": "mn",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math malignmark": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "malignmark",
+            "ns": "http://www.w3.org/1998/Math/MathML"
+          }
+        ],
+        "html": "<malignmark></malignmark>",
+        "noQuirksBodyHtml": "<malignmark></malignmark>"
+      }
+    },
+    {
+      "data": "<div></div>",
+      "errors": [],
+      "fragment": {
+        "name": "mn",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "div"
+          }
+        ],
+        "html": "<div></div>",
+        "noQuirksBodyHtml": "<div></div>"
+      }
+    },
+    {
+      "data": "<figure></figure>",
+      "errors": [],
+      "fragment": {
+        "name": "mn",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "figure": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "figure"
+          }
+        ],
+        "html": "<figure></figure>",
+        "noQuirksBodyHtml": "<figure></figure>"
+      }
+    },
+    {
+      "data": "<b></b><mglyph/><i></i><malignmark/><u></u><mo/>X",
+      "errors": [
+        "51: Self-closing syntax (“/>”) used on a non-void HTML element. Ignoring the slash and treating as a start tag.",
+        "52: End of file seen and there were open elements.",
+        "51: Unclosed element “mo”."
+      ],
+      "fragment": {
+        "name": "mo",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "b": true,
+            "math mglyph": true,
+            "i": true,
+            "math malignmark": true,
+            "u": true,
+            "mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "b"
+          },
+          {
+            "tag": "mglyph",
+            "ns": "http://www.w3.org/1998/Math/MathML"
+          },
+          {
+            "tag": "i"
+          },
+          {
+            "tag": "malignmark",
+            "ns": "http://www.w3.org/1998/Math/MathML"
+          },
+          {
+            "tag": "u"
+          },
+          {
+            "tag": "mo",
+            "children": [
+              {
+                "text": "X"
+              }
+            ]
+          }
+        ],
+        "html": "<b></b><mglyph></mglyph><i></i><malignmark></malignmark><u></u><mo>X</mo>",
+        "noQuirksBodyHtml": "<b></b><mglyph><i></i><malignmark><u></u><mo>X</mo></malignmark></mglyph>"
+      }
+    },
+    {
+      "data": "<malignmark></malignmark>",
+      "errors": [],
+      "fragment": {
+        "name": "mo",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math malignmark": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "malignmark",
+            "ns": "http://www.w3.org/1998/Math/MathML"
+          }
+        ],
+        "html": "<malignmark></malignmark>",
+        "noQuirksBodyHtml": "<malignmark></malignmark>"
+      }
+    },
+    {
+      "data": "<div></div>",
+      "errors": [],
+      "fragment": {
+        "name": "mo",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "div"
+          }
+        ],
+        "html": "<div></div>",
+        "noQuirksBodyHtml": "<div></div>"
+      }
+    },
+    {
+      "data": "<figure></figure>",
+      "errors": [],
+      "fragment": {
+        "name": "mo",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "figure": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "figure"
+          }
+        ],
+        "html": "<figure></figure>",
+        "noQuirksBodyHtml": "<figure></figure>"
+      }
+    },
+    {
+      "data": "<b></b><mglyph/><i></i><malignmark/><u></u><mi/>X",
+      "errors": [
+        "51: Self-closing syntax (“/>”) used on a non-void HTML element. Ignoring the slash and treating as a start tag.",
+        "52: End of file seen and there were open elements.",
+        "51: Unclosed element “mi”."
+      ],
+      "fragment": {
+        "name": "mi",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "b": true,
+            "math mglyph": true,
+            "i": true,
+            "math malignmark": true,
+            "u": true,
+            "mi": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "b"
+          },
+          {
+            "tag": "mglyph",
+            "ns": "http://www.w3.org/1998/Math/MathML"
+          },
+          {
+            "tag": "i"
+          },
+          {
+            "tag": "malignmark",
+            "ns": "http://www.w3.org/1998/Math/MathML"
+          },
+          {
+            "tag": "u"
+          },
+          {
+            "tag": "mi",
+            "children": [
+              {
+                "text": "X"
+              }
+            ]
+          }
+        ],
+        "html": "<b></b><mglyph></mglyph><i></i><malignmark></malignmark><u></u><mi>X</mi>",
+        "noQuirksBodyHtml": "<b></b><mglyph><i></i><malignmark><u></u><mi>X</mi></malignmark></mglyph>"
+      }
+    },
+    {
+      "data": "<malignmark></malignmark>",
+      "errors": [],
+      "fragment": {
+        "name": "mi",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math malignmark": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "malignmark",
+            "ns": "http://www.w3.org/1998/Math/MathML"
+          }
+        ],
+        "html": "<malignmark></malignmark>",
+        "noQuirksBodyHtml": "<malignmark></malignmark>"
+      }
+    },
+    {
+      "data": "<div></div>",
+      "errors": [],
+      "fragment": {
+        "name": "mi",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "div"
+          }
+        ],
+        "html": "<div></div>",
+        "noQuirksBodyHtml": "<div></div>"
+      }
+    },
+    {
+      "data": "<figure></figure>",
+      "errors": [],
+      "fragment": {
+        "name": "mi",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "figure": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "figure"
+          }
+        ],
+        "html": "<figure></figure>",
+        "noQuirksBodyHtml": "<figure></figure>"
+      }
+    },
+    {
+      "data": "<b></b><mglyph/><i></i><malignmark/><u></u><mtext/>X",
+      "errors": [
+        "51: Self-closing syntax (“/>”) used on a non-void HTML element. Ignoring the slash and treating as a start tag.",
+        "52: End of file seen and there were open elements.",
+        "51: Unclosed element “mtext”."
+      ],
+      "fragment": {
+        "name": "mtext",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "b": true,
+            "math mglyph": true,
+            "i": true,
+            "math malignmark": true,
+            "u": true,
+            "mtext": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "b"
+          },
+          {
+            "tag": "mglyph",
+            "ns": "http://www.w3.org/1998/Math/MathML"
+          },
+          {
+            "tag": "i"
+          },
+          {
+            "tag": "malignmark",
+            "ns": "http://www.w3.org/1998/Math/MathML"
+          },
+          {
+            "tag": "u"
+          },
+          {
+            "tag": "mtext",
+            "children": [
+              {
+                "text": "X"
+              }
+            ]
+          }
+        ],
+        "html": "<b></b><mglyph></mglyph><i></i><malignmark></malignmark><u></u><mtext>X</mtext>",
+        "noQuirksBodyHtml": "<b></b><mglyph><i></i><malignmark><u></u><mtext>X</mtext></malignmark></mglyph>"
+      }
+    },
+    {
+      "data": "<malignmark></malignmark>",
+      "errors": [],
+      "fragment": {
+        "name": "mtext",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math malignmark": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "malignmark",
+            "ns": "http://www.w3.org/1998/Math/MathML"
+          }
+        ],
+        "html": "<malignmark></malignmark>",
+        "noQuirksBodyHtml": "<malignmark></malignmark>"
+      }
+    },
+    {
+      "data": "<div></div>",
+      "errors": [],
+      "fragment": {
+        "name": "mtext",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "div"
+          }
+        ],
+        "html": "<div></div>",
+        "noQuirksBodyHtml": "<div></div>"
+      }
+    },
+    {
+      "data": "<figure></figure>",
+      "errors": [],
+      "fragment": {
+        "name": "mtext",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "figure": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "figure"
+          }
+        ],
+        "html": "<figure></figure>",
+        "noQuirksBodyHtml": "<figure></figure>"
+      }
+    },
+    {
+      "data": "<div></div>",
+      "errors": [
+        "5: HTML start tag “div” in a foreign namespace context."
+      ],
+      "fragment": {
+        "name": "annotation-xml",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "div",
+            "ns": "http://www.w3.org/1998/Math/MathML"
+          }
+        ],
+        "html": "<div></div>",
+        "noQuirksBodyHtml": "<div></div>"
+      }
+    },
+    {
+      "data": "<figure></figure>",
+      "errors": [],
+      "fragment": {
+        "name": "annotation-xml",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math figure": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "figure",
+            "ns": "http://www.w3.org/1998/Math/MathML"
+          }
+        ],
+        "html": "<figure></figure>",
+        "noQuirksBodyHtml": "<figure></figure>"
+      }
+    },
+    {
+      "data": "<div></div>",
+      "errors": [
+        "5: HTML start tag “div” in a foreign namespace context."
+      ],
+      "fragment": {
+        "name": "math",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "div",
+            "ns": "http://www.w3.org/1998/Math/MathML"
+          }
+        ],
+        "html": "<div></div>",
+        "noQuirksBodyHtml": "<div></div>"
+      }
+    },
+    {
+      "data": "<figure></figure>",
+      "errors": [],
+      "fragment": {
+        "name": "math",
+        "ns": "http://www.w3.org/1998/Math/MathML"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math figure": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "figure",
+            "ns": "http://www.w3.org/1998/Math/MathML"
+          }
+        ],
+        "html": "<figure></figure>",
+        "noQuirksBodyHtml": "<figure></figure>"
+      }
+    },
+    {
+      "data": "<div></div>",
+      "errors": [],
+      "fragment": {
+        "name": "foreignObject",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "div"
+          }
+        ],
+        "html": "<div></div>",
+        "noQuirksBodyHtml": "<div></div>"
+      }
+    },
+    {
+      "data": "<figure></figure>",
+      "errors": [],
+      "fragment": {
+        "name": "foreignObject",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "figure": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "figure"
+          }
+        ],
+        "html": "<figure></figure>",
+        "noQuirksBodyHtml": "<figure></figure>"
+      }
+    },
+    {
+      "data": "<div></div>",
+      "errors": [],
+      "fragment": {
+        "name": "title",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "div"
+          }
+        ],
+        "html": "<div></div>",
+        "noQuirksBodyHtml": "<div></div>"
+      }
+    },
+    {
+      "data": "<figure></figure>",
+      "errors": [],
+      "fragment": {
+        "name": "title",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "figure": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "figure"
+          }
+        ],
+        "html": "<figure></figure>",
+        "noQuirksBodyHtml": "<figure></figure>"
+      }
+    },
+    {
+      "data": "<figure></figure>",
+      "errors": [],
+      "fragment": {
+        "name": "desc",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "figure": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "figure"
+          }
+        ],
+        "html": "<figure></figure>",
+        "noQuirksBodyHtml": "<figure></figure>"
+      }
+    },
+    {
+      "data": "<div><h1>X</h1></div>",
+      "errors": [
+        "5: HTML start tag “div” in a foreign namespace context.",
+        "9: HTML start tag “h1” in a foreign namespace context."
+      ],
+      "fragment": {
+        "name": "svg",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "svg div": true,
+            "svg h1": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "div",
+            "ns": "http://www.w3.org/2000/svg",
+            "children": [
+              {
+                "tag": "h1",
+                "ns": "http://www.w3.org/2000/svg",
+                "children": [
+                  {
+                    "text": "X"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<div><h1>X</h1></div>",
+        "noQuirksBodyHtml": "<div><h1>X</h1></div>"
+      }
+    },
+    {
+      "data": "<div></div>",
+      "errors": [
+        "5: HTML start tag “div” in a foreign namespace context."
+      ],
+      "fragment": {
+        "name": "svg",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "svg div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "div",
+            "ns": "http://www.w3.org/2000/svg"
+          }
+        ],
+        "html": "<div></div>",
+        "noQuirksBodyHtml": "<div></div>"
+      }
+    },
+    {
+      "data": "<div></div>",
+      "errors": [],
+      "fragment": {
+        "name": "desc",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "div"
+          }
+        ],
+        "html": "<div></div>",
+        "noQuirksBodyHtml": "<div></div>"
+      }
+    },
+    {
+      "data": "<figure></figure>",
+      "errors": [],
+      "fragment": {
+        "name": "desc",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "figure": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "figure"
+          }
+        ],
+        "html": "<figure></figure>",
+        "noQuirksBodyHtml": "<figure></figure>"
+      }
+    },
+    {
+      "data": "<plaintext><foo>",
+      "errors": [
+        "16: End of file seen and there were open elements.",
+        "11: Unclosed element “plaintext”."
+      ],
+      "fragment": {
+        "name": "desc",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "plaintext": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "plaintext",
+            "children": [
+              {
+                "text": "<foo>",
+                "no_escape": true
+              }
+            ]
+          }
+        ],
+        "html": "<plaintext><foo></plaintext>",
+        "noQuirksBodyHtml": "<plaintext><foo></plaintext>"
+      }
+    },
+    {
+      "data": "<frameset>X",
+      "errors": [
+        "6: Stray start tag “frameset”."
+      ],
+      "fragment": {
+        "name": "desc",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {}
+        },
+        "tree": [
+          {
+            "text": "X"
+          }
+        ],
+        "html": "X",
+        "noQuirksBodyHtml": "X"
+      }
+    },
+    {
+      "data": "<head>X",
+      "errors": [
+        "6: Stray start tag “head”."
+      ],
+      "fragment": {
+        "name": "desc",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {}
+        },
+        "tree": [
+          {
+            "text": "X"
+          }
+        ],
+        "html": "X",
+        "noQuirksBodyHtml": "X"
+      }
+    },
+    {
+      "data": "<body>X",
+      "errors": [
+        "6: Stray start tag “body”."
+      ],
+      "fragment": {
+        "name": "desc",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {}
+        },
+        "tree": [
+          {
+            "text": "X"
+          }
+        ],
+        "html": "X",
+        "noQuirksBodyHtml": "X"
+      }
+    },
+    {
+      "data": "<html>X",
+      "errors": [
+        "6: Stray start tag “html”."
+      ],
+      "fragment": {
+        "name": "desc",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {}
+        },
+        "tree": [
+          {
+            "text": "X"
+          }
+        ],
+        "html": "X",
+        "noQuirksBodyHtml": "X"
+      }
+    },
+    {
+      "data": "<html class=\"foo\">X",
+      "errors": [
+        "6: Stray start tag “html”."
+      ],
+      "fragment": {
+        "name": "desc",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {}
+        },
+        "tree": [
+          {
+            "text": "X"
+          }
+        ],
+        "html": "X",
+        "noQuirksBodyHtml": "X"
+      }
+    },
+    {
+      "data": "<body class=\"foo\">X",
+      "errors": [
+        "6: Stray start tag “body”."
+      ],
+      "fragment": {
+        "name": "desc",
+        "ns": "http://www.w3.org/2000/svg"
+      },
+      "document": {
+        "props": {
+          "tags": {}
+        },
+        "tree": [
+          {
+            "text": "X"
+          }
+        ],
+        "html": "X",
+        "noQuirksBodyHtml": "X"
+      }
+    }
+  ],
+  "html5test-com.dat": [
+    {
+      "data": "<div<div>",
+      "errors": [
+        "(1,9): expected-doctype-but-got-start-tag",
+        "(1,9): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div<div": true
+          },
+          "tagWithLt": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div<div"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div<div></div<div></body></html>",
+        "noQuirksBodyHtml": "<div<div></div<div>"
+      }
+    },
+    {
+      "data": "<div foo<bar=''>",
+      "errors": [
+        "(1,9): invalid-character-in-attribute-name",
+        "(1,16): expected-doctype-but-got-start-tag",
+        "(1,16): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          },
+          "attrWithFunnyChar": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "attrs": [
+                      {
+                        "name": "foo<bar",
+                        "value": ""
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div foo<bar=\"\"></div></body></html>",
+        "noQuirksBodyHtml": "<div foo<bar=\"\"></div>"
+      }
+    },
+    {
+      "data": "<div foo=`bar`>",
+      "errors": [
+        "(1,10): equals-in-unquoted-attribute-value",
+        "(1,14): unexpected-character-in-unquoted-attribute-value",
+        "(1,15): expected-doctype-but-got-start-tag",
+        "(1,15): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "attrs": [
+                      {
+                        "name": "foo",
+                        "value": "`bar`"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div foo=\"`bar`\"></div></body></html>",
+        "noQuirksBodyHtml": "<div foo=\"`bar`\"></div>"
+      }
+    },
+    {
+      "data": "<div \\\"foo=''>",
+      "errors": [
+        "(1,7): invalid-character-in-attribute-name",
+        "(1,14): expected-doctype-but-got-start-tag",
+        "(1,14): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          },
+          "attrWithFunnyChar": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "attrs": [
+                      {
+                        "name": "\\\"foo",
+                        "value": ""
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div \\\"foo=\"\"></div></body></html>",
+        "noQuirksBodyHtml": "<div \\\"foo=\"\"></div>"
+      }
+    },
+    {
+      "data": "<a href='\\nbar'></a>",
+      "errors": [
+        "(1,16): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "attrs": [
+                      {
+                        "name": "href",
+                        "value": "\\nbar"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a href=\"\\nbar\"></a></body></html>",
+        "noQuirksBodyHtml": "<a href=\"\\nbar\"></a>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "&lang;&rang;",
+      "errors": [
+        "(1,6): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "⟨⟩"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>⟨⟩</body></html>",
+        "noQuirksBodyHtml": "⟨⟩"
+      }
+    },
+    {
+      "data": "&apos;",
+      "errors": [
+        "(1,6): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "'"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>'</body></html>",
+        "noQuirksBodyHtml": "'"
+      }
+    },
+    {
+      "data": "&ImaginaryI;",
+      "errors": [
+        "(1,12): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "ⅈ"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>ⅈ</body></html>",
+        "noQuirksBodyHtml": "ⅈ"
+      }
+    },
+    {
+      "data": "&Kopf;",
+      "errors": [
+        "(1,6): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "𝕂"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>𝕂</body></html>",
+        "noQuirksBodyHtml": "𝕂"
+      }
+    },
+    {
+      "data": "&notinva;",
+      "errors": [
+        "(1,9): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "∉"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>∉</body></html>",
+        "noQuirksBodyHtml": "∉"
+      }
+    },
+    {
+      "data": "<?import namespace=\"foo\" implementation=\"#bar\">",
+      "errors": [
+        "(1,1): expected-tag-name-but-got-question-mark",
+        "(1,47): expected-doctype-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "comment": "?import namespace=\"foo\" implementation=\"#bar\""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!--?import namespace=\"foo\" implementation=\"#bar\"--><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": "<!--?import namespace=\"foo\" implementation=\"#bar\"-->"
+      }
+    },
+    {
+      "data": "<!--foo--bar-->",
+      "errors": [
+        "(1,10): unexpected-char-in-comment",
+        "(1,15): expected-doctype-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "comment": "foo--bar"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!--foo--bar--><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": "<!--foo--bar-->"
+      }
+    },
+    {
+      "data": "<![CDATA[x]]>",
+      "errors": [
+        "(1,2): expected-dashes-or-doctype",
+        "(1,13): expected-doctype-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "comment": "[CDATA[x]]"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!--[CDATA[x]]--><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": "<!--[CDATA[x]]-->"
+      }
+    },
+    {
+      "data": "<textarea><!--</textarea>--></textarea>",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag",
+        "(1,39): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "textarea": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "textarea",
+                    "children": [
+                      {
+                        "text": "<!--",
+                        "escaped": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><textarea>&lt;!--</textarea>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<textarea>&lt;!--</textarea>--&gt;"
+      }
+    },
+    {
+      "data": "<textarea><!--</textarea>-->",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "textarea": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "textarea",
+                    "children": [
+                      {
+                        "text": "<!--",
+                        "escaped": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><textarea>&lt;!--</textarea>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<textarea>&lt;!--</textarea>--&gt;"
+      }
+    },
+    {
+      "data": "<style><!--</style>--></style>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,30): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          },
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": "<!--",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><style><!--</style></head><body>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<style><!--</style>--&gt;"
+      }
+    },
+    {
+      "data": "<style><!--</style>-->",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          },
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": "<!--",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><style><!--</style></head><body>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<style><!--</style>--&gt;"
+      }
+    },
+    {
+      "data": "<ul><li>A </li> <li>B</li></ul>",
+      "errors": [
+        "(1,4): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ul": true,
+            "li": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ul",
+                    "children": [
+                      {
+                        "tag": "li",
+                        "children": [
+                          {
+                            "text": "A "
+                          }
+                        ]
+                      },
+                      {
+                        "text": " "
+                      },
+                      {
+                        "tag": "li",
+                        "children": [
+                          {
+                            "text": "B"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ul><li>A </li> <li>B</li></ul></body></html>",
+        "noQuirksBodyHtml": "<ul><li>A </li> <li>B</li></ul>"
+      }
+    },
+    {
+      "data": "<table><form><input type=hidden><input></form><div></div></table>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,13): unexpected-form-in-table",
+        "(1,32): unexpected-hidden-input-in-table",
+        "(1,39): unexpected-start-tag-implies-table-voodoo",
+        "(1,46): unexpected-end-tag-implies-table-voodoo",
+        "(1,46): unexpected-end-tag",
+        "(1,51): unexpected-start-tag-implies-table-voodoo",
+        "(1,57): unexpected-end-tag-implies-table-voodoo"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "input": true,
+            "div": true,
+            "table": true,
+            "form": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "input"
+                  },
+                  {
+                    "tag": "div"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "form"
+                      },
+                      {
+                        "tag": "input",
+                        "attrs": [
+                          {
+                            "name": "type",
+                            "value": "hidden"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><input><div></div><table><form></form><input type=\"hidden\"></table></body></html>",
+        "noQuirksBodyHtml": "<input><div></div><table><form></form><input type=\"hidden\"></table>"
+      }
+    },
+    {
+      "data": "<i>A<b>B<p></i>C</b>D",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,15): adoption-agency-1.3",
+        "(1,20): adoption-agency-1.3"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "i": true,
+            "b": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "i",
+                    "children": [
+                      {
+                        "text": "A"
+                      },
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": "B"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "b"
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "tag": "i"
+                          },
+                          {
+                            "text": "C"
+                          }
+                        ]
+                      },
+                      {
+                        "text": "D"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><i>A<b>B</b></i><b></b><p><b><i></i>C</b>D</p></body></html>",
+        "noQuirksBodyHtml": "<i>A<b>B</b></i><b></b><p><b><i></i>C</b>D</p>"
+      }
+    },
+    {
+      "data": "<div></div>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div></div></body></html>",
+        "noQuirksBodyHtml": "<div></div>"
+      }
+    },
+    {
+      "data": "<svg></svg>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg></svg></body></html>",
+        "noQuirksBodyHtml": "<svg></svg>"
+      }
+    },
+    {
+      "data": "<math></math>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math></math></body></html>",
+        "noQuirksBodyHtml": "<math></math>"
+      }
+    }
+  ],
+  "inbody01.dat": [
+    {
+      "data": "<button>1</foo>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,15): unexpected-end-tag",
+        "(1,15): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "button": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "button",
+                    "children": [
+                      {
+                        "text": "1"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><button>1</button></body></html>",
+        "noQuirksBodyHtml": "<button>1</button>"
+      }
+    },
+    {
+      "data": "<foo>1<p>2</foo>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,16): unexpected-end-tag",
+        "(1,16): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "foo": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "foo",
+                    "children": [
+                      {
+                        "text": "1"
+                      },
+                      {
+                        "tag": "p",
+                        "children": [
+                          {
+                            "text": "2"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><foo>1<p>2</p></foo></body></html>",
+        "noQuirksBodyHtml": "<foo>1<p>2</p></foo>"
+      }
+    },
+    {
+      "data": "<dd>1</foo>",
+      "errors": [
+        "(1,4): expected-doctype-but-got-start-tag",
+        "(1,11): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "dd": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "dd",
+                    "children": [
+                      {
+                        "text": "1"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><dd>1</dd></body></html>",
+        "noQuirksBodyHtml": "<dd>1</dd>"
+      }
+    },
+    {
+      "data": "<foo>1<dd>2</foo>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,17): unexpected-end-tag",
+        "(1,17): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "foo": true,
+            "dd": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "foo",
+                    "children": [
+                      {
+                        "text": "1"
+                      },
+                      {
+                        "tag": "dd",
+                        "children": [
+                          {
+                            "text": "2"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><foo>1<dd>2</dd></foo></body></html>",
+        "noQuirksBodyHtml": "<foo>1<dd>2</dd></foo>"
+      }
+    }
+  ],
+  "isindex.dat": [
+    {
+      "data": "<isindex>",
+      "errors": [
+        "(1,9): expected-doctype-but-got-start-tag",
+        "(1,9): deprecated-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "form": true,
+            "hr": true,
+            "label": true,
+            "input": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "form",
+                    "children": [
+                      {
+                        "tag": "hr"
+                      },
+                      {
+                        "tag": "label",
+                        "children": [
+                          {
+                            "text": "This is a searchable index. Enter search keywords: "
+                          },
+                          {
+                            "tag": "input",
+                            "attrs": [
+                              {
+                                "name": "name",
+                                "value": "isindex"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "hr"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form></body></html>",
+        "noQuirksBodyHtml": "<form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form>"
+      }
+    },
+    {
+      "data": "<isindex name=\"A\" action=\"B\" prompt=\"C\" foo=\"D\">",
+      "errors": [
+        "(1,48): expected-doctype-but-got-start-tag",
+        "(1,48): deprecated-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "form": true,
+            "hr": true,
+            "label": true,
+            "input": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "form",
+                    "attrs": [
+                      {
+                        "name": "action",
+                        "value": "B"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "tag": "hr"
+                      },
+                      {
+                        "tag": "label",
+                        "children": [
+                          {
+                            "text": "C"
+                          },
+                          {
+                            "tag": "input",
+                            "attrs": [
+                              {
+                                "name": "foo",
+                                "value": "D"
+                              },
+                              {
+                                "name": "name",
+                                "value": "isindex"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "hr"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><form action=\"B\"><hr><label>C<input name=\"isindex\" foo=\"D\"></label><hr></form></body></html>",
+        "noQuirksBodyHtml": "<form action=\"B\"><hr><label>C<input name=\"isindex\" foo=\"D\"></label><hr></form>"
+      }
+    },
+    {
+      "data": "<form><isindex>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,15): deprecated-tag",
+        "(1,15): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "form": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "form"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><form></form></body></html>",
+        "noQuirksBodyHtml": "<form></form>"
+      }
+    }
+  ],
+  "main-element.dat": [
+    {
+      "data": "<!doctype html><p>foo<main>bar<p>baz",
+      "errors": [
+        "(1,36): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "main": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "foo"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "main",
+                    "children": [
+                      {
+                        "text": "bar"
+                      },
+                      {
+                        "tag": "p",
+                        "children": [
+                          {
+                            "text": "baz"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p>foo</p><main>bar<p>baz</p></main></body></html>",
+        "noQuirksBodyHtml": "<p>foo</p><main>bar<p>baz</p></main>"
+      }
+    },
+    {
+      "data": "<!doctype html><main><p>foo</main>bar",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "main": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "main",
+                    "children": [
+                      {
+                        "tag": "p",
+                        "children": [
+                          {
+                            "text": "foo"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "text": "bar"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><main><p>foo</p></main>bar</body></html>",
+        "noQuirksBodyHtml": "<main><p>foo</p></main>bar"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html>xxx<svg><x><g><a><main><b>",
+      "errors": [
+        " * (1,42) unexpected HTML-like start tag token in foreign content",
+        " * (1,42) unexpected end of file"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg x": true,
+            "svg g": true,
+            "svg a": true,
+            "svg main": true,
+            "b": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "xxx"
+                  },
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "x",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "tag": "g",
+                            "ns": "http://www.w3.org/2000/svg",
+                            "children": [
+                              {
+                                "tag": "a",
+                                "ns": "http://www.w3.org/2000/svg",
+                                "children": [
+                                  {
+                                    "tag": "main",
+                                    "ns": "http://www.w3.org/2000/svg"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "b"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>xxx<svg><x><g><a><main></main></a></g></x></svg><b></b></body></html>",
+        "noQuirksBodyHtml": "xxx<svg><x><g><a><main><b></b></main></a></g></x></svg>"
+      }
+    }
+  ],
+  "math.dat": [
+    {
+      "data": "<math><tr><td><mo><tr>",
+      "errors": [],
+      "fragment": {
+        "name": "td"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math math": true,
+            "math tr": true,
+            "math td": true,
+            "math mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "math",
+            "ns": "http://www.w3.org/1998/Math/MathML",
+            "children": [
+              {
+                "tag": "tr",
+                "ns": "http://www.w3.org/1998/Math/MathML",
+                "children": [
+                  {
+                    "tag": "td",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mo",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<math><tr><td><mo></mo></td></tr></math>",
+        "noQuirksBodyHtml": "<math><tr><td><mo></mo></td></tr></math>"
+      }
+    },
+    {
+      "data": "<math><tr><td><mo><tr>",
+      "errors": [],
+      "fragment": {
+        "name": "tr"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math math": true,
+            "math tr": true,
+            "math td": true,
+            "math mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "math",
+            "ns": "http://www.w3.org/1998/Math/MathML",
+            "children": [
+              {
+                "tag": "tr",
+                "ns": "http://www.w3.org/1998/Math/MathML",
+                "children": [
+                  {
+                    "tag": "td",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mo",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<math><tr><td><mo></mo></td></tr></math>",
+        "noQuirksBodyHtml": "<math><tr><td><mo></mo></td></tr></math>"
+      }
+    },
+    {
+      "data": "<math><thead><mo><tbody>",
+      "errors": [],
+      "fragment": {
+        "name": "thead"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math math": true,
+            "math thead": true,
+            "math mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "math",
+            "ns": "http://www.w3.org/1998/Math/MathML",
+            "children": [
+              {
+                "tag": "thead",
+                "ns": "http://www.w3.org/1998/Math/MathML",
+                "children": [
+                  {
+                    "tag": "mo",
+                    "ns": "http://www.w3.org/1998/Math/MathML"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<math><thead><mo></mo></thead></math>",
+        "noQuirksBodyHtml": "<math><thead><mo></mo></thead></math>"
+      }
+    },
+    {
+      "data": "<math><tfoot><mo><tbody>",
+      "errors": [],
+      "fragment": {
+        "name": "tfoot"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math math": true,
+            "math tfoot": true,
+            "math mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "math",
+            "ns": "http://www.w3.org/1998/Math/MathML",
+            "children": [
+              {
+                "tag": "tfoot",
+                "ns": "http://www.w3.org/1998/Math/MathML",
+                "children": [
+                  {
+                    "tag": "mo",
+                    "ns": "http://www.w3.org/1998/Math/MathML"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<math><tfoot><mo></mo></tfoot></math>",
+        "noQuirksBodyHtml": "<math><tfoot><mo></mo></tfoot></math>"
+      }
+    },
+    {
+      "data": "<math><tbody><mo><tfoot>",
+      "errors": [],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math math": true,
+            "math tbody": true,
+            "math mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "math",
+            "ns": "http://www.w3.org/1998/Math/MathML",
+            "children": [
+              {
+                "tag": "tbody",
+                "ns": "http://www.w3.org/1998/Math/MathML",
+                "children": [
+                  {
+                    "tag": "mo",
+                    "ns": "http://www.w3.org/1998/Math/MathML"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<math><tbody><mo></mo></tbody></math>",
+        "noQuirksBodyHtml": "<math><tbody><mo></mo></tbody></math>"
+      }
+    },
+    {
+      "data": "<math><tbody><mo></table>",
+      "errors": [],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math math": true,
+            "math tbody": true,
+            "math mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "math",
+            "ns": "http://www.w3.org/1998/Math/MathML",
+            "children": [
+              {
+                "tag": "tbody",
+                "ns": "http://www.w3.org/1998/Math/MathML",
+                "children": [
+                  {
+                    "tag": "mo",
+                    "ns": "http://www.w3.org/1998/Math/MathML"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<math><tbody><mo></mo></tbody></math>",
+        "noQuirksBodyHtml": "<math><tbody><mo></mo></tbody></math>"
+      }
+    },
+    {
+      "data": "<math><thead><mo></table>",
+      "errors": [],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math math": true,
+            "math thead": true,
+            "math mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "math",
+            "ns": "http://www.w3.org/1998/Math/MathML",
+            "children": [
+              {
+                "tag": "thead",
+                "ns": "http://www.w3.org/1998/Math/MathML",
+                "children": [
+                  {
+                    "tag": "mo",
+                    "ns": "http://www.w3.org/1998/Math/MathML"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<math><thead><mo></mo></thead></math>",
+        "noQuirksBodyHtml": "<math><thead><mo></mo></thead></math>"
+      }
+    },
+    {
+      "data": "<math><tfoot><mo></table>",
+      "errors": [],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math math": true,
+            "math tfoot": true,
+            "math mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "math",
+            "ns": "http://www.w3.org/1998/Math/MathML",
+            "children": [
+              {
+                "tag": "tfoot",
+                "ns": "http://www.w3.org/1998/Math/MathML",
+                "children": [
+                  {
+                    "tag": "mo",
+                    "ns": "http://www.w3.org/1998/Math/MathML"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<math><tfoot><mo></mo></tfoot></math>",
+        "noQuirksBodyHtml": "<math><tfoot><mo></mo></tfoot></math>"
+      }
+    }
+  ],
+  "namespace-sensitivity.dat": [
+    {
+      "data": "<body><table><tr><td><svg><td><foreignObject><span></td>Foo",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "svg svg": true,
+            "svg td": true,
+            "svg foreignObject": true,
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Foo"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "svg",
+                                    "ns": "http://www.w3.org/2000/svg",
+                                    "children": [
+                                      {
+                                        "tag": "td",
+                                        "ns": "http://www.w3.org/2000/svg",
+                                        "children": [
+                                          {
+                                            "tag": "foreignObject",
+                                            "ns": "http://www.w3.org/2000/svg",
+                                            "children": [
+                                              {
+                                                "tag": "span"
+                                              }
+                                            ]
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>Foo<table><tbody><tr><td><svg><td><foreignObject><span></span></foreignObject></td></svg></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "Foo<table><tbody><tr><td><svg><td><foreignObject><span></span></foreignObject></td></svg></td></tr></tbody></table>"
+      }
+    }
+  ],
+  "pending-spec-changes-plain-text-unsafe.dat": [
+    {
+      "data": "<body><table>\u0000filler\u0000text\u0000",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,14): invalid-codepoint",
+        "(1,14): invalid-codepoint-in-table-text",
+        "(1,21): invalid-codepoint",
+        "(1,21): invalid-codepoint-in-table-text",
+        "(1,26): invalid-codepoint",
+        "(1,26): invalid-codepoint-in-table-text",
+        "(1,26): foster-parenting-character-in-table",
+        "(1,26): foster-parenting-character-in-table",
+        "(1,26): foster-parenting-character-in-table",
+        "(1,26): foster-parenting-character-in-table",
+        "(1,26): foster-parenting-character-in-table",
+        "(1,26): foster-parenting-character-in-table",
+        "(1,26): foster-parenting-character-in-table",
+        "(1,26): foster-parenting-character-in-table",
+        "(1,26): foster-parenting-character-in-table",
+        "(1,26): foster-parenting-character-in-table",
+        "(1,26): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "fillertext"
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>fillertext<table></table></body></html>",
+        "noQuirksBodyHtml": "fillertext<table></table>"
+      }
+    }
+  ],
+  "pending-spec-changes.dat": [
+    {
+      "data": "<input type=\"hidden\"><frameset>",
+      "errors": [
+        "(1,21): expected-doctype-but-got-start-tag",
+        "(1,31): unexpected-start-tag",
+        "(1,31): eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": "<input type=\"hidden\">"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><table><caption><svg>foo</table>bar",
+      "errors": [
+        "(1,47): unexpected-end-tag",
+        "(1,47): end-table-tag-in-caption"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "caption": true,
+            "svg svg": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "caption",
+                        "children": [
+                          {
+                            "tag": "svg",
+                            "ns": "http://www.w3.org/2000/svg",
+                            "children": [
+                              {
+                                "text": "foo"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "text": "bar"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><caption><svg>foo</svg></caption></table>bar</body></html>",
+        "noQuirksBodyHtml": "<table><caption><svg>foo</svg></caption></table>bar"
+      }
+    },
+    {
+      "data": "<table><tr><td><svg><desc><td></desc><circle>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,30): unexpected-cell-end-tag",
+        "(1,37): unexpected-end-tag",
+        "(1,45): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "svg svg": true,
+            "svg desc": true,
+            "circle": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "svg",
+                                    "ns": "http://www.w3.org/2000/svg",
+                                    "children": [
+                                      {
+                                        "tag": "desc",
+                                        "ns": "http://www.w3.org/2000/svg"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              },
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "circle"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><tr><td><svg><desc></desc></svg></td><td><circle></circle></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td><svg><desc></desc></svg></td><td><circle></circle></td></tr></tbody></table>"
+      }
+    }
+  ],
+  "plain-text-unsafe.dat": [
+    {
+      "data": "FOO&#x000D;ZOO",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,11): illegal-codepoint-for-numeric-entity"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO\rZOO"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO\rZOO</body></html>",
+        "noQuirksBodyHtml": "FOO\rZOO"
+      }
+    },
+    {
+      "data": "<html>\u0000<frameset></frameset>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,7): invalid-codepoint",
+        "(1,7): invalid-codepoint-in-body",
+        "(1,17): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<html> \u0000 <frameset></frameset>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,8): invalid-codepoint",
+        "(1,8): invalid-codepoint-in-body",
+        "(1,19): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": "  "
+      }
+    },
+    {
+      "data": "<html>a\u0000a<frameset></frameset>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,8): invalid-codepoint",
+        "(1,8): invalid-codepoint-in-body",
+        "(1,19): unexpected-start-tag",
+        "(1,30): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "aa"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>aa</body></html>",
+        "noQuirksBodyHtml": "aa"
+      }
+    },
+    {
+      "data": "<html>\u0000\u0000<frameset></frameset>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,7): invalid-codepoint",
+        "(1,7): invalid-codepoint-in-body",
+        "(1,8): invalid-codepoint",
+        "(1,8): invalid-codepoint-in-body",
+        "(1,18): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<html>\u0000\n <frameset></frameset>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,7): invalid-codepoint",
+        "(1,7): invalid-codepoint-in-body",
+        "(2,11): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": "\n "
+      }
+    },
+    {
+      "data": "<html><select>\u0000",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,15): invalid-codepoint",
+        "(1,15): invalid-codepoint-in-select",
+        "(1,15): eof-in-select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><select></select></body></html>",
+        "noQuirksBodyHtml": "<select></select>"
+      }
+    },
+    {
+      "data": "\u0000",
+      "errors": [
+        "(1,1): invalid-codepoint",
+        "(1,1): expected-doctype-but-got-chars",
+        "(1,1): invalid-codepoint-in-body"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<body>\u0000",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,7): invalid-codepoint",
+        "(1,7): invalid-codepoint-in-body"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<plaintext>\u0000filler\u0000text\u0000",
+      "errors": [
+        "(1,11): expected-doctype-but-got-start-tag",
+        "(1,12): invalid-codepoint",
+        "(1,19): invalid-codepoint",
+        "(1,24): invalid-codepoint",
+        "(1,24): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "plaintext": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "plaintext",
+                    "children": [
+                      {
+                        "text": "�filler�text�",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><plaintext>�filler�text�</plaintext></body></html>",
+        "noQuirksBodyHtml": "<plaintext>�filler�text�</plaintext>"
+      }
+    },
+    {
+      "data": "<svg><![CDATA[\u0000filler\u0000text\u0000]]>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,30): invalid-codepoint",
+        "(1,30): invalid-codepoint",
+        "(1,30): invalid-codepoint",
+        "(1,30): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "�filler�text�"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>�filler�text�</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>�filler�text�</svg>"
+      }
+    },
+    {
+      "data": "<body><!\u0000>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,8): expected-dashes-or-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "comment": "�"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><!--�--></body></html>",
+        "noQuirksBodyHtml": "<!--�-->"
+      }
+    },
+    {
+      "data": "<body><!\u0000filler\u0000text>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,8): expected-dashes-or-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "comment": "�filler�text"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><!--�filler�text--></body></html>",
+        "noQuirksBodyHtml": "<!--�filler�text-->"
+      }
+    },
+    {
+      "data": "<body><svg><foreignObject>\u0000filler\u0000text",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,27): invalid-codepoint",
+        "(1,27): invalid-codepoint-in-body",
+        "(1,34): invalid-codepoint",
+        "(1,34): invalid-codepoint-in-body",
+        "(1,38): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg foreignObject": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "foreignObject",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "text": "fillertext"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg><foreignObject>fillertext</foreignObject></svg></body></html>",
+        "noQuirksBodyHtml": "<svg><foreignObject>fillertext</foreignObject></svg>"
+      }
+    },
+    {
+      "data": "<svg>\u0000filler\u0000text",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,6): invalid-codepoint",
+        "(1,6): invalid-codepoint-in-foreign-content",
+        "(1,13): invalid-codepoint",
+        "(1,13): invalid-codepoint-in-foreign-content",
+        "(1,17): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "�filler�text"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>�filler�text</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>�filler�text</svg>"
+      }
+    },
+    {
+      "data": "<svg>\u0000<frameset>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,6): invalid-codepoint",
+        "(1,6): invalid-codepoint-in-foreign-content",
+        "(1,16): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "�"
+                      },
+                      {
+                        "tag": "frameset",
+                        "ns": "http://www.w3.org/2000/svg"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>�<frameset></frameset></svg></body></html>",
+        "noQuirksBodyHtml": "<svg>�<frameset></frameset></svg>"
+      }
+    },
+    {
+      "data": "<svg>\u0000 <frameset>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,6): invalid-codepoint",
+        "(1,6): invalid-codepoint-in-foreign-content",
+        "(1,17): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "� "
+                      },
+                      {
+                        "tag": "frameset",
+                        "ns": "http://www.w3.org/2000/svg"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>� <frameset></frameset></svg></body></html>",
+        "noQuirksBodyHtml": "<svg>� <frameset></frameset></svg>"
+      }
+    },
+    {
+      "data": "<svg>\u0000a<frameset>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,6): invalid-codepoint",
+        "(1,6): invalid-codepoint-in-foreign-content",
+        "(1,17): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "�a"
+                      },
+                      {
+                        "tag": "frameset",
+                        "ns": "http://www.w3.org/2000/svg"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>�a<frameset></frameset></svg></body></html>",
+        "noQuirksBodyHtml": "<svg>�a<frameset></frameset></svg>"
+      }
+    },
+    {
+      "data": "<svg>\u0000</svg><frameset>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,6): invalid-codepoint",
+        "(1,6): invalid-codepoint-in-foreign-content",
+        "(1,22): unexpected-start-tag",
+        "(1,22): eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": "<svg>�</svg>"
+      }
+    },
+    {
+      "data": "<svg>\u0000 </svg><frameset>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,6): invalid-codepoint",
+        "(1,6): invalid-codepoint-in-foreign-content",
+        "(1,23): unexpected-start-tag",
+        "(1,23): eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": "<svg>� </svg>"
+      }
+    },
+    {
+      "data": "<svg>\u0000a</svg><frameset>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,6): invalid-codepoint",
+        "(1,6): invalid-codepoint-in-foreign-content",
+        "(1,23): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "�a"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>�a</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>�a</svg>"
+      }
+    },
+    {
+      "data": "<svg><path></path></svg><frameset>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,34): unexpected-start-tag",
+        "(1,34): eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": "<svg><path></path></svg>"
+      }
+    },
+    {
+      "data": "<svg><p><frameset>",
+      "errors": [
+        "(1, 5) expected-doctype-but-got-start-tag",
+        "(1, 8) unexpected-html-element-in-foreign-content",
+        "(1, 18) unexpected-start-tag",
+        "(1, 18) eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": "<svg><p><frameset></frameset></p></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><pre>\r\n\r\nA</pre>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "pre": true
+          },
+          "doctype": true,
+          "extraNL": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "pre",
+                    "children": [
+                      {
+                        "text": "\nA",
+                        "extraNL": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><pre>\n\nA</pre></body></html>",
+        "noQuirksBodyHtml": "<pre>\n\nA</pre>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><pre>\r\rA</pre>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "pre": true
+          },
+          "doctype": true,
+          "extraNL": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "pre",
+                    "children": [
+                      {
+                        "text": "\nA",
+                        "extraNL": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><pre>\n\nA</pre></body></html>",
+        "noQuirksBodyHtml": "<pre>\n\nA</pre>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><pre>\rA</pre>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "pre": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "pre",
+                    "children": [
+                      {
+                        "text": "A"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><pre>A</pre></body></html>",
+        "noQuirksBodyHtml": "<pre>A</pre>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><table><tr><td><math><mtext>\u0000a",
+      "errors": [
+        "(1,44): invalid-codepoint",
+        "(1,44): invalid-codepoint-in-body",
+        "(1,45): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "math math": true,
+            "math mtext": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "math",
+                                    "ns": "http://www.w3.org/1998/Math/MathML",
+                                    "children": [
+                                      {
+                                        "tag": "mtext",
+                                        "ns": "http://www.w3.org/1998/Math/MathML",
+                                        "children": [
+                                          {
+                                            "text": "a"
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><math><mtext>a</mtext></math></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td><math><mtext>a</mtext></math></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><table><tr><td><svg><foreignObject>\u0000a",
+      "errors": [
+        "(1,51): invalid-codepoint",
+        "(1,51): invalid-codepoint-in-body",
+        "(1,52): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "svg svg": true,
+            "svg foreignObject": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "svg",
+                                    "ns": "http://www.w3.org/2000/svg",
+                                    "children": [
+                                      {
+                                        "tag": "foreignObject",
+                                        "ns": "http://www.w3.org/2000/svg",
+                                        "children": [
+                                          {
+                                            "text": "a"
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><svg><foreignObject>a</foreignObject></svg></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td><svg><foreignObject>a</foreignObject></svg></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><math><mi>a\u0000b",
+      "errors": [
+        "(1,27): invalid-codepoint",
+        "(1,27): invalid-codepoint-in-body",
+        "(1,28): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mi": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "text": "ab"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math><mi>ab</mi></math></body></html>",
+        "noQuirksBodyHtml": "<math><mi>ab</mi></math>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><math><mo>a\u0000b",
+      "errors": [
+        "(1,27): invalid-codepoint",
+        "(1,27): invalid-codepoint-in-body",
+        "(1,28): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mo": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mo",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "text": "ab"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math><mo>ab</mo></math></body></html>",
+        "noQuirksBodyHtml": "<math><mo>ab</mo></math>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><math><mn>a\u0000b",
+      "errors": [
+        "(1,27): invalid-codepoint",
+        "(1,27): invalid-codepoint-in-body",
+        "(1,28): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mn": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mn",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "text": "ab"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math><mn>ab</mn></math></body></html>",
+        "noQuirksBodyHtml": "<math><mn>ab</mn></math>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><math><ms>a\u0000b",
+      "errors": [
+        "(1,27): invalid-codepoint",
+        "(1,27): invalid-codepoint-in-body",
+        "(1,28): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math ms": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "ms",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "text": "ab"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math><ms>ab</ms></math></body></html>",
+        "noQuirksBodyHtml": "<math><ms>ab</ms></math>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><math><mtext>a\u0000b",
+      "errors": [
+        "(1,30): invalid-codepoint",
+        "(1,30): invalid-codepoint-in-body",
+        "(1,31): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mtext": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mtext",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "text": "ab"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math><mtext>ab</mtext></math></body></html>",
+        "noQuirksBodyHtml": "<math><mtext>ab</mtext></math>"
+      }
+    }
+  ],
+  "ruby.dat": [
+    {
+      "data": "<html><ruby>a<rb>b<rb></ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rb": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "rb",
+                        "children": [
+                          {
+                            "text": "b"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "rb"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby>a<rb>b</rb><rb></rb></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby>a<rb>b</rb><rb></rb></ruby>"
+      }
+    },
+    {
+      "data": "<html><ruby>a<rb>b<rt></ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rb": true,
+            "rt": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "rb",
+                        "children": [
+                          {
+                            "text": "b"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "rt"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby>a<rb>b</rb><rt></rt></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby>a<rb>b</rb><rt></rt></ruby>"
+      }
+    },
+    {
+      "data": "<html><ruby>a<rb>b<rtc></ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rb": true,
+            "rtc": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "rb",
+                        "children": [
+                          {
+                            "text": "b"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "rtc"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby>a<rb>b</rb><rtc></rtc></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby>a<rb>b</rb><rtc></rtc></ruby>"
+      }
+    },
+    {
+      "data": "<html><ruby>a<rb>b<rp></ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rb": true,
+            "rp": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "rb",
+                        "children": [
+                          {
+                            "text": "b"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "rp"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby>a<rb>b</rb><rp></rp></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby>a<rb>b</rb><rp></rp></ruby>"
+      }
+    },
+    {
+      "data": "<html><ruby>a<rb>b<span></ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rb": true,
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "rb",
+                        "children": [
+                          {
+                            "text": "b"
+                          },
+                          {
+                            "tag": "span"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby>a<rb>b<span></span></rb></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby>a<rb>b<span></span></rb></ruby>"
+      }
+    },
+    {
+      "data": "<html><ruby>a<rt>b<rb></ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rt": true,
+            "rb": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "rt",
+                        "children": [
+                          {
+                            "text": "b"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "rb"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby>a<rt>b</rt><rb></rb></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby>a<rt>b</rt><rb></rb></ruby>"
+      }
+    },
+    {
+      "data": "<html><ruby>a<rt>b<rt></ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rt": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "rt",
+                        "children": [
+                          {
+                            "text": "b"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "rt"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby>a<rt>b</rt><rt></rt></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby>a<rt>b</rt><rt></rt></ruby>"
+      }
+    },
+    {
+      "data": "<html><ruby>a<rt>b<rtc></ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rt": true,
+            "rtc": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "rt",
+                        "children": [
+                          {
+                            "text": "b"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "rtc"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby>a<rt>b</rt><rtc></rtc></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby>a<rt>b</rt><rtc></rtc></ruby>"
+      }
+    },
+    {
+      "data": "<html><ruby>a<rt>b<rp></ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rt": true,
+            "rp": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "rt",
+                        "children": [
+                          {
+                            "text": "b"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "rp"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby>a<rt>b</rt><rp></rp></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby>a<rt>b</rt><rp></rp></ruby>"
+      }
+    },
+    {
+      "data": "<html><ruby>a<rt>b<span></ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rt": true,
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "rt",
+                        "children": [
+                          {
+                            "text": "b"
+                          },
+                          {
+                            "tag": "span"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby>a<rt>b<span></span></rt></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby>a<rt>b<span></span></rt></ruby>"
+      }
+    },
+    {
+      "data": "<html><ruby>a<rtc>b<rb></ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rtc": true,
+            "rb": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "rtc",
+                        "children": [
+                          {
+                            "text": "b"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "rb"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby>a<rtc>b</rtc><rb></rb></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby>a<rtc>b</rtc><rb></rb></ruby>"
+      }
+    },
+    {
+      "data": "<html><ruby>a<rtc>b<rt>c<rt>d</ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rtc": true,
+            "rt": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "rtc",
+                        "children": [
+                          {
+                            "text": "b"
+                          },
+                          {
+                            "tag": "rt",
+                            "children": [
+                              {
+                                "text": "c"
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "rt",
+                            "children": [
+                              {
+                                "text": "d"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby>a<rtc>b<rt>c</rt><rt>d</rt></rtc></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby>a<rtc>b<rt>c</rt><rt>d</rt></rtc></ruby>"
+      }
+    },
+    {
+      "data": "<html><ruby>a<rtc>b<rtc></ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rtc": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "rtc",
+                        "children": [
+                          {
+                            "text": "b"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "rtc"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby>a<rtc>b</rtc><rtc></rtc></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby>a<rtc>b</rtc><rtc></rtc></ruby>"
+      }
+    },
+    {
+      "data": "<html><ruby>a<rtc>b<rp></ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rtc": true,
+            "rp": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "rtc",
+                        "children": [
+                          {
+                            "text": "b"
+                          },
+                          {
+                            "tag": "rp"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby>a<rtc>b<rp></rp></rtc></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby>a<rtc>b<rp></rp></rtc></ruby>"
+      }
+    },
+    {
+      "data": "<html><ruby>a<rtc>b<span></ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rtc": true,
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "rtc",
+                        "children": [
+                          {
+                            "text": "b"
+                          },
+                          {
+                            "tag": "span"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby>a<rtc>b<span></span></rtc></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby>a<rtc>b<span></span></rtc></ruby>"
+      }
+    },
+    {
+      "data": "<html><ruby>a<rp>b<rb></ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rp": true,
+            "rb": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "rp",
+                        "children": [
+                          {
+                            "text": "b"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "rb"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby>a<rp>b</rp><rb></rb></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby>a<rp>b</rp><rb></rb></ruby>"
+      }
+    },
+    {
+      "data": "<html><ruby>a<rp>b<rt></ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rp": true,
+            "rt": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "rp",
+                        "children": [
+                          {
+                            "text": "b"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "rt"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby>a<rp>b</rp><rt></rt></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby>a<rp>b</rp><rt></rt></ruby>"
+      }
+    },
+    {
+      "data": "<html><ruby>a<rp>b<rtc></ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rp": true,
+            "rtc": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "rp",
+                        "children": [
+                          {
+                            "text": "b"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "rtc"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby>a<rp>b</rp><rtc></rtc></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby>a<rp>b</rp><rtc></rtc></ruby>"
+      }
+    },
+    {
+      "data": "<html><ruby>a<rp>b<rp></ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rp": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "rp",
+                        "children": [
+                          {
+                            "text": "b"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "rp"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby>a<rp>b</rp><rp></rp></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby>a<rp>b</rp><rp></rp></ruby>"
+      }
+    },
+    {
+      "data": "<html><ruby>a<rp>b<span></ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rp": true,
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "rp",
+                        "children": [
+                          {
+                            "text": "b"
+                          },
+                          {
+                            "tag": "span"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby>a<rp>b<span></span></rp></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby>a<rp>b<span></span></rp></ruby>"
+      }
+    },
+    {
+      "data": "<html><ruby><rtc><ruby>a<rb>b<rt></ruby></ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rtc": true,
+            "rb": true,
+            "rt": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "tag": "rtc",
+                        "children": [
+                          {
+                            "tag": "ruby",
+                            "children": [
+                              {
+                                "text": "a"
+                              },
+                              {
+                                "tag": "rb",
+                                "children": [
+                                  {
+                                    "text": "b"
+                                  }
+                                ]
+                              },
+                              {
+                                "tag": "rt"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby><rtc><ruby>a<rb>b</rb><rt></rt></ruby></rtc></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby><rtc><ruby>a<rb>b</rb><rt></rt></ruby></rtc></ruby>"
+      }
+    }
+  ],
+  "scriptdata01.dat": [
+    {
+      "data": "FOO<script>'Hello'</script>BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "'Hello'",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "BAR"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script>'Hello'</script>BAR</body></html>",
+        "noQuirksBodyHtml": "FOO<script>'Hello'</script>BAR"
+      }
+    },
+    {
+      "data": "FOO<script></script>BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script"
+                  },
+                  {
+                    "text": "BAR"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script></script>BAR</body></html>",
+        "noQuirksBodyHtml": "FOO<script></script>BAR"
+      }
+    },
+    {
+      "data": "FOO<script></script >BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script"
+                  },
+                  {
+                    "text": "BAR"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script></script>BAR</body></html>",
+        "noQuirksBodyHtml": "FOO<script></script>BAR"
+      }
+    },
+    {
+      "data": "FOO<script></script/>BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,21): self-closing-flag-on-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script"
+                  },
+                  {
+                    "text": "BAR"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script></script>BAR</body></html>",
+        "noQuirksBodyHtml": "FOO<script></script>BAR"
+      }
+    },
+    {
+      "data": "FOO<script></script/ >BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,20): unexpected-character-after-solidus-in-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script"
+                  },
+                  {
+                    "text": "BAR"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script></script>BAR</body></html>",
+        "noQuirksBodyHtml": "FOO<script></script>BAR"
+      }
+    },
+    {
+      "data": "FOO<script type=\"text/plain\"></scriptx>BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,42): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "text/plain"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "</scriptx>BAR",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script type=\"text/plain\"></scriptx>BAR</script></body></html>",
+        "noQuirksBodyHtml": "FOO<script type=\"text/plain\"></scriptx>BAR</script>"
+      }
+    },
+    {
+      "data": "FOO<script></script foo=\">\" dd>BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,31): attributes-in-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script"
+                  },
+                  {
+                    "text": "BAR"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script></script>BAR</body></html>",
+        "noQuirksBodyHtml": "FOO<script></script>BAR"
+      }
+    },
+    {
+      "data": "FOO<script>'<'</script>BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "'<'",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "BAR"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script>'<'</script>BAR</body></html>",
+        "noQuirksBodyHtml": "FOO<script>'<'</script>BAR"
+      }
+    },
+    {
+      "data": "FOO<script>'<!'</script>BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "'<!'",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "BAR"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script>'<!'</script>BAR</body></html>",
+        "noQuirksBodyHtml": "FOO<script>'<!'</script>BAR"
+      }
+    },
+    {
+      "data": "FOO<script>'<!-'</script>BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "'<!-'",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "BAR"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script>'<!-'</script>BAR</body></html>",
+        "noQuirksBodyHtml": "FOO<script>'<!-'</script>BAR"
+      }
+    },
+    {
+      "data": "FOO<script>'<!--'</script>BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "'<!--'",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "BAR"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script>'<!--'</script>BAR</body></html>",
+        "noQuirksBodyHtml": "FOO<script>'<!--'</script>BAR"
+      }
+    },
+    {
+      "data": "FOO<script>'<!---'</script>BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "'<!---'",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "BAR"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script>'<!---'</script>BAR</body></html>",
+        "noQuirksBodyHtml": "FOO<script>'<!---'</script>BAR"
+      }
+    },
+    {
+      "data": "FOO<script>'<!-->'</script>BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "'<!-->'",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "BAR"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script>'<!-->'</script>BAR</body></html>",
+        "noQuirksBodyHtml": "FOO<script>'<!-->'</script>BAR"
+      }
+    },
+    {
+      "data": "FOO<script>'<!-->'</script>BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "'<!-->'",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "BAR"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script>'<!-->'</script>BAR</body></html>",
+        "noQuirksBodyHtml": "FOO<script>'<!-->'</script>BAR"
+      }
+    },
+    {
+      "data": "FOO<script>'<!-- potato'</script>BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "'<!-- potato'",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "BAR"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script>'<!-- potato'</script>BAR</body></html>",
+        "noQuirksBodyHtml": "FOO<script>'<!-- potato'</script>BAR"
+      }
+    },
+    {
+      "data": "FOO<script>'<!-- <sCrIpt'</script>BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "'<!-- <sCrIpt'",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "BAR"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script>'<!-- <sCrIpt'</script>BAR</body></html>",
+        "noQuirksBodyHtml": "FOO<script>'<!-- <sCrIpt'</script>BAR"
+      }
+    },
+    {
+      "data": "FOO<script type=\"text/plain\">'<!-- <sCrIpt>'</script>BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,56): expected-script-data-but-got-eof",
+        "(1,56): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "text/plain"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "'<!-- <sCrIpt>'</script>BAR",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script type=\"text/plain\">'<!-- <sCrIpt>'</script>BAR</script></body></html>",
+        "noQuirksBodyHtml": "FOO<script type=\"text/plain\">'<!-- <sCrIpt>'</script>BAR</script>"
+      }
+    },
+    {
+      "data": "FOO<script type=\"text/plain\">'<!-- <sCrIpt> -'</script>BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,58): expected-script-data-but-got-eof",
+        "(1,58): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "text/plain"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "'<!-- <sCrIpt> -'</script>BAR",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script type=\"text/plain\">'<!-- <sCrIpt> -'</script>BAR</script></body></html>",
+        "noQuirksBodyHtml": "FOO<script type=\"text/plain\">'<!-- <sCrIpt> -'</script>BAR</script>"
+      }
+    },
+    {
+      "data": "FOO<script type=\"text/plain\">'<!-- <sCrIpt> --'</script>BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,59): expected-script-data-but-got-eof",
+        "(1,59): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "text/plain"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "'<!-- <sCrIpt> --'</script>BAR",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script type=\"text/plain\">'<!-- <sCrIpt> --'</script>BAR</script></body></html>",
+        "noQuirksBodyHtml": "FOO<script type=\"text/plain\">'<!-- <sCrIpt> --'</script>BAR</script>"
+      }
+    },
+    {
+      "data": "FOO<script>'<!-- <sCrIpt> -->'</script>BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "'<!-- <sCrIpt> -->'",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "BAR"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script>'<!-- <sCrIpt> -->'</script>BAR</body></html>",
+        "noQuirksBodyHtml": "FOO<script>'<!-- <sCrIpt> -->'</script>BAR"
+      }
+    },
+    {
+      "data": "FOO<script type=\"text/plain\">'<!-- <sCrIpt> --!>'</script>BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,61): expected-script-data-but-got-eof",
+        "(1,61): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "text/plain"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "'<!-- <sCrIpt> --!>'</script>BAR",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script type=\"text/plain\">'<!-- <sCrIpt> --!>'</script>BAR</script></body></html>",
+        "noQuirksBodyHtml": "FOO<script type=\"text/plain\">'<!-- <sCrIpt> --!>'</script>BAR</script>"
+      }
+    },
+    {
+      "data": "FOO<script type=\"text/plain\">'<!-- <sCrIpt> -- >'</script>BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,61): expected-script-data-but-got-eof",
+        "(1,61): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "text/plain"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "'<!-- <sCrIpt> -- >'</script>BAR",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script type=\"text/plain\">'<!-- <sCrIpt> -- >'</script>BAR</script></body></html>",
+        "noQuirksBodyHtml": "FOO<script type=\"text/plain\">'<!-- <sCrIpt> -- >'</script>BAR</script>"
+      }
+    },
+    {
+      "data": "FOO<script type=\"text/plain\">'<!-- <sCrIpt '</script>BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,56): expected-script-data-but-got-eof",
+        "(1,56): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "text/plain"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "'<!-- <sCrIpt '</script>BAR",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script type=\"text/plain\">'<!-- <sCrIpt '</script>BAR</script></body></html>",
+        "noQuirksBodyHtml": "FOO<script type=\"text/plain\">'<!-- <sCrIpt '</script>BAR</script>"
+      }
+    },
+    {
+      "data": "FOO<script type=\"text/plain\">'<!-- <sCrIpt/'</script>BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars",
+        "(1,56): expected-script-data-but-got-eof",
+        "(1,56): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "text/plain"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "'<!-- <sCrIpt/'</script>BAR",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script type=\"text/plain\">'<!-- <sCrIpt/'</script>BAR</script></body></html>",
+        "noQuirksBodyHtml": "FOO<script type=\"text/plain\">'<!-- <sCrIpt/'</script>BAR</script>"
+      }
+    },
+    {
+      "data": "FOO<script type=\"text/plain\">'<!-- <sCrIpt\\'</script>BAR",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "text/plain"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "'<!-- <sCrIpt\\'",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "BAR"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script type=\"text/plain\">'<!-- <sCrIpt\\'</script>BAR</body></html>",
+        "noQuirksBodyHtml": "FOO<script type=\"text/plain\">'<!-- <sCrIpt\\'</script>BAR"
+      }
+    },
+    {
+      "data": "FOO<script type=\"text/plain\">'<!-- <sCrIpt/'</script>BAR</script>QUX",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "text/plain"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "'<!-- <sCrIpt/'</script>BAR",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "QUX"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script type=\"text/plain\">'<!-- <sCrIpt/'</script>BAR</script>QUX</body></html>",
+        "noQuirksBodyHtml": "FOO<script type=\"text/plain\">'<!-- <sCrIpt/'</script>BAR</script>QUX"
+      }
+    },
+    {
+      "data": "FOO<script><!--<script>-></script>--></script>QUX",
+      "errors": [
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "script": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "FOO"
+                  },
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script>-></script>-->",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "QUX"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>FOO<script><!--<script>-></script>--></script>QUX</body></html>",
+        "noQuirksBodyHtml": "FOO<script><!--<script>-></script>--></script>QUX"
+      }
+    }
+  ],
+  "tables01.dat": [
+    {
+      "data": "<table><th>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,11): unexpected-cell-in-table-body",
+        "(1,11): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "th": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "th"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><tr><th></th></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><th></th></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<table><td>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,11): unexpected-cell-in-table-body",
+        "(1,11): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><tr><td></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<table><col foo='bar'>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,22): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "colgroup": true,
+            "col": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "colgroup",
+                        "children": [
+                          {
+                            "tag": "col",
+                            "attrs": [
+                              {
+                                "name": "foo",
+                                "value": "bar"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><colgroup><col foo=\"bar\"></colgroup></table></body></html>",
+        "noQuirksBodyHtml": "<table><colgroup><col foo=\"bar\"></colgroup></table>"
+      }
+    },
+    {
+      "data": "<table><colgroup></html>foo",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,24): unexpected-end-tag",
+        "(1,27): foster-parenting-character-in-table",
+        "(1,27): foster-parenting-character-in-table",
+        "(1,27): foster-parenting-character-in-table",
+        "(1,27): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "colgroup": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "foo"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "colgroup"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>foo<table><colgroup></colgroup></table></body></html>",
+        "noQuirksBodyHtml": "foo<table><colgroup></colgroup></table>"
+      }
+    },
+    {
+      "data": "<table></table><p>foo",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table"
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "foo"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table></table><p>foo</p></body></html>",
+        "noQuirksBodyHtml": "<table></table><p>foo</p>"
+      }
+    },
+    {
+      "data": "<table></body></caption></col></colgroup></html></tbody></td></tfoot></th></thead></tr><td>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,14): unexpected-end-tag",
+        "(1,24): unexpected-end-tag",
+        "(1,30): unexpected-end-tag",
+        "(1,41): unexpected-end-tag",
+        "(1,48): unexpected-end-tag",
+        "(1,56): unexpected-end-tag",
+        "(1,61): unexpected-end-tag",
+        "(1,69): unexpected-end-tag",
+        "(1,74): unexpected-end-tag",
+        "(1,82): unexpected-end-tag",
+        "(1,87): unexpected-end-tag",
+        "(1,91): unexpected-cell-in-table-body",
+        "(1,91): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><tr><td></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<table><select><option>3</select></table>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,15): unexpected-start-tag-implies-table-voodoo"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "option": true,
+            "table": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "tag": "option",
+                        "children": [
+                          {
+                            "text": "3"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><select><option>3</option></select><table></table></body></html>",
+        "noQuirksBodyHtml": "<select><option>3</option></select><table></table>"
+      }
+    },
+    {
+      "data": "<table><select><table></table></select></table>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,15): unexpected-start-tag-implies-table-voodoo",
+        "(1,22): unexpected-table-element-start-tag-in-select-in-table",
+        "(1,22): unexpected-start-tag-implies-end-tag",
+        "(1,39): unexpected-end-tag",
+        "(1,47): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "table": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select"
+                  },
+                  {
+                    "tag": "table"
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><select></select><table></table><table></table></body></html>",
+        "noQuirksBodyHtml": "<select></select><table></table><table></table>"
+      }
+    },
+    {
+      "data": "<table><select></table>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,15): unexpected-start-tag-implies-table-voodoo",
+        "(1,23): unexpected-table-element-end-tag-in-select-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "table": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select"
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><select></select><table></table></body></html>",
+        "noQuirksBodyHtml": "<select></select><table></table>"
+      }
+    },
+    {
+      "data": "<table><select><option>A<tr><td>B</td></tr></table>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,15): unexpected-start-tag-implies-table-voodoo",
+        "(1,28): unexpected-table-element-start-tag-in-select-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "option": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "tag": "option",
+                        "children": [
+                          {
+                            "text": "A"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "text": "B"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><select><option>A</option></select><table><tbody><tr><td>B</td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<select><option>A</option></select><table><tbody><tr><td>B</td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<table><td></body></caption></col></colgroup></html>foo",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,11): unexpected-cell-in-table-body",
+        "(1,18): unexpected-end-tag",
+        "(1,28): unexpected-end-tag",
+        "(1,34): unexpected-end-tag",
+        "(1,45): unexpected-end-tag",
+        "(1,52): unexpected-end-tag",
+        "(1,55): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "text": "foo"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><tr><td>foo</td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td>foo</td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<table><td>A</table>B",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,11): unexpected-cell-in-table-body"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "text": "A"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "text": "B"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><tr><td>A</td></tr></tbody></table>B</body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td>A</td></tr></tbody></table>B"
+      }
+    },
+    {
+      "data": "<table><tr><caption>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,20): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "caption": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "caption"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><tr></tr></tbody><caption></caption></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr></tr></tbody><caption></caption></table>"
+      }
+    },
+    {
+      "data": "<table><tr></body></caption></col></colgroup></html></td></th><td>foo",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,18): unexpected-end-tag-in-table-row",
+        "(1,28): unexpected-end-tag-in-table-row",
+        "(1,34): unexpected-end-tag-in-table-row",
+        "(1,45): unexpected-end-tag-in-table-row",
+        "(1,52): unexpected-end-tag-in-table-row",
+        "(1,57): unexpected-end-tag-in-table-row",
+        "(1,62): unexpected-end-tag-in-table-row",
+        "(1,69): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "text": "foo"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><tr><td>foo</td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td>foo</td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<table><td><tr>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,11): unexpected-cell-in-table-body",
+        "(1,15): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td"
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><tr><td></td></tr><tr></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td></td></tr><tr></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<table><td><button><td>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,11): unexpected-cell-in-table-body",
+        "(1,23): unexpected-cell-end-tag",
+        "(1,23): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "button": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "button"
+                                  }
+                                ]
+                              },
+                              {
+                                "tag": "td"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><tr><td><button></button></td><td></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td><button></button></td><td></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<table><tr><td><svg><desc><td>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,30): unexpected-cell-end-tag",
+        "(1,30): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "svg svg": true,
+            "svg desc": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "svg",
+                                    "ns": "http://www.w3.org/2000/svg",
+                                    "children": [
+                                      {
+                                        "tag": "desc",
+                                        "ns": "http://www.w3.org/2000/svg"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              },
+                              {
+                                "tag": "td"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><tr><td><svg><desc></desc></svg></td><td></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td><svg><desc></desc></svg></td><td></td></tr></tbody></table>"
+      }
+    }
+  ],
+  "template.dat": [
+    {
+      "data": "<body><template>Hello</template>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "text": "Hello"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template>Hello</template></body></html>",
+        "noQuirksBodyHtml": "<template>Hello</template>"
+      }
+    },
+    {
+      "data": "<template>Hello</template>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "text": "Hello"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template>Hello</template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template>Hello</template>"
+      }
+    },
+    {
+      "data": "<template></template><div></div>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "body": true,
+            "div": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template></template></head><body><div></div></body></html>",
+        "noQuirksBodyHtml": "<template></template><div></div>"
+      }
+    },
+    {
+      "data": "<html><template>Hello</template>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "text": "Hello"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template>Hello</template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template>Hello</template>"
+      }
+    },
+    {
+      "data": "<head><template><div></div></template></head>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "div": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "div"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><div></div></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template><div></div></template>"
+      }
+    },
+    {
+      "data": "<div><template><div><span></template><b>",
+      "errors": [
+        " * (1,6) missing DOCTYPE",
+        " * (1,38) mismatched template end tag",
+        " * (1,41) unexpected end of file"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "template": true,
+            "span": true,
+            "b": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "template",
+                        "children": [
+                          {
+                            "content": true,
+                            "children": [
+                              {
+                                "tag": "div",
+                                "children": [
+                                  {
+                                    "tag": "span"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "b"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div><template><div><span></span></div></template><b></b></div></body></html>",
+        "noQuirksBodyHtml": "<div><template><div><span></span></div></template><b></b></div>"
+      }
+    },
+    {
+      "data": "<div><template></div>Hello",
+      "errors": [
+        " * (1,6) missing DOCTYPE",
+        " * (1,22) unexpected token in template",
+        " * (1,27) unexpected end of file in template",
+        " * (1,27) unexpected end of file"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "template": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "template",
+                        "children": [
+                          {
+                            "content": true,
+                            "children": [
+                              {
+                                "text": "Hello"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div><template>Hello</template></div></body></html>",
+        "noQuirksBodyHtml": "<div><template>Hello</template></div>"
+      }
+    },
+    {
+      "data": "<div></template></div>",
+      "errors": [
+        " * (1,6) missing DOCTYPE",
+        " * (1,17) unexpected template end tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div></div></body></html>",
+        "noQuirksBodyHtml": "<div></div>"
+      }
+    },
+    {
+      "data": "<table><template></template></table>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "template": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "template",
+                        "children": [
+                          {
+                            "content": true
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><template></template></table></body></html>",
+        "noQuirksBodyHtml": "<table><template></template></table>"
+      }
+    },
+    {
+      "data": "<table><template></template></div>",
+      "errors": [
+        " * (1,8) missing DOCTYPE",
+        " * (1,35) unexpected token in table - foster parenting",
+        " * (1,35) unexpected end tag",
+        " * (1,35) unexpected end of file"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "template": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "template",
+                        "children": [
+                          {
+                            "content": true
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><template></template></table></body></html>",
+        "noQuirksBodyHtml": "<table><template></template></table>"
+      }
+    },
+    {
+      "data": "<table><div><template></template></div>",
+      "errors": [
+        " * (1,8) missing DOCTYPE",
+        " * (1,13) unexpected token in table - foster parenting",
+        " * (1,40) unexpected token in table - foster parenting",
+        " * (1,40) unexpected end of file"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "template": true,
+            "table": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "template",
+                        "children": [
+                          {
+                            "content": true
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div><template></template></div><table></table></body></html>",
+        "noQuirksBodyHtml": "<div><template></template></div><table></table>"
+      }
+    },
+    {
+      "data": "<table><template></template><div></div>",
+      "errors": [
+        "no doctype",
+        "bad div in table",
+        "bad /div in table",
+        "eof in table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "table": true,
+            "template": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "template",
+                        "children": [
+                          {
+                            "content": true
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div></div><table><template></template></table></body></html>",
+        "noQuirksBodyHtml": "<div></div><table><template></template></table>"
+      }
+    },
+    {
+      "data": "<table>   <template></template></table>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "template": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "text": "   "
+                      },
+                      {
+                        "tag": "template",
+                        "children": [
+                          {
+                            "content": true
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table>   <template></template></table></body></html>",
+        "noQuirksBodyHtml": "<table>   <template></template></table>"
+      }
+    },
+    {
+      "data": "<table><tbody><template></template></tbody>",
+      "errors": [
+        "no doctype",
+        "eof in table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "template": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><template></template></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><template></template></tbody></table>"
+      }
+    },
+    {
+      "data": "<table><tbody><template></tbody></template>",
+      "errors": [
+        "no doctype",
+        "bad /tbody",
+        "eof in table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "template": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><template></template></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><template></template></tbody></table>"
+      }
+    },
+    {
+      "data": "<table><tbody><template></template></tbody></table>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "template": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><template></template></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><template></template></tbody></table>"
+      }
+    },
+    {
+      "data": "<table><thead><template></template></thead>",
+      "errors": [
+        "no doctype",
+        "eof in table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "thead": true,
+            "template": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "thead",
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><thead><template></template></thead></table></body></html>",
+        "noQuirksBodyHtml": "<table><thead><template></template></thead></table>"
+      }
+    },
+    {
+      "data": "<table><tfoot><template></template></tfoot>",
+      "errors": [
+        "no doctype",
+        "eof in table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tfoot": true,
+            "template": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tfoot",
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tfoot><template></template></tfoot></table></body></html>",
+        "noQuirksBodyHtml": "<table><tfoot><template></template></tfoot></table>"
+      }
+    },
+    {
+      "data": "<select><template></template></select>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "template": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "tag": "template",
+                        "children": [
+                          {
+                            "content": true
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><select><template></template></select></body></html>",
+        "noQuirksBodyHtml": "<select><template></template></select>"
+      }
+    },
+    {
+      "data": "<select><template><option></option></template></select>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "template": true,
+            "option": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "tag": "template",
+                        "children": [
+                          {
+                            "content": true,
+                            "children": [
+                              {
+                                "tag": "option"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><select><template><option></option></template></select></body></html>",
+        "noQuirksBodyHtml": "<select><template><option></option></template></select>"
+      }
+    },
+    {
+      "data": "<template><option></option></select><option></option></template>",
+      "errors": [
+        "no doctype",
+        "bad /select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "option": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "option"
+                          },
+                          {
+                            "tag": "option"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><option></option><option></option></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template><option></option><option></option></template>"
+      }
+    },
+    {
+      "data": "<select><template></template><option></select>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "template": true,
+            "option": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "tag": "template",
+                        "children": [
+                          {
+                            "content": true
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "option"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><select><template></template><option></option></select></body></html>",
+        "noQuirksBodyHtml": "<select><template></template><option></option></select>"
+      }
+    },
+    {
+      "data": "<select><option><template></template></select>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "option": true,
+            "template": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "tag": "option",
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><select><option><template></template></option></select></body></html>",
+        "noQuirksBodyHtml": "<select><option><template></template></option></select>"
+      }
+    },
+    {
+      "data": "<select><template>",
+      "errors": [
+        "no doctype",
+        "eof in template",
+        "eof in select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "template": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "tag": "template",
+                        "children": [
+                          {
+                            "content": true
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><select><template></template></select></body></html>",
+        "noQuirksBodyHtml": "<select><template></template></select>"
+      }
+    },
+    {
+      "data": "<select><option></option><template>",
+      "errors": [
+        "no doctype",
+        "eof in template",
+        "eof in select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "option": true,
+            "template": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "tag": "option"
+                      },
+                      {
+                        "tag": "template",
+                        "children": [
+                          {
+                            "content": true
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><select><option></option><template></template></select></body></html>",
+        "noQuirksBodyHtml": "<select><option></option><template></template></select>"
+      }
+    },
+    {
+      "data": "<select><option></option><template><option>",
+      "errors": [
+        "no doctype",
+        "eof in template",
+        "eof in select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "option": true,
+            "template": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "tag": "option"
+                      },
+                      {
+                        "tag": "template",
+                        "children": [
+                          {
+                            "content": true,
+                            "children": [
+                              {
+                                "tag": "option"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><select><option></option><template><option></option></template></select></body></html>",
+        "noQuirksBodyHtml": "<select><option></option><template><option></option></template></select>"
+      }
+    },
+    {
+      "data": "<table><thead><template><td></template></table>",
+      "errors": [
+        " * (1,8) missing DOCTYPE"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "thead": true,
+            "template": true,
+            "td": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "thead",
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true,
+                                "children": [
+                                  {
+                                    "tag": "td"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><thead><template><td></td></template></thead></table></body></html>",
+        "noQuirksBodyHtml": "<table><thead><template><td></td></template></thead></table>"
+      }
+    },
+    {
+      "data": "<table><template><thead></template></table>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "template": true,
+            "thead": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "template",
+                        "children": [
+                          {
+                            "content": true,
+                            "children": [
+                              {
+                                "tag": "thead"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><template><thead></thead></template></table></body></html>",
+        "noQuirksBodyHtml": "<table><template><thead></thead></template></table>"
+      }
+    },
+    {
+      "data": "<body><table><template><td></tr><div></template></table>",
+      "errors": [
+        "no doctype",
+        "bad </tr>",
+        "missing </div>"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "template": true,
+            "td": true,
+            "div": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "template",
+                        "children": [
+                          {
+                            "content": true,
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "div"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><template><td><div></div></td></template></table></body></html>",
+        "noQuirksBodyHtml": "<table><template><td><div></div></td></template></table>"
+      }
+    },
+    {
+      "data": "<table><template><thead></template></thead></table>",
+      "errors": [
+        "no doctype",
+        "bad /thead after /template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "template": true,
+            "thead": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "template",
+                        "children": [
+                          {
+                            "content": true,
+                            "children": [
+                              {
+                                "tag": "thead"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><template><thead></thead></template></table></body></html>",
+        "noQuirksBodyHtml": "<table><template><thead></thead></template></table>"
+      }
+    },
+    {
+      "data": "<table><thead><template><tr></template></table>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "thead": true,
+            "template": true,
+            "tr": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "thead",
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true,
+                                "children": [
+                                  {
+                                    "tag": "tr"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><thead><template><tr></tr></template></thead></table></body></html>",
+        "noQuirksBodyHtml": "<table><thead><template><tr></tr></template></thead></table>"
+      }
+    },
+    {
+      "data": "<table><template><tr></template></table>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "template": true,
+            "tr": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "template",
+                        "children": [
+                          {
+                            "content": true,
+                            "children": [
+                              {
+                                "tag": "tr"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><template><tr></tr></template></table></body></html>",
+        "noQuirksBodyHtml": "<table><template><tr></tr></template></table>"
+      }
+    },
+    {
+      "data": "<table><tr><template><td>",
+      "errors": [
+        "no doctype",
+        "eof in template",
+        "eof in table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "template": true,
+            "td": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "template",
+                                "children": [
+                                  {
+                                    "content": true,
+                                    "children": [
+                                      {
+                                        "tag": "td"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><tr><template><td></td></template></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><template><td></td></template></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<table><template><tr><template><td></template></tr></template></table>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "template": true,
+            "tr": true,
+            "td": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "template",
+                        "children": [
+                          {
+                            "content": true,
+                            "children": [
+                              {
+                                "tag": "tr",
+                                "children": [
+                                  {
+                                    "tag": "template",
+                                    "children": [
+                                      {
+                                        "content": true,
+                                        "children": [
+                                          {
+                                            "tag": "td"
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><template><tr><template><td></td></template></tr></template></table></body></html>",
+        "noQuirksBodyHtml": "<table><template><tr><template><td></td></template></tr></template></table>"
+      }
+    },
+    {
+      "data": "<table><template><tr><template><td></td></template></tr></template></table>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "template": true,
+            "tr": true,
+            "td": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "template",
+                        "children": [
+                          {
+                            "content": true,
+                            "children": [
+                              {
+                                "tag": "tr",
+                                "children": [
+                                  {
+                                    "tag": "template",
+                                    "children": [
+                                      {
+                                        "content": true,
+                                        "children": [
+                                          {
+                                            "tag": "td"
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><template><tr><template><td></td></template></tr></template></table></body></html>",
+        "noQuirksBodyHtml": "<table><template><tr><template><td></td></template></tr></template></table>"
+      }
+    },
+    {
+      "data": "<table><template><td></template>",
+      "errors": [
+        "no doctype",
+        "eof in table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "template": true,
+            "td": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "template",
+                        "children": [
+                          {
+                            "content": true,
+                            "children": [
+                              {
+                                "tag": "td"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><template><td></td></template></table></body></html>",
+        "noQuirksBodyHtml": "<table><template><td></td></template></table>"
+      }
+    },
+    {
+      "data": "<body><template><td></td></template>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "td": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "td"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><td></td></template></body></html>",
+        "noQuirksBodyHtml": "<template><td></td></template>"
+      }
+    },
+    {
+      "data": "<body><template><template><tr></tr></template><td></td></template>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "tr": true,
+            "td": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true,
+                                "children": [
+                                  {
+                                    "tag": "tr"
+                                  }
+                                ]
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "td"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><template><tr></tr></template><td></td></template></body></html>",
+        "noQuirksBodyHtml": "<template><template><tr></tr></template><td></td></template>"
+      }
+    },
+    {
+      "data": "<table><colgroup><template><col>",
+      "errors": [
+        "no doctype",
+        "eof in template",
+        "eof in table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "colgroup": true,
+            "template": true,
+            "col": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "colgroup",
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true,
+                                "children": [
+                                  {
+                                    "tag": "col"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><colgroup><template><col></template></colgroup></table></body></html>",
+        "noQuirksBodyHtml": "<table><colgroup><template><col></template></colgroup></table>"
+      }
+    },
+    {
+      "data": "<frameset><template><frame></frame></template></frameset>",
+      "errors": [
+        " * (1,11) missing DOCTYPE",
+        " * (1,21) unexpected start tag token",
+        " * (1,36) unexpected end tag token",
+        " * (1,47) unexpected end tag token"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true,
+            "frame": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset",
+                "children": [
+                  {
+                    "tag": "frame"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset><frame></frameset></html>",
+        "noQuirksBodyHtml": "<template></template>"
+      }
+    },
+    {
+      "data": "<template><frame></frame></frameset><frame></frame></template>",
+      "errors": [
+        " * (1,11) missing DOCTYPE",
+        " * (1,18) unexpected start tag",
+        " * (1,26) unexpected end tag",
+        " * (1,37) unexpected end tag",
+        " * (1,44) unexpected start tag",
+        " * (1,52) unexpected end tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template></template>"
+      }
+    },
+    {
+      "data": "<template><div><frameset><span></span></div><span></span></template>",
+      "errors": [
+        "no doctype",
+        "bad frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "div": true,
+            "span": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "div",
+                            "children": [
+                              {
+                                "tag": "span"
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "span"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><div><span></span></div><span></span></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template><div><span></span></div><span></span></template>"
+      }
+    },
+    {
+      "data": "<body><template><div><frameset><span></span></div><span></span></template></body>",
+      "errors": [
+        "no doctype",
+        "bad frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "div": true,
+            "span": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "div",
+                            "children": [
+                              {
+                                "tag": "span"
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "span"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><div><span></span></div><span></span></template></body></html>",
+        "noQuirksBodyHtml": "<template><div><span></span></div><span></span></template>"
+      }
+    },
+    {
+      "data": "<body><template><script>var i = 1;</script><td></td></template>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "script": true,
+            "td": true
+          },
+          "template": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "script",
+                            "children": [
+                              {
+                                "text": "var i = 1;",
+                                "no_escape": true
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "td"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><script>var i = 1;</script><td></td></template></body></html>",
+        "noQuirksBodyHtml": "<template><script>var i = 1;</script><td></td></template>"
+      }
+    },
+    {
+      "data": "<body><template><tr><div></div></tr></template>",
+      "errors": [
+        "no doctype",
+        "foster-parented div",
+        "foster-parented /div"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "tr": true,
+            "div": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "tr"
+                          },
+                          {
+                            "tag": "div"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><tr></tr><div></div></template></body></html>",
+        "noQuirksBodyHtml": "<template><tr></tr><div></div></template>"
+      }
+    },
+    {
+      "data": "<body><template><tr></tr><td></td></template>",
+      "errors": [
+        "no doctype",
+        "unexpected <td>"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "tr": true,
+            "td": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "tr"
+                          },
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><tr></tr><tr><td></td></tr></template></body></html>",
+        "noQuirksBodyHtml": "<template><tr></tr><tr><td></td></tr></template>"
+      }
+    },
+    {
+      "data": "<body><template><td></td></tr><td></td></template>",
+      "errors": [
+        "no doctype",
+        "bad </tr>"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "td": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "td"
+                          },
+                          {
+                            "tag": "td"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><td></td><td></td></template></body></html>",
+        "noQuirksBodyHtml": "<template><td></td><td></td></template>"
+      }
+    },
+    {
+      "data": "<body><template><td></td><tbody><td></td></template>",
+      "errors": [
+        "no doctype",
+        "bad <tbody>"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "td": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "td"
+                          },
+                          {
+                            "tag": "td"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><td></td><td></td></template></body></html>",
+        "noQuirksBodyHtml": "<template><td></td><td></td></template>"
+      }
+    },
+    {
+      "data": "<body><template><td></td><caption></caption><td></td></template>",
+      "errors": [
+        " * (1,7) missing DOCTYPE",
+        " * (1,35) unexpected start tag in table row",
+        " * (1,45) unexpected end tag in table row"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "td": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "td"
+                          },
+                          {
+                            "tag": "td"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><td></td><td></td></template></body></html>",
+        "noQuirksBodyHtml": "<template><td></td><td></td></template>"
+      }
+    },
+    {
+      "data": "<body><template><td></td><colgroup></caption><td></td></template>",
+      "errors": [
+        " * (1,7) missing DOCTYPE",
+        " * (1,36) unexpected start tag in table row",
+        " * (1,46) unexpected end tag in table row"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "td": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "td"
+                          },
+                          {
+                            "tag": "td"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><td></td><td></td></template></body></html>",
+        "noQuirksBodyHtml": "<template><td></td><td></td></template>"
+      }
+    },
+    {
+      "data": "<body><template><td></td></table><td></td></template>",
+      "errors": [
+        "no doctype",
+        "bad </table>"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "td": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "td"
+                          },
+                          {
+                            "tag": "td"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><td></td><td></td></template></body></html>",
+        "noQuirksBodyHtml": "<template><td></td><td></td></template>"
+      }
+    },
+    {
+      "data": "<body><template><tr></tr><tbody><tr></tr></template>",
+      "errors": [
+        "no doctype",
+        "bad <tbody>"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "tr": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "tr"
+                          },
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><tr></tr><tr></tr></template></body></html>",
+        "noQuirksBodyHtml": "<template><tr></tr><tr></tr></template>"
+      }
+    },
+    {
+      "data": "<body><template><tr></tr><caption><tr></tr></template>",
+      "errors": [
+        "no doctype",
+        "bad <caption>"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "tr": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "tr"
+                          },
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><tr></tr><tr></tr></template></body></html>",
+        "noQuirksBodyHtml": "<template><tr></tr><tr></tr></template>"
+      }
+    },
+    {
+      "data": "<body><template><tr></tr></table><tr></tr></template>",
+      "errors": [
+        "no doctype",
+        "bad </table>"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "tr": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "tr"
+                          },
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><tr></tr><tr></tr></template></body></html>",
+        "noQuirksBodyHtml": "<template><tr></tr><tr></tr></template>"
+      }
+    },
+    {
+      "data": "<body><template><thead></thead><caption></caption><tbody></tbody></template>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "thead": true,
+            "caption": true,
+            "tbody": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "thead"
+                          },
+                          {
+                            "tag": "caption"
+                          },
+                          {
+                            "tag": "tbody"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><thead></thead><caption></caption><tbody></tbody></template></body></html>",
+        "noQuirksBodyHtml": "<template><thead></thead><caption></caption><tbody></tbody></template>"
+      }
+    },
+    {
+      "data": "<body><template><thead></thead></table><tbody></tbody></template></body>",
+      "errors": [
+        "no doctype",
+        "bad </table>"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "thead": true,
+            "tbody": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "thead"
+                          },
+                          {
+                            "tag": "tbody"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><thead></thead><tbody></tbody></template></body></html>",
+        "noQuirksBodyHtml": "<template><thead></thead><tbody></tbody></template>"
+      }
+    },
+    {
+      "data": "<body><template><div><tr></tr></div></template>",
+      "errors": [
+        "no doctype",
+        "bad tr",
+        "bad /tr"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "div": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "div"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><div></div></template></body></html>",
+        "noQuirksBodyHtml": "<template><div></div></template>"
+      }
+    },
+    {
+      "data": "<body><template><em>Hello</em></template>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "em": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "em",
+                            "children": [
+                              {
+                                "text": "Hello"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><em>Hello</em></template></body></html>",
+        "noQuirksBodyHtml": "<template><em>Hello</em></template>"
+      }
+    },
+    {
+      "data": "<body><template><!--comment--></template>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true
+          },
+          "template": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "comment": "comment"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><!--comment--></template></body></html>",
+        "noQuirksBodyHtml": "<template><!--comment--></template>"
+      }
+    },
+    {
+      "data": "<body><template><style></style><td></td></template>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "style": true,
+            "td": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "style"
+                          },
+                          {
+                            "tag": "td"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><style></style><td></td></template></body></html>",
+        "noQuirksBodyHtml": "<template><style></style><td></td></template>"
+      }
+    },
+    {
+      "data": "<body><template><meta><td></td></template>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "meta": true,
+            "td": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "meta"
+                          },
+                          {
+                            "tag": "td"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><meta><td></td></template></body></html>",
+        "noQuirksBodyHtml": "<template><meta><td></td></template>"
+      }
+    },
+    {
+      "data": "<body><template><link><td></td></template>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "link": true,
+            "td": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "link"
+                          },
+                          {
+                            "tag": "td"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><link><td></td></template></body></html>",
+        "noQuirksBodyHtml": "<template><link><td></td></template>"
+      }
+    },
+    {
+      "data": "<body><template><template><tr></tr></template><td></td></template>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "tr": true,
+            "td": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true,
+                                "children": [
+                                  {
+                                    "tag": "tr"
+                                  }
+                                ]
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "td"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><template><tr></tr></template><td></td></template></body></html>",
+        "noQuirksBodyHtml": "<template><template><tr></tr></template><td></td></template>"
+      }
+    },
+    {
+      "data": "<body><table><colgroup><template><col></col></template></colgroup></table></body>",
+      "errors": [
+        "no doctype",
+        "bad /col"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "colgroup": true,
+            "template": true,
+            "col": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "colgroup",
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true,
+                                "children": [
+                                  {
+                                    "tag": "col"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><colgroup><template><col></template></colgroup></table></body></html>",
+        "noQuirksBodyHtml": "<table><colgroup><template><col></template></colgroup></table>"
+      }
+    },
+    {
+      "data": "<body a=b><template><div></div><body c=d><div></div></body></template></body>",
+      "errors": [
+        "no doctype",
+        "bad <body>",
+        "bad </body>"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "div": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "attrs": [
+                  {
+                    "name": "a",
+                    "value": "b"
+                  }
+                ],
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "div"
+                          },
+                          {
+                            "tag": "div"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body a=\"b\"><template><div></div><div></div></template></body></html>",
+        "noQuirksBodyHtml": "<template><div></div><div></div></template>"
+      }
+    },
+    {
+      "data": "<html a=b><template><div><html b=c><span></template>",
+      "errors": [
+        "no doctype",
+        "bad <html>",
+        "missing end tags in template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "div": true,
+            "span": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "attrs": [
+              {
+                "name": "a",
+                "value": "b"
+              }
+            ],
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "div",
+                            "children": [
+                              {
+                                "tag": "span"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html a=\"b\"><head><template><div><span></span></div></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template><div><span></span></div></template>"
+      }
+    },
+    {
+      "data": "<html a=b><template><col></col><html b=c><col></col></template>",
+      "errors": [
+        "no doctype",
+        "bad /col",
+        "bad html",
+        "bad /col"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "col": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "attrs": [
+              {
+                "name": "a",
+                "value": "b"
+              }
+            ],
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "col"
+                          },
+                          {
+                            "tag": "col"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html a=\"b\"><head><template><col><col></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template><col><col></template>"
+      }
+    },
+    {
+      "data": "<html a=b><template><frame></frame><html b=c><frame></frame></template>",
+      "errors": [
+        "no doctype",
+        "bad frame",
+        "bad /frame",
+        "bad html",
+        "bad frame",
+        "bad /frame"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "attrs": [
+              {
+                "name": "a",
+                "value": "b"
+              }
+            ],
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html a=\"b\"><head><template></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template></template>"
+      }
+    },
+    {
+      "data": "<body><template><tr></tr><template></template><td></td></template>",
+      "errors": [
+        "no doctype",
+        "unexpected <td>"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "tr": true,
+            "td": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "tr"
+                          },
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><tr></tr><template></template><tr><td></td></tr></template></body></html>",
+        "noQuirksBodyHtml": "<template><tr></tr><template></template><tr><td></td></tr></template>"
+      }
+    },
+    {
+      "data": "<body><template><thead></thead><template><tr></tr></template><tr></tr><tfoot></tfoot></template>",
+      "errors": [
+        "no doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "thead": true,
+            "tr": true,
+            "tbody": true,
+            "tfoot": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "thead"
+                          },
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true,
+                                "children": [
+                                  {
+                                    "tag": "tr"
+                                  }
+                                ]
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "tbody",
+                            "children": [
+                              {
+                                "tag": "tr"
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "tfoot"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><thead></thead><template><tr></tr></template><tbody><tr></tr></tbody><tfoot></tfoot></template></body></html>",
+        "noQuirksBodyHtml": "<template><thead></thead><template><tr></tr></template><tbody><tr></tr></tbody><tfoot></tfoot></template>"
+      }
+    },
+    {
+      "data": "<body><template><template><b><template></template></template>text</template>",
+      "errors": [
+        "no doctype",
+        "missing </b>"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "b": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true,
+                                "children": [
+                                  {
+                                    "tag": "b",
+                                    "children": [
+                                      {
+                                        "tag": "template",
+                                        "children": [
+                                          {
+                                            "content": true
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          },
+                          {
+                            "text": "text"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><template><b><template></template></b></template>text</template></body></html>",
+        "noQuirksBodyHtml": "<template><template><b><template></template></b></template>text</template>"
+      }
+    },
+    {
+      "data": "<body><template><col><colgroup>",
+      "errors": [
+        "no doctype",
+        "bad colgroup",
+        "eof in template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "col": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "col"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><col></template></body></html>",
+        "noQuirksBodyHtml": "<template><col></template>"
+      }
+    },
+    {
+      "data": "<body><template><col></colgroup>",
+      "errors": [
+        "no doctype",
+        "bogus /colgroup",
+        "eof in template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "col": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "col"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><col></template></body></html>",
+        "noQuirksBodyHtml": "<template><col></template>"
+      }
+    },
+    {
+      "data": "<body><template><col><colgroup></template></body>",
+      "errors": [
+        "no doctype",
+        "bad colgroup"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "col": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "col"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><col></template></body></html>",
+        "noQuirksBodyHtml": "<template><col></template>"
+      }
+    },
+    {
+      "data": "<body><template><col><div>",
+      "errors": [
+        " * (1,7) missing DOCTYPE",
+        " * (1,27) unexpected token",
+        " * (1,27) unexpected end of file in template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "col": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "col"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><col></template></body></html>",
+        "noQuirksBodyHtml": "<template><col></template>"
+      }
+    },
+    {
+      "data": "<body><template><col></div>",
+      "errors": [
+        "no doctype",
+        "bad /div",
+        "eof in template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "col": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "col"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><col></template></body></html>",
+        "noQuirksBodyHtml": "<template><col></template>"
+      }
+    },
+    {
+      "data": "<body><template><col>Hello",
+      "errors": [
+        "no doctype",
+        "unexpected text",
+        "eof in template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "col": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "col"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><col></template></body></html>",
+        "noQuirksBodyHtml": "<template><col></template>"
+      }
+    },
+    {
+      "data": "<body><template><i><menu>Foo</i>",
+      "errors": [
+        "no doctype",
+        "mising /menu",
+        "eof in template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "i": true,
+            "menu": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "i"
+                          },
+                          {
+                            "tag": "menu",
+                            "children": [
+                              {
+                                "tag": "i",
+                                "children": [
+                                  {
+                                    "text": "Foo"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><i></i><menu><i>Foo</i></menu></template></body></html>",
+        "noQuirksBodyHtml": "<template><i></i><menu><i>Foo</i></menu></template>"
+      }
+    },
+    {
+      "data": "<body><template></div><div>Foo</div><template></template><tr></tr>",
+      "errors": [
+        "no doctype",
+        "bogus /div",
+        "bogus tr",
+        "bogus /tr",
+        "eof in template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true,
+            "div": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "div",
+                            "children": [
+                              {
+                                "text": "Foo"
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template><div>Foo</div><template></template></template></body></html>",
+        "noQuirksBodyHtml": "<template><div>Foo</div><template></template></template>"
+      }
+    },
+    {
+      "data": "<body><div><template></div><tr><td>Foo</td></tr></template>",
+      "errors": [
+        " * (1,7) missing DOCTYPE",
+        " * (1,28) unexpected token in template",
+        " * (1,60) unexpected end of file"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "template": true,
+            "tr": true,
+            "td": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "template",
+                        "children": [
+                          {
+                            "content": true,
+                            "children": [
+                              {
+                                "tag": "tr",
+                                "children": [
+                                  {
+                                    "tag": "td",
+                                    "children": [
+                                      {
+                                        "text": "Foo"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div><template><tr><td>Foo</td></tr></template></div></body></html>",
+        "noQuirksBodyHtml": "<div><template><tr><td>Foo</td></tr></template></div>"
+      }
+    },
+    {
+      "data": "<template></figcaption><sub><table></table>",
+      "errors": [
+        "no doctype",
+        "bad /figcaption",
+        "eof in template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "sub": true,
+            "table": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "sub",
+                            "children": [
+                              {
+                                "tag": "table"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><sub><table></table></sub></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template><sub><table></table></sub></template>"
+      }
+    },
+    {
+      "data": "<template><template>",
+      "errors": [
+        "no doctype",
+        "eof in template",
+        "eof in template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><template></template></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template><template></template></template>"
+      }
+    },
+    {
+      "data": "<template><div>",
+      "errors": [
+        "no doctype",
+        "eof in template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "div": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "div"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><div></div></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template><div></div></template>"
+      }
+    },
+    {
+      "data": "<template><template><div>",
+      "errors": [
+        "no doctype",
+        "eof in template",
+        "eof in template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "div": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true,
+                                "children": [
+                                  {
+                                    "tag": "div"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><template><div></div></template></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template><template><div></div></template></template>"
+      }
+    },
+    {
+      "data": "<template><template><table>",
+      "errors": [
+        "no doctype",
+        "eof in template",
+        "eof in template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "table": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true,
+                                "children": [
+                                  {
+                                    "tag": "table"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><template><table></table></template></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template><template><table></table></template></template>"
+      }
+    },
+    {
+      "data": "<template><template><tbody>",
+      "errors": [
+        "no doctype",
+        "eof in template",
+        "eof in template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "tbody": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true,
+                                "children": [
+                                  {
+                                    "tag": "tbody"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><template><tbody></tbody></template></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template><template><tbody></tbody></template></template>"
+      }
+    },
+    {
+      "data": "<template><template><tr>",
+      "errors": [
+        "no doctype",
+        "eof in template",
+        "eof in template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "tr": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true,
+                                "children": [
+                                  {
+                                    "tag": "tr"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><template><tr></tr></template></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template><template><tr></tr></template></template>"
+      }
+    },
+    {
+      "data": "<template><template><td>",
+      "errors": [
+        "no doctype",
+        "eof in template",
+        "eof in template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "td": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true,
+                                "children": [
+                                  {
+                                    "tag": "td"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><template><td></td></template></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template><template><td></td></template></template>"
+      }
+    },
+    {
+      "data": "<template><template><caption>",
+      "errors": [
+        "no doctype",
+        "eof in template",
+        "eof in template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "caption": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true,
+                                "children": [
+                                  {
+                                    "tag": "caption"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><template><caption></caption></template></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template><template><caption></caption></template></template>"
+      }
+    },
+    {
+      "data": "<template><template><colgroup>",
+      "errors": [
+        "no doctype",
+        "eof in template",
+        "eof in template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "colgroup": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true,
+                                "children": [
+                                  {
+                                    "tag": "colgroup"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><template><colgroup></colgroup></template></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template><template><colgroup></colgroup></template></template>"
+      }
+    },
+    {
+      "data": "<template><template><col>",
+      "errors": [
+        "no doctype",
+        "eof in template",
+        "eof in template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "col": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true,
+                                "children": [
+                                  {
+                                    "tag": "col"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><template><col></template></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template><template><col></template></template>"
+      }
+    },
+    {
+      "data": "<template><template><tbody><select>",
+      "errors": [
+        " * (1,11) missing DOCTYPE",
+        " * (1,36) unexpected token in table - foster parenting",
+        " * (1,36) unexpected end of file in template",
+        " * (1,36) unexpected end of file in template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "tbody": true,
+            "select": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true,
+                                "children": [
+                                  {
+                                    "tag": "tbody"
+                                  },
+                                  {
+                                    "tag": "select"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><template><tbody></tbody><select></select></template></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template><template><tbody></tbody><select></select></template></template>"
+      }
+    },
+    {
+      "data": "<template><template><table>Foo",
+      "errors": [
+        "no doctype",
+        "foster-parenting text F",
+        "foster-parenting text o",
+        "foster-parenting text o",
+        "eof",
+        "eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "table": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true,
+                                "children": [
+                                  {
+                                    "text": "Foo"
+                                  },
+                                  {
+                                    "tag": "table"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><template>Foo<table></table></template></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template><template>Foo<table></table></template></template>"
+      }
+    },
+    {
+      "data": "<template><template><frame>",
+      "errors": [
+        "no doctype",
+        "bad tag",
+        "eof",
+        "eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><template></template></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template><template></template></template>"
+      }
+    },
+    {
+      "data": "<template><template><script>var i",
+      "errors": [
+        "no doctype",
+        "eof in script",
+        "eof in template",
+        "eof in template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "script": true,
+            "body": true
+          },
+          "template": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true,
+                                "children": [
+                                  {
+                                    "tag": "script",
+                                    "children": [
+                                      {
+                                        "text": "var i",
+                                        "no_escape": true
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><template><script>var i</script></template></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template><template><script>var i</script></template></template>"
+      }
+    },
+    {
+      "data": "<template><template><style>var i",
+      "errors": [
+        "no doctype",
+        "eof in style",
+        "eof in template",
+        "eof in template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "style": true,
+            "body": true
+          },
+          "template": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true,
+                                "children": [
+                                  {
+                                    "tag": "style",
+                                    "children": [
+                                      {
+                                        "text": "var i",
+                                        "no_escape": true
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><template><style>var i</style></template></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template><template><style>var i</style></template></template>"
+      }
+    },
+    {
+      "data": "<template><table></template><body><span>Foo",
+      "errors": [
+        "no doctype",
+        "missing /table",
+        "bad eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "table": true,
+            "body": true,
+            "span": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "table"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "span",
+                    "children": [
+                      {
+                        "text": "Foo"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><table></table></template></head><body><span>Foo</span></body></html>",
+        "noQuirksBodyHtml": "<template><table></table></template><span>Foo</span>"
+      }
+    },
+    {
+      "data": "<template><td></template><body><span>Foo",
+      "errors": [
+        "no doctype",
+        "bad eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "td": true,
+            "body": true,
+            "span": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "td"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "span",
+                    "children": [
+                      {
+                        "text": "Foo"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><td></td></template></head><body><span>Foo</span></body></html>",
+        "noQuirksBodyHtml": "<template><td></td></template><span>Foo</span>"
+      }
+    },
+    {
+      "data": "<template><object></template><body><span>Foo",
+      "errors": [
+        "no doctype",
+        "missing /object",
+        "bad eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "object": true,
+            "body": true,
+            "span": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "object"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "span",
+                    "children": [
+                      {
+                        "text": "Foo"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><object></object></template></head><body><span>Foo</span></body></html>",
+        "noQuirksBodyHtml": "<template><object></object></template><span>Foo</span>"
+      }
+    },
+    {
+      "data": "<template><svg><template>",
+      "errors": [
+        "no doctype",
+        "eof in template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "svg svg": true,
+            "svg template": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "svg",
+                            "ns": "http://www.w3.org/2000/svg",
+                            "children": [
+                              {
+                                "tag": "template",
+                                "ns": "http://www.w3.org/2000/svg"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><svg><template></template></svg></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template><svg><template></template></svg></template>"
+      }
+    },
+    {
+      "data": "<template><svg><foo><template><foreignObject><div></template><div>",
+      "errors": [
+        "no doctype",
+        "ugly template closure",
+        "bad eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "svg svg": true,
+            "svg foo": true,
+            "svg template": true,
+            "svg foreignObject": true,
+            "div": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "svg",
+                            "ns": "http://www.w3.org/2000/svg",
+                            "children": [
+                              {
+                                "tag": "foo",
+                                "ns": "http://www.w3.org/2000/svg",
+                                "children": [
+                                  {
+                                    "tag": "template",
+                                    "ns": "http://www.w3.org/2000/svg",
+                                    "children": [
+                                      {
+                                        "tag": "foreignObject",
+                                        "ns": "http://www.w3.org/2000/svg",
+                                        "children": [
+                                          {
+                                            "tag": "div"
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><svg><foo><template><foreignObject><div></div></foreignObject></template></foo></svg></template></head><body><div></div></body></html>",
+        "noQuirksBodyHtml": "<template><svg><foo><template><foreignObject><div></div></foreignObject></template></foo></svg></template><div></div>"
+      }
+    },
+    {
+      "data": "<dummy><template><span></dummy>",
+      "errors": [
+        "no doctype",
+        "bad end tag </dummy>",
+        "eof in template",
+        "eof in dummy"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "dummy": true,
+            "template": true,
+            "span": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "dummy",
+                    "children": [
+                      {
+                        "tag": "template",
+                        "children": [
+                          {
+                            "content": true,
+                            "children": [
+                              {
+                                "tag": "span"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><dummy><template><span></span></template></dummy></body></html>",
+        "noQuirksBodyHtml": "<dummy><template><span></span></template></dummy>"
+      }
+    },
+    {
+      "data": "<body><table><tr><td><select><template>Foo</template><caption>A</table>",
+      "errors": [
+        "no doctype",
+        "(1,62): unexpected-caption-in-select-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "select": true,
+            "template": true,
+            "caption": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "select",
+                                    "children": [
+                                      {
+                                        "tag": "template",
+                                        "children": [
+                                          {
+                                            "content": true,
+                                            "children": [
+                                              {
+                                                "text": "Foo"
+                                              }
+                                            ]
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "caption",
+                        "children": [
+                          {
+                            "text": "A"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><tr><td><select><template>Foo</template></select></td></tr></tbody><caption>A</caption></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td><select><template>Foo</template></select></td></tr></tbody><caption>A</caption></table>"
+      }
+    },
+    {
+      "data": "<body></body><template>",
+      "errors": [
+        "no doctype",
+        "(1,23): template-after-body",
+        "(1,24): eof-in-template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "template": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><template></template></body></html>",
+        "noQuirksBodyHtml": "<template></template>"
+      }
+    },
+    {
+      "data": "<head></head><template>",
+      "errors": [
+        "no doctype",
+        "(1,23): template-after-head",
+        "(1,24): eof-in-template"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template></template>"
+      }
+    },
+    {
+      "data": "<head></head><template>Foo</template>",
+      "errors": [
+        "no doctype",
+        "(1,23): template-after-head"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "text": "Foo"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template>Foo</template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template>Foo</template>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE HTML><dummy><table><template><table><template><table><script>",
+      "errors": [
+        "eof script",
+        "eof template",
+        "eof template",
+        "eof table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "dummy": true,
+            "table": true,
+            "template": true,
+            "script": true
+          },
+          "doctype": true,
+          "template": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "dummy",
+                    "children": [
+                      {
+                        "tag": "table",
+                        "children": [
+                          {
+                            "tag": "template",
+                            "children": [
+                              {
+                                "content": true,
+                                "children": [
+                                  {
+                                    "tag": "table",
+                                    "children": [
+                                      {
+                                        "tag": "template",
+                                        "children": [
+                                          {
+                                            "content": true,
+                                            "children": [
+                                              {
+                                                "tag": "table",
+                                                "children": [
+                                                  {
+                                                    "tag": "script"
+                                                  }
+                                                ]
+                                              }
+                                            ]
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><dummy><table><template><table><template><table><script></script></table></template></table></template></table></dummy></body></html>",
+        "noQuirksBodyHtml": "<dummy><table><template><table><template><table><script></script></table></template></table></template></table></dummy>"
+      }
+    },
+    {
+      "data": "<template><a><table><a>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "template": true,
+            "a": true,
+            "table": true,
+            "body": true
+          },
+          "template": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "template",
+                    "children": [
+                      {
+                        "content": true,
+                        "children": [
+                          {
+                            "tag": "a",
+                            "children": [
+                              {
+                                "tag": "a"
+                              },
+                              {
+                                "tag": "table"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><template><a><a></a><table></table></a></template></head><body></body></html>",
+        "noQuirksBodyHtml": "<template><a><a></a><table></table></a></template>"
+      }
+    }
+  ],
+  "tests1.dat": [
+    {
+      "data": "Test",
+      "errors": [
+        "(1,0): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Test"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>Test</body></html>",
+        "noQuirksBodyHtml": "Test"
+      }
+    },
+    {
+      "data": "<p>One<p>Two",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "One"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "Two"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><p>One</p><p>Two</p></body></html>",
+        "noQuirksBodyHtml": "<p>One</p><p>Two</p>"
+      }
+    },
+    {
+      "data": "Line1<br>Line2<br>Line3<br>Line4",
+      "errors": [
+        "(1,0): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "br": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Line1"
+                  },
+                  {
+                    "tag": "br"
+                  },
+                  {
+                    "text": "Line2"
+                  },
+                  {
+                    "tag": "br"
+                  },
+                  {
+                    "text": "Line3"
+                  },
+                  {
+                    "tag": "br"
+                  },
+                  {
+                    "text": "Line4"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>Line1<br>Line2<br>Line3<br>Line4</body></html>",
+        "noQuirksBodyHtml": "Line1<br>Line2<br>Line3<br>Line4"
+      }
+    },
+    {
+      "data": "<html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<head>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<body>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<html><head>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<html><head></head>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<html><head></head><body>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<html><head></head><body></body>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<html><head><body></body></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<html><head></body></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<html><head><body></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<html><body></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<body></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<head></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "</head>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "</body>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-end-tag element."
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "</html>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-end-tag element."
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<b><table><td><i></table>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,14): unexpected-cell-in-table-body",
+        "(1,25): unexpected-cell-end-tag",
+        "(1,25): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "i": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "table",
+                        "children": [
+                          {
+                            "tag": "tbody",
+                            "children": [
+                              {
+                                "tag": "tr",
+                                "children": [
+                                  {
+                                    "tag": "td",
+                                    "children": [
+                                      {
+                                        "tag": "i"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><b><table><tbody><tr><td><i></i></td></tr></tbody></table></b></body></html>",
+        "noQuirksBodyHtml": "<b><table><tbody><tr><td><i></i></td></tr></tbody></table></b>"
+      }
+    },
+    {
+      "data": "<b><table><td></b><i></table>X",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,14): unexpected-cell-in-table-body",
+        "(1,18): unexpected-end-tag",
+        "(1,29): unexpected-cell-end-tag",
+        "(1,30): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "i": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "table",
+                        "children": [
+                          {
+                            "tag": "tbody",
+                            "children": [
+                              {
+                                "tag": "tr",
+                                "children": [
+                                  {
+                                    "tag": "td",
+                                    "children": [
+                                      {
+                                        "tag": "i"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "text": "X"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><b><table><tbody><tr><td><i></i></td></tr></tbody></table>X</b></body></html>",
+        "noQuirksBodyHtml": "<b><table><tbody><tr><td><i></i></td></tr></tbody></table>X</b>"
+      }
+    },
+    {
+      "data": "<h1>Hello<h2>World",
+      "errors": [
+        "(1,4): expected-doctype-but-got-start-tag",
+        "(1,13): unexpected-start-tag",
+        "(1,18): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "h1": true,
+            "h2": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "h1",
+                    "children": [
+                      {
+                        "text": "Hello"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "h2",
+                    "children": [
+                      {
+                        "text": "World"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><h1>Hello</h1><h2>World</h2></body></html>",
+        "noQuirksBodyHtml": "<h1>Hello</h1><h2>World</h2>"
+      }
+    },
+    {
+      "data": "<a><p>X<a>Y</a>Z</p></a>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,10): unexpected-start-tag-implies-end-tag",
+        "(1,10): adoption-agency-1.3",
+        "(1,24): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a"
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "a",
+                        "children": [
+                          {
+                            "text": "X"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "a",
+                        "children": [
+                          {
+                            "text": "Y"
+                          }
+                        ]
+                      },
+                      {
+                        "text": "Z"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a></a><p><a>X</a><a>Y</a>Z</p></body></html>",
+        "noQuirksBodyHtml": "<a></a><p><a>X</a><a>Y</a>Z</p>"
+      }
+    },
+    {
+      "data": "<b><button>foo</b>bar",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,18): adoption-agency-1.3",
+        "(1,21): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "button": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b"
+                  },
+                  {
+                    "tag": "button",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": "foo"
+                          }
+                        ]
+                      },
+                      {
+                        "text": "bar"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><b></b><button><b>foo</b>bar</button></body></html>",
+        "noQuirksBodyHtml": "<b></b><button><b>foo</b>bar</button>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><span><button>foo</span>bar",
+      "errors": [
+        "(1,39): unexpected-end-tag",
+        "(1,42): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "span": true,
+            "button": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "span",
+                    "children": [
+                      {
+                        "tag": "button",
+                        "children": [
+                          {
+                            "text": "foobar"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><span><button>foobar</button></span></body></html>",
+        "noQuirksBodyHtml": "<span><button>foobar</button></span>"
+      }
+    },
+    {
+      "data": "<p><b><div><marquee></p></b></div>X",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,11): unexpected-end-tag",
+        "(1,24): unexpected-end-tag",
+        "(1,28): unexpected-end-tag",
+        "(1,34): end-tag-too-early",
+        "(1,35): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "b": true,
+            "div": true,
+            "marquee": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "b"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "tag": "marquee",
+                            "children": [
+                              {
+                                "tag": "p"
+                              },
+                              {
+                                "text": "X"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><p><b></b></p><div><b><marquee><p></p>X</marquee></b></div></body></html>",
+        "noQuirksBodyHtml": "<p><b></b></p><div><b><marquee><p></p>X</marquee></b></div>"
+      }
+    },
+    {
+      "data": "<script><div></script></div><title><p></title><p><p>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,28): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "title": true,
+            "body": true,
+            "p": true
+          },
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<div>",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "<p>",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p"
+                  },
+                  {
+                    "tag": "p"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><div></script><title>&lt;p&gt;</title></head><body><p></p><p></p></body></html>",
+        "noQuirksBodyHtml": "<script><div></script><title>&lt;p&gt;</title><p></p><p></p>"
+      }
+    },
+    {
+      "data": "<!--><div>--<!-->",
+      "errors": [
+        "(1,5): incorrect-comment",
+        "(1,10): expected-doctype-but-got-start-tag",
+        "(1,17): incorrect-comment",
+        "(1,17): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "comment": ""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": "--"
+                      },
+                      {
+                        "comment": ""
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!----><html><head></head><body><div>--<!----></div></body></html>",
+        "noQuirksBodyHtml": "<!----><div>--<!----></div>"
+      }
+    },
+    {
+      "data": "<p><hr></p>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,11): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "hr": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p"
+                  },
+                  {
+                    "tag": "hr"
+                  },
+                  {
+                    "tag": "p"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><p></p><hr><p></p></body></html>",
+        "noQuirksBodyHtml": "<p></p><hr><p></p>"
+      }
+    },
+    {
+      "data": "<select><b><option><select><option></b></select>X",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,11): unexpected-start-tag-in-select",
+        "(1,27): unexpected-select-in-select",
+        "(1,39): unexpected-end-tag",
+        "(1,48): unexpected-end-tag",
+        "(1,49): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "option": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "tag": "option"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "option",
+                    "children": [
+                      {
+                        "text": "X"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><select><option></option></select><option>X</option></body></html>",
+        "noQuirksBodyHtml": "<select><option></option></select><option>X</option>"
+      }
+    },
+    {
+      "data": "<a><table><td><a><table></table><a></tr><a></table><b>X</b>C<a>Y",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,14): unexpected-cell-in-table-body",
+        "(1,35): unexpected-start-tag-implies-end-tag",
+        "(1,40): unexpected-cell-end-tag",
+        "(1,43): unexpected-start-tag-implies-table-voodoo",
+        "(1,43): unexpected-start-tag-implies-end-tag",
+        "(1,43): unexpected-end-tag",
+        "(1,63): unexpected-start-tag-implies-end-tag",
+        "(1,64): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "b": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "children": [
+                      {
+                        "tag": "a"
+                      },
+                      {
+                        "tag": "table",
+                        "children": [
+                          {
+                            "tag": "tbody",
+                            "children": [
+                              {
+                                "tag": "tr",
+                                "children": [
+                                  {
+                                    "tag": "td",
+                                    "children": [
+                                      {
+                                        "tag": "a",
+                                        "children": [
+                                          {
+                                            "tag": "table"
+                                          }
+                                        ]
+                                      },
+                                      {
+                                        "tag": "a"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "a",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": "X"
+                          }
+                        ]
+                      },
+                      {
+                        "text": "C"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "a",
+                    "children": [
+                      {
+                        "text": "Y"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a><a></a><table><tbody><tr><td><a><table></table></a><a></a></td></tr></tbody></table></a><a><b>X</b>C</a><a>Y</a></body></html>",
+        "noQuirksBodyHtml": "<a><a></a><table><tbody><tr><td><a><table></table></a><a></a></td></tr></tbody></table></a><a><b>X</b>C</a><a>Y</a>"
+      }
+    },
+    {
+      "data": "<a X>0<b>1<a Y>2",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,15): unexpected-start-tag-implies-end-tag",
+        "(1,15): adoption-agency-1.3",
+        "(1,16): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "b": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "attrs": [
+                      {
+                        "name": "x",
+                        "value": ""
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "0"
+                      },
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": "1"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "a",
+                        "attrs": [
+                          {
+                            "name": "y",
+                            "value": ""
+                          }
+                        ],
+                        "children": [
+                          {
+                            "text": "2"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a x=\"\">0<b>1</b></a><b><a y=\"\">2</a></b></body></html>",
+        "noQuirksBodyHtml": "<a x=\"\">0<b>1</b></a><b><a y=\"\">2</a></b>"
+      }
+    },
+    {
+      "data": "<!-----><font><div>hello<table>excite!<b>me!<th><i>please!</tr><!--X-->",
+      "errors": [
+        "(1,7): unexpected-dash-after-double-dash-in-comment",
+        "(1,14): expected-doctype-but-got-start-tag",
+        "(1,41): unexpected-start-tag-implies-table-voodoo",
+        "(1,48): foster-parenting-character-in-table",
+        "(1,48): foster-parenting-character-in-table",
+        "(1,48): foster-parenting-character-in-table",
+        "(1,48): foster-parenting-character-in-table",
+        "(1,48): foster-parenting-character-in-table",
+        "(1,48): foster-parenting-character-in-table",
+        "(1,48): foster-parenting-character-in-table",
+        "(1,48): foster-parenting-character-in-table",
+        "(1,48): foster-parenting-character-in-table",
+        "(1,48): foster-parenting-character-in-table",
+        "(1,48): unexpected-cell-in-table-body",
+        "(1,63): unexpected-cell-end-tag",
+        "(1,71): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "font": true,
+            "div": true,
+            "b": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "th": true,
+            "i": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "comment": "-"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "font",
+                    "children": [
+                      {
+                        "tag": "div",
+                        "children": [
+                          {
+                            "text": "helloexcite!"
+                          },
+                          {
+                            "tag": "b",
+                            "children": [
+                              {
+                                "text": "me!"
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "table",
+                            "children": [
+                              {
+                                "tag": "tbody",
+                                "children": [
+                                  {
+                                    "tag": "tr",
+                                    "children": [
+                                      {
+                                        "tag": "th",
+                                        "children": [
+                                          {
+                                            "tag": "i",
+                                            "children": [
+                                              {
+                                                "text": "please!"
+                                              }
+                                            ]
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "comment": "X"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!-----><html><head></head><body><font><div>helloexcite!<b>me!</b><table><tbody><tr><th><i>please!</i></th></tr><!--X--></tbody></table></div></font></body></html>",
+        "noQuirksBodyHtml": "<!-----><font><div>helloexcite!<b>me!</b><table><tbody><tr><th><i>please!</i></th></tr><!--X--></tbody></table></div></font>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><li>hello<li>world<ul>how<li>do</ul>you</body><!--do-->",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "li": true,
+            "ul": true
+          },
+          "doctype": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "li",
+                    "children": [
+                      {
+                        "text": "hello"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "li",
+                    "children": [
+                      {
+                        "text": "world"
+                      },
+                      {
+                        "tag": "ul",
+                        "children": [
+                          {
+                            "text": "how"
+                          },
+                          {
+                            "tag": "li",
+                            "children": [
+                              {
+                                "text": "do"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "text": "you"
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "comment": "do"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><li>hello</li><li>world<ul>how<li>do</li></ul>you</li></body><!--do--></html>",
+        "noQuirksBodyHtml": "<li>hello</li><li>world<ul>how<li>do</li></ul>you<!--do--></li>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html>A<option>B<optgroup>C<select>D</option>E",
+      "errors": [
+        "(1,54): unexpected-end-tag-in-select",
+        "(1,55): eof-in-select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "option": true,
+            "optgroup": true,
+            "select": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "A"
+                  },
+                  {
+                    "tag": "option",
+                    "children": [
+                      {
+                        "text": "B"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "optgroup",
+                    "children": [
+                      {
+                        "text": "C"
+                      },
+                      {
+                        "tag": "select",
+                        "children": [
+                          {
+                            "text": "DE"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>A<option>B</option><optgroup>C<select>DE</select></optgroup></body></html>",
+        "noQuirksBodyHtml": "A<option>B</option><optgroup>C<select>DE</select></optgroup>"
+      }
+    },
+    {
+      "data": "<",
+      "errors": [
+        "(1,1): expected-tag-name",
+        "(1,1): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "<",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>&lt;</body></html>",
+        "noQuirksBodyHtml": "&lt;"
+      }
+    },
+    {
+      "data": "<#",
+      "errors": [
+        "(1,1): expected-tag-name",
+        "(1,1): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "<#",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>&lt;#</body></html>",
+        "noQuirksBodyHtml": "&lt;#"
+      }
+    },
+    {
+      "data": "</",
+      "errors": [
+        "(1,2): expected-closing-tag-but-got-eof",
+        "(1,2): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "</",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>&lt;/</body></html>",
+        "noQuirksBodyHtml": "&lt;/"
+      }
+    },
+    {
+      "data": "</#",
+      "errors": [
+        "(1,2): expected-closing-tag-but-got-char",
+        "(1,3): expected-doctype-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "comment": "#"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!--#--><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": "<!--#-->"
+      }
+    },
+    {
+      "data": "<?",
+      "errors": [
+        "(1,1): expected-tag-name-but-got-question-mark",
+        "(1,2): expected-doctype-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "comment": "?"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!--?--><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": "<!--?-->"
+      }
+    },
+    {
+      "data": "<?#",
+      "errors": [
+        "(1,1): expected-tag-name-but-got-question-mark",
+        "(1,3): expected-doctype-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "comment": "?#"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!--?#--><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": "<!--?#-->"
+      }
+    },
+    {
+      "data": "<!",
+      "errors": [
+        "(1,2): expected-dashes-or-doctype",
+        "(1,2): expected-doctype-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "comment": ""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!----><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": "<!---->"
+      }
+    },
+    {
+      "data": "<!#",
+      "errors": [
+        "(1,2): expected-dashes-or-doctype",
+        "(1,3): expected-doctype-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "comment": "#"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!--#--><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": "<!--#-->"
+      }
+    },
+    {
+      "data": "<?COMMENT?>",
+      "errors": [
+        "(1,1): expected-tag-name-but-got-question-mark",
+        "(1,11): expected-doctype-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "comment": "?COMMENT?"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!--?COMMENT?--><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": "<!--?COMMENT?-->"
+      }
+    },
+    {
+      "data": "<!COMMENT>",
+      "errors": [
+        "(1,2): expected-dashes-or-doctype",
+        "(1,10): expected-doctype-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "comment": "COMMENT"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!--COMMENT--><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": "<!--COMMENT-->"
+      }
+    },
+    {
+      "data": "</ COMMENT >",
+      "errors": [
+        "(1,2): expected-closing-tag-but-got-char",
+        "(1,12): expected-doctype-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "comment": " COMMENT "
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!-- COMMENT --><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": "<!-- COMMENT -->"
+      }
+    },
+    {
+      "data": "<?COM--MENT?>",
+      "errors": [
+        "(1,1): expected-tag-name-but-got-question-mark",
+        "(1,13): expected-doctype-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "comment": "?COM--MENT?"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!--?COM--MENT?--><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": "<!--?COM--MENT?-->"
+      }
+    },
+    {
+      "data": "<!COM--MENT>",
+      "errors": [
+        "(1,2): expected-dashes-or-doctype",
+        "(1,12): expected-doctype-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "comment": "COM--MENT"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!--COM--MENT--><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": "<!--COM--MENT-->"
+      }
+    },
+    {
+      "data": "</ COM--MENT >",
+      "errors": [
+        "(1,2): expected-closing-tag-but-got-char",
+        "(1,14): expected-doctype-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "comment": " COM--MENT "
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!-- COM--MENT --><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": "<!-- COM--MENT -->"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><style> EOF",
+      "errors": [
+        "(1,26): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": " EOF",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><style> EOF</style></head><body></body></html>",
+        "noQuirksBodyHtml": "<style> EOF</style>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><script> <!-- </script> --> </script> EOF",
+      "errors": [
+        "(1,52): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": " <!-- ",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": " "
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "-->  EOF",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script> <!-- </script> </head><body>--&gt;  EOF</body></html>",
+        "noQuirksBodyHtml": "<script> <!-- </script> --&gt;  EOF"
+      }
+    },
+    {
+      "data": "<b><p></b>TEST",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,10): adoption-agency-1.3"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b"
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "b"
+                      },
+                      {
+                        "text": "TEST"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><b></b><p><b></b>TEST</p></body></html>",
+        "noQuirksBodyHtml": "<b></b><p><b></b>TEST</p>"
+      }
+    },
+    {
+      "data": "<p id=a><b><p id=b></b>TEST",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,19): unexpected-end-tag",
+        "(1,23): adoption-agency-1.2"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "b": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "attrs": [
+                      {
+                        "name": "id",
+                        "value": "a"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "tag": "b"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "attrs": [
+                      {
+                        "name": "id",
+                        "value": "b"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "TEST"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><p id=\"a\"><b></b></p><p id=\"b\">TEST</p></body></html>",
+        "noQuirksBodyHtml": "<p id=\"a\"><b></b></p><p id=\"b\">TEST</p>"
+      }
+    },
+    {
+      "data": "<b id=a><p><b id=b></p></b>TEST",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,23): unexpected-end-tag",
+        "(1,27): adoption-agency-1.2",
+        "(1,31): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "attrs": [
+                      {
+                        "name": "id",
+                        "value": "a"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "tag": "p",
+                        "children": [
+                          {
+                            "tag": "b",
+                            "attrs": [
+                              {
+                                "name": "id",
+                                "value": "b"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "text": "TEST"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><b id=\"a\"><p><b id=\"b\"></b></p>TEST</b></body></html>",
+        "noQuirksBodyHtml": "<b id=\"a\"><p><b id=\"b\"></b></p>TEST</b>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><title>U-test</title><body><div><p>Test<u></p></div></body>",
+      "errors": [
+        "(1,61): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "title": true,
+            "body": true,
+            "div": true,
+            "p": true,
+            "u": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "U-test"
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "p",
+                        "children": [
+                          {
+                            "text": "Test"
+                          },
+                          {
+                            "tag": "u"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><title>U-test</title></head><body><div><p>Test<u></u></p></div></body></html>",
+        "noQuirksBodyHtml": "<title>U-test</title><div><p>Test<u></u></p></div>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><font><table></font></table></font>",
+      "errors": [
+        "(1,35): unexpected-end-tag-implies-table-voodoo",
+        "(1,35): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "font": true,
+            "table": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "font",
+                    "children": [
+                      {
+                        "tag": "table"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><font><table></table></font></body></html>",
+        "noQuirksBodyHtml": "<font><table></table></font>"
+      }
+    },
+    {
+      "data": "<font><p>hello<b>cruel</font>world",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,29): adoption-agency-1.3",
+        "(1,29): adoption-agency-1.3",
+        "(1,34): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "font": true,
+            "p": true,
+            "b": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "font"
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "font",
+                        "children": [
+                          {
+                            "text": "hello"
+                          },
+                          {
+                            "tag": "b",
+                            "children": [
+                              {
+                                "text": "cruel"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": "world"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><font></font><p><font>hello<b>cruel</b></font><b>world</b></p></body></html>",
+        "noQuirksBodyHtml": "<font></font><p><font>hello<b>cruel</b></font><b>world</b></p>"
+      }
+    },
+    {
+      "data": "<b>Test</i>Test",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,11): unexpected-end-tag",
+        "(1,15): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "text": "TestTest"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><b>TestTest</b></body></html>",
+        "noQuirksBodyHtml": "<b>TestTest</b>"
+      }
+    },
+    {
+      "data": "<b>A<cite>B<div>C",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,17): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "cite": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "text": "A"
+                      },
+                      {
+                        "tag": "cite",
+                        "children": [
+                          {
+                            "text": "B"
+                          },
+                          {
+                            "tag": "div",
+                            "children": [
+                              {
+                                "text": "C"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><b>A<cite>B<div>C</div></cite></b></body></html>",
+        "noQuirksBodyHtml": "<b>A<cite>B<div>C</div></cite></b>"
+      }
+    },
+    {
+      "data": "<b>A<cite>B<div>C</cite>D",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,24): unexpected-end-tag",
+        "(1,25): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "cite": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "text": "A"
+                      },
+                      {
+                        "tag": "cite",
+                        "children": [
+                          {
+                            "text": "B"
+                          },
+                          {
+                            "tag": "div",
+                            "children": [
+                              {
+                                "text": "CD"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><b>A<cite>B<div>CD</div></cite></b></body></html>",
+        "noQuirksBodyHtml": "<b>A<cite>B<div>CD</div></cite></b>"
+      }
+    },
+    {
+      "data": "<b>A<cite>B<div>C</b>D",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,21): adoption-agency-1.3",
+        "(1,22): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "cite": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "text": "A"
+                      },
+                      {
+                        "tag": "cite",
+                        "children": [
+                          {
+                            "text": "B"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": "C"
+                          }
+                        ]
+                      },
+                      {
+                        "text": "D"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><b>A<cite>B</cite></b><div><b>C</b>D</div></body></html>",
+        "noQuirksBodyHtml": "<b>A<cite>B</cite></b><div><b>C</b>D</div>"
+      }
+    },
+    {
+      "data": "",
+      "errors": [
+        "(1,0): expected-doctype-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<DIV>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,5): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div></div></body></html>",
+        "noQuirksBodyHtml": "<div></div>"
+      }
+    },
+    {
+      "data": "<DIV> abc",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,9): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": " abc"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div> abc</div></body></html>",
+        "noQuirksBodyHtml": "<div> abc</div>"
+      }
+    },
+    {
+      "data": "<DIV> abc <B>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,13): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "b": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": " abc "
+                      },
+                      {
+                        "tag": "b"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div> abc <b></b></div></body></html>",
+        "noQuirksBodyHtml": "<div> abc <b></b></div>"
+      }
+    },
+    {
+      "data": "<DIV> abc <B> def",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,17): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "b": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": " abc "
+                      },
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": " def"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div> abc <b> def</b></div></body></html>",
+        "noQuirksBodyHtml": "<div> abc <b> def</b></div>"
+      }
+    },
+    {
+      "data": "<DIV> abc <B> def <I>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,21): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "b": true,
+            "i": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": " abc "
+                      },
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": " def "
+                          },
+                          {
+                            "tag": "i"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div> abc <b> def <i></i></b></div></body></html>",
+        "noQuirksBodyHtml": "<div> abc <b> def <i></i></b></div>"
+      }
+    },
+    {
+      "data": "<DIV> abc <B> def <I> ghi",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,25): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "b": true,
+            "i": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": " abc "
+                      },
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": " def "
+                          },
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "text": " ghi"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div> abc <b> def <i> ghi</i></b></div></body></html>",
+        "noQuirksBodyHtml": "<div> abc <b> def <i> ghi</i></b></div>"
+      }
+    },
+    {
+      "data": "<DIV> abc <B> def <I> ghi <P>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,29): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "b": true,
+            "i": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": " abc "
+                      },
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": " def "
+                          },
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "text": " ghi "
+                              },
+                              {
+                                "tag": "p"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div> abc <b> def <i> ghi <p></p></i></b></div></body></html>",
+        "noQuirksBodyHtml": "<div> abc <b> def <i> ghi <p></p></i></b></div>"
+      }
+    },
+    {
+      "data": "<DIV> abc <B> def <I> ghi <P> jkl",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,33): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "b": true,
+            "i": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": " abc "
+                      },
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": " def "
+                          },
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "text": " ghi "
+                              },
+                              {
+                                "tag": "p",
+                                "children": [
+                                  {
+                                    "text": " jkl"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div> abc <b> def <i> ghi <p> jkl</p></i></b></div></body></html>",
+        "noQuirksBodyHtml": "<div> abc <b> def <i> ghi <p> jkl</p></i></b></div>"
+      }
+    },
+    {
+      "data": "<DIV> abc <B> def <I> ghi <P> jkl </B>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,38): adoption-agency-1.3",
+        "(1,38): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "b": true,
+            "i": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": " abc "
+                      },
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": " def "
+                          },
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "text": " ghi "
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "i",
+                        "children": [
+                          {
+                            "tag": "p",
+                            "children": [
+                              {
+                                "tag": "b",
+                                "children": [
+                                  {
+                                    "text": " jkl "
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div> abc <b> def <i> ghi </i></b><i><p><b> jkl </b></p></i></div></body></html>",
+        "noQuirksBodyHtml": "<div> abc <b> def <i> ghi </i></b><i><p><b> jkl </b></p></i></div>"
+      }
+    },
+    {
+      "data": "<DIV> abc <B> def <I> ghi <P> jkl </B> mno",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,38): adoption-agency-1.3",
+        "(1,42): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "b": true,
+            "i": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": " abc "
+                      },
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": " def "
+                          },
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "text": " ghi "
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "i",
+                        "children": [
+                          {
+                            "tag": "p",
+                            "children": [
+                              {
+                                "tag": "b",
+                                "children": [
+                                  {
+                                    "text": " jkl "
+                                  }
+                                ]
+                              },
+                              {
+                                "text": " mno"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div> abc <b> def <i> ghi </i></b><i><p><b> jkl </b> mno</p></i></div></body></html>",
+        "noQuirksBodyHtml": "<div> abc <b> def <i> ghi </i></b><i><p><b> jkl </b> mno</p></i></div>"
+      }
+    },
+    {
+      "data": "<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,38): adoption-agency-1.3",
+        "(1,47): adoption-agency-1.3",
+        "(1,47): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "b": true,
+            "i": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": " abc "
+                      },
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": " def "
+                          },
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "text": " ghi "
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "i"
+                      },
+                      {
+                        "tag": "p",
+                        "children": [
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "tag": "b",
+                                "children": [
+                                  {
+                                    "text": " jkl "
+                                  }
+                                ]
+                              },
+                              {
+                                "text": " mno "
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div> abc <b> def <i> ghi </i></b><i></i><p><i><b> jkl </b> mno </i></p></div></body></html>",
+        "noQuirksBodyHtml": "<div> abc <b> def <i> ghi </i></b><i></i><p><i><b> jkl </b> mno </i></p></div>"
+      }
+    },
+    {
+      "data": "<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> pqr",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,38): adoption-agency-1.3",
+        "(1,47): adoption-agency-1.3",
+        "(1,51): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "b": true,
+            "i": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": " abc "
+                      },
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": " def "
+                          },
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "text": " ghi "
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "i"
+                      },
+                      {
+                        "tag": "p",
+                        "children": [
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "tag": "b",
+                                "children": [
+                                  {
+                                    "text": " jkl "
+                                  }
+                                ]
+                              },
+                              {
+                                "text": " mno "
+                              }
+                            ]
+                          },
+                          {
+                            "text": " pqr"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div> abc <b> def <i> ghi </i></b><i></i><p><i><b> jkl </b> mno </i> pqr</p></div></body></html>",
+        "noQuirksBodyHtml": "<div> abc <b> def <i> ghi </i></b><i></i><p><i><b> jkl </b> mno </i> pqr</p></div>"
+      }
+    },
+    {
+      "data": "<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> pqr </P>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,38): adoption-agency-1.3",
+        "(1,47): adoption-agency-1.3",
+        "(1,56): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "b": true,
+            "i": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": " abc "
+                      },
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": " def "
+                          },
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "text": " ghi "
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "i"
+                      },
+                      {
+                        "tag": "p",
+                        "children": [
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "tag": "b",
+                                "children": [
+                                  {
+                                    "text": " jkl "
+                                  }
+                                ]
+                              },
+                              {
+                                "text": " mno "
+                              }
+                            ]
+                          },
+                          {
+                            "text": " pqr "
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div> abc <b> def <i> ghi </i></b><i></i><p><i><b> jkl </b> mno </i> pqr </p></div></body></html>",
+        "noQuirksBodyHtml": "<div> abc <b> def <i> ghi </i></b><i></i><p><i><b> jkl </b> mno </i> pqr </p></div>"
+      }
+    },
+    {
+      "data": "<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> pqr </P> stu",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,38): adoption-agency-1.3",
+        "(1,47): adoption-agency-1.3",
+        "(1,60): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "b": true,
+            "i": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": " abc "
+                      },
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": " def "
+                          },
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "text": " ghi "
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "i"
+                      },
+                      {
+                        "tag": "p",
+                        "children": [
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "tag": "b",
+                                "children": [
+                                  {
+                                    "text": " jkl "
+                                  }
+                                ]
+                              },
+                              {
+                                "text": " mno "
+                              }
+                            ]
+                          },
+                          {
+                            "text": " pqr "
+                          }
+                        ]
+                      },
+                      {
+                        "text": " stu"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div> abc <b> def <i> ghi </i></b><i></i><p><i><b> jkl </b> mno </i> pqr </p> stu</div></body></html>",
+        "noQuirksBodyHtml": "<div> abc <b> def <i> ghi </i></b><i></i><p><i><b> jkl </b> mno </i> pqr </p> stu</div>"
+      }
+    },
+    {
+      "data": "<test attribute---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------->",
+      "errors": [
+        "(1,1040): expected-doctype-but-got-start-tag",
+        "(1,1040): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "test": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "test",
+                    "attrs": [
+                      {
+                        "name": "attribute----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------",
+                        "value": ""
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><test attribute----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------=\"\"></test></body></html>",
+        "noQuirksBodyHtml": "<test attribute----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------=\"\"></test>"
+      }
+    },
+    {
+      "data": "<a href=\"blah\">aba<table><a href=\"foo\">br<tr><td></td></tr>x</table>aoe",
+      "errors": [
+        "(1,15): expected-doctype-but-got-start-tag",
+        "(1,39): unexpected-start-tag-implies-table-voodoo",
+        "(1,39): unexpected-start-tag-implies-end-tag",
+        "(1,39): unexpected-end-tag",
+        "(1,45): foster-parenting-character-in-table",
+        "(1,45): foster-parenting-character-in-table",
+        "(1,68): foster-parenting-character-in-table",
+        "(1,71): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "attrs": [
+                      {
+                        "name": "href",
+                        "value": "blah"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "aba"
+                      },
+                      {
+                        "tag": "a",
+                        "attrs": [
+                          {
+                            "name": "href",
+                            "value": "foo"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "text": "br"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "a",
+                        "attrs": [
+                          {
+                            "name": "href",
+                            "value": "foo"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "text": "x"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "table",
+                        "children": [
+                          {
+                            "tag": "tbody",
+                            "children": [
+                              {
+                                "tag": "tr",
+                                "children": [
+                                  {
+                                    "tag": "td"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "a",
+                    "attrs": [
+                      {
+                        "name": "href",
+                        "value": "foo"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "aoe"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a href=\"blah\">aba<a href=\"foo\">br</a><a href=\"foo\">x</a><table><tbody><tr><td></td></tr></tbody></table></a><a href=\"foo\">aoe</a></body></html>",
+        "noQuirksBodyHtml": "<a href=\"blah\">aba<a href=\"foo\">br</a><a href=\"foo\">x</a><table><tbody><tr><td></td></tr></tbody></table></a><a href=\"foo\">aoe</a>"
+      }
+    },
+    {
+      "data": "<a href=\"blah\">aba<table><tr><td><a href=\"foo\">br</td></tr>x</table>aoe",
+      "errors": [
+        "(1,15): expected-doctype-but-got-start-tag",
+        "(1,54): unexpected-cell-end-tag",
+        "(1,68): unexpected text in table",
+        "(1,71): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "attrs": [
+                      {
+                        "name": "href",
+                        "value": "blah"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "abax"
+                      },
+                      {
+                        "tag": "table",
+                        "children": [
+                          {
+                            "tag": "tbody",
+                            "children": [
+                              {
+                                "tag": "tr",
+                                "children": [
+                                  {
+                                    "tag": "td",
+                                    "children": [
+                                      {
+                                        "tag": "a",
+                                        "attrs": [
+                                          {
+                                            "name": "href",
+                                            "value": "foo"
+                                          }
+                                        ],
+                                        "children": [
+                                          {
+                                            "text": "br"
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "text": "aoe"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a href=\"blah\">abax<table><tbody><tr><td><a href=\"foo\">br</a></td></tr></tbody></table>aoe</a></body></html>",
+        "noQuirksBodyHtml": "<a href=\"blah\">abax<table><tbody><tr><td><a href=\"foo\">br</a></td></tr></tbody></table>aoe</a>"
+      }
+    },
+    {
+      "data": "<table><a href=\"blah\">aba<tr><td><a href=\"foo\">br</td></tr>x</table>aoe",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,22): unexpected-start-tag-implies-table-voodoo",
+        "(1,29): foster-parenting-character-in-table",
+        "(1,29): foster-parenting-character-in-table",
+        "(1,29): foster-parenting-character-in-table",
+        "(1,54): unexpected-cell-end-tag",
+        "(1,68): foster-parenting-character-in-table",
+        "(1,71): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "attrs": [
+                      {
+                        "name": "href",
+                        "value": "blah"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "aba"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "a",
+                    "attrs": [
+                      {
+                        "name": "href",
+                        "value": "blah"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "x"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "a",
+                                    "attrs": [
+                                      {
+                                        "name": "href",
+                                        "value": "foo"
+                                      }
+                                    ],
+                                    "children": [
+                                      {
+                                        "text": "br"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "a",
+                    "attrs": [
+                      {
+                        "name": "href",
+                        "value": "blah"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "aoe"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a href=\"blah\">aba</a><a href=\"blah\">x</a><table><tbody><tr><td><a href=\"foo\">br</a></td></tr></tbody></table><a href=\"blah\">aoe</a></body></html>",
+        "noQuirksBodyHtml": "<a href=\"blah\">aba</a><a href=\"blah\">x</a><table><tbody><tr><td><a href=\"foo\">br</a></td></tr></tbody></table><a href=\"blah\">aoe</a>"
+      }
+    },
+    {
+      "data": "<a href=a>aa<marquee>aa<a href=b>bb</marquee>aa",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag",
+        "(1,45): end-tag-too-early",
+        "(1,47): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "marquee": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "attrs": [
+                      {
+                        "name": "href",
+                        "value": "a"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "aa"
+                      },
+                      {
+                        "tag": "marquee",
+                        "children": [
+                          {
+                            "text": "aa"
+                          },
+                          {
+                            "tag": "a",
+                            "attrs": [
+                              {
+                                "name": "href",
+                                "value": "b"
+                              }
+                            ],
+                            "children": [
+                              {
+                                "text": "bb"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "text": "aa"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a href=\"a\">aa<marquee>aa<a href=\"b\">bb</a></marquee>aa</a></body></html>",
+        "noQuirksBodyHtml": "<a href=\"a\">aa<marquee>aa<a href=\"b\">bb</a></marquee>aa</a>"
+      }
+    },
+    {
+      "data": "<wbr><strike><code></strike><code><strike></code>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,28): adoption-agency-1.3",
+        "(1,49): adoption-agency-1.3",
+        "(1,49): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "wbr": true,
+            "strike": true,
+            "code": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "wbr"
+                  },
+                  {
+                    "tag": "strike",
+                    "children": [
+                      {
+                        "tag": "code"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "code",
+                    "children": [
+                      {
+                        "tag": "code",
+                        "children": [
+                          {
+                            "tag": "strike"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><wbr><strike><code></code></strike><code><code><strike></strike></code></code></body></html>",
+        "noQuirksBodyHtml": "<wbr><strike><code></code></strike><code><code><strike></strike></code></code>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><spacer>foo",
+      "errors": [
+        "(1,26): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "spacer": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "spacer",
+                    "children": [
+                      {
+                        "text": "foo"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><spacer>foo</spacer></body></html>",
+        "noQuirksBodyHtml": "<spacer>foo</spacer>"
+      }
+    },
+    {
+      "data": "<title><meta></title><link><title><meta></title>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "title": true,
+            "link": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "<meta>",
+                        "escaped": true
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "link"
+                  },
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "<meta>",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><title>&lt;meta&gt;</title><link><title>&lt;meta&gt;</title></head><body></body></html>",
+        "noQuirksBodyHtml": "<title>&lt;meta&gt;</title><link><title>&lt;meta&gt;</title>"
+      }
+    },
+    {
+      "data": "<style><!--</style><meta><script>--><link></script>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "meta": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": "<!--",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "meta"
+                  },
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "--><link>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><style><!--</style><meta><script>--><link></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<style><!--</style><meta><script>--><link></script>"
+      }
+    },
+    {
+      "data": "<head><meta></head><link>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,25): unexpected-start-tag-out-of-my-head"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "meta": true,
+            "link": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "meta"
+                  },
+                  {
+                    "tag": "link"
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><meta><link></head><body></body></html>",
+        "noQuirksBodyHtml": "<meta><link>"
+      }
+    },
+    {
+      "data": "<table><tr><tr><td><td><span><th><span>X</table>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,33): unexpected-cell-end-tag",
+        "(1,48): unexpected-cell-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "span": true,
+            "th": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr"
+                          },
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td"
+                              },
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "span"
+                                  }
+                                ]
+                              },
+                              {
+                                "tag": "th",
+                                "children": [
+                                  {
+                                    "tag": "span",
+                                    "children": [
+                                      {
+                                        "text": "X"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><tr></tr><tr><td></td><td><span></span></td><th><span>X</span></th></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr></tr><tr><td></td><td><span></span></td><th><span>X</span></th></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<body><body><base><link><meta><title><p></title><body><p></body>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,12): unexpected-start-tag",
+        "(1,54): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "base": true,
+            "link": true,
+            "meta": true,
+            "title": true,
+            "p": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "base"
+                  },
+                  {
+                    "tag": "link"
+                  },
+                  {
+                    "tag": "meta"
+                  },
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "<p>",
+                        "escaped": true
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><base><link><meta><title>&lt;p&gt;</title><p></p></body></html>",
+        "noQuirksBodyHtml": "<base><link><meta><title>&lt;p&gt;</title><p></p>"
+      }
+    },
+    {
+      "data": "<textarea><p></textarea>",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "textarea": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "textarea",
+                    "children": [
+                      {
+                        "text": "<p>",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><textarea>&lt;p&gt;</textarea></body></html>",
+        "noQuirksBodyHtml": "<textarea>&lt;p&gt;</textarea>"
+      }
+    },
+    {
+      "data": "<p><image></p>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,10): unexpected-start-tag-treated-as"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "img": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "img"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><p><img></p></body></html>",
+        "noQuirksBodyHtml": "<p><img></p>"
+      }
+    },
+    {
+      "data": "<a><table><a></table><p><a><div><a>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,13): unexpected-start-tag-implies-table-voodoo",
+        "(1,13): unexpected-start-tag-implies-end-tag",
+        "(1,13): adoption-agency-1.3",
+        "(1,27): unexpected-start-tag-implies-end-tag",
+        "(1,27): adoption-agency-1.2",
+        "(1,32): unexpected-end-tag",
+        "(1,35): unexpected-start-tag-implies-end-tag",
+        "(1,35): adoption-agency-1.2",
+        "(1,35): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "table": true,
+            "p": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "children": [
+                      {
+                        "tag": "a"
+                      },
+                      {
+                        "tag": "table"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "a"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "a"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a><a></a><table></table></a><p><a></a></p><div><a></a></div></body></html>",
+        "noQuirksBodyHtml": "<a><a></a><table></table></a><p><a></a></p><div><a></a></div>"
+      }
+    },
+    {
+      "data": "<head></p><meta><p>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,10): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "meta": true,
+            "body": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "meta"
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><meta></head><body><p></p></body></html>",
+        "noQuirksBodyHtml": "<p></p><meta><p></p>"
+      }
+    },
+    {
+      "data": "<head></html><meta><p>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,19): expected-eof-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "meta": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "meta"
+                  },
+                  {
+                    "tag": "p"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><meta><p></p></body></html>",
+        "noQuirksBodyHtml": "<meta><p></p>"
+      }
+    },
+    {
+      "data": "<b><table><td><i></table>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,14): unexpected-cell-in-table-body",
+        "(1,25): unexpected-cell-end-tag",
+        "(1,25): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "i": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "table",
+                        "children": [
+                          {
+                            "tag": "tbody",
+                            "children": [
+                              {
+                                "tag": "tr",
+                                "children": [
+                                  {
+                                    "tag": "td",
+                                    "children": [
+                                      {
+                                        "tag": "i"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><b><table><tbody><tr><td><i></i></td></tr></tbody></table></b></body></html>",
+        "noQuirksBodyHtml": "<b><table><tbody><tr><td><i></i></td></tr></tbody></table></b>"
+      }
+    },
+    {
+      "data": "<b><table><td></b><i></table>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,14): unexpected-cell-in-table-body",
+        "(1,18): unexpected-end-tag",
+        "(1,29): unexpected-cell-end-tag",
+        "(1,29): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "i": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "table",
+                        "children": [
+                          {
+                            "tag": "tbody",
+                            "children": [
+                              {
+                                "tag": "tr",
+                                "children": [
+                                  {
+                                    "tag": "td",
+                                    "children": [
+                                      {
+                                        "tag": "i"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><b><table><tbody><tr><td><i></i></td></tr></tbody></table></b></body></html>",
+        "noQuirksBodyHtml": "<b><table><tbody><tr><td><i></i></td></tr></tbody></table></b>"
+      }
+    },
+    {
+      "data": "<h1><h2>",
+      "errors": [
+        "(1,4): expected-doctype-but-got-start-tag",
+        "(1,8): unexpected-start-tag",
+        "(1,8): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "h1": true,
+            "h2": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "h1"
+                  },
+                  {
+                    "tag": "h2"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><h1></h1><h2></h2></body></html>",
+        "noQuirksBodyHtml": "<h1></h1><h2></h2>"
+      }
+    },
+    {
+      "data": "<a><p><a></a></p></a>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,9): unexpected-start-tag-implies-end-tag",
+        "(1,9): adoption-agency-1.3",
+        "(1,21): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a"
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "a"
+                      },
+                      {
+                        "tag": "a"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a></a><p><a></a><a></a></p></body></html>",
+        "noQuirksBodyHtml": "<a></a><p><a></a><a></a></p>"
+      }
+    },
+    {
+      "data": "<b><button></b></button></b>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,15): adoption-agency-1.3",
+        "(1,28): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "button": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b"
+                  },
+                  {
+                    "tag": "button",
+                    "children": [
+                      {
+                        "tag": "b"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><b></b><button><b></b></button></body></html>",
+        "noQuirksBodyHtml": "<b></b><button><b></b></button>"
+      }
+    },
+    {
+      "data": "<p><b><div><marquee></p></b></div>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,11): unexpected-end-tag",
+        "(1,24): unexpected-end-tag",
+        "(1,28): unexpected-end-tag",
+        "(1,34): end-tag-too-early",
+        "(1,34): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "b": true,
+            "div": true,
+            "marquee": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "b"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "tag": "marquee",
+                            "children": [
+                              {
+                                "tag": "p"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><p><b></b></p><div><b><marquee><p></p></marquee></b></div></body></html>",
+        "noQuirksBodyHtml": "<p><b></b></p><div><b><marquee><p></p></marquee></b></div>"
+      }
+    },
+    {
+      "data": "<script></script></div><title></title><p><p>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,23): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "title": true,
+            "body": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script"
+                  },
+                  {
+                    "tag": "title"
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p"
+                  },
+                  {
+                    "tag": "p"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script></script><title></title></head><body><p></p><p></p></body></html>",
+        "noQuirksBodyHtml": "<script></script><title></title><p></p><p></p>"
+      }
+    },
+    {
+      "data": "<p><hr></p>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,11): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "hr": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p"
+                  },
+                  {
+                    "tag": "hr"
+                  },
+                  {
+                    "tag": "p"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><p></p><hr><p></p></body></html>",
+        "noQuirksBodyHtml": "<p></p><hr><p></p>"
+      }
+    },
+    {
+      "data": "<select><b><option><select><option></b></select>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,11): unexpected-start-tag-in-select",
+        "(1,27): unexpected-select-in-select",
+        "(1,39): unexpected-end-tag",
+        "(1,48): unexpected-end-tag",
+        "(1,48): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "option": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "tag": "option"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "option"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><select><option></option></select><option></option></body></html>",
+        "noQuirksBodyHtml": "<select><option></option></select><option></option>"
+      }
+    },
+    {
+      "data": "<html><head><title></title><body></body></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "title": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "title"
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><title></title></head><body></body></html>",
+        "noQuirksBodyHtml": "<title></title>"
+      }
+    },
+    {
+      "data": "<a><table><td><a><table></table><a></tr><a></table><a>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,14): unexpected-cell-in-table-body",
+        "(1,35): unexpected-start-tag-implies-end-tag",
+        "(1,40): unexpected-cell-end-tag",
+        "(1,43): unexpected-start-tag-implies-table-voodoo",
+        "(1,43): unexpected-start-tag-implies-end-tag",
+        "(1,43): unexpected-end-tag",
+        "(1,54): unexpected-start-tag-implies-end-tag",
+        "(1,54): adoption-agency-1.2",
+        "(1,54): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "children": [
+                      {
+                        "tag": "a"
+                      },
+                      {
+                        "tag": "table",
+                        "children": [
+                          {
+                            "tag": "tbody",
+                            "children": [
+                              {
+                                "tag": "tr",
+                                "children": [
+                                  {
+                                    "tag": "td",
+                                    "children": [
+                                      {
+                                        "tag": "a",
+                                        "children": [
+                                          {
+                                            "tag": "table"
+                                          }
+                                        ]
+                                      },
+                                      {
+                                        "tag": "a"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "a"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a><a></a><table><tbody><tr><td><a><table></table></a><a></a></td></tr></tbody></table></a><a></a></body></html>",
+        "noQuirksBodyHtml": "<a><a></a><table><tbody><tr><td><a><table></table></a><a></a></td></tr></tbody></table></a><a></a>"
+      }
+    },
+    {
+      "data": "<ul><li></li><div><li></div><li><li><div><li><address><li><b><em></b><li></ul>",
+      "errors": [
+        "(1,4): expected-doctype-but-got-start-tag",
+        "(1,45): end-tag-too-early",
+        "(1,58): end-tag-too-early",
+        "(1,69): adoption-agency-1.3"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ul": true,
+            "li": true,
+            "div": true,
+            "address": true,
+            "b": true,
+            "em": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ul",
+                    "children": [
+                      {
+                        "tag": "li"
+                      },
+                      {
+                        "tag": "div",
+                        "children": [
+                          {
+                            "tag": "li"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "li"
+                      },
+                      {
+                        "tag": "li",
+                        "children": [
+                          {
+                            "tag": "div"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "li",
+                        "children": [
+                          {
+                            "tag": "address"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "li",
+                        "children": [
+                          {
+                            "tag": "b",
+                            "children": [
+                              {
+                                "tag": "em"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "li"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ul><li></li><div><li></li></div><li></li><li><div></div></li><li><address></address></li><li><b><em></em></b></li><li></li></ul></body></html>",
+        "noQuirksBodyHtml": "<ul><li></li><div><li></li></div><li></li><li><div></div></li><li><address></address></li><li><b><em></em></b></li><li></li></ul>"
+      }
+    },
+    {
+      "data": "<ul><li><ul></li><li>a</li></ul></li></ul>",
+      "errors": [
+        "(1,4): expected-doctype-but-got-start-tag",
+        "(1,17): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ul": true,
+            "li": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ul",
+                    "children": [
+                      {
+                        "tag": "li",
+                        "children": [
+                          {
+                            "tag": "ul",
+                            "children": [
+                              {
+                                "tag": "li",
+                                "children": [
+                                  {
+                                    "text": "a"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ul><li><ul><li>a</li></ul></li></ul></body></html>",
+        "noQuirksBodyHtml": "<ul><li><ul><li>a</li></ul></li></ul>"
+      }
+    },
+    {
+      "data": "<frameset><frame><frameset><frame></frameset><noframes></noframes></frameset>",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true,
+            "frame": true,
+            "noframes": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset",
+                "children": [
+                  {
+                    "tag": "frame"
+                  },
+                  {
+                    "tag": "frameset",
+                    "children": [
+                      {
+                        "tag": "frame"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "noframes"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset><frame><frameset><frame></frameset><noframes></noframes></frameset></html>",
+        "noQuirksBodyHtml": "<noframes></noframes>"
+      }
+    },
+    {
+      "data": "<h1><table><td><h3></table><h3></h1>",
+      "errors": [
+        "(1,4): expected-doctype-but-got-start-tag",
+        "(1,15): unexpected-cell-in-table-body",
+        "(1,27): unexpected-cell-end-tag",
+        "(1,31): unexpected-start-tag",
+        "(1,36): end-tag-too-early"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "h1": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "h3": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "h1",
+                    "children": [
+                      {
+                        "tag": "table",
+                        "children": [
+                          {
+                            "tag": "tbody",
+                            "children": [
+                              {
+                                "tag": "tr",
+                                "children": [
+                                  {
+                                    "tag": "td",
+                                    "children": [
+                                      {
+                                        "tag": "h3"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "h3"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><h1><table><tbody><tr><td><h3></h3></td></tr></tbody></table></h1><h3></h3></body></html>",
+        "noQuirksBodyHtml": "<h1><table><tbody><tr><td><h3></h3></td></tr></tbody></table></h1><h3></h3>"
+      }
+    },
+    {
+      "data": "<table><colgroup><col><colgroup><col><col><col><colgroup><col><col><thead><tr><td></table>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "colgroup": true,
+            "col": true,
+            "thead": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "colgroup",
+                        "children": [
+                          {
+                            "tag": "col"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "colgroup",
+                        "children": [
+                          {
+                            "tag": "col"
+                          },
+                          {
+                            "tag": "col"
+                          },
+                          {
+                            "tag": "col"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "colgroup",
+                        "children": [
+                          {
+                            "tag": "col"
+                          },
+                          {
+                            "tag": "col"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "thead",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><colgroup><col></colgroup><colgroup><col><col><col></colgroup><colgroup><col><col></colgroup><thead><tr><td></td></tr></thead></table></body></html>",
+        "noQuirksBodyHtml": "<table><colgroup><col></colgroup><colgroup><col><col><col></colgroup><colgroup><col><col></colgroup><thead><tr><td></td></tr></thead></table>"
+      }
+    },
+    {
+      "data": "<table><col><tbody><col><tr><col><td><col></table><col>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,37): unexpected-cell-in-table-body",
+        "(1,55): unexpected-start-tag-ignored"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "colgroup": true,
+            "col": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "colgroup",
+                        "children": [
+                          {
+                            "tag": "col"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "tbody"
+                      },
+                      {
+                        "tag": "colgroup",
+                        "children": [
+                          {
+                            "tag": "col"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "colgroup",
+                        "children": [
+                          {
+                            "tag": "col"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "colgroup",
+                        "children": [
+                          {
+                            "tag": "col"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><colgroup><col></colgroup><tbody></tbody><colgroup><col></colgroup><tbody><tr></tr></tbody><colgroup><col></colgroup><tbody><tr><td></td></tr></tbody><colgroup><col></colgroup></table></body></html>",
+        "noQuirksBodyHtml": "<table><colgroup><col></colgroup><tbody></tbody><colgroup><col></colgroup><tbody><tr></tr></tbody><colgroup><col></colgroup><tbody><tr><td></td></tr></tbody><colgroup><col></colgroup></table>"
+      }
+    },
+    {
+      "data": "<table><colgroup><tbody><colgroup><tr><colgroup><td><colgroup></table><colgroup>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,52): unexpected-cell-in-table-body",
+        "(1,80): unexpected-start-tag-ignored"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "colgroup": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "colgroup"
+                      },
+                      {
+                        "tag": "tbody"
+                      },
+                      {
+                        "tag": "colgroup"
+                      },
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "colgroup"
+                      },
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "colgroup"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><colgroup></colgroup><tbody></tbody><colgroup></colgroup><tbody><tr></tr></tbody><colgroup></colgroup><tbody><tr><td></td></tr></tbody><colgroup></colgroup></table></body></html>",
+        "noQuirksBodyHtml": "<table><colgroup></colgroup><tbody></tbody><colgroup></colgroup><tbody><tr></tr></tbody><colgroup></colgroup><tbody><tr><td></td></tr></tbody><colgroup></colgroup></table>"
+      }
+    },
+    {
+      "data": "</strong></b></em></i></u></strike></s></blink></tt></pre></big></small></font></select></h1></h2></h3></h4></h5></h6></body></br></a></img></title></span></style></script></table></th></td></tr></frame></area></link></param></hr></input></col></base></meta></basefont></bgsound></embed></spacer></p></dd></dt></caption></colgroup></tbody></tfoot></thead></address></blockquote></center></dir></div></dl></fieldset></listing></menu></ol></ul></li></nobr></wbr></form></button></marquee></object></html></frameset></head></iframe></image></isindex></noembed></noframes></noscript></optgroup></option></plaintext></textarea>",
+      "errors": [
+        "(1,9): expected-doctype-but-got-end-tag",
+        "(1,9): unexpected-end-tag-before-html",
+        "(1,13): unexpected-end-tag-before-html",
+        "(1,18): unexpected-end-tag-before-html",
+        "(1,22): unexpected-end-tag-before-html",
+        "(1,26): unexpected-end-tag-before-html",
+        "(1,35): unexpected-end-tag-before-html",
+        "(1,39): unexpected-end-tag-before-html",
+        "(1,47): unexpected-end-tag-before-html",
+        "(1,52): unexpected-end-tag-before-html",
+        "(1,58): unexpected-end-tag-before-html",
+        "(1,64): unexpected-end-tag-before-html",
+        "(1,72): unexpected-end-tag-before-html",
+        "(1,79): unexpected-end-tag-before-html",
+        "(1,88): unexpected-end-tag-before-html",
+        "(1,93): unexpected-end-tag-before-html",
+        "(1,98): unexpected-end-tag-before-html",
+        "(1,103): unexpected-end-tag-before-html",
+        "(1,108): unexpected-end-tag-before-html",
+        "(1,113): unexpected-end-tag-before-html",
+        "(1,118): unexpected-end-tag-before-html",
+        "(1,130): unexpected-end-tag-after-body",
+        "(1,130): unexpected-end-tag-treated-as",
+        "(1,134): unexpected-end-tag",
+        "(1,140): unexpected-end-tag",
+        "(1,148): unexpected-end-tag",
+        "(1,155): unexpected-end-tag",
+        "(1,163): unexpected-end-tag",
+        "(1,172): unexpected-end-tag",
+        "(1,180): unexpected-end-tag",
+        "(1,185): unexpected-end-tag",
+        "(1,190): unexpected-end-tag",
+        "(1,195): unexpected-end-tag",
+        "(1,203): unexpected-end-tag",
+        "(1,210): unexpected-end-tag",
+        "(1,217): unexpected-end-tag",
+        "(1,225): unexpected-end-tag",
+        "(1,230): unexpected-end-tag",
+        "(1,238): unexpected-end-tag",
+        "(1,244): unexpected-end-tag",
+        "(1,251): unexpected-end-tag",
+        "(1,258): unexpected-end-tag",
+        "(1,269): unexpected-end-tag",
+        "(1,279): unexpected-end-tag",
+        "(1,287): unexpected-end-tag",
+        "(1,296): unexpected-end-tag",
+        "(1,300): unexpected-end-tag",
+        "(1,305): unexpected-end-tag",
+        "(1,310): unexpected-end-tag",
+        "(1,320): unexpected-end-tag",
+        "(1,331): unexpected-end-tag",
+        "(1,339): unexpected-end-tag",
+        "(1,347): unexpected-end-tag",
+        "(1,355): unexpected-end-tag",
+        "(1,365): end-tag-too-early",
+        "(1,378): end-tag-too-early",
+        "(1,387): end-tag-too-early",
+        "(1,393): end-tag-too-early",
+        "(1,399): end-tag-too-early",
+        "(1,404): end-tag-too-early",
+        "(1,415): end-tag-too-early",
+        "(1,425): end-tag-too-early",
+        "(1,432): end-tag-too-early",
+        "(1,437): end-tag-too-early",
+        "(1,442): end-tag-too-early",
+        "(1,447): unexpected-end-tag",
+        "(1,454): unexpected-end-tag",
+        "(1,460): unexpected-end-tag",
+        "(1,467): unexpected-end-tag",
+        "(1,476): end-tag-too-early",
+        "(1,486): end-tag-too-early",
+        "(1,495): end-tag-too-early",
+        "(1,513): expected-eof-but-got-end-tag",
+        "(1,513): unexpected-end-tag",
+        "(1,520): unexpected-end-tag",
+        "(1,529): unexpected-end-tag",
+        "(1,537): unexpected-end-tag",
+        "(1,547): unexpected-end-tag",
+        "(1,557): unexpected-end-tag",
+        "(1,568): unexpected-end-tag",
+        "(1,579): unexpected-end-tag",
+        "(1,590): unexpected-end-tag",
+        "(1,599): unexpected-end-tag",
+        "(1,611): unexpected-end-tag",
+        "(1,622): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "br": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "br"
+                  },
+                  {
+                    "tag": "p"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><br><p></p></body></html>",
+        "noQuirksBodyHtml": "<br><p></p>"
+      }
+    },
+    {
+      "data": "<table><tr></strong></b></em></i></u></strike></s></blink></tt></pre></big></small></font></select></h1></h2></h3></h4></h5></h6></body></br></a></img></title></span></style></script></table></th></td></tr></frame></area></link></param></hr></input></col></base></meta></basefont></bgsound></embed></spacer></p></dd></dt></caption></colgroup></tbody></tfoot></thead></address></blockquote></center></dir></div></dl></fieldset></listing></menu></ol></ul></li></nobr></wbr></form></button></marquee></object></html></frameset></head></iframe></image></isindex></noembed></noframes></noscript></optgroup></option></plaintext></textarea>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,20): unexpected-end-tag-implies-table-voodoo",
+        "(1,20): unexpected-end-tag",
+        "(1,24): unexpected-end-tag-implies-table-voodoo",
+        "(1,24): unexpected-end-tag",
+        "(1,29): unexpected-end-tag-implies-table-voodoo",
+        "(1,29): unexpected-end-tag",
+        "(1,33): unexpected-end-tag-implies-table-voodoo",
+        "(1,33): unexpected-end-tag",
+        "(1,37): unexpected-end-tag-implies-table-voodoo",
+        "(1,37): unexpected-end-tag",
+        "(1,46): unexpected-end-tag-implies-table-voodoo",
+        "(1,46): unexpected-end-tag",
+        "(1,50): unexpected-end-tag-implies-table-voodoo",
+        "(1,50): unexpected-end-tag",
+        "(1,58): unexpected-end-tag-implies-table-voodoo",
+        "(1,58): unexpected-end-tag",
+        "(1,63): unexpected-end-tag-implies-table-voodoo",
+        "(1,63): unexpected-end-tag",
+        "(1,69): unexpected-end-tag-implies-table-voodoo",
+        "(1,69): end-tag-too-early",
+        "(1,75): unexpected-end-tag-implies-table-voodoo",
+        "(1,75): unexpected-end-tag",
+        "(1,83): unexpected-end-tag-implies-table-voodoo",
+        "(1,83): unexpected-end-tag",
+        "(1,90): unexpected-end-tag-implies-table-voodoo",
+        "(1,90): unexpected-end-tag",
+        "(1,99): unexpected-end-tag-implies-table-voodoo",
+        "(1,99): unexpected-end-tag",
+        "(1,104): unexpected-end-tag-implies-table-voodoo",
+        "(1,104): end-tag-too-early",
+        "(1,109): unexpected-end-tag-implies-table-voodoo",
+        "(1,109): end-tag-too-early",
+        "(1,114): unexpected-end-tag-implies-table-voodoo",
+        "(1,114): end-tag-too-early",
+        "(1,119): unexpected-end-tag-implies-table-voodoo",
+        "(1,119): end-tag-too-early",
+        "(1,124): unexpected-end-tag-implies-table-voodoo",
+        "(1,124): end-tag-too-early",
+        "(1,129): unexpected-end-tag-implies-table-voodoo",
+        "(1,129): end-tag-too-early",
+        "(1,136): unexpected-end-tag-in-table-row",
+        "(1,141): unexpected-end-tag-implies-table-voodoo",
+        "(1,141): unexpected-end-tag-treated-as",
+        "(1,145): unexpected-end-tag-implies-table-voodoo",
+        "(1,145): unexpected-end-tag",
+        "(1,151): unexpected-end-tag-implies-table-voodoo",
+        "(1,151): unexpected-end-tag",
+        "(1,159): unexpected-end-tag-implies-table-voodoo",
+        "(1,159): unexpected-end-tag",
+        "(1,166): unexpected-end-tag-implies-table-voodoo",
+        "(1,166): unexpected-end-tag",
+        "(1,174): unexpected-end-tag-implies-table-voodoo",
+        "(1,174): unexpected-end-tag",
+        "(1,183): unexpected-end-tag-implies-table-voodoo",
+        "(1,183): unexpected-end-tag",
+        "(1,196): unexpected-end-tag",
+        "(1,201): unexpected-end-tag",
+        "(1,206): unexpected-end-tag",
+        "(1,214): unexpected-end-tag",
+        "(1,221): unexpected-end-tag",
+        "(1,228): unexpected-end-tag",
+        "(1,236): unexpected-end-tag",
+        "(1,241): unexpected-end-tag",
+        "(1,249): unexpected-end-tag",
+        "(1,255): unexpected-end-tag",
+        "(1,262): unexpected-end-tag",
+        "(1,269): unexpected-end-tag",
+        "(1,280): unexpected-end-tag",
+        "(1,290): unexpected-end-tag",
+        "(1,298): unexpected-end-tag",
+        "(1,307): unexpected-end-tag",
+        "(1,311): unexpected-end-tag",
+        "(1,316): unexpected-end-tag",
+        "(1,321): unexpected-end-tag",
+        "(1,331): unexpected-end-tag",
+        "(1,342): unexpected-end-tag",
+        "(1,350): unexpected-end-tag",
+        "(1,358): unexpected-end-tag",
+        "(1,366): unexpected-end-tag",
+        "(1,376): end-tag-too-early",
+        "(1,389): end-tag-too-early",
+        "(1,398): end-tag-too-early",
+        "(1,404): end-tag-too-early",
+        "(1,410): end-tag-too-early",
+        "(1,415): end-tag-too-early",
+        "(1,426): end-tag-too-early",
+        "(1,436): end-tag-too-early",
+        "(1,443): end-tag-too-early",
+        "(1,448): end-tag-too-early",
+        "(1,453): end-tag-too-early",
+        "(1,458): unexpected-end-tag",
+        "(1,465): unexpected-end-tag",
+        "(1,471): unexpected-end-tag",
+        "(1,478): unexpected-end-tag",
+        "(1,487): end-tag-too-early",
+        "(1,497): end-tag-too-early",
+        "(1,506): end-tag-too-early",
+        "(1,524): expected-eof-but-got-end-tag",
+        "(1,524): unexpected-end-tag",
+        "(1,531): unexpected-end-tag",
+        "(1,540): unexpected-end-tag",
+        "(1,548): unexpected-end-tag",
+        "(1,558): unexpected-end-tag",
+        "(1,568): unexpected-end-tag",
+        "(1,579): unexpected-end-tag",
+        "(1,590): unexpected-end-tag",
+        "(1,601): unexpected-end-tag",
+        "(1,610): unexpected-end-tag",
+        "(1,622): unexpected-end-tag",
+        "(1,633): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "br": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "br"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><br><table><tbody><tr></tr></tbody></table><p></p></body></html>",
+        "noQuirksBodyHtml": "<br><table><tbody><tr></tr></tbody></table><p></p>"
+      }
+    },
+    {
+      "data": "<frameset>",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag",
+        "(1,10): eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": ""
+      }
+    }
+  ],
+  "tests10.dat": [
+    {
+      "data": "<!DOCTYPE html><svg></svg>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg></svg></body></html>",
+        "noQuirksBodyHtml": "<svg></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><svg></svg><![CDATA[a]]>",
+      "errors": [
+        "(1,28) expected-dashes-or-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "doctype": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg"
+                  },
+                  {
+                    "comment": "[CDATA[a]]"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg></svg><!--[CDATA[a]]--></body></html>",
+        "noQuirksBodyHtml": "<svg></svg><!--[CDATA[a]]-->"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><svg></svg>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg></svg></body></html>",
+        "noQuirksBodyHtml": "<svg></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><select><svg></svg></select>",
+      "errors": [
+        "(1,34) unexpected-start-tag-in-select",
+        "(1,40) unexpected-end-tag-in-select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select></select></body></html>",
+        "noQuirksBodyHtml": "<select></select>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><select><option><svg></svg></option></select>",
+      "errors": [
+        "(1,42) unexpected-start-tag-in-select",
+        "(1,48) unexpected-end-tag-in-select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "option": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "tag": "option"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select><option></option></select></body></html>",
+        "noQuirksBodyHtml": "<select><option></option></select>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><svg></svg></table>",
+      "errors": [
+        "(1,33) foster-parenting-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "table": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg"
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg></svg><table></table></body></html>",
+        "noQuirksBodyHtml": "<svg></svg><table></table>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><svg><g>foo</g></svg></table>",
+      "errors": [
+        "(1,33) foster-parenting-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg g": true,
+            "table": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "g",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "text": "foo"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg><g>foo</g></svg><table></table></body></html>",
+        "noQuirksBodyHtml": "<svg><g>foo</g></svg><table></table>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><svg><g>foo</g><g>bar</g></svg></table>",
+      "errors": [
+        "(1,33) foster-parenting-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg g": true,
+            "table": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "g",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "text": "foo"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "g",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "text": "bar"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg><g>foo</g><g>bar</g></svg><table></table></body></html>",
+        "noQuirksBodyHtml": "<svg><g>foo</g><g>bar</g></svg><table></table>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><tbody><svg><g>foo</g><g>bar</g></svg></tbody></table>",
+      "errors": [
+        "(1,40) foster-parenting-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg g": true,
+            "table": true,
+            "tbody": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "g",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "text": "foo"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "g",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "text": "bar"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg><g>foo</g><g>bar</g></svg><table><tbody></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<svg><g>foo</g><g>bar</g></svg><table><tbody></tbody></table>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><tbody><tr><svg><g>foo</g><g>bar</g></svg></tr></tbody></table>",
+      "errors": [
+        "(1,44) foster-parenting-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg g": true,
+            "table": true,
+            "tbody": true,
+            "tr": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "g",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "text": "foo"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "g",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "text": "bar"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg><g>foo</g><g>bar</g></svg><table><tbody><tr></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<svg><g>foo</g><g>bar</g></svg><table><tbody><tr></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg></td></tr></tbody></table>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "svg svg": true,
+            "svg g": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "svg",
+                                    "ns": "http://www.w3.org/2000/svg",
+                                    "children": [
+                                      {
+                                        "tag": "g",
+                                        "ns": "http://www.w3.org/2000/svg",
+                                        "children": [
+                                          {
+                                            "text": "foo"
+                                          }
+                                        ]
+                                      },
+                                      {
+                                        "tag": "g",
+                                        "ns": "http://www.w3.org/2000/svg",
+                                        "children": [
+                                          {
+                                            "text": "bar"
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg><p>baz</td></tr></tbody></table>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "svg svg": true,
+            "svg g": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "svg",
+                                    "ns": "http://www.w3.org/2000/svg",
+                                    "children": [
+                                      {
+                                        "tag": "g",
+                                        "ns": "http://www.w3.org/2000/svg",
+                                        "children": [
+                                          {
+                                            "text": "foo"
+                                          }
+                                        ]
+                                      },
+                                      {
+                                        "tag": "g",
+                                        "ns": "http://www.w3.org/2000/svg",
+                                        "children": [
+                                          {
+                                            "text": "bar"
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "tag": "p",
+                                    "children": [
+                                      {
+                                        "text": "baz"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg><p>baz</p></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg><p>baz</p></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g></svg><p>baz</caption></table>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "caption": true,
+            "svg svg": true,
+            "svg g": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "caption",
+                        "children": [
+                          {
+                            "tag": "svg",
+                            "ns": "http://www.w3.org/2000/svg",
+                            "children": [
+                              {
+                                "tag": "g",
+                                "ns": "http://www.w3.org/2000/svg",
+                                "children": [
+                                  {
+                                    "text": "foo"
+                                  }
+                                ]
+                              },
+                              {
+                                "tag": "g",
+                                "ns": "http://www.w3.org/2000/svg",
+                                "children": [
+                                  {
+                                    "text": "bar"
+                                  }
+                                ]
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "p",
+                            "children": [
+                              {
+                                "text": "baz"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><caption><svg><g>foo</g><g>bar</g></svg><p>baz</p></caption></table></body></html>",
+        "noQuirksBodyHtml": "<table><caption><svg><g>foo</g><g>bar</g></svg><p>baz</p></caption></table>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g><p>baz</table><p>quux",
+      "errors": [
+        "(1,65) unexpected-html-element-in-foreign-content"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "caption": true,
+            "svg svg": true,
+            "svg g": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "caption",
+                        "children": [
+                          {
+                            "tag": "svg",
+                            "ns": "http://www.w3.org/2000/svg",
+                            "children": [
+                              {
+                                "tag": "g",
+                                "ns": "http://www.w3.org/2000/svg",
+                                "children": [
+                                  {
+                                    "text": "foo"
+                                  }
+                                ]
+                              },
+                              {
+                                "tag": "g",
+                                "ns": "http://www.w3.org/2000/svg",
+                                "children": [
+                                  {
+                                    "text": "bar"
+                                  }
+                                ]
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "p",
+                            "children": [
+                              {
+                                "text": "baz"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "quux"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><caption><svg><g>foo</g><g>bar</g></svg><p>baz</p></caption></table><p>quux</p></body></html>",
+        "noQuirksBodyHtml": "<table><caption><svg><g>foo</g><g>bar</g><p>baz</p></svg></caption></table><p>quux</p>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g>baz</table><p>quux",
+      "errors": [
+        "(1,73) unexpected-end-tag",
+        "(1,73) expected-one-end-tag-but-got-another"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "caption": true,
+            "svg svg": true,
+            "svg g": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "caption",
+                        "children": [
+                          {
+                            "tag": "svg",
+                            "ns": "http://www.w3.org/2000/svg",
+                            "children": [
+                              {
+                                "tag": "g",
+                                "ns": "http://www.w3.org/2000/svg",
+                                "children": [
+                                  {
+                                    "text": "foo"
+                                  }
+                                ]
+                              },
+                              {
+                                "tag": "g",
+                                "ns": "http://www.w3.org/2000/svg",
+                                "children": [
+                                  {
+                                    "text": "bar"
+                                  }
+                                ]
+                              },
+                              {
+                                "text": "baz"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "quux"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><caption><svg><g>foo</g><g>bar</g>baz</svg></caption></table><p>quux</p></body></html>",
+        "noQuirksBodyHtml": "<table><caption><svg><g>foo</g><g>bar</g>baz</svg></caption></table><p>quux</p>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><colgroup><svg><g>foo</g><g>bar</g><p>baz</table><p>quux",
+      "errors": [
+        "(1,43) foster-parenting-start-tag svg",
+        "(1,66) unexpected HTML-like start tag token in foreign content",
+        "(1,66) foster-parenting-start-tag",
+        "(1,67) foster-parenting-character",
+        "(1,68) foster-parenting-character",
+        "(1,69) foster-parenting-character"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg g": true,
+            "p": true,
+            "table": true,
+            "colgroup": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "g",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "text": "foo"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "g",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "text": "bar"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "baz"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "colgroup"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "quux"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg><g>foo</g><g>bar</g></svg><p>baz</p><table><colgroup></colgroup></table><p>quux</p></body></html>",
+        "noQuirksBodyHtml": "<svg><g>foo</g><g>bar</g><p>baz</p></svg><table><colgroup></colgroup></table><p>quux</p>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><tr><td><select><svg><g>foo</g><g>bar</g><p>baz</table><p>quux",
+      "errors": [
+        "(1,49) unexpected-start-tag-in-select",
+        "(1,52) unexpected-start-tag-in-select",
+        "(1,59) unexpected-end-tag-in-select",
+        "(1,62) unexpected-start-tag-in-select",
+        "(1,69) unexpected-end-tag-in-select",
+        "(1,72) unexpected-start-tag-in-select",
+        "(1,83) unexpected-table-element-end-tag-in-select-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "select": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "select",
+                                    "children": [
+                                      {
+                                        "text": "foobarbaz"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "quux"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><select>foobarbaz</select></td></tr></tbody></table><p>quux</p></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td><select>foobarbaz</select></td></tr></tbody></table><p>quux</p>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><select><svg><g>foo</g><g>bar</g><p>baz</table><p>quux",
+      "errors": [
+        "(1,36) unexpected-start-tag-implies-table-voodoo",
+        "(1,41) unexpected-start-tag-in-select",
+        "(1,44) unexpected-start-tag-in-select",
+        "(1,51) unexpected-end-tag-in-select",
+        "(1,54) unexpected-start-tag-in-select",
+        "(1,61) unexpected-end-tag-in-select",
+        "(1,64) unexpected-start-tag-in-select",
+        "(1,75) unexpected-table-element-end-tag-in-select-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "table": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "text": "foobarbaz"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table"
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "quux"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select>foobarbaz</select><table></table><p>quux</p></body></html>",
+        "noQuirksBodyHtml": "<select>foobarbaz</select><table></table><p>quux</p>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body></body></html><svg><g>foo</g><g>bar</g><p>baz",
+      "errors": [
+        "(1,40) expected-eof-but-got-start-tag",
+        "(1,63) unexpected-html-element-in-foreign-content"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg g": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "g",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "text": "foo"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "g",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "text": "bar"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "baz"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg><g>foo</g><g>bar</g></svg><p>baz</p></body></html>",
+        "noQuirksBodyHtml": "<svg><g>foo</g><g>bar</g><p>baz</p></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body></body><svg><g>foo</g><g>bar</g><p>baz",
+      "errors": [
+        "(1,33) unexpected-start-tag-after-body",
+        "(1,56) unexpected-html-element-in-foreign-content"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg g": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "g",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "text": "foo"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "g",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "text": "bar"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "baz"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg><g>foo</g><g>bar</g></svg><p>baz</p></body></html>",
+        "noQuirksBodyHtml": "<svg><g>foo</g><g>bar</g><p>baz</p></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><frameset><svg><g></g><g></g><p><span>",
+      "errors": [
+        "(1,30) unexpected-start-tag-in-frameset",
+        "(1,33) unexpected-start-tag-in-frameset",
+        "(1,37) unexpected-end-tag-in-frameset",
+        "(1,40) unexpected-start-tag-in-frameset",
+        "(1,44) unexpected-end-tag-in-frameset",
+        "(1,47) unexpected-start-tag-in-frameset",
+        "(1,53) unexpected-start-tag-in-frameset",
+        "(1,53) eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": "<svg><g></g><g></g><p><span></span></p></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><frameset></frameset><svg><g></g><g></g><p><span>",
+      "errors": [
+        "(1,41) unexpected-start-tag-after-frameset",
+        "(1,44) unexpected-start-tag-after-frameset",
+        "(1,48) unexpected-end-tag-after-frameset",
+        "(1,51) unexpected-start-tag-after-frameset",
+        "(1,55) unexpected-end-tag-after-frameset",
+        "(1,58) unexpected-start-tag-after-frameset",
+        "(1,64) unexpected-start-tag-after-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": "<svg><g></g><g></g><p><span></span></p></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body xlink:href=foo><svg xlink:href=foo></svg>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "attrs": [
+                  {
+                    "name": "xlink:href",
+                    "value": "foo"
+                  }
+                ],
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "attrs": [
+                      {
+                        "name": "href",
+                        "ns": "http://www.w3.org/1999/xlink",
+                        "value": "foo"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body xlink:href=\"foo\"><svg xlink:href=\"foo\"></svg></body></html>",
+        "noQuirksBodyHtml": "<svg xlink:href=\"foo\"></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo></g></svg>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg g": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "attrs": [
+                  {
+                    "name": "xlink:href",
+                    "value": "foo"
+                  },
+                  {
+                    "name": "xml:lang",
+                    "value": "en"
+                  }
+                ],
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "g",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "attrs": [
+                          {
+                            "name": "href",
+                            "ns": "http://www.w3.org/1999/xlink",
+                            "value": "foo"
+                          },
+                          {
+                            "name": "lang",
+                            "ns": "http://www.w3.org/XML/1998/namespace",
+                            "value": "en"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body xlink:href=\"foo\" xml:lang=\"en\"><svg><g xml:lang=\"en\" xlink:href=\"foo\"></g></svg></body></html>",
+        "noQuirksBodyHtml": "<svg><g xml:lang=\"en\" xlink:href=\"foo\"></g></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo /></svg>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg g": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "attrs": [
+                  {
+                    "name": "xlink:href",
+                    "value": "foo"
+                  },
+                  {
+                    "name": "xml:lang",
+                    "value": "en"
+                  }
+                ],
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "g",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "attrs": [
+                          {
+                            "name": "href",
+                            "ns": "http://www.w3.org/1999/xlink",
+                            "value": "foo"
+                          },
+                          {
+                            "name": "lang",
+                            "ns": "http://www.w3.org/XML/1998/namespace",
+                            "value": "en"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body xlink:href=\"foo\" xml:lang=\"en\"><svg><g xml:lang=\"en\" xlink:href=\"foo\"></g></svg></body></html>",
+        "noQuirksBodyHtml": "<svg><g xml:lang=\"en\" xlink:href=\"foo\"></g></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo />bar</svg>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg g": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "attrs": [
+                  {
+                    "name": "xlink:href",
+                    "value": "foo"
+                  },
+                  {
+                    "name": "xml:lang",
+                    "value": "en"
+                  }
+                ],
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "g",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "attrs": [
+                          {
+                            "name": "href",
+                            "ns": "http://www.w3.org/1999/xlink",
+                            "value": "foo"
+                          },
+                          {
+                            "name": "lang",
+                            "ns": "http://www.w3.org/XML/1998/namespace",
+                            "value": "en"
+                          }
+                        ]
+                      },
+                      {
+                        "text": "bar"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body xlink:href=\"foo\" xml:lang=\"en\"><svg><g xml:lang=\"en\" xlink:href=\"foo\"></g>bar</svg></body></html>",
+        "noQuirksBodyHtml": "<svg><g xml:lang=\"en\" xlink:href=\"foo\"></g>bar</svg>"
+      }
+    },
+    {
+      "data": "<svg></path>",
+      "errors": [
+        "(1,5) expected-doctype-but-got-start-tag",
+        "(1,12) unexpected-end-tag",
+        "(1,12) unexpected-end-tag",
+        "(1,12) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg></svg></body></html>",
+        "noQuirksBodyHtml": "<svg></svg>"
+      }
+    },
+    {
+      "data": "<div><svg></div>a",
+      "errors": [
+        "(1,5) expected-doctype-but-got-start-tag",
+        "(1,16) unexpected-end-tag",
+        "(1,16) end-tag-too-early"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "svg svg": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "svg",
+                        "ns": "http://www.w3.org/2000/svg"
+                      }
+                    ]
+                  },
+                  {
+                    "text": "a"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div><svg></svg></div>a</body></html>",
+        "noQuirksBodyHtml": "<div><svg></svg></div>a"
+      }
+    },
+    {
+      "data": "<div><svg><path></div>a",
+      "errors": [
+        "(1,5) expected-doctype-but-got-start-tag",
+        "(1,22) unexpected-end-tag",
+        "(1,22) end-tag-too-early"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "svg svg": true,
+            "svg path": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "svg",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "tag": "path",
+                            "ns": "http://www.w3.org/2000/svg"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "text": "a"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div><svg><path></path></svg></div>a</body></html>",
+        "noQuirksBodyHtml": "<div><svg><path></path></svg></div>a"
+      }
+    },
+    {
+      "data": "<div><svg><path></svg><path>",
+      "errors": [
+        "(1,5) expected-doctype-but-got-start-tag",
+        "(1,22) unexpected-end-tag",
+        "(1,28) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "svg svg": true,
+            "svg path": true,
+            "path": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "svg",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "tag": "path",
+                            "ns": "http://www.w3.org/2000/svg"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "path"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div><svg><path></path></svg><path></path></div></body></html>",
+        "noQuirksBodyHtml": "<div><svg><path></path></svg><path></path></div>"
+      }
+    },
+    {
+      "data": "<div><svg><path><foreignObject><math></div>a",
+      "errors": [
+        "(1,5) expected-doctype-but-got-start-tag",
+        "(1,43) unexpected-end-tag",
+        "(1,43) end-tag-too-early",
+        "(1,44) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "svg svg": true,
+            "svg path": true,
+            "svg foreignObject": true,
+            "math math": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "svg",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "tag": "path",
+                            "ns": "http://www.w3.org/2000/svg",
+                            "children": [
+                              {
+                                "tag": "foreignObject",
+                                "ns": "http://www.w3.org/2000/svg",
+                                "children": [
+                                  {
+                                    "tag": "math",
+                                    "ns": "http://www.w3.org/1998/Math/MathML",
+                                    "children": [
+                                      {
+                                        "text": "a"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div><svg><path><foreignObject><math>a</math></foreignObject></path></svg></div></body></html>",
+        "noQuirksBodyHtml": "<div><svg><path><foreignObject><math>a</math></foreignObject></path></svg></div>"
+      }
+    },
+    {
+      "data": "<div><svg><path><foreignObject><p></div>a",
+      "errors": [
+        "(1,5) expected-doctype-but-got-start-tag",
+        "(1,40) end-tag-too-early",
+        "(1,41) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "svg svg": true,
+            "svg path": true,
+            "svg foreignObject": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "svg",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "tag": "path",
+                            "ns": "http://www.w3.org/2000/svg",
+                            "children": [
+                              {
+                                "tag": "foreignObject",
+                                "ns": "http://www.w3.org/2000/svg",
+                                "children": [
+                                  {
+                                    "tag": "p",
+                                    "children": [
+                                      {
+                                        "text": "a"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div><svg><path><foreignObject><p>a</p></foreignObject></path></svg></div></body></html>",
+        "noQuirksBodyHtml": "<div><svg><path><foreignObject><p>a</p></foreignObject></path></svg></div>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><svg><desc><div><svg><ul>a",
+      "errors": [
+        "(1,40) unexpected-html-element-in-foreign-content",
+        "(1,41) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg desc": true,
+            "div": true,
+            "ul": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "desc",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "tag": "div",
+                            "children": [
+                              {
+                                "tag": "svg",
+                                "ns": "http://www.w3.org/2000/svg"
+                              },
+                              {
+                                "tag": "ul",
+                                "children": [
+                                  {
+                                    "text": "a"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg><desc><div><svg></svg><ul>a</ul></div></desc></svg></body></html>",
+        "noQuirksBodyHtml": "<svg><desc><div><svg><ul>a</ul></svg></div></desc></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><svg><desc><svg><ul>a",
+      "errors": [
+        "(1,35) unexpected-html-element-in-foreign-content",
+        "(1,36) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg desc": true,
+            "ul": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "desc",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "tag": "svg",
+                            "ns": "http://www.w3.org/2000/svg"
+                          },
+                          {
+                            "tag": "ul",
+                            "children": [
+                              {
+                                "text": "a"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg><desc><svg></svg><ul>a</ul></desc></svg></body></html>",
+        "noQuirksBodyHtml": "<svg><desc><svg><ul>a</ul></svg></desc></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><p><svg><desc><p>",
+      "errors": [
+        "(1,32) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "svg svg": true,
+            "svg desc": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "svg",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "tag": "desc",
+                            "ns": "http://www.w3.org/2000/svg",
+                            "children": [
+                              {
+                                "tag": "p"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><svg><desc><p></p></desc></svg></p></body></html>",
+        "noQuirksBodyHtml": "<p><svg><desc><p></p></desc></svg></p>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><p><svg><title><p>",
+      "errors": [
+        "(1,33) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "svg svg": true,
+            "svg title": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "svg",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "tag": "title",
+                            "ns": "http://www.w3.org/2000/svg",
+                            "children": [
+                              {
+                                "tag": "p"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><svg><title><p></p></title></svg></p></body></html>",
+        "noQuirksBodyHtml": "<p><svg><title><p></p></title></svg></p>"
+      }
+    },
+    {
+      "data": "<div><svg><path><foreignObject><p></foreignObject><p>",
+      "errors": [
+        "(1,5) expected-doctype-but-got-start-tag",
+        "(1,50) unexpected-end-tag",
+        "(1,53) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "svg svg": true,
+            "svg path": true,
+            "svg foreignObject": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "svg",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "tag": "path",
+                            "ns": "http://www.w3.org/2000/svg",
+                            "children": [
+                              {
+                                "tag": "foreignObject",
+                                "ns": "http://www.w3.org/2000/svg",
+                                "children": [
+                                  {
+                                    "tag": "p"
+                                  },
+                                  {
+                                    "tag": "p"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div><svg><path><foreignObject><p></p><p></p></foreignObject></path></svg></div></body></html>",
+        "noQuirksBodyHtml": "<div><svg><path><foreignObject><p></p><p></p></foreignObject></path></svg></div>"
+      }
+    },
+    {
+      "data": "<math><mi><div><object><div><span></span></div></object></div></mi><mi>",
+      "errors": [
+        "(1,6) expected-doctype-but-got-start-tag",
+        "(1,71) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mi": true,
+            "div": true,
+            "object": true,
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "div",
+                            "children": [
+                              {
+                                "tag": "object",
+                                "children": [
+                                  {
+                                    "tag": "div",
+                                    "children": [
+                                      {
+                                        "tag": "span"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><mi><div><object><div><span></span></div></object></div></mi><mi></mi></math></body></html>",
+        "noQuirksBodyHtml": "<math><mi><div><object><div><span></span></div></object></div></mi><mi></mi></math>"
+      }
+    },
+    {
+      "data": "<math><mi><svg><foreignObject><div><div></div></div></foreignObject></svg></mi><mi>",
+      "errors": [
+        "(1,6) expected-doctype-but-got-start-tag",
+        "(1,83) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mi": true,
+            "svg svg": true,
+            "svg foreignObject": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "svg",
+                            "ns": "http://www.w3.org/2000/svg",
+                            "children": [
+                              {
+                                "tag": "foreignObject",
+                                "ns": "http://www.w3.org/2000/svg",
+                                "children": [
+                                  {
+                                    "tag": "div",
+                                    "children": [
+                                      {
+                                        "tag": "div"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><mi><svg><foreignObject><div><div></div></div></foreignObject></svg></mi><mi></mi></math></body></html>",
+        "noQuirksBodyHtml": "<math><mi><svg><foreignObject><div><div></div></div></foreignObject></svg></mi><mi></mi></math>"
+      }
+    },
+    {
+      "data": "<svg><script></script><path>",
+      "errors": [
+        "(1,5) expected-doctype-but-got-start-tag",
+        "(1,28) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg script": true,
+            "svg path": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "script",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "path",
+                        "ns": "http://www.w3.org/2000/svg"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg><script></script><path></path></svg></body></html>",
+        "noQuirksBodyHtml": "<svg><script></script><path></path></svg>"
+      }
+    },
+    {
+      "data": "<table><svg></svg><tr>",
+      "errors": [
+        "(1,7) expected-doctype-but-got-start-tag",
+        "(1,12) unexpected-start-tag-implies-table-voodoo",
+        "(1,22) eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "table": true,
+            "tbody": true,
+            "tr": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg></svg><table><tbody><tr></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<svg></svg><table><tbody><tr></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<math><mi><mglyph>",
+      "errors": [
+        "(1,6) expected-doctype-but-got-start-tag",
+        "(1,18) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mi": true,
+            "math mglyph": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "mglyph",
+                            "ns": "http://www.w3.org/1998/Math/MathML"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><mi><mglyph></mglyph></mi></math></body></html>",
+        "noQuirksBodyHtml": "<math><mi><mglyph></mglyph></mi></math>"
+      }
+    },
+    {
+      "data": "<math><mi><malignmark>",
+      "errors": [
+        "(1,6) expected-doctype-but-got-start-tag",
+        "(1,22) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mi": true,
+            "math malignmark": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "malignmark",
+                            "ns": "http://www.w3.org/1998/Math/MathML"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><mi><malignmark></malignmark></mi></math></body></html>",
+        "noQuirksBodyHtml": "<math><mi><malignmark></malignmark></mi></math>"
+      }
+    },
+    {
+      "data": "<math><mo><mglyph>",
+      "errors": [
+        "(1,6) expected-doctype-but-got-start-tag",
+        "(1,18) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mo": true,
+            "math mglyph": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mo",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "mglyph",
+                            "ns": "http://www.w3.org/1998/Math/MathML"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><mo><mglyph></mglyph></mo></math></body></html>",
+        "noQuirksBodyHtml": "<math><mo><mglyph></mglyph></mo></math>"
+      }
+    },
+    {
+      "data": "<math><mo><malignmark>",
+      "errors": [
+        "(1,6) expected-doctype-but-got-start-tag",
+        "(1,22) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mo": true,
+            "math malignmark": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mo",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "malignmark",
+                            "ns": "http://www.w3.org/1998/Math/MathML"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><mo><malignmark></malignmark></mo></math></body></html>",
+        "noQuirksBodyHtml": "<math><mo><malignmark></malignmark></mo></math>"
+      }
+    },
+    {
+      "data": "<math><mn><mglyph>",
+      "errors": [
+        "(1,6) expected-doctype-but-got-start-tag",
+        "(1,18) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mn": true,
+            "math mglyph": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mn",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "mglyph",
+                            "ns": "http://www.w3.org/1998/Math/MathML"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><mn><mglyph></mglyph></mn></math></body></html>",
+        "noQuirksBodyHtml": "<math><mn><mglyph></mglyph></mn></math>"
+      }
+    },
+    {
+      "data": "<math><mn><malignmark>",
+      "errors": [
+        "(1,6) expected-doctype-but-got-start-tag",
+        "(1,22) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mn": true,
+            "math malignmark": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mn",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "malignmark",
+                            "ns": "http://www.w3.org/1998/Math/MathML"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><mn><malignmark></malignmark></mn></math></body></html>",
+        "noQuirksBodyHtml": "<math><mn><malignmark></malignmark></mn></math>"
+      }
+    },
+    {
+      "data": "<math><ms><mglyph>",
+      "errors": [
+        "(1,6) expected-doctype-but-got-start-tag",
+        "(1,18) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math ms": true,
+            "math mglyph": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "ms",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "mglyph",
+                            "ns": "http://www.w3.org/1998/Math/MathML"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><ms><mglyph></mglyph></ms></math></body></html>",
+        "noQuirksBodyHtml": "<math><ms><mglyph></mglyph></ms></math>"
+      }
+    },
+    {
+      "data": "<math><ms><malignmark>",
+      "errors": [
+        "(1,6) expected-doctype-but-got-start-tag",
+        "(1,22) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math ms": true,
+            "math malignmark": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "ms",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "malignmark",
+                            "ns": "http://www.w3.org/1998/Math/MathML"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><ms><malignmark></malignmark></ms></math></body></html>",
+        "noQuirksBodyHtml": "<math><ms><malignmark></malignmark></ms></math>"
+      }
+    },
+    {
+      "data": "<math><mtext><mglyph>",
+      "errors": [
+        "(1,6) expected-doctype-but-got-start-tag",
+        "(1,21) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mtext": true,
+            "math mglyph": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mtext",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "mglyph",
+                            "ns": "http://www.w3.org/1998/Math/MathML"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><mtext><mglyph></mglyph></mtext></math></body></html>",
+        "noQuirksBodyHtml": "<math><mtext><mglyph></mglyph></mtext></math>"
+      }
+    },
+    {
+      "data": "<math><mtext><malignmark>",
+      "errors": [
+        "(1,6) expected-doctype-but-got-start-tag",
+        "(1,25) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mtext": true,
+            "math malignmark": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mtext",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "malignmark",
+                            "ns": "http://www.w3.org/1998/Math/MathML"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><mtext><malignmark></malignmark></mtext></math></body></html>",
+        "noQuirksBodyHtml": "<math><mtext><malignmark></malignmark></mtext></math>"
+      }
+    },
+    {
+      "data": "<math><annotation-xml><svg></svg></annotation-xml><mi>",
+      "errors": [
+        "(1,6) expected-doctype-but-got-start-tag",
+        "(1,54) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math annotation-xml": true,
+            "svg svg": true,
+            "math mi": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "annotation-xml",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "svg",
+                            "ns": "http://www.w3.org/2000/svg"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><annotation-xml><svg></svg></annotation-xml><mi></mi></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml><svg></svg></annotation-xml><mi></mi></math>"
+      }
+    },
+    {
+      "data": "<math><annotation-xml><svg><foreignObject><div><math><mi></mi></math><span></span></div></foreignObject><path></path></svg></annotation-xml><mi>",
+      "errors": [
+        "(1,6) expected-doctype-but-got-start-tag",
+        "(1,144) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math annotation-xml": true,
+            "svg svg": true,
+            "svg foreignObject": true,
+            "div": true,
+            "math mi": true,
+            "span": true,
+            "svg path": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "annotation-xml",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "svg",
+                            "ns": "http://www.w3.org/2000/svg",
+                            "children": [
+                              {
+                                "tag": "foreignObject",
+                                "ns": "http://www.w3.org/2000/svg",
+                                "children": [
+                                  {
+                                    "tag": "div",
+                                    "children": [
+                                      {
+                                        "tag": "math",
+                                        "ns": "http://www.w3.org/1998/Math/MathML",
+                                        "children": [
+                                          {
+                                            "tag": "mi",
+                                            "ns": "http://www.w3.org/1998/Math/MathML"
+                                          }
+                                        ]
+                                      },
+                                      {
+                                        "tag": "span"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              },
+                              {
+                                "tag": "path",
+                                "ns": "http://www.w3.org/2000/svg"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><annotation-xml><svg><foreignObject><div><math><mi></mi></math><span></span></div></foreignObject><path></path></svg></annotation-xml><mi></mi></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml><svg><foreignObject><div><math><mi></mi></math><span></span></div></foreignObject><path></path></svg></annotation-xml><mi></mi></math>"
+      }
+    },
+    {
+      "data": "<math><annotation-xml><svg><foreignObject><math><mi><svg></svg></mi><mo></mo></math><span></span></foreignObject><path></path></svg></annotation-xml><mi>",
+      "errors": [
+        "(1,6) expected-doctype-but-got-start-tag",
+        "(1,153) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math annotation-xml": true,
+            "svg svg": true,
+            "svg foreignObject": true,
+            "math mi": true,
+            "math mo": true,
+            "span": true,
+            "svg path": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "annotation-xml",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "svg",
+                            "ns": "http://www.w3.org/2000/svg",
+                            "children": [
+                              {
+                                "tag": "foreignObject",
+                                "ns": "http://www.w3.org/2000/svg",
+                                "children": [
+                                  {
+                                    "tag": "math",
+                                    "ns": "http://www.w3.org/1998/Math/MathML",
+                                    "children": [
+                                      {
+                                        "tag": "mi",
+                                        "ns": "http://www.w3.org/1998/Math/MathML",
+                                        "children": [
+                                          {
+                                            "tag": "svg",
+                                            "ns": "http://www.w3.org/2000/svg"
+                                          }
+                                        ]
+                                      },
+                                      {
+                                        "tag": "mo",
+                                        "ns": "http://www.w3.org/1998/Math/MathML"
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "tag": "span"
+                                  }
+                                ]
+                              },
+                              {
+                                "tag": "path",
+                                "ns": "http://www.w3.org/2000/svg"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><annotation-xml><svg><foreignObject><math><mi><svg></svg></mi><mo></mo></math><span></span></foreignObject><path></path></svg></annotation-xml><mi></mi></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml><svg><foreignObject><math><mi><svg></svg></mi><mo></mo></math><span></span></foreignObject><path></path></svg></annotation-xml><mi></mi></math>"
+      }
+    }
+  ],
+  "tests11.dat": [
+    {
+      "data": "<!DOCTYPE html><body><svg attributeName='' attributeType='' baseFrequency='' baseProfile='' calcMode='' clipPathUnits='' diffuseConstant='' edgeMode='' filterUnits='' glyphRef='' gradientTransform='' gradientUnits='' kernelMatrix='' kernelUnitLength='' keyPoints='' keySplines='' keyTimes='' lengthAdjust='' limitingConeAngle='' markerHeight='' markerUnits='' markerWidth='' maskContentUnits='' maskUnits='' numOctaves='' pathLength='' patternContentUnits='' patternTransform='' patternUnits='' pointsAtX='' pointsAtY='' pointsAtZ='' preserveAlpha='' preserveAspectRatio='' primitiveUnits='' refX='' refY='' repeatCount='' repeatDur='' requiredExtensions='' requiredFeatures='' specularConstant='' specularExponent='' spreadMethod='' startOffset='' stdDeviation='' stitchTiles='' surfaceScale='' systemLanguage='' tableValues='' targetX='' targetY='' textLength='' viewBox='' viewTarget='' xChannelSelector='' yChannelSelector='' zoomAndPan=''></svg>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "attrs": [
+                      {
+                        "name": "attributeName",
+                        "value": ""
+                      },
+                      {
+                        "name": "attributeType",
+                        "value": ""
+                      },
+                      {
+                        "name": "baseFrequency",
+                        "value": ""
+                      },
+                      {
+                        "name": "baseProfile",
+                        "value": ""
+                      },
+                      {
+                        "name": "calcMode",
+                        "value": ""
+                      },
+                      {
+                        "name": "clipPathUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "diffuseConstant",
+                        "value": ""
+                      },
+                      {
+                        "name": "edgeMode",
+                        "value": ""
+                      },
+                      {
+                        "name": "filterUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "glyphRef",
+                        "value": ""
+                      },
+                      {
+                        "name": "gradientTransform",
+                        "value": ""
+                      },
+                      {
+                        "name": "gradientUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "kernelMatrix",
+                        "value": ""
+                      },
+                      {
+                        "name": "kernelUnitLength",
+                        "value": ""
+                      },
+                      {
+                        "name": "keyPoints",
+                        "value": ""
+                      },
+                      {
+                        "name": "keySplines",
+                        "value": ""
+                      },
+                      {
+                        "name": "keyTimes",
+                        "value": ""
+                      },
+                      {
+                        "name": "lengthAdjust",
+                        "value": ""
+                      },
+                      {
+                        "name": "limitingConeAngle",
+                        "value": ""
+                      },
+                      {
+                        "name": "markerHeight",
+                        "value": ""
+                      },
+                      {
+                        "name": "markerUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "markerWidth",
+                        "value": ""
+                      },
+                      {
+                        "name": "maskContentUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "maskUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "numOctaves",
+                        "value": ""
+                      },
+                      {
+                        "name": "pathLength",
+                        "value": ""
+                      },
+                      {
+                        "name": "patternContentUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "patternTransform",
+                        "value": ""
+                      },
+                      {
+                        "name": "patternUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "pointsAtX",
+                        "value": ""
+                      },
+                      {
+                        "name": "pointsAtY",
+                        "value": ""
+                      },
+                      {
+                        "name": "pointsAtZ",
+                        "value": ""
+                      },
+                      {
+                        "name": "preserveAlpha",
+                        "value": ""
+                      },
+                      {
+                        "name": "preserveAspectRatio",
+                        "value": ""
+                      },
+                      {
+                        "name": "primitiveUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "refX",
+                        "value": ""
+                      },
+                      {
+                        "name": "refY",
+                        "value": ""
+                      },
+                      {
+                        "name": "repeatCount",
+                        "value": ""
+                      },
+                      {
+                        "name": "repeatDur",
+                        "value": ""
+                      },
+                      {
+                        "name": "requiredExtensions",
+                        "value": ""
+                      },
+                      {
+                        "name": "requiredFeatures",
+                        "value": ""
+                      },
+                      {
+                        "name": "specularConstant",
+                        "value": ""
+                      },
+                      {
+                        "name": "specularExponent",
+                        "value": ""
+                      },
+                      {
+                        "name": "spreadMethod",
+                        "value": ""
+                      },
+                      {
+                        "name": "startOffset",
+                        "value": ""
+                      },
+                      {
+                        "name": "stdDeviation",
+                        "value": ""
+                      },
+                      {
+                        "name": "stitchTiles",
+                        "value": ""
+                      },
+                      {
+                        "name": "surfaceScale",
+                        "value": ""
+                      },
+                      {
+                        "name": "systemLanguage",
+                        "value": ""
+                      },
+                      {
+                        "name": "tableValues",
+                        "value": ""
+                      },
+                      {
+                        "name": "targetX",
+                        "value": ""
+                      },
+                      {
+                        "name": "targetY",
+                        "value": ""
+                      },
+                      {
+                        "name": "textLength",
+                        "value": ""
+                      },
+                      {
+                        "name": "viewBox",
+                        "value": ""
+                      },
+                      {
+                        "name": "viewTarget",
+                        "value": ""
+                      },
+                      {
+                        "name": "xChannelSelector",
+                        "value": ""
+                      },
+                      {
+                        "name": "yChannelSelector",
+                        "value": ""
+                      },
+                      {
+                        "name": "zoomAndPan",
+                        "value": ""
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg attributeName=\"\" attributeType=\"\" baseFrequency=\"\" baseProfile=\"\" calcMode=\"\" clipPathUnits=\"\" diffuseConstant=\"\" edgeMode=\"\" filterUnits=\"\" glyphRef=\"\" gradientTransform=\"\" gradientUnits=\"\" kernelMatrix=\"\" kernelUnitLength=\"\" keyPoints=\"\" keySplines=\"\" keyTimes=\"\" lengthAdjust=\"\" limitingConeAngle=\"\" markerHeight=\"\" markerUnits=\"\" markerWidth=\"\" maskContentUnits=\"\" maskUnits=\"\" numOctaves=\"\" pathLength=\"\" patternContentUnits=\"\" patternTransform=\"\" patternUnits=\"\" pointsAtX=\"\" pointsAtY=\"\" pointsAtZ=\"\" preserveAlpha=\"\" preserveAspectRatio=\"\" primitiveUnits=\"\" refX=\"\" refY=\"\" repeatCount=\"\" repeatDur=\"\" requiredExtensions=\"\" requiredFeatures=\"\" specularConstant=\"\" specularExponent=\"\" spreadMethod=\"\" startOffset=\"\" stdDeviation=\"\" stitchTiles=\"\" surfaceScale=\"\" systemLanguage=\"\" tableValues=\"\" targetX=\"\" targetY=\"\" textLength=\"\" viewBox=\"\" viewTarget=\"\" xChannelSelector=\"\" yChannelSelector=\"\" zoomAndPan=\"\"></svg></body></html>",
+        "noQuirksBodyHtml": "<svg attributeName=\"\" attributeType=\"\" baseFrequency=\"\" baseProfile=\"\" calcMode=\"\" clipPathUnits=\"\" diffuseConstant=\"\" edgeMode=\"\" filterUnits=\"\" glyphRef=\"\" gradientTransform=\"\" gradientUnits=\"\" kernelMatrix=\"\" kernelUnitLength=\"\" keyPoints=\"\" keySplines=\"\" keyTimes=\"\" lengthAdjust=\"\" limitingConeAngle=\"\" markerHeight=\"\" markerUnits=\"\" markerWidth=\"\" maskContentUnits=\"\" maskUnits=\"\" numOctaves=\"\" pathLength=\"\" patternContentUnits=\"\" patternTransform=\"\" patternUnits=\"\" pointsAtX=\"\" pointsAtY=\"\" pointsAtZ=\"\" preserveAlpha=\"\" preserveAspectRatio=\"\" primitiveUnits=\"\" refX=\"\" refY=\"\" repeatCount=\"\" repeatDur=\"\" requiredExtensions=\"\" requiredFeatures=\"\" specularConstant=\"\" specularExponent=\"\" spreadMethod=\"\" startOffset=\"\" stdDeviation=\"\" stitchTiles=\"\" surfaceScale=\"\" systemLanguage=\"\" tableValues=\"\" targetX=\"\" targetY=\"\" textLength=\"\" viewBox=\"\" viewTarget=\"\" xChannelSelector=\"\" yChannelSelector=\"\" zoomAndPan=\"\"></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><BODY><SVG ATTRIBUTENAME='' ATTRIBUTETYPE='' BASEFREQUENCY='' BASEPROFILE='' CALCMODE='' CLIPPATHUNITS='' DIFFUSECONSTANT='' EDGEMODE='' FILTERUNITS='' GLYPHREF='' GRADIENTTRANSFORM='' GRADIENTUNITS='' KERNELMATRIX='' KERNELUNITLENGTH='' KEYPOINTS='' KEYSPLINES='' KEYTIMES='' LENGTHADJUST='' LIMITINGCONEANGLE='' MARKERHEIGHT='' MARKERUNITS='' MARKERWIDTH='' MASKCONTENTUNITS='' MASKUNITS='' NUMOCTAVES='' PATHLENGTH='' PATTERNCONTENTUNITS='' PATTERNTRANSFORM='' PATTERNUNITS='' POINTSATX='' POINTSATY='' POINTSATZ='' PRESERVEALPHA='' PRESERVEASPECTRATIO='' PRIMITIVEUNITS='' REFX='' REFY='' REPEATCOUNT='' REPEATDUR='' REQUIREDEXTENSIONS='' REQUIREDFEATURES='' SPECULARCONSTANT='' SPECULAREXPONENT='' SPREADMETHOD='' STARTOFFSET='' STDDEVIATION='' STITCHTILES='' SURFACESCALE='' SYSTEMLANGUAGE='' TABLEVALUES='' TARGETX='' TARGETY='' TEXTLENGTH='' VIEWBOX='' VIEWTARGET='' XCHANNELSELECTOR='' YCHANNELSELECTOR='' ZOOMANDPAN=''></SVG>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "attrs": [
+                      {
+                        "name": "attributeName",
+                        "value": ""
+                      },
+                      {
+                        "name": "attributeType",
+                        "value": ""
+                      },
+                      {
+                        "name": "baseFrequency",
+                        "value": ""
+                      },
+                      {
+                        "name": "baseProfile",
+                        "value": ""
+                      },
+                      {
+                        "name": "calcMode",
+                        "value": ""
+                      },
+                      {
+                        "name": "clipPathUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "diffuseConstant",
+                        "value": ""
+                      },
+                      {
+                        "name": "edgeMode",
+                        "value": ""
+                      },
+                      {
+                        "name": "filterUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "glyphRef",
+                        "value": ""
+                      },
+                      {
+                        "name": "gradientTransform",
+                        "value": ""
+                      },
+                      {
+                        "name": "gradientUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "kernelMatrix",
+                        "value": ""
+                      },
+                      {
+                        "name": "kernelUnitLength",
+                        "value": ""
+                      },
+                      {
+                        "name": "keyPoints",
+                        "value": ""
+                      },
+                      {
+                        "name": "keySplines",
+                        "value": ""
+                      },
+                      {
+                        "name": "keyTimes",
+                        "value": ""
+                      },
+                      {
+                        "name": "lengthAdjust",
+                        "value": ""
+                      },
+                      {
+                        "name": "limitingConeAngle",
+                        "value": ""
+                      },
+                      {
+                        "name": "markerHeight",
+                        "value": ""
+                      },
+                      {
+                        "name": "markerUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "markerWidth",
+                        "value": ""
+                      },
+                      {
+                        "name": "maskContentUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "maskUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "numOctaves",
+                        "value": ""
+                      },
+                      {
+                        "name": "pathLength",
+                        "value": ""
+                      },
+                      {
+                        "name": "patternContentUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "patternTransform",
+                        "value": ""
+                      },
+                      {
+                        "name": "patternUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "pointsAtX",
+                        "value": ""
+                      },
+                      {
+                        "name": "pointsAtY",
+                        "value": ""
+                      },
+                      {
+                        "name": "pointsAtZ",
+                        "value": ""
+                      },
+                      {
+                        "name": "preserveAlpha",
+                        "value": ""
+                      },
+                      {
+                        "name": "preserveAspectRatio",
+                        "value": ""
+                      },
+                      {
+                        "name": "primitiveUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "refX",
+                        "value": ""
+                      },
+                      {
+                        "name": "refY",
+                        "value": ""
+                      },
+                      {
+                        "name": "repeatCount",
+                        "value": ""
+                      },
+                      {
+                        "name": "repeatDur",
+                        "value": ""
+                      },
+                      {
+                        "name": "requiredExtensions",
+                        "value": ""
+                      },
+                      {
+                        "name": "requiredFeatures",
+                        "value": ""
+                      },
+                      {
+                        "name": "specularConstant",
+                        "value": ""
+                      },
+                      {
+                        "name": "specularExponent",
+                        "value": ""
+                      },
+                      {
+                        "name": "spreadMethod",
+                        "value": ""
+                      },
+                      {
+                        "name": "startOffset",
+                        "value": ""
+                      },
+                      {
+                        "name": "stdDeviation",
+                        "value": ""
+                      },
+                      {
+                        "name": "stitchTiles",
+                        "value": ""
+                      },
+                      {
+                        "name": "surfaceScale",
+                        "value": ""
+                      },
+                      {
+                        "name": "systemLanguage",
+                        "value": ""
+                      },
+                      {
+                        "name": "tableValues",
+                        "value": ""
+                      },
+                      {
+                        "name": "targetX",
+                        "value": ""
+                      },
+                      {
+                        "name": "targetY",
+                        "value": ""
+                      },
+                      {
+                        "name": "textLength",
+                        "value": ""
+                      },
+                      {
+                        "name": "viewBox",
+                        "value": ""
+                      },
+                      {
+                        "name": "viewTarget",
+                        "value": ""
+                      },
+                      {
+                        "name": "xChannelSelector",
+                        "value": ""
+                      },
+                      {
+                        "name": "yChannelSelector",
+                        "value": ""
+                      },
+                      {
+                        "name": "zoomAndPan",
+                        "value": ""
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg attributeName=\"\" attributeType=\"\" baseFrequency=\"\" baseProfile=\"\" calcMode=\"\" clipPathUnits=\"\" diffuseConstant=\"\" edgeMode=\"\" filterUnits=\"\" glyphRef=\"\" gradientTransform=\"\" gradientUnits=\"\" kernelMatrix=\"\" kernelUnitLength=\"\" keyPoints=\"\" keySplines=\"\" keyTimes=\"\" lengthAdjust=\"\" limitingConeAngle=\"\" markerHeight=\"\" markerUnits=\"\" markerWidth=\"\" maskContentUnits=\"\" maskUnits=\"\" numOctaves=\"\" pathLength=\"\" patternContentUnits=\"\" patternTransform=\"\" patternUnits=\"\" pointsAtX=\"\" pointsAtY=\"\" pointsAtZ=\"\" preserveAlpha=\"\" preserveAspectRatio=\"\" primitiveUnits=\"\" refX=\"\" refY=\"\" repeatCount=\"\" repeatDur=\"\" requiredExtensions=\"\" requiredFeatures=\"\" specularConstant=\"\" specularExponent=\"\" spreadMethod=\"\" startOffset=\"\" stdDeviation=\"\" stitchTiles=\"\" surfaceScale=\"\" systemLanguage=\"\" tableValues=\"\" targetX=\"\" targetY=\"\" textLength=\"\" viewBox=\"\" viewTarget=\"\" xChannelSelector=\"\" yChannelSelector=\"\" zoomAndPan=\"\"></svg></body></html>",
+        "noQuirksBodyHtml": "<svg attributeName=\"\" attributeType=\"\" baseFrequency=\"\" baseProfile=\"\" calcMode=\"\" clipPathUnits=\"\" diffuseConstant=\"\" edgeMode=\"\" filterUnits=\"\" glyphRef=\"\" gradientTransform=\"\" gradientUnits=\"\" kernelMatrix=\"\" kernelUnitLength=\"\" keyPoints=\"\" keySplines=\"\" keyTimes=\"\" lengthAdjust=\"\" limitingConeAngle=\"\" markerHeight=\"\" markerUnits=\"\" markerWidth=\"\" maskContentUnits=\"\" maskUnits=\"\" numOctaves=\"\" pathLength=\"\" patternContentUnits=\"\" patternTransform=\"\" patternUnits=\"\" pointsAtX=\"\" pointsAtY=\"\" pointsAtZ=\"\" preserveAlpha=\"\" preserveAspectRatio=\"\" primitiveUnits=\"\" refX=\"\" refY=\"\" repeatCount=\"\" repeatDur=\"\" requiredExtensions=\"\" requiredFeatures=\"\" specularConstant=\"\" specularExponent=\"\" spreadMethod=\"\" startOffset=\"\" stdDeviation=\"\" stitchTiles=\"\" surfaceScale=\"\" systemLanguage=\"\" tableValues=\"\" targetX=\"\" targetY=\"\" textLength=\"\" viewBox=\"\" viewTarget=\"\" xChannelSelector=\"\" yChannelSelector=\"\" zoomAndPan=\"\"></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><svg attributename='' attributetype='' basefrequency='' baseprofile='' calcmode='' clippathunits='' diffuseconstant='' edgemode='' filterunits='' filterres='' glyphref='' gradienttransform='' gradientunits='' kernelmatrix='' kernelunitlength='' keypoints='' keysplines='' keytimes='' lengthadjust='' limitingconeangle='' markerheight='' markerunits='' markerwidth='' maskcontentunits='' maskunits='' numoctaves='' pathlength='' patterncontentunits='' patterntransform='' patternunits='' pointsatx='' pointsaty='' pointsatz='' preservealpha='' preserveaspectratio='' primitiveunits='' refx='' refy='' repeatcount='' repeatdur='' requiredextensions='' requiredfeatures='' specularconstant='' specularexponent='' spreadmethod='' startoffset='' stddeviation='' stitchtiles='' surfacescale='' systemlanguage='' tablevalues='' targetx='' targety='' textlength='' viewbox='' viewtarget='' xchannelselector='' ychannelselector='' zoomandpan=''></svg>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "attrs": [
+                      {
+                        "name": "attributeName",
+                        "value": ""
+                      },
+                      {
+                        "name": "attributeType",
+                        "value": ""
+                      },
+                      {
+                        "name": "baseFrequency",
+                        "value": ""
+                      },
+                      {
+                        "name": "baseProfile",
+                        "value": ""
+                      },
+                      {
+                        "name": "calcMode",
+                        "value": ""
+                      },
+                      {
+                        "name": "clipPathUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "diffuseConstant",
+                        "value": ""
+                      },
+                      {
+                        "name": "edgeMode",
+                        "value": ""
+                      },
+                      {
+                        "name": "filterUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "filterres",
+                        "value": ""
+                      },
+                      {
+                        "name": "glyphRef",
+                        "value": ""
+                      },
+                      {
+                        "name": "gradientTransform",
+                        "value": ""
+                      },
+                      {
+                        "name": "gradientUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "kernelMatrix",
+                        "value": ""
+                      },
+                      {
+                        "name": "kernelUnitLength",
+                        "value": ""
+                      },
+                      {
+                        "name": "keyPoints",
+                        "value": ""
+                      },
+                      {
+                        "name": "keySplines",
+                        "value": ""
+                      },
+                      {
+                        "name": "keyTimes",
+                        "value": ""
+                      },
+                      {
+                        "name": "lengthAdjust",
+                        "value": ""
+                      },
+                      {
+                        "name": "limitingConeAngle",
+                        "value": ""
+                      },
+                      {
+                        "name": "markerHeight",
+                        "value": ""
+                      },
+                      {
+                        "name": "markerUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "markerWidth",
+                        "value": ""
+                      },
+                      {
+                        "name": "maskContentUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "maskUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "numOctaves",
+                        "value": ""
+                      },
+                      {
+                        "name": "pathLength",
+                        "value": ""
+                      },
+                      {
+                        "name": "patternContentUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "patternTransform",
+                        "value": ""
+                      },
+                      {
+                        "name": "patternUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "pointsAtX",
+                        "value": ""
+                      },
+                      {
+                        "name": "pointsAtY",
+                        "value": ""
+                      },
+                      {
+                        "name": "pointsAtZ",
+                        "value": ""
+                      },
+                      {
+                        "name": "preserveAlpha",
+                        "value": ""
+                      },
+                      {
+                        "name": "preserveAspectRatio",
+                        "value": ""
+                      },
+                      {
+                        "name": "primitiveUnits",
+                        "value": ""
+                      },
+                      {
+                        "name": "refX",
+                        "value": ""
+                      },
+                      {
+                        "name": "refY",
+                        "value": ""
+                      },
+                      {
+                        "name": "repeatCount",
+                        "value": ""
+                      },
+                      {
+                        "name": "repeatDur",
+                        "value": ""
+                      },
+                      {
+                        "name": "requiredExtensions",
+                        "value": ""
+                      },
+                      {
+                        "name": "requiredFeatures",
+                        "value": ""
+                      },
+                      {
+                        "name": "specularConstant",
+                        "value": ""
+                      },
+                      {
+                        "name": "specularExponent",
+                        "value": ""
+                      },
+                      {
+                        "name": "spreadMethod",
+                        "value": ""
+                      },
+                      {
+                        "name": "startOffset",
+                        "value": ""
+                      },
+                      {
+                        "name": "stdDeviation",
+                        "value": ""
+                      },
+                      {
+                        "name": "stitchTiles",
+                        "value": ""
+                      },
+                      {
+                        "name": "surfaceScale",
+                        "value": ""
+                      },
+                      {
+                        "name": "systemLanguage",
+                        "value": ""
+                      },
+                      {
+                        "name": "tableValues",
+                        "value": ""
+                      },
+                      {
+                        "name": "targetX",
+                        "value": ""
+                      },
+                      {
+                        "name": "targetY",
+                        "value": ""
+                      },
+                      {
+                        "name": "textLength",
+                        "value": ""
+                      },
+                      {
+                        "name": "viewBox",
+                        "value": ""
+                      },
+                      {
+                        "name": "viewTarget",
+                        "value": ""
+                      },
+                      {
+                        "name": "xChannelSelector",
+                        "value": ""
+                      },
+                      {
+                        "name": "yChannelSelector",
+                        "value": ""
+                      },
+                      {
+                        "name": "zoomAndPan",
+                        "value": ""
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg attributeName=\"\" attributeType=\"\" baseFrequency=\"\" baseProfile=\"\" calcMode=\"\" clipPathUnits=\"\" diffuseConstant=\"\" edgeMode=\"\" filterUnits=\"\" filterres=\"\" glyphRef=\"\" gradientTransform=\"\" gradientUnits=\"\" kernelMatrix=\"\" kernelUnitLength=\"\" keyPoints=\"\" keySplines=\"\" keyTimes=\"\" lengthAdjust=\"\" limitingConeAngle=\"\" markerHeight=\"\" markerUnits=\"\" markerWidth=\"\" maskContentUnits=\"\" maskUnits=\"\" numOctaves=\"\" pathLength=\"\" patternContentUnits=\"\" patternTransform=\"\" patternUnits=\"\" pointsAtX=\"\" pointsAtY=\"\" pointsAtZ=\"\" preserveAlpha=\"\" preserveAspectRatio=\"\" primitiveUnits=\"\" refX=\"\" refY=\"\" repeatCount=\"\" repeatDur=\"\" requiredExtensions=\"\" requiredFeatures=\"\" specularConstant=\"\" specularExponent=\"\" spreadMethod=\"\" startOffset=\"\" stdDeviation=\"\" stitchTiles=\"\" surfaceScale=\"\" systemLanguage=\"\" tableValues=\"\" targetX=\"\" targetY=\"\" textLength=\"\" viewBox=\"\" viewTarget=\"\" xChannelSelector=\"\" yChannelSelector=\"\" zoomAndPan=\"\"></svg></body></html>",
+        "noQuirksBodyHtml": "<svg attributeName=\"\" attributeType=\"\" baseFrequency=\"\" baseProfile=\"\" calcMode=\"\" clipPathUnits=\"\" diffuseConstant=\"\" edgeMode=\"\" filterUnits=\"\" filterres=\"\" glyphRef=\"\" gradientTransform=\"\" gradientUnits=\"\" kernelMatrix=\"\" kernelUnitLength=\"\" keyPoints=\"\" keySplines=\"\" keyTimes=\"\" lengthAdjust=\"\" limitingConeAngle=\"\" markerHeight=\"\" markerUnits=\"\" markerWidth=\"\" maskContentUnits=\"\" maskUnits=\"\" numOctaves=\"\" pathLength=\"\" patternContentUnits=\"\" patternTransform=\"\" patternUnits=\"\" pointsAtX=\"\" pointsAtY=\"\" pointsAtZ=\"\" preserveAlpha=\"\" preserveAspectRatio=\"\" primitiveUnits=\"\" refX=\"\" refY=\"\" repeatCount=\"\" repeatDur=\"\" requiredExtensions=\"\" requiredFeatures=\"\" specularConstant=\"\" specularExponent=\"\" spreadMethod=\"\" startOffset=\"\" stdDeviation=\"\" stitchTiles=\"\" surfaceScale=\"\" systemLanguage=\"\" tableValues=\"\" targetX=\"\" targetY=\"\" textLength=\"\" viewBox=\"\" viewTarget=\"\" xChannelSelector=\"\" yChannelSelector=\"\" zoomAndPan=\"\"></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><math attributeName='' attributeType='' baseFrequency='' baseProfile='' calcMode='' clipPathUnits='' diffuseConstant='' edgeMode='' filterUnits='' glyphRef='' gradientTransform='' gradientUnits='' kernelMatrix='' kernelUnitLength='' keyPoints='' keySplines='' keyTimes='' lengthAdjust='' limitingConeAngle='' markerHeight='' markerUnits='' markerWidth='' maskContentUnits='' maskUnits='' numOctaves='' pathLength='' patternContentUnits='' patternTransform='' patternUnits='' pointsAtX='' pointsAtY='' pointsAtZ='' preserveAlpha='' preserveAspectRatio='' primitiveUnits='' refX='' refY='' repeatCount='' repeatDur='' requiredExtensions='' requiredFeatures='' specularConstant='' specularExponent='' spreadMethod='' startOffset='' stdDeviation='' stitchTiles='' surfaceScale='' systemLanguage='' tableValues='' targetX='' targetY='' textLength='' viewBox='' viewTarget='' xChannelSelector='' yChannelSelector='' zoomAndPan=''></math>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "attrs": [
+                      {
+                        "name": "attributename",
+                        "value": ""
+                      },
+                      {
+                        "name": "attributetype",
+                        "value": ""
+                      },
+                      {
+                        "name": "basefrequency",
+                        "value": ""
+                      },
+                      {
+                        "name": "baseprofile",
+                        "value": ""
+                      },
+                      {
+                        "name": "calcmode",
+                        "value": ""
+                      },
+                      {
+                        "name": "clippathunits",
+                        "value": ""
+                      },
+                      {
+                        "name": "diffuseconstant",
+                        "value": ""
+                      },
+                      {
+                        "name": "edgemode",
+                        "value": ""
+                      },
+                      {
+                        "name": "filterunits",
+                        "value": ""
+                      },
+                      {
+                        "name": "glyphref",
+                        "value": ""
+                      },
+                      {
+                        "name": "gradienttransform",
+                        "value": ""
+                      },
+                      {
+                        "name": "gradientunits",
+                        "value": ""
+                      },
+                      {
+                        "name": "kernelmatrix",
+                        "value": ""
+                      },
+                      {
+                        "name": "kernelunitlength",
+                        "value": ""
+                      },
+                      {
+                        "name": "keypoints",
+                        "value": ""
+                      },
+                      {
+                        "name": "keysplines",
+                        "value": ""
+                      },
+                      {
+                        "name": "keytimes",
+                        "value": ""
+                      },
+                      {
+                        "name": "lengthadjust",
+                        "value": ""
+                      },
+                      {
+                        "name": "limitingconeangle",
+                        "value": ""
+                      },
+                      {
+                        "name": "markerheight",
+                        "value": ""
+                      },
+                      {
+                        "name": "markerunits",
+                        "value": ""
+                      },
+                      {
+                        "name": "markerwidth",
+                        "value": ""
+                      },
+                      {
+                        "name": "maskcontentunits",
+                        "value": ""
+                      },
+                      {
+                        "name": "maskunits",
+                        "value": ""
+                      },
+                      {
+                        "name": "numoctaves",
+                        "value": ""
+                      },
+                      {
+                        "name": "pathlength",
+                        "value": ""
+                      },
+                      {
+                        "name": "patterncontentunits",
+                        "value": ""
+                      },
+                      {
+                        "name": "patterntransform",
+                        "value": ""
+                      },
+                      {
+                        "name": "patternunits",
+                        "value": ""
+                      },
+                      {
+                        "name": "pointsatx",
+                        "value": ""
+                      },
+                      {
+                        "name": "pointsaty",
+                        "value": ""
+                      },
+                      {
+                        "name": "pointsatz",
+                        "value": ""
+                      },
+                      {
+                        "name": "preservealpha",
+                        "value": ""
+                      },
+                      {
+                        "name": "preserveaspectratio",
+                        "value": ""
+                      },
+                      {
+                        "name": "primitiveunits",
+                        "value": ""
+                      },
+                      {
+                        "name": "refx",
+                        "value": ""
+                      },
+                      {
+                        "name": "refy",
+                        "value": ""
+                      },
+                      {
+                        "name": "repeatcount",
+                        "value": ""
+                      },
+                      {
+                        "name": "repeatdur",
+                        "value": ""
+                      },
+                      {
+                        "name": "requiredextensions",
+                        "value": ""
+                      },
+                      {
+                        "name": "requiredfeatures",
+                        "value": ""
+                      },
+                      {
+                        "name": "specularconstant",
+                        "value": ""
+                      },
+                      {
+                        "name": "specularexponent",
+                        "value": ""
+                      },
+                      {
+                        "name": "spreadmethod",
+                        "value": ""
+                      },
+                      {
+                        "name": "startoffset",
+                        "value": ""
+                      },
+                      {
+                        "name": "stddeviation",
+                        "value": ""
+                      },
+                      {
+                        "name": "stitchtiles",
+                        "value": ""
+                      },
+                      {
+                        "name": "surfacescale",
+                        "value": ""
+                      },
+                      {
+                        "name": "systemlanguage",
+                        "value": ""
+                      },
+                      {
+                        "name": "tablevalues",
+                        "value": ""
+                      },
+                      {
+                        "name": "targetx",
+                        "value": ""
+                      },
+                      {
+                        "name": "targety",
+                        "value": ""
+                      },
+                      {
+                        "name": "textlength",
+                        "value": ""
+                      },
+                      {
+                        "name": "viewbox",
+                        "value": ""
+                      },
+                      {
+                        "name": "viewtarget",
+                        "value": ""
+                      },
+                      {
+                        "name": "xchannelselector",
+                        "value": ""
+                      },
+                      {
+                        "name": "ychannelselector",
+                        "value": ""
+                      },
+                      {
+                        "name": "zoomandpan",
+                        "value": ""
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math attributename=\"\" attributetype=\"\" basefrequency=\"\" baseprofile=\"\" calcmode=\"\" clippathunits=\"\" diffuseconstant=\"\" edgemode=\"\" filterunits=\"\" glyphref=\"\" gradienttransform=\"\" gradientunits=\"\" kernelmatrix=\"\" kernelunitlength=\"\" keypoints=\"\" keysplines=\"\" keytimes=\"\" lengthadjust=\"\" limitingconeangle=\"\" markerheight=\"\" markerunits=\"\" markerwidth=\"\" maskcontentunits=\"\" maskunits=\"\" numoctaves=\"\" pathlength=\"\" patterncontentunits=\"\" patterntransform=\"\" patternunits=\"\" pointsatx=\"\" pointsaty=\"\" pointsatz=\"\" preservealpha=\"\" preserveaspectratio=\"\" primitiveunits=\"\" refx=\"\" refy=\"\" repeatcount=\"\" repeatdur=\"\" requiredextensions=\"\" requiredfeatures=\"\" specularconstant=\"\" specularexponent=\"\" spreadmethod=\"\" startoffset=\"\" stddeviation=\"\" stitchtiles=\"\" surfacescale=\"\" systemlanguage=\"\" tablevalues=\"\" targetx=\"\" targety=\"\" textlength=\"\" viewbox=\"\" viewtarget=\"\" xchannelselector=\"\" ychannelselector=\"\" zoomandpan=\"\"></math></body></html>",
+        "noQuirksBodyHtml": "<math attributename=\"\" attributetype=\"\" basefrequency=\"\" baseprofile=\"\" calcmode=\"\" clippathunits=\"\" diffuseconstant=\"\" edgemode=\"\" filterunits=\"\" glyphref=\"\" gradienttransform=\"\" gradientunits=\"\" kernelmatrix=\"\" kernelunitlength=\"\" keypoints=\"\" keysplines=\"\" keytimes=\"\" lengthadjust=\"\" limitingconeangle=\"\" markerheight=\"\" markerunits=\"\" markerwidth=\"\" maskcontentunits=\"\" maskunits=\"\" numoctaves=\"\" pathlength=\"\" patterncontentunits=\"\" patterntransform=\"\" patternunits=\"\" pointsatx=\"\" pointsaty=\"\" pointsatz=\"\" preservealpha=\"\" preserveaspectratio=\"\" primitiveunits=\"\" refx=\"\" refy=\"\" repeatcount=\"\" repeatdur=\"\" requiredextensions=\"\" requiredfeatures=\"\" specularconstant=\"\" specularexponent=\"\" spreadmethod=\"\" startoffset=\"\" stddeviation=\"\" stitchtiles=\"\" surfacescale=\"\" systemlanguage=\"\" tablevalues=\"\" targetx=\"\" targety=\"\" textlength=\"\" viewbox=\"\" viewtarget=\"\" xchannelselector=\"\" ychannelselector=\"\" zoomandpan=\"\"></math>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><svg><altGlyph /><altGlyphDef /><altGlyphItem /><animateColor /><animateMotion /><animateTransform /><clipPath /><feBlend /><feColorMatrix /><feComponentTransfer /><feComposite /><feConvolveMatrix /><feDiffuseLighting /><feDisplacementMap /><feDistantLight /><feFlood /><feFuncA /><feFuncB /><feFuncG /><feFuncR /><feGaussianBlur /><feImage /><feMerge /><feMergeNode /><feMorphology /><feOffset /><fePointLight /><feSpecularLighting /><feSpotLight /><feTile /><feTurbulence /><foreignObject /><glyphRef /><linearGradient /><radialGradient /><textPath /></svg>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg altGlyph": true,
+            "svg altGlyphDef": true,
+            "svg altGlyphItem": true,
+            "svg animateColor": true,
+            "svg animateMotion": true,
+            "svg animateTransform": true,
+            "svg clipPath": true,
+            "svg feBlend": true,
+            "svg feColorMatrix": true,
+            "svg feComponentTransfer": true,
+            "svg feComposite": true,
+            "svg feConvolveMatrix": true,
+            "svg feDiffuseLighting": true,
+            "svg feDisplacementMap": true,
+            "svg feDistantLight": true,
+            "svg feFlood": true,
+            "svg feFuncA": true,
+            "svg feFuncB": true,
+            "svg feFuncG": true,
+            "svg feFuncR": true,
+            "svg feGaussianBlur": true,
+            "svg feImage": true,
+            "svg feMerge": true,
+            "svg feMergeNode": true,
+            "svg feMorphology": true,
+            "svg feOffset": true,
+            "svg fePointLight": true,
+            "svg feSpecularLighting": true,
+            "svg feSpotLight": true,
+            "svg feTile": true,
+            "svg feTurbulence": true,
+            "svg foreignObject": true,
+            "svg glyphRef": true,
+            "svg linearGradient": true,
+            "svg radialGradient": true,
+            "svg textPath": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "altGlyph",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "altGlyphDef",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "altGlyphItem",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "animateColor",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "animateMotion",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "animateTransform",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "clipPath",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feBlend",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feColorMatrix",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feComponentTransfer",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feComposite",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feConvolveMatrix",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feDiffuseLighting",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feDisplacementMap",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feDistantLight",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feFlood",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feFuncA",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feFuncB",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feFuncG",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feFuncR",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feGaussianBlur",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feImage",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feMerge",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feMergeNode",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feMorphology",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feOffset",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "fePointLight",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feSpecularLighting",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feSpotLight",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feTile",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feTurbulence",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "foreignObject",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "glyphRef",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "linearGradient",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "radialGradient",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "textPath",
+                        "ns": "http://www.w3.org/2000/svg"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg><altGlyph></altGlyph><altGlyphDef></altGlyphDef><altGlyphItem></altGlyphItem><animateColor></animateColor><animateMotion></animateMotion><animateTransform></animateTransform><clipPath></clipPath><feBlend></feBlend><feColorMatrix></feColorMatrix><feComponentTransfer></feComponentTransfer><feComposite></feComposite><feConvolveMatrix></feConvolveMatrix><feDiffuseLighting></feDiffuseLighting><feDisplacementMap></feDisplacementMap><feDistantLight></feDistantLight><feFlood></feFlood><feFuncA></feFuncA><feFuncB></feFuncB><feFuncG></feFuncG><feFuncR></feFuncR><feGaussianBlur></feGaussianBlur><feImage></feImage><feMerge></feMerge><feMergeNode></feMergeNode><feMorphology></feMorphology><feOffset></feOffset><fePointLight></fePointLight><feSpecularLighting></feSpecularLighting><feSpotLight></feSpotLight><feTile></feTile><feTurbulence></feTurbulence><foreignObject></foreignObject><glyphRef></glyphRef><linearGradient></linearGradient><radialGradient></radialGradient><textPath></textPath></svg></body></html>",
+        "noQuirksBodyHtml": "<svg><altGlyph></altGlyph><altGlyphDef></altGlyphDef><altGlyphItem></altGlyphItem><animateColor></animateColor><animateMotion></animateMotion><animateTransform></animateTransform><clipPath></clipPath><feBlend></feBlend><feColorMatrix></feColorMatrix><feComponentTransfer></feComponentTransfer><feComposite></feComposite><feConvolveMatrix></feConvolveMatrix><feDiffuseLighting></feDiffuseLighting><feDisplacementMap></feDisplacementMap><feDistantLight></feDistantLight><feFlood></feFlood><feFuncA></feFuncA><feFuncB></feFuncB><feFuncG></feFuncG><feFuncR></feFuncR><feGaussianBlur></feGaussianBlur><feImage></feImage><feMerge></feMerge><feMergeNode></feMergeNode><feMorphology></feMorphology><feOffset></feOffset><fePointLight></fePointLight><feSpecularLighting></feSpecularLighting><feSpotLight></feSpotLight><feTile></feTile><feTurbulence></feTurbulence><foreignObject></foreignObject><glyphRef></glyphRef><linearGradient></linearGradient><radialGradient></radialGradient><textPath></textPath></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><svg><altglyph /><altglyphdef /><altglyphitem /><animatecolor /><animatemotion /><animatetransform /><clippath /><feblend /><fecolormatrix /><fecomponenttransfer /><fecomposite /><feconvolvematrix /><fediffuselighting /><fedisplacementmap /><fedistantlight /><feflood /><fefunca /><fefuncb /><fefuncg /><fefuncr /><fegaussianblur /><feimage /><femerge /><femergenode /><femorphology /><feoffset /><fepointlight /><fespecularlighting /><fespotlight /><fetile /><feturbulence /><foreignobject /><glyphref /><lineargradient /><radialgradient /><textpath /></svg>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg altGlyph": true,
+            "svg altGlyphDef": true,
+            "svg altGlyphItem": true,
+            "svg animateColor": true,
+            "svg animateMotion": true,
+            "svg animateTransform": true,
+            "svg clipPath": true,
+            "svg feBlend": true,
+            "svg feColorMatrix": true,
+            "svg feComponentTransfer": true,
+            "svg feComposite": true,
+            "svg feConvolveMatrix": true,
+            "svg feDiffuseLighting": true,
+            "svg feDisplacementMap": true,
+            "svg feDistantLight": true,
+            "svg feFlood": true,
+            "svg feFuncA": true,
+            "svg feFuncB": true,
+            "svg feFuncG": true,
+            "svg feFuncR": true,
+            "svg feGaussianBlur": true,
+            "svg feImage": true,
+            "svg feMerge": true,
+            "svg feMergeNode": true,
+            "svg feMorphology": true,
+            "svg feOffset": true,
+            "svg fePointLight": true,
+            "svg feSpecularLighting": true,
+            "svg feSpotLight": true,
+            "svg feTile": true,
+            "svg feTurbulence": true,
+            "svg foreignObject": true,
+            "svg glyphRef": true,
+            "svg linearGradient": true,
+            "svg radialGradient": true,
+            "svg textPath": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "altGlyph",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "altGlyphDef",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "altGlyphItem",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "animateColor",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "animateMotion",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "animateTransform",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "clipPath",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feBlend",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feColorMatrix",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feComponentTransfer",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feComposite",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feConvolveMatrix",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feDiffuseLighting",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feDisplacementMap",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feDistantLight",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feFlood",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feFuncA",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feFuncB",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feFuncG",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feFuncR",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feGaussianBlur",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feImage",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feMerge",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feMergeNode",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feMorphology",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feOffset",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "fePointLight",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feSpecularLighting",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feSpotLight",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feTile",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feTurbulence",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "foreignObject",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "glyphRef",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "linearGradient",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "radialGradient",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "textPath",
+                        "ns": "http://www.w3.org/2000/svg"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg><altGlyph></altGlyph><altGlyphDef></altGlyphDef><altGlyphItem></altGlyphItem><animateColor></animateColor><animateMotion></animateMotion><animateTransform></animateTransform><clipPath></clipPath><feBlend></feBlend><feColorMatrix></feColorMatrix><feComponentTransfer></feComponentTransfer><feComposite></feComposite><feConvolveMatrix></feConvolveMatrix><feDiffuseLighting></feDiffuseLighting><feDisplacementMap></feDisplacementMap><feDistantLight></feDistantLight><feFlood></feFlood><feFuncA></feFuncA><feFuncB></feFuncB><feFuncG></feFuncG><feFuncR></feFuncR><feGaussianBlur></feGaussianBlur><feImage></feImage><feMerge></feMerge><feMergeNode></feMergeNode><feMorphology></feMorphology><feOffset></feOffset><fePointLight></fePointLight><feSpecularLighting></feSpecularLighting><feSpotLight></feSpotLight><feTile></feTile><feTurbulence></feTurbulence><foreignObject></foreignObject><glyphRef></glyphRef><linearGradient></linearGradient><radialGradient></radialGradient><textPath></textPath></svg></body></html>",
+        "noQuirksBodyHtml": "<svg><altGlyph></altGlyph><altGlyphDef></altGlyphDef><altGlyphItem></altGlyphItem><animateColor></animateColor><animateMotion></animateMotion><animateTransform></animateTransform><clipPath></clipPath><feBlend></feBlend><feColorMatrix></feColorMatrix><feComponentTransfer></feComponentTransfer><feComposite></feComposite><feConvolveMatrix></feConvolveMatrix><feDiffuseLighting></feDiffuseLighting><feDisplacementMap></feDisplacementMap><feDistantLight></feDistantLight><feFlood></feFlood><feFuncA></feFuncA><feFuncB></feFuncB><feFuncG></feFuncG><feFuncR></feFuncR><feGaussianBlur></feGaussianBlur><feImage></feImage><feMerge></feMerge><feMergeNode></feMergeNode><feMorphology></feMorphology><feOffset></feOffset><fePointLight></fePointLight><feSpecularLighting></feSpecularLighting><feSpotLight></feSpotLight><feTile></feTile><feTurbulence></feTurbulence><foreignObject></foreignObject><glyphRef></glyphRef><linearGradient></linearGradient><radialGradient></radialGradient><textPath></textPath></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><BODY><SVG><ALTGLYPH /><ALTGLYPHDEF /><ALTGLYPHITEM /><ANIMATECOLOR /><ANIMATEMOTION /><ANIMATETRANSFORM /><CLIPPATH /><FEBLEND /><FECOLORMATRIX /><FECOMPONENTTRANSFER /><FECOMPOSITE /><FECONVOLVEMATRIX /><FEDIFFUSELIGHTING /><FEDISPLACEMENTMAP /><FEDISTANTLIGHT /><FEFLOOD /><FEFUNCA /><FEFUNCB /><FEFUNCG /><FEFUNCR /><FEGAUSSIANBLUR /><FEIMAGE /><FEMERGE /><FEMERGENODE /><FEMORPHOLOGY /><FEOFFSET /><FEPOINTLIGHT /><FESPECULARLIGHTING /><FESPOTLIGHT /><FETILE /><FETURBULENCE /><FOREIGNOBJECT /><GLYPHREF /><LINEARGRADIENT /><RADIALGRADIENT /><TEXTPATH /></SVG>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg altGlyph": true,
+            "svg altGlyphDef": true,
+            "svg altGlyphItem": true,
+            "svg animateColor": true,
+            "svg animateMotion": true,
+            "svg animateTransform": true,
+            "svg clipPath": true,
+            "svg feBlend": true,
+            "svg feColorMatrix": true,
+            "svg feComponentTransfer": true,
+            "svg feComposite": true,
+            "svg feConvolveMatrix": true,
+            "svg feDiffuseLighting": true,
+            "svg feDisplacementMap": true,
+            "svg feDistantLight": true,
+            "svg feFlood": true,
+            "svg feFuncA": true,
+            "svg feFuncB": true,
+            "svg feFuncG": true,
+            "svg feFuncR": true,
+            "svg feGaussianBlur": true,
+            "svg feImage": true,
+            "svg feMerge": true,
+            "svg feMergeNode": true,
+            "svg feMorphology": true,
+            "svg feOffset": true,
+            "svg fePointLight": true,
+            "svg feSpecularLighting": true,
+            "svg feSpotLight": true,
+            "svg feTile": true,
+            "svg feTurbulence": true,
+            "svg foreignObject": true,
+            "svg glyphRef": true,
+            "svg linearGradient": true,
+            "svg radialGradient": true,
+            "svg textPath": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "altGlyph",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "altGlyphDef",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "altGlyphItem",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "animateColor",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "animateMotion",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "animateTransform",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "clipPath",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feBlend",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feColorMatrix",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feComponentTransfer",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feComposite",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feConvolveMatrix",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feDiffuseLighting",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feDisplacementMap",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feDistantLight",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feFlood",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feFuncA",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feFuncB",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feFuncG",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feFuncR",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feGaussianBlur",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feImage",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feMerge",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feMergeNode",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feMorphology",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feOffset",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "fePointLight",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feSpecularLighting",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feSpotLight",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feTile",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "feTurbulence",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "foreignObject",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "glyphRef",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "linearGradient",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "radialGradient",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "textPath",
+                        "ns": "http://www.w3.org/2000/svg"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg><altGlyph></altGlyph><altGlyphDef></altGlyphDef><altGlyphItem></altGlyphItem><animateColor></animateColor><animateMotion></animateMotion><animateTransform></animateTransform><clipPath></clipPath><feBlend></feBlend><feColorMatrix></feColorMatrix><feComponentTransfer></feComponentTransfer><feComposite></feComposite><feConvolveMatrix></feConvolveMatrix><feDiffuseLighting></feDiffuseLighting><feDisplacementMap></feDisplacementMap><feDistantLight></feDistantLight><feFlood></feFlood><feFuncA></feFuncA><feFuncB></feFuncB><feFuncG></feFuncG><feFuncR></feFuncR><feGaussianBlur></feGaussianBlur><feImage></feImage><feMerge></feMerge><feMergeNode></feMergeNode><feMorphology></feMorphology><feOffset></feOffset><fePointLight></fePointLight><feSpecularLighting></feSpecularLighting><feSpotLight></feSpotLight><feTile></feTile><feTurbulence></feTurbulence><foreignObject></foreignObject><glyphRef></glyphRef><linearGradient></linearGradient><radialGradient></radialGradient><textPath></textPath></svg></body></html>",
+        "noQuirksBodyHtml": "<svg><altGlyph></altGlyph><altGlyphDef></altGlyphDef><altGlyphItem></altGlyphItem><animateColor></animateColor><animateMotion></animateMotion><animateTransform></animateTransform><clipPath></clipPath><feBlend></feBlend><feColorMatrix></feColorMatrix><feComponentTransfer></feComponentTransfer><feComposite></feComposite><feConvolveMatrix></feConvolveMatrix><feDiffuseLighting></feDiffuseLighting><feDisplacementMap></feDisplacementMap><feDistantLight></feDistantLight><feFlood></feFlood><feFuncA></feFuncA><feFuncB></feFuncB><feFuncG></feFuncG><feFuncR></feFuncR><feGaussianBlur></feGaussianBlur><feImage></feImage><feMerge></feMerge><feMergeNode></feMergeNode><feMorphology></feMorphology><feOffset></feOffset><fePointLight></fePointLight><feSpecularLighting></feSpecularLighting><feSpotLight></feSpotLight><feTile></feTile><feTurbulence></feTurbulence><foreignObject></foreignObject><glyphRef></glyphRef><linearGradient></linearGradient><radialGradient></radialGradient><textPath></textPath></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><math><altGlyph /><altGlyphDef /><altGlyphItem /><animateColor /><animateMotion /><animateTransform /><clipPath /><feBlend /><feColorMatrix /><feComponentTransfer /><feComposite /><feConvolveMatrix /><feDiffuseLighting /><feDisplacementMap /><feDistantLight /><feFlood /><feFuncA /><feFuncB /><feFuncG /><feFuncR /><feGaussianBlur /><feImage /><feMerge /><feMergeNode /><feMorphology /><feOffset /><fePointLight /><feSpecularLighting /><feSpotLight /><feTile /><feTurbulence /><foreignObject /><glyphRef /><linearGradient /><radialGradient /><textPath /></math>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math altglyph": true,
+            "math altglyphdef": true,
+            "math altglyphitem": true,
+            "math animatecolor": true,
+            "math animatemotion": true,
+            "math animatetransform": true,
+            "math clippath": true,
+            "math feblend": true,
+            "math fecolormatrix": true,
+            "math fecomponenttransfer": true,
+            "math fecomposite": true,
+            "math feconvolvematrix": true,
+            "math fediffuselighting": true,
+            "math fedisplacementmap": true,
+            "math fedistantlight": true,
+            "math feflood": true,
+            "math fefunca": true,
+            "math fefuncb": true,
+            "math fefuncg": true,
+            "math fefuncr": true,
+            "math fegaussianblur": true,
+            "math feimage": true,
+            "math femerge": true,
+            "math femergenode": true,
+            "math femorphology": true,
+            "math feoffset": true,
+            "math fepointlight": true,
+            "math fespecularlighting": true,
+            "math fespotlight": true,
+            "math fetile": true,
+            "math feturbulence": true,
+            "math foreignobject": true,
+            "math glyphref": true,
+            "math lineargradient": true,
+            "math radialgradient": true,
+            "math textpath": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "altglyph",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "altglyphdef",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "altglyphitem",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "animatecolor",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "animatemotion",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "animatetransform",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "clippath",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "feblend",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "fecolormatrix",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "fecomponenttransfer",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "fecomposite",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "feconvolvematrix",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "fediffuselighting",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "fedisplacementmap",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "fedistantlight",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "feflood",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "fefunca",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "fefuncb",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "fefuncg",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "fefuncr",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "fegaussianblur",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "feimage",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "femerge",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "femergenode",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "femorphology",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "feoffset",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "fepointlight",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "fespecularlighting",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "fespotlight",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "fetile",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "feturbulence",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "foreignobject",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "glyphref",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "lineargradient",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "radialgradient",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      },
+                      {
+                        "tag": "textpath",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math><altglyph></altglyph><altglyphdef></altglyphdef><altglyphitem></altglyphitem><animatecolor></animatecolor><animatemotion></animatemotion><animatetransform></animatetransform><clippath></clippath><feblend></feblend><fecolormatrix></fecolormatrix><fecomponenttransfer></fecomponenttransfer><fecomposite></fecomposite><feconvolvematrix></feconvolvematrix><fediffuselighting></fediffuselighting><fedisplacementmap></fedisplacementmap><fedistantlight></fedistantlight><feflood></feflood><fefunca></fefunca><fefuncb></fefuncb><fefuncg></fefuncg><fefuncr></fefuncr><fegaussianblur></fegaussianblur><feimage></feimage><femerge></femerge><femergenode></femergenode><femorphology></femorphology><feoffset></feoffset><fepointlight></fepointlight><fespecularlighting></fespecularlighting><fespotlight></fespotlight><fetile></fetile><feturbulence></feturbulence><foreignobject></foreignobject><glyphref></glyphref><lineargradient></lineargradient><radialgradient></radialgradient><textpath></textpath></math></body></html>",
+        "noQuirksBodyHtml": "<math><altglyph></altglyph><altglyphdef></altglyphdef><altglyphitem></altglyphitem><animatecolor></animatecolor><animatemotion></animatemotion><animatetransform></animatetransform><clippath></clippath><feblend></feblend><fecolormatrix></fecolormatrix><fecomponenttransfer></fecomponenttransfer><fecomposite></fecomposite><feconvolvematrix></feconvolvematrix><fediffuselighting></fediffuselighting><fedisplacementmap></fedisplacementmap><fedistantlight></fedistantlight><feflood></feflood><fefunca></fefunca><fefuncb></fefuncb><fefuncg></fefuncg><fefuncr></fefuncr><fegaussianblur></fegaussianblur><feimage></feimage><femerge></femerge><femergenode></femergenode><femorphology></femorphology><feoffset></feoffset><fepointlight></fepointlight><fespecularlighting></fespecularlighting><fespotlight></fespotlight><fetile></fetile><feturbulence></feturbulence><foreignobject></foreignobject><glyphref></glyphref><lineargradient></lineargradient><radialgradient></radialgradient><textpath></textpath></math>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><svg><solidColor /></svg>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg solidcolor": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "solidcolor",
+                        "ns": "http://www.w3.org/2000/svg"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg><solidcolor></solidcolor></svg></body></html>",
+        "noQuirksBodyHtml": "<svg><solidcolor></solidcolor></svg>"
+      }
+    }
+  ],
+  "tests12.dat": [
+    {
+      "data": "<!DOCTYPE html><body><p>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><P>spam<TABLE><tr><td><img></td></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "math math": true,
+            "math mtext": true,
+            "i": true,
+            "math annotation-xml": true,
+            "svg svg": true,
+            "svg desc": true,
+            "b": true,
+            "svg g": true,
+            "svg foreignObject": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "img": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "foo"
+                      },
+                      {
+                        "tag": "math",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "mtext",
+                            "ns": "http://www.w3.org/1998/Math/MathML",
+                            "children": [
+                              {
+                                "tag": "i",
+                                "children": [
+                                  {
+                                    "text": "baz"
+                                  }
+                                ]
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "annotation-xml",
+                            "ns": "http://www.w3.org/1998/Math/MathML",
+                            "children": [
+                              {
+                                "tag": "svg",
+                                "ns": "http://www.w3.org/2000/svg",
+                                "children": [
+                                  {
+                                    "tag": "desc",
+                                    "ns": "http://www.w3.org/2000/svg",
+                                    "children": [
+                                      {
+                                        "tag": "b",
+                                        "children": [
+                                          {
+                                            "text": "eggs"
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "tag": "g",
+                                    "ns": "http://www.w3.org/2000/svg",
+                                    "children": [
+                                      {
+                                        "tag": "foreignObject",
+                                        "ns": "http://www.w3.org/2000/svg",
+                                        "children": [
+                                          {
+                                            "tag": "p",
+                                            "children": [
+                                              {
+                                                "text": "spam"
+                                              }
+                                            ]
+                                          },
+                                          {
+                                            "tag": "table",
+                                            "children": [
+                                              {
+                                                "tag": "tbody",
+                                                "children": [
+                                                  {
+                                                    "tag": "tr",
+                                                    "children": [
+                                                      {
+                                                        "tag": "td",
+                                                        "children": [
+                                                          {
+                                                            "tag": "img"
+                                                          }
+                                                        ]
+                                                      }
+                                                    ]
+                                                  }
+                                                ]
+                                              }
+                                            ]
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "tag": "g",
+                                    "ns": "http://www.w3.org/2000/svg",
+                                    "children": [
+                                      {
+                                        "text": "quux"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "text": "bar"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><p>spam</p><table><tbody><tr><td><img></td></tr></tbody></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar</p></body></html>",
+        "noQuirksBodyHtml": "<p>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><p>spam</p><table><tbody><tr><td><img></td></tr></tbody></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar</p>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><P>spam<TABLE><tr><td><img></td></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mtext": true,
+            "i": true,
+            "math annotation-xml": true,
+            "svg svg": true,
+            "svg desc": true,
+            "b": true,
+            "svg g": true,
+            "svg foreignObject": true,
+            "p": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "img": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "foo"
+                  },
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mtext",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "text": "baz"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "annotation-xml",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "svg",
+                            "ns": "http://www.w3.org/2000/svg",
+                            "children": [
+                              {
+                                "tag": "desc",
+                                "ns": "http://www.w3.org/2000/svg",
+                                "children": [
+                                  {
+                                    "tag": "b",
+                                    "children": [
+                                      {
+                                        "text": "eggs"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              },
+                              {
+                                "tag": "g",
+                                "ns": "http://www.w3.org/2000/svg",
+                                "children": [
+                                  {
+                                    "tag": "foreignObject",
+                                    "ns": "http://www.w3.org/2000/svg",
+                                    "children": [
+                                      {
+                                        "tag": "p",
+                                        "children": [
+                                          {
+                                            "text": "spam"
+                                          }
+                                        ]
+                                      },
+                                      {
+                                        "tag": "table",
+                                        "children": [
+                                          {
+                                            "tag": "tbody",
+                                            "children": [
+                                              {
+                                                "tag": "tr",
+                                                "children": [
+                                                  {
+                                                    "tag": "td",
+                                                    "children": [
+                                                      {
+                                                        "tag": "img"
+                                                      }
+                                                    ]
+                                                  }
+                                                ]
+                                              }
+                                            ]
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              },
+                              {
+                                "tag": "g",
+                                "ns": "http://www.w3.org/2000/svg",
+                                "children": [
+                                  {
+                                    "text": "quux"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "text": "bar"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><p>spam</p><table><tbody><tr><td><img></td></tr></tbody></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar</body></html>",
+        "noQuirksBodyHtml": "foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><p>spam</p><table><tbody><tr><td><img></td></tr></tbody></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar"
+      }
+    }
+  ],
+  "tests14.dat": [
+    {
+      "data": "<!DOCTYPE html><html><body><xyz:abc></xyz:abc>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "xyz:abc": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "xyz:abc"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><xyz:abc></xyz:abc></body></html>",
+        "noQuirksBodyHtml": "<xyz:abc></xyz:abc>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><html><body><xyz:abc></xyz:abc><span></span>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "xyz:abc": true,
+            "span": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "xyz:abc"
+                  },
+                  {
+                    "tag": "span"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><xyz:abc></xyz:abc><span></span></body></html>",
+        "noQuirksBodyHtml": "<xyz:abc></xyz:abc><span></span>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><html><html abc:def=gh><xyz:abc></xyz:abc>",
+      "errors": [
+        "(1,38): non-html-root"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "xyz:abc": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "attrs": [
+              {
+                "name": "abc:def",
+                "value": "gh"
+              }
+            ],
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "xyz:abc"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html abc:def=\"gh\"><head></head><body><xyz:abc></xyz:abc></body></html>",
+        "noQuirksBodyHtml": "<xyz:abc></xyz:abc>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><html xml:lang=bar><html xml:lang=foo>",
+      "errors": [
+        "(1,53): non-html-root"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "attrs": [
+              {
+                "name": "xml:lang",
+                "value": "bar"
+              }
+            ],
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html xml:lang=\"bar\"><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><html 123=456>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "attrs": [
+              {
+                "name": "123",
+                "value": "456"
+              }
+            ],
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html 123=\"456\"><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><html 123=456><html 789=012>",
+      "errors": [
+        "(1,43): non-html-root"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "attrs": [
+              {
+                "name": "123",
+                "value": "456"
+              },
+              {
+                "name": "789",
+                "value": "012"
+              }
+            ],
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html 123=\"456\" 789=\"012\"><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><html><body 789=012>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "attrs": [
+                  {
+                    "name": "789",
+                    "value": "012"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body 789=\"012\"></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    }
+  ],
+  "tests15.dat": [
+    {
+      "data": "<!DOCTYPE html><p><b><i><u></p> <p>X",
+      "errors": [
+        "(1,31): unexpected-end-tag",
+        "(1,36): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "b": true,
+            "i": true,
+            "u": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "tag": "u"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "i",
+                        "children": [
+                          {
+                            "tag": "u",
+                            "children": [
+                              {
+                                "text": " "
+                              },
+                              {
+                                "tag": "p",
+                                "children": [
+                                  {
+                                    "text": "X"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><b><i><u></u></i></b></p><b><i><u> <p>X</p></u></i></b></body></html>",
+        "noQuirksBodyHtml": "<p><b><i><u></u></i></b></p><b><i><u> <p>X</p></u></i></b>"
+      }
+    },
+    {
+      "data": "<p><b><i><u></p>\n<p>X",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,16): unexpected-end-tag",
+        "(2,4): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "b": true,
+            "i": true,
+            "u": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "tag": "u"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "i",
+                        "children": [
+                          {
+                            "tag": "u",
+                            "children": [
+                              {
+                                "text": "\n"
+                              },
+                              {
+                                "tag": "p",
+                                "children": [
+                                  {
+                                    "text": "X"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><p><b><i><u></u></i></b></p><b><i><u>\n<p>X</p></u></i></b></body></html>",
+        "noQuirksBodyHtml": "<p><b><i><u></u></i></b></p><b><i><u>\n<p>X</p></u></i></b>"
+      }
+    },
+    {
+      "data": "<!doctype html></html> <head>",
+      "errors": [
+        "(1,29): expected-eof-but-got-start-tag",
+        "(1,29): unexpected-start-tag-ignored"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": " "
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body> </body></html>",
+        "noQuirksBodyHtml": " "
+      }
+    },
+    {
+      "data": "<!doctype html></body><meta>",
+      "errors": [
+        "(1,28): unexpected-start-tag-after-body"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "meta": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "meta"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><meta></body></html>",
+        "noQuirksBodyHtml": "<meta>"
+      }
+    },
+    {
+      "data": "<html></html><!-- foo -->",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          },
+          {
+            "comment": " foo "
+          }
+        ],
+        "html": "<html><head></head><body></body></html><!-- foo -->",
+        "noQuirksBodyHtml": "<!-- foo -->"
+      }
+    },
+    {
+      "data": "<!doctype html></body><title>X</title>",
+      "errors": [
+        "(1,29): unexpected-start-tag-after-body"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "title": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "X"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><title>X</title></body></html>",
+        "noQuirksBodyHtml": "<title>X</title>"
+      }
+    },
+    {
+      "data": "<!doctype html><table> X<meta></table>",
+      "errors": [
+        "(1,23): foster-parenting-character",
+        "(1,24): foster-parenting-character",
+        "(1,30): foster-parenting-start-character"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "meta": true,
+            "table": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": " X"
+                  },
+                  {
+                    "tag": "meta"
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body> X<meta><table></table></body></html>",
+        "noQuirksBodyHtml": " X<meta><table></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table> x</table>",
+      "errors": [
+        "(1,23): foster-parenting-character",
+        "(1,24): foster-parenting-character"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": " x"
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body> x<table></table></body></html>",
+        "noQuirksBodyHtml": " x<table></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table> x </table>",
+      "errors": [
+        "(1,23): foster-parenting-character",
+        "(1,24): foster-parenting-character",
+        "(1,25): foster-parenting-character"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": " x "
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body> x <table></table></body></html>",
+        "noQuirksBodyHtml": " x <table></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><tr> x</table>",
+      "errors": [
+        "(1,27): foster-parenting-character",
+        "(1,28): foster-parenting-character"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": " x"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body> x<table><tbody><tr></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": " x<table><tbody><tr></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table>X<style> <tr>x </style> </table>",
+      "errors": [
+        "(1,23): foster-parenting-character"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "style": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "X"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "style",
+                        "children": [
+                          {
+                            "text": " <tr>x ",
+                            "no_escape": true
+                          }
+                        ]
+                      },
+                      {
+                        "text": " "
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>X<table><style> <tr>x </style> </table></body></html>",
+        "noQuirksBodyHtml": "X<table><style> <tr>x </style> </table>"
+      }
+    },
+    {
+      "data": "<!doctype html><div><table><a>foo</a> <tr><td>bar</td> </tr></table></div>",
+      "errors": [
+        "(1,30): foster-parenting-start-tag",
+        "(1,31): foster-parenting-character",
+        "(1,32): foster-parenting-character",
+        "(1,33): foster-parenting-character",
+        "(1,37): foster-parenting-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "a": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "a",
+                        "children": [
+                          {
+                            "text": "foo"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "table",
+                        "children": [
+                          {
+                            "text": " "
+                          },
+                          {
+                            "tag": "tbody",
+                            "children": [
+                              {
+                                "tag": "tr",
+                                "children": [
+                                  {
+                                    "tag": "td",
+                                    "children": [
+                                      {
+                                        "text": "bar"
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "text": " "
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><div><a>foo</a><table> <tbody><tr><td>bar</td> </tr></tbody></table></div></body></html>",
+        "noQuirksBodyHtml": "<div><a>foo</a><table> <tbody><tr><td>bar</td> </tr></tbody></table></div>"
+      }
+    },
+    {
+      "data": "<frame></frame></frame><frameset><frame><frameset><frame></frameset><noframes></frameset><noframes>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,7): unexpected-start-tag-ignored",
+        "(1,15): unexpected-end-tag",
+        "(1,23): unexpected-end-tag",
+        "(1,33): unexpected-start-tag",
+        "(1,99): expected-named-closing-tag-but-got-eof",
+        "(1,99): eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true,
+            "frame": true,
+            "noframes": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset",
+                "children": [
+                  {
+                    "tag": "frame"
+                  },
+                  {
+                    "tag": "frameset",
+                    "children": [
+                      {
+                        "tag": "frame"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "noframes",
+                    "children": [
+                      {
+                        "text": "</frameset><noframes>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset><frame><frameset><frame></frameset><noframes></frameset><noframes></noframes></frameset></html>",
+        "noQuirksBodyHtml": "<noframes></frameset><noframes></noframes>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><object></html>",
+      "errors": [
+        "(1,30): expected-body-in-scope",
+        "(1,30): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "object": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "object"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><object></object></body></html>",
+        "noQuirksBodyHtml": "<object></object>"
+      }
+    }
+  ],
+  "tests16.dat": [
+    {
+      "data": "<!doctype html><script>",
+      "errors": [
+        "(1,23): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script"
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script>a",
+      "errors": [
+        "(1,24): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "a",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script>a</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script>a</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><",
+      "errors": [
+        "(1,24): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script></",
+      "errors": [
+        "(1,25): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script></</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script></S",
+      "errors": [
+        "(1,26): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</S",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script></S</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></S</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script></SC",
+      "errors": [
+        "(1,27): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</SC",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script></SC</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></SC</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script></SCR",
+      "errors": [
+        "(1,28): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</SCR",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script></SCR</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></SCR</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script></SCRI",
+      "errors": [
+        "(1,29): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</SCRI",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script></SCRI</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></SCRI</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script></SCRIP",
+      "errors": [
+        "(1,30): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</SCRIP",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script></SCRIP</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></SCRIP</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script></SCRIPT",
+      "errors": [
+        "(1,31): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</SCRIPT",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script></SCRIPT</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></SCRIPT</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script></SCRIPT ",
+      "errors": [
+        "(1,32): expected-attribute-name-but-got-eof",
+        "(1,32): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script"
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script></s",
+      "errors": [
+        "(1,26): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</s",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script></s</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></s</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script></sc",
+      "errors": [
+        "(1,27): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</sc",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script></sc</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></sc</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script></scr",
+      "errors": [
+        "(1,28): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</scr",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script></scr</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></scr</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script></scri",
+      "errors": [
+        "(1,29): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</scri",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script></scri</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></scri</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script></scrip",
+      "errors": [
+        "(1,30): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</scrip",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script></scrip</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></scrip</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script></script",
+      "errors": [
+        "(1,31): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</script",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script></script</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></script</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script></script ",
+      "errors": [
+        "(1,32): expected-attribute-name-but-got-eof",
+        "(1,32): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script"
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!",
+      "errors": [
+        "(1,25): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!a",
+      "errors": [
+        "(1,26): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!a",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!a</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!a</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!-",
+      "errors": [
+        "(1,26): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!-",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!-</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!-</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!-a",
+      "errors": [
+        "(1,27): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!-a",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!-a</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!-a</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--",
+      "errors": [
+        "(1,27): expected-named-closing-tag-but-got-eof",
+        "(1,27): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--a",
+      "errors": [
+        "(1,28): expected-named-closing-tag-but-got-eof",
+        "(1,28): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--a",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--a</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--a</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<",
+      "errors": [
+        "(1,28): expected-named-closing-tag-but-got-eof",
+        "(1,28): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<a",
+      "errors": [
+        "(1,29): expected-named-closing-tag-but-got-eof",
+        "(1,29): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<a",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<a</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<a</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--</",
+      "errors": [
+        "(1,29): expected-named-closing-tag-but-got-eof",
+        "(1,29): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--</",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--</</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--</</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--</script",
+      "errors": [
+        "(1,35): expected-named-closing-tag-but-got-eof",
+        "(1,35): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--</script",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--</script</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--</script</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--</script ",
+      "errors": [
+        "(1,36): expected-attribute-name-but-got-eof",
+        "(1,36): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<s",
+      "errors": [
+        "(1,29): expected-named-closing-tag-but-got-eof",
+        "(1,29): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<s",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<s</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<s</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script",
+      "errors": [
+        "(1,34): expected-named-closing-tag-but-got-eof",
+        "(1,34): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script ",
+      "errors": [
+        "(1,35): eof-in-script-in-script",
+        "(1,35): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script ",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script </script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script <",
+      "errors": [
+        "(1,36): eof-in-script-in-script",
+        "(1,36): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script <",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script <</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script <</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script <a",
+      "errors": [
+        "(1,37): eof-in-script-in-script",
+        "(1,37): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script <a",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script <a</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script <a</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script </",
+      "errors": [
+        "(1,37): eof-in-script-in-script",
+        "(1,37): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script </</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script </s",
+      "errors": [
+        "(1,38): eof-in-script-in-script",
+        "(1,38): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </s",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script </s</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </s</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script </script",
+      "errors": [
+        "(1,43): eof-in-script-in-script",
+        "(1,43): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </script",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script </script</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </script</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script </scripta",
+      "errors": [
+        "(1,44): eof-in-script-in-script",
+        "(1,44): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </scripta",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script </scripta</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </scripta</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script </script ",
+      "errors": [
+        "(1,44): expected-named-closing-tag-but-got-eof",
+        "(1,44): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </script ",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script </script </script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </script </script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script </script>",
+      "errors": [
+        "(1,44): expected-named-closing-tag-but-got-eof",
+        "(1,44): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </script>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script </script></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </script></script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script </script/",
+      "errors": [
+        "(1,44): expected-named-closing-tag-but-got-eof",
+        "(1,44): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </script/",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script </script/</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </script/</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script </script <",
+      "errors": [
+        "(1,45): expected-named-closing-tag-but-got-eof",
+        "(1,45): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </script <",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script </script <</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </script <</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script </script <a",
+      "errors": [
+        "(1,46): expected-named-closing-tag-but-got-eof",
+        "(1,46): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </script <a",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script </script <a</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </script <a</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script </script </",
+      "errors": [
+        "(1,46): expected-named-closing-tag-but-got-eof",
+        "(1,46): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </script </",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script </script </</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </script </</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script </script </script",
+      "errors": [
+        "(1,52): expected-named-closing-tag-but-got-eof",
+        "(1,52): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </script </script",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script </script </script</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </script </script</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script </script </script ",
+      "errors": [
+        "(1,53): expected-attribute-name-but-got-eof",
+        "(1,53): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </script ",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script </script </script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </script </script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script </script </script/",
+      "errors": [
+        "(1,53): unexpected-EOF-after-solidus-in-tag",
+        "(1,53): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </script ",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script </script </script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </script </script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script </script </script>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </script ",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script </script </script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </script </script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script -",
+      "errors": [
+        "(1,36): eof-in-script-in-script",
+        "(1,36): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script -",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script -</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script -</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script -a",
+      "errors": [
+        "(1,37): eof-in-script-in-script",
+        "(1,37): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script -a",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script -a</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script -a</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script -<",
+      "errors": [
+        "(1,37): eof-in-script-in-script",
+        "(1,37): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script -<",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script -<</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script -<</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script --",
+      "errors": [
+        "(1,37): eof-in-script-in-script",
+        "(1,37): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script --",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script --</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script --</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script --a",
+      "errors": [
+        "(1,38): eof-in-script-in-script",
+        "(1,38): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script --a",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script --a</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script --a</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script --<",
+      "errors": [
+        "(1,38): eof-in-script-in-script",
+        "(1,38): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script --<",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script --<</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script --<</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script -->",
+      "errors": [
+        "(1,38): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script -->",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script --></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script --></script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script --><",
+      "errors": [
+        "(1,39): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script --><",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script --><</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script --><</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script --></",
+      "errors": [
+        "(1,40): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script --></",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script --></</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script --></</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script --></script",
+      "errors": [
+        "(1,46): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script --></script",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script --></script</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script --></script</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script --></script ",
+      "errors": [
+        "(1,47): expected-attribute-name-but-got-eof",
+        "(1,47): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script -->",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script --></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script --></script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script --></script/",
+      "errors": [
+        "(1,47): unexpected-EOF-after-solidus-in-tag",
+        "(1,47): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script -->",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script --></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script --></script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script --></script>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script -->",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script --></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script --></script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script><\\/script>--></script>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script><\\/script>-->",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script><\\/script>--></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script><\\/script>--></script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script></scr'+'ipt>--></script>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script></scr'+'ipt>-->",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script></scr'+'ipt>--></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script></scr'+'ipt>--></script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script></script><script></script></script>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script></script><script></script>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script></script><script></script></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script></script><script></script></script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script></script><script></script>--><!--</script>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script></script><script></script>--><!--",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script></script><script></script>--><!--</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script></script><script></script>--><!--</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script></script><script></script>-- ></script>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script></script><script></script>-- >",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script></script><script></script>-- ></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script></script><script></script>-- ></script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script></script><script></script>- -></script>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script></script><script></script>- ->",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script></script><script></script>- -></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script></script><script></script>- -></script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script></script><script></script>- - ></script>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script></script><script></script>- - >",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script></script><script></script>- - ></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script></script><script></script>- - ></script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script></script><script></script>-></script>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script></script><script></script>->",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script></script><script></script>-></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script></script><script></script>-></script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script>--!></script>X",
+      "errors": [
+        "(1,49): expected-named-closing-tag-but-got-eof",
+        "(1,49): unexpected-EOF-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script>--!></script>X",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script>--!></script>X</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script>--!></script>X</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<scr'+'ipt></script>--></script>",
+      "errors": [
+        "(1,59): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<scr'+'ipt>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<scr'+'ipt></script></head><body>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<script><!--<scr'+'ipt></script>--&gt;"
+      }
+    },
+    {
+      "data": "<!doctype html><script><!--<script></scr'+'ipt></script>X",
+      "errors": [
+        "(1,57): expected-named-closing-tag-but-got-eof",
+        "(1,57): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script></scr'+'ipt></script>X",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script><!--<script></scr'+'ipt></script>X</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script></scr'+'ipt></script>X</script>"
+      }
+    },
+    {
+      "data": "<!doctype html><style><!--<style></style>--></style>",
+      "errors": [
+        "(1,52): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": "<!--<style>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><style><!--<style></style></head><body>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<style><!--<style></style>--&gt;"
+      }
+    },
+    {
+      "data": "<!doctype html><style><!--</style>X",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": "<!--",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "X"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><style><!--</style></head><body>X</body></html>",
+        "noQuirksBodyHtml": "<style><!--</style>X"
+      }
+    },
+    {
+      "data": "<!doctype html><style><!--...</style>...--></style>",
+      "errors": [
+        "(1,51): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": "<!--...",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "...-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><style><!--...</style></head><body>...--&gt;</body></html>",
+        "noQuirksBodyHtml": "<style><!--...</style>...--&gt;"
+      }
+    },
+    {
+      "data": "<!doctype html><style><!--<br><html xmlns:v=\"urn:schemas-microsoft-com:vml\"><!--[if !mso]><style></style>X",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": "<!--<br><html xmlns:v=\"urn:schemas-microsoft-com:vml\"><!--[if !mso]><style>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "X"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><style><!--<br><html xmlns:v=\"urn:schemas-microsoft-com:vml\"><!--[if !mso]><style></style></head><body>X</body></html>",
+        "noQuirksBodyHtml": "<style><!--<br><html xmlns:v=\"urn:schemas-microsoft-com:vml\"><!--[if !mso]><style></style>X"
+      }
+    },
+    {
+      "data": "<!doctype html><style><!--...<style><!--...--!></style>--></style>",
+      "errors": [
+        "(1,66): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": "<!--...<style><!--...--!>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><style><!--...<style><!--...--!></style></head><body>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<style><!--...<style><!--...--!></style>--&gt;"
+      }
+    },
+    {
+      "data": "<!doctype html><style><!--...</style><!-- --><style>@import ...</style>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": "<!--...",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "comment": " "
+                  },
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": "@import ...",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><style><!--...</style><!-- --><style>@import ...</style></head><body></body></html>",
+        "noQuirksBodyHtml": "<style><!--...</style><!-- --><style>@import ...</style>"
+      }
+    },
+    {
+      "data": "<!doctype html><style>...<style><!--...</style><!-- --></style>",
+      "errors": [
+        "(1,63): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": "...<style><!--...",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "comment": " "
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><style>...<style><!--...</style><!-- --></head><body></body></html>",
+        "noQuirksBodyHtml": "<style>...<style><!--...</style><!-- -->"
+      }
+    },
+    {
+      "data": "<!doctype html><style>...<!--[if IE]><style>...</style>X",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": "...<!--[if IE]><style>...",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "X"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><style>...<!--[if IE]><style>...</style></head><body>X</body></html>",
+        "noQuirksBodyHtml": "<style>...<!--[if IE]><style>...</style>X"
+      }
+    },
+    {
+      "data": "<!doctype html><title><!--<title></title>--></title>",
+      "errors": [
+        "(1,52): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "title": true,
+            "body": true
+          },
+          "doctype": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "<!--<title>",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><title>&lt;!--&lt;title&gt;</title></head><body>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<title>&lt;!--&lt;title&gt;</title>--&gt;"
+      }
+    },
+    {
+      "data": "<!doctype html><title>&lt;/title></title>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "title": true,
+            "body": true
+          },
+          "doctype": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "</title>",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><title>&lt;/title&gt;</title></head><body></body></html>",
+        "noQuirksBodyHtml": "<title>&lt;/title&gt;</title>"
+      }
+    },
+    {
+      "data": "<!doctype html><title>foo/title><link></head><body>X",
+      "errors": [
+        "(1,52): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "title": true,
+            "body": true
+          },
+          "doctype": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "foo/title><link></head><body>X",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><title>foo/title&gt;&lt;link&gt;&lt;/head&gt;&lt;body&gt;X</title></head><body></body></html>",
+        "noQuirksBodyHtml": "<title>foo/title&gt;&lt;link&gt;&lt;/head&gt;&lt;body&gt;X</title>"
+      }
+    },
+    {
+      "data": "<!doctype html><noscript><!--<noscript></noscript>--></noscript>",
+      "errors": [
+        "(1,64): unexpected-end-tag"
+      ],
+      "script": "on",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "text": "<!--<noscript>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><noscript><!--<noscript></noscript></head><body>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<noscript>&lt;!--&lt;noscript&gt;</noscript>--&gt;"
+      }
+    },
+    {
+      "data": "<!doctype html><noscript><!--<noscript></noscript>--></noscript>",
+      "errors": [],
+      "script": "off",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "doctype": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "comment": "<noscript></noscript>"
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><noscript><!--<noscript></noscript>--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript>&lt;!--&lt;noscript&gt;</noscript>--&gt;"
+      }
+    },
+    {
+      "data": "<!doctype html><noscript><!--</noscript>X<noscript>--></noscript>",
+      "errors": [],
+      "script": "on",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "text": "<!--",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "X"
+                  },
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "text": "-->",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><noscript><!--</noscript></head><body>X<noscript>--></noscript></body></html>",
+        "noQuirksBodyHtml": "<noscript>&lt;!--</noscript>X<noscript>--&gt;</noscript>"
+      }
+    },
+    {
+      "data": "<!doctype html><noscript><!--</noscript>X<noscript>--></noscript>",
+      "errors": [],
+      "script": "off",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "doctype": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "comment": "</noscript>X<noscript>"
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><noscript><!--</noscript>X<noscript>--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript>&lt;!--</noscript>X<noscript>--&gt;</noscript>"
+      }
+    },
+    {
+      "data": "<!doctype html><noscript><iframe></noscript>X",
+      "errors": [],
+      "script": "on",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "text": "<iframe>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "X"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><noscript><iframe></noscript></head><body>X</body></html>",
+        "noQuirksBodyHtml": "<noscript>&lt;iframe&gt;</noscript>X"
+      }
+    },
+    {
+      "data": "<!doctype html><noscript><iframe></noscript>X",
+      "errors": [
+        " * (1,34) unexpected token in head noscript",
+        " * (1,46) unexpected EOF"
+      ],
+      "script": "off",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true,
+            "iframe": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript"
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "iframe",
+                    "children": [
+                      {
+                        "text": "</noscript>X",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><noscript></noscript></head><body><iframe></noscript>X</iframe></body></html>",
+        "noQuirksBodyHtml": "<noscript>&lt;iframe&gt;</noscript>X"
+      }
+    },
+    {
+      "data": "<!doctype html><noframes><!--<noframes></noframes>--></noframes>",
+      "errors": [
+        "(1,64): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noframes": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noframes",
+                    "children": [
+                      {
+                        "text": "<!--<noframes>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><noframes><!--<noframes></noframes></head><body>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<noframes><!--<noframes></noframes>--&gt;"
+      }
+    },
+    {
+      "data": "<!doctype html><noframes><body><script><!--...</script></body></noframes></html>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noframes": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noframes",
+                    "children": [
+                      {
+                        "text": "<body><script><!--...</script></body>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><noframes><body><script><!--...</script></body></noframes></head><body></body></html>",
+        "noQuirksBodyHtml": "<noframes><body><script><!--...</script></body></noframes>"
+      }
+    },
+    {
+      "data": "<!doctype html><textarea><!--<textarea></textarea>--></textarea>",
+      "errors": [
+        "(1,64): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "textarea": true
+          },
+          "doctype": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "textarea",
+                    "children": [
+                      {
+                        "text": "<!--<textarea>",
+                        "escaped": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><textarea>&lt;!--&lt;textarea&gt;</textarea>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<textarea>&lt;!--&lt;textarea&gt;</textarea>--&gt;"
+      }
+    },
+    {
+      "data": "<!doctype html><textarea>&lt;/textarea></textarea>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "textarea": true
+          },
+          "doctype": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "textarea",
+                    "children": [
+                      {
+                        "text": "</textarea>",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><textarea>&lt;/textarea&gt;</textarea></body></html>",
+        "noQuirksBodyHtml": "<textarea>&lt;/textarea&gt;</textarea>"
+      }
+    },
+    {
+      "data": "<!doctype html><textarea>&lt;</textarea>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "textarea": true
+          },
+          "doctype": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "textarea",
+                    "children": [
+                      {
+                        "text": "<",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><textarea>&lt;</textarea></body></html>",
+        "noQuirksBodyHtml": "<textarea>&lt;</textarea>"
+      }
+    },
+    {
+      "data": "<!doctype html><textarea>a&lt;b</textarea>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "textarea": true
+          },
+          "doctype": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "textarea",
+                    "children": [
+                      {
+                        "text": "a<b",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><textarea>a&lt;b</textarea></body></html>",
+        "noQuirksBodyHtml": "<textarea>a&lt;b</textarea>"
+      }
+    },
+    {
+      "data": "<!doctype html><iframe><!--<iframe></iframe>--></iframe>",
+      "errors": [
+        "(1,56): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "iframe": true
+          },
+          "doctype": true,
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "iframe",
+                    "children": [
+                      {
+                        "text": "<!--<iframe>",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><iframe><!--<iframe></iframe>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<iframe><!--<iframe></iframe>--&gt;"
+      }
+    },
+    {
+      "data": "<!doctype html><iframe>...<!--X->...<!--/X->...</iframe>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "iframe": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "iframe",
+                    "children": [
+                      {
+                        "text": "...<!--X->...<!--/X->...",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><iframe>...<!--X->...<!--/X->...</iframe></body></html>",
+        "noQuirksBodyHtml": "<iframe>...<!--X->...<!--/X->...</iframe>"
+      }
+    },
+    {
+      "data": "<!doctype html><xmp><!--<xmp></xmp>--></xmp>",
+      "errors": [
+        "(1,44): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "xmp": true
+          },
+          "doctype": true,
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "xmp",
+                    "children": [
+                      {
+                        "text": "<!--<xmp>",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><xmp><!--<xmp></xmp>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<xmp><!--<xmp></xmp>--&gt;"
+      }
+    },
+    {
+      "data": "<!doctype html><noembed><!--<noembed></noembed>--></noembed>",
+      "errors": [
+        "(1,60): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "noembed": true
+          },
+          "doctype": true,
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "noembed",
+                    "children": [
+                      {
+                        "text": "<!--<noembed>",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><noembed><!--<noembed></noembed>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<noembed><!--<noembed></noembed>--&gt;"
+      }
+    },
+    {
+      "data": "<script>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,8): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script"
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></script>"
+      }
+    },
+    {
+      "data": "<script>a",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,9): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "a",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script>a</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script>a</script>"
+      }
+    },
+    {
+      "data": "<script><",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,9): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><</script>"
+      }
+    },
+    {
+      "data": "<script></",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,10): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script></</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></</script>"
+      }
+    },
+    {
+      "data": "<script></S",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,11): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</S",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script></S</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></S</script>"
+      }
+    },
+    {
+      "data": "<script></SC",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,12): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</SC",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script></SC</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></SC</script>"
+      }
+    },
+    {
+      "data": "<script></SCR",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,13): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</SCR",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script></SCR</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></SCR</script>"
+      }
+    },
+    {
+      "data": "<script></SCRI",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,14): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</SCRI",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script></SCRI</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></SCRI</script>"
+      }
+    },
+    {
+      "data": "<script></SCRIP",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,15): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</SCRIP",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script></SCRIP</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></SCRIP</script>"
+      }
+    },
+    {
+      "data": "<script></SCRIPT",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,16): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</SCRIPT",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script></SCRIPT</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></SCRIPT</script>"
+      }
+    },
+    {
+      "data": "<script></SCRIPT ",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,17): expected-attribute-name-but-got-eof",
+        "(1,17): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script"
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></script>"
+      }
+    },
+    {
+      "data": "<script></s",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,11): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</s",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script></s</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></s</script>"
+      }
+    },
+    {
+      "data": "<script></sc",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,12): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</sc",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script></sc</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></sc</script>"
+      }
+    },
+    {
+      "data": "<script></scr",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,13): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</scr",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script></scr</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></scr</script>"
+      }
+    },
+    {
+      "data": "<script></scri",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,14): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</scri",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script></scri</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></scri</script>"
+      }
+    },
+    {
+      "data": "<script></scrip",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,15): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</scrip",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script></scrip</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></scrip</script>"
+      }
+    },
+    {
+      "data": "<script></script",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,16): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</script",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script></script</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></script</script>"
+      }
+    },
+    {
+      "data": "<script></script ",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,17): expected-attribute-name-but-got-eof",
+        "(1,17): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script"
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></script>"
+      }
+    },
+    {
+      "data": "<script><!",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,10): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!</script>"
+      }
+    },
+    {
+      "data": "<script><!a",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,11): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!a",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!a</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!a</script>"
+      }
+    },
+    {
+      "data": "<script><!-",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,11): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!-",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!-</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!-</script>"
+      }
+    },
+    {
+      "data": "<script><!-a",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,12): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!-a",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!-a</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!-a</script>"
+      }
+    },
+    {
+      "data": "<script><!--",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,12): expected-named-closing-tag-but-got-eof",
+        "(1,12): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--</script>"
+      }
+    },
+    {
+      "data": "<script><!--a",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,13): expected-named-closing-tag-but-got-eof",
+        "(1,13): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--a",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--a</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--a</script>"
+      }
+    },
+    {
+      "data": "<script><!--<",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,13): expected-named-closing-tag-but-got-eof",
+        "(1,13): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<</script>"
+      }
+    },
+    {
+      "data": "<script><!--<a",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,14): expected-named-closing-tag-but-got-eof",
+        "(1,14): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<a",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<a</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<a</script>"
+      }
+    },
+    {
+      "data": "<script><!--</",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,14): expected-named-closing-tag-but-got-eof",
+        "(1,14): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--</",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--</</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--</</script>"
+      }
+    },
+    {
+      "data": "<script><!--</script",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,20): expected-named-closing-tag-but-got-eof",
+        "(1,20): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--</script",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--</script</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--</script</script>"
+      }
+    },
+    {
+      "data": "<script><!--</script ",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,21): expected-attribute-name-but-got-eof",
+        "(1,21): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--</script>"
+      }
+    },
+    {
+      "data": "<script><!--<s",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,14): expected-named-closing-tag-but-got-eof",
+        "(1,14): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<s",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<s</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<s</script>"
+      }
+    },
+    {
+      "data": "<script><!--<script",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,19): expected-named-closing-tag-but-got-eof",
+        "(1,19): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script</script>"
+      }
+    },
+    {
+      "data": "<script><!--<script ",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,20): eof-in-script-in-script",
+        "(1,20): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script ",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script </script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </script>"
+      }
+    },
+    {
+      "data": "<script><!--<script <",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,21): eof-in-script-in-script",
+        "(1,21): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script <",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script <</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script <</script>"
+      }
+    },
+    {
+      "data": "<script><!--<script <a",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,22): eof-in-script-in-script",
+        "(1,22): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script <a",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script <a</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script <a</script>"
+      }
+    },
+    {
+      "data": "<script><!--<script </",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,22): eof-in-script-in-script",
+        "(1,22): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script </</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </</script>"
+      }
+    },
+    {
+      "data": "<script><!--<script </s",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,23): eof-in-script-in-script",
+        "(1,23): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </s",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script </s</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </s</script>"
+      }
+    },
+    {
+      "data": "<script><!--<script </script",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,28): eof-in-script-in-script",
+        "(1,28): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </script",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script </script</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </script</script>"
+      }
+    },
+    {
+      "data": "<script><!--<script </scripta",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,29): eof-in-script-in-script",
+        "(1,29): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </scripta",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script </scripta</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </scripta</script>"
+      }
+    },
+    {
+      "data": "<script><!--<script </script ",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,29): expected-named-closing-tag-but-got-eof",
+        "(1,29): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </script ",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script </script </script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </script </script>"
+      }
+    },
+    {
+      "data": "<script><!--<script </script>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,29): expected-named-closing-tag-but-got-eof",
+        "(1,29): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </script>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script </script></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </script></script>"
+      }
+    },
+    {
+      "data": "<script><!--<script </script/",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,29): expected-named-closing-tag-but-got-eof",
+        "(1,29): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </script/",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script </script/</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </script/</script>"
+      }
+    },
+    {
+      "data": "<script><!--<script </script <",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,30): expected-named-closing-tag-but-got-eof",
+        "(1,30): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </script <",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script </script <</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </script <</script>"
+      }
+    },
+    {
+      "data": "<script><!--<script </script <a",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,31): expected-named-closing-tag-but-got-eof",
+        "(1,31): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </script <a",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script </script <a</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </script <a</script>"
+      }
+    },
+    {
+      "data": "<script><!--<script </script </",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,31): expected-named-closing-tag-but-got-eof",
+        "(1,31): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </script </",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script </script </</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </script </</script>"
+      }
+    },
+    {
+      "data": "<script><!--<script </script </script",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,37): expected-named-closing-tag-but-got-eof",
+        "(1,37): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </script </script",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script </script </script</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </script </script</script>"
+      }
+    },
+    {
+      "data": "<script><!--<script </script </script ",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,38): expected-attribute-name-but-got-eof",
+        "(1,38): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </script ",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script </script </script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </script </script>"
+      }
+    },
+    {
+      "data": "<script><!--<script </script </script/",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,38): unexpected-EOF-after-solidus-in-tag",
+        "(1,38): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </script ",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script </script </script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </script </script>"
+      }
+    },
+    {
+      "data": "<script><!--<script </script </script>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script </script ",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script </script </script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script </script </script>"
+      }
+    },
+    {
+      "data": "<script><!--<script -",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,21): eof-in-script-in-script",
+        "(1,21): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script -",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script -</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script -</script>"
+      }
+    },
+    {
+      "data": "<script><!--<script -a",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,22): eof-in-script-in-script",
+        "(1,22): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script -a",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script -a</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script -a</script>"
+      }
+    },
+    {
+      "data": "<script><!--<script --",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,22): eof-in-script-in-script",
+        "(1,22): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script --",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script --</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script --</script>"
+      }
+    },
+    {
+      "data": "<script><!--<script --a",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,23): eof-in-script-in-script",
+        "(1,23): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script --a",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script --a</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script --a</script>"
+      }
+    },
+    {
+      "data": "<script><!--<script -->",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,23): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script -->",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script --></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script --></script>"
+      }
+    },
+    {
+      "data": "<script><!--<script --><",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,24): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script --><",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script --><</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script --><</script>"
+      }
+    },
+    {
+      "data": "<script><!--<script --></",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,25): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script --></",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script --></</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script --></</script>"
+      }
+    },
+    {
+      "data": "<script><!--<script --></script",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,31): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script --></script",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script --></script</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script --></script</script>"
+      }
+    },
+    {
+      "data": "<script><!--<script --></script ",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,32): expected-attribute-name-but-got-eof",
+        "(1,32): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script -->",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script --></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script --></script>"
+      }
+    },
+    {
+      "data": "<script><!--<script --></script/",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,32): unexpected-EOF-after-solidus-in-tag",
+        "(1,32): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script -->",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script --></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script --></script>"
+      }
+    },
+    {
+      "data": "<script><!--<script --></script>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script -->",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script --></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script --></script>"
+      }
+    },
+    {
+      "data": "<script><!--<script><\\/script>--></script>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script><\\/script>-->",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script><\\/script>--></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script><\\/script>--></script>"
+      }
+    },
+    {
+      "data": "<script><!--<script></scr'+'ipt>--></script>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script></scr'+'ipt>-->",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script></scr'+'ipt>--></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script></scr'+'ipt>--></script>"
+      }
+    },
+    {
+      "data": "<script><!--<script></script><script></script></script>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script></script><script></script>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script></script><script></script></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script></script><script></script></script>"
+      }
+    },
+    {
+      "data": "<script><!--<script></script><script></script>--><!--</script>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script></script><script></script>--><!--",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script></script><script></script>--><!--</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script></script><script></script>--><!--</script>"
+      }
+    },
+    {
+      "data": "<script><!--<script></script><script></script>-- ></script>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script></script><script></script>-- >",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script></script><script></script>-- ></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script></script><script></script>-- ></script>"
+      }
+    },
+    {
+      "data": "<script><!--<script></script><script></script>- -></script>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script></script><script></script>- ->",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script></script><script></script>- -></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script></script><script></script>- -></script>"
+      }
+    },
+    {
+      "data": "<script><!--<script></script><script></script>- - ></script>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script></script><script></script>- - >",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script></script><script></script>- - ></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script></script><script></script>- - ></script>"
+      }
+    },
+    {
+      "data": "<script><!--<script></script><script></script>-></script>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script></script><script></script>->",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script></script><script></script>-></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script></script><script></script>-></script>"
+      }
+    },
+    {
+      "data": "<script><!--<script>--!></script>X",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,34): expected-named-closing-tag-but-got-eof",
+        "(1,34): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script>--!></script>X",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script>--!></script>X</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script>--!></script>X</script>"
+      }
+    },
+    {
+      "data": "<script><!--<scr'+'ipt></script>--></script>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,44): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<scr'+'ipt>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<scr'+'ipt></script></head><body>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<script><!--<scr'+'ipt></script>--&gt;"
+      }
+    },
+    {
+      "data": "<script><!--<script></scr'+'ipt></script>X",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,42): expected-named-closing-tag-but-got-eof",
+        "(1,42): unexpected-eof-in-text-mode"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "<!--<script></scr'+'ipt></script>X",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script><!--<script></scr'+'ipt></script>X</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script><!--<script></scr'+'ipt></script>X</script>"
+      }
+    },
+    {
+      "data": "<style><!--<style></style>--></style>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,37): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          },
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": "<!--<style>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><style><!--<style></style></head><body>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<style><!--<style></style>--&gt;"
+      }
+    },
+    {
+      "data": "<style><!--</style>X",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": "<!--",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "X"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><style><!--</style></head><body>X</body></html>",
+        "noQuirksBodyHtml": "<style><!--</style>X"
+      }
+    },
+    {
+      "data": "<style><!--...</style>...--></style>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,36): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          },
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": "<!--...",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "...-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><style><!--...</style></head><body>...--&gt;</body></html>",
+        "noQuirksBodyHtml": "<style><!--...</style>...--&gt;"
+      }
+    },
+    {
+      "data": "<style><!--<br><html xmlns:v=\"urn:schemas-microsoft-com:vml\"><!--[if !mso]><style></style>X",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": "<!--<br><html xmlns:v=\"urn:schemas-microsoft-com:vml\"><!--[if !mso]><style>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "X"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><style><!--<br><html xmlns:v=\"urn:schemas-microsoft-com:vml\"><!--[if !mso]><style></style></head><body>X</body></html>",
+        "noQuirksBodyHtml": "<style><!--<br><html xmlns:v=\"urn:schemas-microsoft-com:vml\"><!--[if !mso]><style></style>X"
+      }
+    },
+    {
+      "data": "<style><!--...<style><!--...--!></style>--></style>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,51): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          },
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": "<!--...<style><!--...--!>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><style><!--...<style><!--...--!></style></head><body>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<style><!--...<style><!--...--!></style>--&gt;"
+      }
+    },
+    {
+      "data": "<style><!--...</style><!-- --><style>@import ...</style>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          },
+          "no_escape": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": "<!--...",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "comment": " "
+                  },
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": "@import ...",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><style><!--...</style><!-- --><style>@import ...</style></head><body></body></html>",
+        "noQuirksBodyHtml": "<style><!--...</style><!-- --><style>@import ...</style>"
+      }
+    },
+    {
+      "data": "<style>...<style><!--...</style><!-- --></style>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,48): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          },
+          "no_escape": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": "...<style><!--...",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "comment": " "
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><style>...<style><!--...</style><!-- --></head><body></body></html>",
+        "noQuirksBodyHtml": "<style>...<style><!--...</style><!-- -->"
+      }
+    },
+    {
+      "data": "<style>...<!--[if IE]><style>...</style>X",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": "...<!--[if IE]><style>...",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "X"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><style>...<!--[if IE]><style>...</style></head><body>X</body></html>",
+        "noQuirksBodyHtml": "<style>...<!--[if IE]><style>...</style>X"
+      }
+    },
+    {
+      "data": "<title><!--<title></title>--></title>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,37): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "title": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "<!--<title>",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><title>&lt;!--&lt;title&gt;</title></head><body>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<title>&lt;!--&lt;title&gt;</title>--&gt;"
+      }
+    },
+    {
+      "data": "<title>&lt;/title></title>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "title": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "</title>",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><title>&lt;/title&gt;</title></head><body></body></html>",
+        "noQuirksBodyHtml": "<title>&lt;/title&gt;</title>"
+      }
+    },
+    {
+      "data": "<title>foo/title><link></head><body>X",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,37): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "title": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "foo/title><link></head><body>X",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><title>foo/title&gt;&lt;link&gt;&lt;/head&gt;&lt;body&gt;X</title></head><body></body></html>",
+        "noQuirksBodyHtml": "<title>foo/title&gt;&lt;link&gt;&lt;/head&gt;&lt;body&gt;X</title>"
+      }
+    },
+    {
+      "data": "<noscript><!--<noscript></noscript>--></noscript>",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag",
+        "(1,49): unexpected-end-tag"
+      ],
+      "script": "on",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "text": "<!--<noscript>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><noscript><!--<noscript></noscript></head><body>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<noscript>&lt;!--&lt;noscript&gt;</noscript>--&gt;"
+      }
+    },
+    {
+      "data": "<noscript><!--<noscript></noscript>--></noscript>",
+      "errors": [
+        " * (1,11) missing DOCTYPE"
+      ],
+      "script": "off",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "comment": "<noscript></noscript>"
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><noscript><!--<noscript></noscript>--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript>&lt;!--&lt;noscript&gt;</noscript>--&gt;"
+      }
+    },
+    {
+      "data": "<noscript><!--</noscript>X<noscript>--></noscript>",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag"
+      ],
+      "script": "on",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "text": "<!--",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "X"
+                  },
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "text": "-->",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><noscript><!--</noscript></head><body>X<noscript>--></noscript></body></html>",
+        "noQuirksBodyHtml": "<noscript>&lt;!--</noscript>X<noscript>--&gt;</noscript>"
+      }
+    },
+    {
+      "data": "<noscript><!--</noscript>X<noscript>--></noscript>",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag"
+      ],
+      "script": "off",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "comment": "</noscript>X<noscript>"
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><noscript><!--</noscript>X<noscript>--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript>&lt;!--</noscript>X<noscript>--&gt;</noscript>"
+      }
+    },
+    {
+      "data": "<noscript><iframe></noscript>X",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag"
+      ],
+      "script": "on",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "text": "<iframe>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "X"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><noscript><iframe></noscript></head><body>X</body></html>",
+        "noQuirksBodyHtml": "<noscript>&lt;iframe&gt;</noscript>X"
+      }
+    },
+    {
+      "data": "<noscript><iframe></noscript>X",
+      "errors": [
+        " * (1,11) missing DOCTYPE",
+        " * (1,19) unexpected token in head noscript",
+        " * (1,31) unexpected EOF"
+      ],
+      "script": "off",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true,
+            "iframe": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript"
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "iframe",
+                    "children": [
+                      {
+                        "text": "</noscript>X",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><noscript></noscript></head><body><iframe></noscript>X</iframe></body></html>",
+        "noQuirksBodyHtml": "<noscript>&lt;iframe&gt;</noscript>X"
+      }
+    },
+    {
+      "data": "<noframes><!--<noframes></noframes>--></noframes>",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag",
+        "(1,49): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noframes": true,
+            "body": true
+          },
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noframes",
+                    "children": [
+                      {
+                        "text": "<!--<noframes>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><noframes><!--<noframes></noframes></head><body>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<noframes><!--<noframes></noframes>--&gt;"
+      }
+    },
+    {
+      "data": "<noframes><body><script><!--...</script></body></noframes></html>",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noframes": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noframes",
+                    "children": [
+                      {
+                        "text": "<body><script><!--...</script></body>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><noframes><body><script><!--...</script></body></noframes></head><body></body></html>",
+        "noQuirksBodyHtml": "<noframes><body><script><!--...</script></body></noframes>"
+      }
+    },
+    {
+      "data": "<textarea><!--<textarea></textarea>--></textarea>",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag",
+        "(1,49): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "textarea": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "textarea",
+                    "children": [
+                      {
+                        "text": "<!--<textarea>",
+                        "escaped": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><textarea>&lt;!--&lt;textarea&gt;</textarea>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<textarea>&lt;!--&lt;textarea&gt;</textarea>--&gt;"
+      }
+    },
+    {
+      "data": "<textarea>&lt;/textarea></textarea>",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "textarea": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "textarea",
+                    "children": [
+                      {
+                        "text": "</textarea>",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><textarea>&lt;/textarea&gt;</textarea></body></html>",
+        "noQuirksBodyHtml": "<textarea>&lt;/textarea&gt;</textarea>"
+      }
+    },
+    {
+      "data": "<iframe><!--<iframe></iframe>--></iframe>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,41): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "iframe": true
+          },
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "iframe",
+                    "children": [
+                      {
+                        "text": "<!--<iframe>",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><iframe><!--<iframe></iframe>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<iframe><!--<iframe></iframe>--&gt;"
+      }
+    },
+    {
+      "data": "<iframe>...<!--X->...<!--/X->...</iframe>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "iframe": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "iframe",
+                    "children": [
+                      {
+                        "text": "...<!--X->...<!--/X->...",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><iframe>...<!--X->...<!--/X->...</iframe></body></html>",
+        "noQuirksBodyHtml": "<iframe>...<!--X->...<!--/X->...</iframe>"
+      }
+    },
+    {
+      "data": "<xmp><!--<xmp></xmp>--></xmp>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,29): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "xmp": true
+          },
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "xmp",
+                    "children": [
+                      {
+                        "text": "<!--<xmp>",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><xmp><!--<xmp></xmp>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<xmp><!--<xmp></xmp>--&gt;"
+      }
+    },
+    {
+      "data": "<noembed><!--<noembed></noembed>--></noembed>",
+      "errors": [
+        "(1,9): expected-doctype-but-got-start-tag",
+        "(1,45): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "noembed": true
+          },
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "noembed",
+                    "children": [
+                      {
+                        "text": "<!--<noembed>",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><noembed><!--<noembed></noembed>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<noembed><!--<noembed></noembed>--&gt;"
+      }
+    },
+    {
+      "data": "<!doctype html><table>\n",
+      "errors": [
+        "(2,0): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "text": "\n"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table>\n</table></body></html>",
+        "noQuirksBodyHtml": "<table>\n</table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><td><span><font></span><span>",
+      "errors": [
+        "(1,26): unexpected-cell-in-table-body",
+        "(1,45): unexpected-end-tag",
+        "(1,51): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "span": true,
+            "font": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "span",
+                                    "children": [
+                                      {
+                                        "tag": "font"
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "tag": "font",
+                                    "children": [
+                                      {
+                                        "tag": "span"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><span><font></font></span><font><span></span></font></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td><span><font></font></span><font><span></span></font></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><form><table></form><form></table></form>",
+      "errors": [
+        "(1,35): unexpected-end-tag-implies-table-voodoo",
+        "(1,35): unexpected-end-tag",
+        "(1,41): unexpected-form-in-table",
+        "(1,56): unexpected-end-tag",
+        "(1,56): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "form": true,
+            "table": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "form",
+                    "children": [
+                      {
+                        "tag": "table",
+                        "children": [
+                          {
+                            "tag": "form"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><form><table><form></form></table></form></body></html>",
+        "noQuirksBodyHtml": "<form><table><form></form></table></form>"
+      }
+    }
+  ],
+  "tests17.dat": [
+    {
+      "data": "<!doctype html><table><tbody><select><tr>",
+      "errors": [
+        "(1,37): unexpected-start-tag-implies-table-voodoo",
+        "(1,41): unexpected-table-element-start-tag-in-select-in-table",
+        "(1,41): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "table": true,
+            "tbody": true,
+            "tr": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select></select><table><tbody><tr></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<select></select><table><tbody><tr></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><tr><select><td>",
+      "errors": [
+        "(1,34): unexpected-start-tag-implies-table-voodoo",
+        "(1,38): unexpected-table-element-start-tag-in-select-in-table",
+        "(1,38): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select></select><table><tbody><tr><td></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<select></select><table><tbody><tr><td></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><tr><td><select><td>",
+      "errors": [
+        "(1,42): unexpected-table-element-start-tag-in-select-in-table",
+        "(1,42): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "select": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "select"
+                                  }
+                                ]
+                              },
+                              {
+                                "tag": "td"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><select></select></td><td></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td><select></select></td><td></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><tr><th><select><td>",
+      "errors": [
+        "(1,42): unexpected-table-element-start-tag-in-select-in-table",
+        "(1,42): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "th": true,
+            "select": true,
+            "td": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "th",
+                                "children": [
+                                  {
+                                    "tag": "select"
+                                  }
+                                ]
+                              },
+                              {
+                                "tag": "td"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><th><select></select></th><td></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><th><select></select></th><td></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><caption><select><tr>",
+      "errors": [
+        "(1,43): unexpected-table-element-start-tag-in-select-in-table",
+        "(1,43): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "caption": true,
+            "select": true,
+            "tbody": true,
+            "tr": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "caption",
+                        "children": [
+                          {
+                            "tag": "select"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><caption><select></select></caption><tbody><tr></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><caption><select></select></caption><tbody><tr></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><select><tr>",
+      "errors": [
+        "(1,27): unexpected-start-tag-in-select",
+        "(1,27): eof-in-select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select></select></body></html>",
+        "noQuirksBodyHtml": "<select></select>"
+      }
+    },
+    {
+      "data": "<!doctype html><select><td>",
+      "errors": [
+        "(1,27): unexpected-start-tag-in-select",
+        "(1,27): eof-in-select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select></select></body></html>",
+        "noQuirksBodyHtml": "<select></select>"
+      }
+    },
+    {
+      "data": "<!doctype html><select><th>",
+      "errors": [
+        "(1,27): unexpected-start-tag-in-select",
+        "(1,27): eof-in-select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select></select></body></html>",
+        "noQuirksBodyHtml": "<select></select>"
+      }
+    },
+    {
+      "data": "<!doctype html><select><tbody>",
+      "errors": [
+        "(1,30): unexpected-start-tag-in-select",
+        "(1,30): eof-in-select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select></select></body></html>",
+        "noQuirksBodyHtml": "<select></select>"
+      }
+    },
+    {
+      "data": "<!doctype html><select><thead>",
+      "errors": [
+        "(1,30): unexpected-start-tag-in-select",
+        "(1,30): eof-in-select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select></select></body></html>",
+        "noQuirksBodyHtml": "<select></select>"
+      }
+    },
+    {
+      "data": "<!doctype html><select><tfoot>",
+      "errors": [
+        "(1,30): unexpected-start-tag-in-select",
+        "(1,30): eof-in-select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select></select></body></html>",
+        "noQuirksBodyHtml": "<select></select>"
+      }
+    },
+    {
+      "data": "<!doctype html><select><caption>",
+      "errors": [
+        "(1,32): unexpected-start-tag-in-select",
+        "(1,32): eof-in-select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select></select></body></html>",
+        "noQuirksBodyHtml": "<select></select>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><tr></table>a",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "text": "a"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr></tr></tbody></table>a</body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr></tr></tbody></table>a"
+      }
+    }
+  ],
+  "tests18.dat": [
+    {
+      "data": "<!doctype html><plaintext></plaintext>",
+      "errors": [
+        "(1,38): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "plaintext": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "plaintext",
+                    "children": [
+                      {
+                        "text": "</plaintext>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><plaintext></plaintext></plaintext></body></html>",
+        "noQuirksBodyHtml": "<plaintext></plaintext></plaintext>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><plaintext></plaintext>",
+      "errors": [
+        "(1,33): foster-parenting-start-tag",
+        "(1,34): foster-parenting-character",
+        "(1,35): foster-parenting-character",
+        "(1,36): foster-parenting-character",
+        "(1,37): foster-parenting-character",
+        "(1,38): foster-parenting-character",
+        "(1,39): foster-parenting-character",
+        "(1,40): foster-parenting-character",
+        "(1,41): foster-parenting-character",
+        "(1,42): foster-parenting-character",
+        "(1,43): foster-parenting-character",
+        "(1,44): foster-parenting-character",
+        "(1,45): foster-parenting-character",
+        "(1,45): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "plaintext": true,
+            "table": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "plaintext",
+                    "children": [
+                      {
+                        "text": "</plaintext>",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><plaintext></plaintext></plaintext><table></table></body></html>",
+        "noQuirksBodyHtml": "<plaintext></plaintext></plaintext><table></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><tbody><plaintext></plaintext>",
+      "errors": [
+        "(1,40): foster-parenting-start-tag",
+        "(1,41): foster-parenting-character",
+        "(1,41): foster-parenting-character",
+        "(1,41): foster-parenting-character",
+        "(1,41): foster-parenting-character",
+        "(1,41): foster-parenting-character",
+        "(1,41): foster-parenting-character",
+        "(1,41): foster-parenting-character",
+        "(1,41): foster-parenting-character",
+        "(1,41): foster-parenting-character",
+        "(1,41): foster-parenting-character",
+        "(1,41): foster-parenting-character",
+        "(1,41): foster-parenting-character",
+        "(1,52): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "plaintext": true,
+            "table": true,
+            "tbody": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "plaintext",
+                    "children": [
+                      {
+                        "text": "</plaintext>",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><plaintext></plaintext></plaintext><table><tbody></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<plaintext></plaintext></plaintext><table><tbody></tbody></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><tbody><tr><plaintext></plaintext>",
+      "errors": [
+        "(1,44): foster-parenting-start-tag",
+        "(1,45): foster-parenting-character",
+        "(1,46): foster-parenting-character",
+        "(1,47): foster-parenting-character",
+        "(1,48): foster-parenting-character",
+        "(1,49): foster-parenting-character",
+        "(1,50): foster-parenting-character",
+        "(1,51): foster-parenting-character",
+        "(1,52): foster-parenting-character",
+        "(1,53): foster-parenting-character",
+        "(1,54): foster-parenting-character",
+        "(1,55): foster-parenting-character",
+        "(1,56): foster-parenting-character",
+        "(1,56): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "plaintext": true,
+            "table": true,
+            "tbody": true,
+            "tr": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "plaintext",
+                    "children": [
+                      {
+                        "text": "</plaintext>",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><plaintext></plaintext></plaintext><table><tbody><tr></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<plaintext></plaintext></plaintext><table><tbody><tr></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><td><plaintext></plaintext>",
+      "errors": [
+        "(1,26): unexpected-cell-in-table-body",
+        "(1,49): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "plaintext": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "plaintext",
+                                    "children": [
+                                      {
+                                        "text": "</plaintext>",
+                                        "no_escape": true
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><plaintext></plaintext></plaintext></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td><plaintext></plaintext></plaintext></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><caption><plaintext></plaintext>",
+      "errors": [
+        "(1,54): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "caption": true,
+            "plaintext": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "caption",
+                        "children": [
+                          {
+                            "tag": "plaintext",
+                            "children": [
+                              {
+                                "text": "</plaintext>",
+                                "no_escape": true
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><caption><plaintext></plaintext></plaintext></caption></table></body></html>",
+        "noQuirksBodyHtml": "<table><caption><plaintext></plaintext></plaintext></caption></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><tr><style></script></style>abc",
+      "errors": [
+        "(1,51): foster-parenting-character",
+        "(1,52): foster-parenting-character",
+        "(1,53): foster-parenting-character",
+        "(1,53): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "style": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "abc"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "style",
+                                "children": [
+                                  {
+                                    "text": "</script>",
+                                    "no_escape": true
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>abc<table><tbody><tr><style></script></style></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "abc<table><tbody><tr><style></script></style></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><tr><script></style></script>abc",
+      "errors": [
+        "(1,52): foster-parenting-character",
+        "(1,53): foster-parenting-character",
+        "(1,54): foster-parenting-character",
+        "(1,54): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "script": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "abc"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "script",
+                                "children": [
+                                  {
+                                    "text": "</style>",
+                                    "no_escape": true
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>abc<table><tbody><tr><script></style></script></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "abc<table><tbody><tr><script></style></script></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><caption><style></script></style>abc",
+      "errors": [
+        "(1,58): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "caption": true,
+            "style": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "caption",
+                        "children": [
+                          {
+                            "tag": "style",
+                            "children": [
+                              {
+                                "text": "</script>",
+                                "no_escape": true
+                              }
+                            ]
+                          },
+                          {
+                            "text": "abc"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><caption><style></script></style>abc</caption></table></body></html>",
+        "noQuirksBodyHtml": "<table><caption><style></script></style>abc</caption></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><td><style></script></style>abc",
+      "errors": [
+        "(1,26): unexpected-cell-in-table-body",
+        "(1,53): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "style": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "style",
+                                    "children": [
+                                      {
+                                        "text": "</script>",
+                                        "no_escape": true
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "text": "abc"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><style></script></style>abc</td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td><style></script></style>abc</td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><select><script></style></script>abc",
+      "errors": [
+        "(1,51): eof-in-select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "script": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "tag": "script",
+                        "children": [
+                          {
+                            "text": "</style>",
+                            "no_escape": true
+                          }
+                        ]
+                      },
+                      {
+                        "text": "abc"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select><script></style></script>abc</select></body></html>",
+        "noQuirksBodyHtml": "<select><script></style></script>abc</select>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><select><script></style></script>abc",
+      "errors": [
+        "(1,30): unexpected-start-tag-implies-table-voodoo",
+        "(1,58): eof-in-select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "script": true,
+            "table": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "tag": "script",
+                        "children": [
+                          {
+                            "text": "</style>",
+                            "no_escape": true
+                          }
+                        ]
+                      },
+                      {
+                        "text": "abc"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select><script></style></script>abc</select><table></table></body></html>",
+        "noQuirksBodyHtml": "<select><script></style></script>abc</select><table></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><tr><select><script></style></script>abc",
+      "errors": [
+        "(1,34): unexpected-start-tag-implies-table-voodoo",
+        "(1,62): eof-in-select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "script": true,
+            "table": true,
+            "tbody": true,
+            "tr": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "tag": "script",
+                        "children": [
+                          {
+                            "text": "</style>",
+                            "no_escape": true
+                          }
+                        ]
+                      },
+                      {
+                        "text": "abc"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select><script></style></script>abc</select><table><tbody><tr></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<select><script></style></script>abc</select><table><tbody><tr></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><frameset></frameset><noframes>abc",
+      "errors": [
+        "(1,49): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true,
+            "noframes": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              },
+              {
+                "tag": "noframes",
+                "children": [
+                  {
+                    "text": "abc",
+                    "no_escape": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset></frameset><noframes>abc</noframes></html>",
+        "noQuirksBodyHtml": "<noframes>abc</noframes>"
+      }
+    },
+    {
+      "data": "<!doctype html><frameset></frameset><noframes>abc</noframes><!--abc-->",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true,
+            "noframes": true
+          },
+          "doctype": true,
+          "no_escape": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              },
+              {
+                "tag": "noframes",
+                "children": [
+                  {
+                    "text": "abc",
+                    "no_escape": true
+                  }
+                ]
+              },
+              {
+                "comment": "abc"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset></frameset><noframes>abc</noframes><!--abc--></html>",
+        "noQuirksBodyHtml": "<noframes>abc</noframes><!--abc-->"
+      }
+    },
+    {
+      "data": "<!doctype html><frameset></frameset></html><noframes>abc",
+      "errors": [
+        "(1,56): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true,
+            "noframes": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              },
+              {
+                "tag": "noframes",
+                "children": [
+                  {
+                    "text": "abc",
+                    "no_escape": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset></frameset><noframes>abc</noframes></html>",
+        "noQuirksBodyHtml": "<noframes>abc</noframes>"
+      }
+    },
+    {
+      "data": "<!doctype html><frameset></frameset></html><noframes>abc</noframes><!--abc-->",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true,
+            "noframes": true
+          },
+          "doctype": true,
+          "no_escape": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              },
+              {
+                "tag": "noframes",
+                "children": [
+                  {
+                    "text": "abc",
+                    "no_escape": true
+                  }
+                ]
+              }
+            ]
+          },
+          {
+            "comment": "abc"
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset></frameset><noframes>abc</noframes></html><!--abc-->",
+        "noQuirksBodyHtml": "<noframes>abc</noframes><!--abc-->"
+      }
+    },
+    {
+      "data": "<!doctype html><table><tr></tbody><tfoot>",
+      "errors": [
+        "(1,41): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "tfoot": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "tfoot"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr></tr></tbody><tfoot></tfoot></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr></tr></tbody><tfoot></tfoot></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><td><svg></svg>abc<td>",
+      "errors": [
+        "(1,26): unexpected-cell-in-table-body",
+        "(1,44): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "svg svg": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "svg",
+                                    "ns": "http://www.w3.org/2000/svg"
+                                  },
+                                  {
+                                    "text": "abc"
+                                  }
+                                ]
+                              },
+                              {
+                                "tag": "td"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><svg></svg>abc</td><td></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td><svg></svg>abc</td><td></td></tr></tbody></table>"
+      }
+    }
+  ],
+  "tests19.dat": [
+    {
+      "data": "<!doctype html><math><mn DefinitionUrl=\"foo\">",
+      "errors": [
+        "(1,45): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mn": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mn",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "attrs": [
+                          {
+                            "name": "definitionURL",
+                            "value": "foo"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math><mn definitionURL=\"foo\"></mn></math></body></html>",
+        "noQuirksBodyHtml": "<math><mn definitionURL=\"foo\"></mn></math>"
+      }
+    },
+    {
+      "data": "<!doctype html><html></p><!--foo-->",
+      "errors": [
+        "(1,25): end-tag-after-implied-root"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "comment": "foo"
+              },
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><!--foo--><head></head><body></body></html>",
+        "noQuirksBodyHtml": "<p></p><!--foo-->"
+      }
+    },
+    {
+      "data": "<!doctype html><head></head></p><!--foo-->",
+      "errors": [
+        "(1,32): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "comment": "foo"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><!--foo--><body></body></html>",
+        "noQuirksBodyHtml": "<p></p><!--foo-->"
+      }
+    },
+    {
+      "data": "<!doctype html><body><p><pre>",
+      "errors": [
+        "(1,29): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "pre": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p"
+                  },
+                  {
+                    "tag": "pre"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p></p><pre></pre></body></html>",
+        "noQuirksBodyHtml": "<p></p><pre></pre>"
+      }
+    },
+    {
+      "data": "<!doctype html><body><p><listing>",
+      "errors": [
+        "(1,33): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "listing": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p"
+                  },
+                  {
+                    "tag": "listing"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p></p><listing></listing></body></html>",
+        "noQuirksBodyHtml": "<p></p><listing></listing>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><plaintext>",
+      "errors": [
+        "(1,29): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "plaintext": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p"
+                  },
+                  {
+                    "tag": "plaintext"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p></p><plaintext></plaintext></body></html>",
+        "noQuirksBodyHtml": "<p></p><plaintext></plaintext>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><h1>",
+      "errors": [
+        "(1,22): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "h1": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p"
+                  },
+                  {
+                    "tag": "h1"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p></p><h1></h1></body></html>",
+        "noQuirksBodyHtml": "<p></p><h1></h1>"
+      }
+    },
+    {
+      "data": "<!doctype html><form><isindex>",
+      "errors": [
+        "(1,30): deprecated-tag",
+        "(1,30): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "form": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "form"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><form></form></body></html>",
+        "noQuirksBodyHtml": "<form></form>"
+      }
+    },
+    {
+      "data": "<!doctype html><isindex action=\"POST\">",
+      "errors": [
+        "(1,38): deprecated-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "form": true,
+            "hr": true,
+            "label": true,
+            "input": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "form",
+                    "attrs": [
+                      {
+                        "name": "action",
+                        "value": "POST"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "tag": "hr"
+                      },
+                      {
+                        "tag": "label",
+                        "children": [
+                          {
+                            "text": "This is a searchable index. Enter search keywords: "
+                          },
+                          {
+                            "tag": "input",
+                            "attrs": [
+                              {
+                                "name": "name",
+                                "value": "isindex"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "hr"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><form action=\"POST\"><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form></body></html>",
+        "noQuirksBodyHtml": "<form action=\"POST\"><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form>"
+      }
+    },
+    {
+      "data": "<!doctype html><isindex prompt=\"this is isindex\">",
+      "errors": [
+        "(1,49): deprecated-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "form": true,
+            "hr": true,
+            "label": true,
+            "input": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "form",
+                    "children": [
+                      {
+                        "tag": "hr"
+                      },
+                      {
+                        "tag": "label",
+                        "children": [
+                          {
+                            "text": "this is isindex"
+                          },
+                          {
+                            "tag": "input",
+                            "attrs": [
+                              {
+                                "name": "name",
+                                "value": "isindex"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "hr"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><form><hr><label>this is isindex<input name=\"isindex\"></label><hr></form></body></html>",
+        "noQuirksBodyHtml": "<form><hr><label>this is isindex<input name=\"isindex\"></label><hr></form>"
+      }
+    },
+    {
+      "data": "<!doctype html><isindex type=\"hidden\">",
+      "errors": [
+        "(1,38): deprecated-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "form": true,
+            "hr": true,
+            "label": true,
+            "input": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "form",
+                    "children": [
+                      {
+                        "tag": "hr"
+                      },
+                      {
+                        "tag": "label",
+                        "children": [
+                          {
+                            "text": "This is a searchable index. Enter search keywords: "
+                          },
+                          {
+                            "tag": "input",
+                            "attrs": [
+                              {
+                                "name": "name",
+                                "value": "isindex"
+                              },
+                              {
+                                "name": "type",
+                                "value": "hidden"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "hr"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\" type=\"hidden\"></label><hr></form></body></html>",
+        "noQuirksBodyHtml": "<form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\" type=\"hidden\"></label><hr></form>"
+      }
+    },
+    {
+      "data": "<!doctype html><isindex name=\"foo\">",
+      "errors": [
+        "(1,35): deprecated-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "form": true,
+            "hr": true,
+            "label": true,
+            "input": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "form",
+                    "children": [
+                      {
+                        "tag": "hr"
+                      },
+                      {
+                        "tag": "label",
+                        "children": [
+                          {
+                            "text": "This is a searchable index. Enter search keywords: "
+                          },
+                          {
+                            "tag": "input",
+                            "attrs": [
+                              {
+                                "name": "name",
+                                "value": "isindex"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "hr"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form></body></html>",
+        "noQuirksBodyHtml": "<form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form>"
+      }
+    },
+    {
+      "data": "<!doctype html><ruby><p><rp>",
+      "errors": [
+        "(1,28): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "p": true,
+            "rp": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "tag": "p"
+                      },
+                      {
+                        "tag": "rp"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><ruby><p></p><rp></rp></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby><p></p><rp></rp></ruby>"
+      }
+    },
+    {
+      "data": "<!doctype html><ruby><div><span><rp>",
+      "errors": [
+        "(1,36): XXX-undefined-error",
+        "(1,36): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "div": true,
+            "span": true,
+            "rp": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "tag": "div",
+                        "children": [
+                          {
+                            "tag": "span",
+                            "children": [
+                              {
+                                "tag": "rp"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><ruby><div><span><rp></rp></span></div></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby><div><span><rp></rp></span></div></ruby>"
+      }
+    },
+    {
+      "data": "<!doctype html><ruby><div><p><rp>",
+      "errors": [
+        "(1,33): XXX-undefined-error",
+        "(1,33): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "div": true,
+            "p": true,
+            "rp": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "tag": "div",
+                        "children": [
+                          {
+                            "tag": "p"
+                          },
+                          {
+                            "tag": "rp"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><ruby><div><p></p><rp></rp></div></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby><div><p></p><rp></rp></div></ruby>"
+      }
+    },
+    {
+      "data": "<!doctype html><ruby><p><rt>",
+      "errors": [
+        "(1,28): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "p": true,
+            "rt": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "tag": "p"
+                      },
+                      {
+                        "tag": "rt"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><ruby><p></p><rt></rt></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby><p></p><rt></rt></ruby>"
+      }
+    },
+    {
+      "data": "<!doctype html><ruby><div><span><rt>",
+      "errors": [
+        "(1,36): XXX-undefined-error",
+        "(1,36): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "div": true,
+            "span": true,
+            "rt": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "tag": "div",
+                        "children": [
+                          {
+                            "tag": "span",
+                            "children": [
+                              {
+                                "tag": "rt"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><ruby><div><span><rt></rt></span></div></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby><div><span><rt></rt></span></div></ruby>"
+      }
+    },
+    {
+      "data": "<!doctype html><ruby><div><p><rt>",
+      "errors": [
+        "(1,33): XXX-undefined-error",
+        "(1,33): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "div": true,
+            "p": true,
+            "rt": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "tag": "div",
+                        "children": [
+                          {
+                            "tag": "p"
+                          },
+                          {
+                            "tag": "rt"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><ruby><div><p></p><rt></rt></div></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby><div><p></p><rt></rt></div></ruby>"
+      }
+    },
+    {
+      "data": "<html><ruby>a<rb>b<rt></ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rb": true,
+            "rt": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "rb",
+                        "children": [
+                          {
+                            "text": "b"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "rt"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby>a<rb>b</rb><rt></rt></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby>a<rb>b</rb><rt></rt></ruby>"
+      }
+    },
+    {
+      "data": "<html><ruby>a<rp>b<rt></ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rp": true,
+            "rt": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "rp",
+                        "children": [
+                          {
+                            "text": "b"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "rt"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby>a<rp>b</rp><rt></rt></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby>a<rp>b</rp><rt></rt></ruby>"
+      }
+    },
+    {
+      "data": "<html><ruby>a<rt>b<rt></ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rt": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "rt",
+                        "children": [
+                          {
+                            "text": "b"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "rt"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby>a<rt>b</rt><rt></rt></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby>a<rt>b</rt><rt></rt></ruby>"
+      }
+    },
+    {
+      "data": "<html><ruby>a<rtc>b<rt>c<rb>d</ruby></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "rtc": true,
+            "rt": true,
+            "rb": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "rtc",
+                        "children": [
+                          {
+                            "text": "b"
+                          },
+                          {
+                            "tag": "rt",
+                            "children": [
+                              {
+                                "text": "c"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "rb",
+                        "children": [
+                          {
+                            "text": "d"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby>a<rtc>b<rt>c</rt></rtc><rb>d</rb></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby>a<rtc>b<rt>c</rt></rtc><rb>d</rb></ruby>"
+      }
+    },
+    {
+      "data": "<!doctype html><math/><foo>",
+      "errors": [
+        "(1,27): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "foo": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML"
+                  },
+                  {
+                    "tag": "foo"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math></math><foo></foo></body></html>",
+        "noQuirksBodyHtml": "<math></math><foo></foo>"
+      }
+    },
+    {
+      "data": "<!doctype html><svg/><foo>",
+      "errors": [
+        "(1,26): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "foo": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg"
+                  },
+                  {
+                    "tag": "foo"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg></svg><foo></foo></body></html>",
+        "noQuirksBodyHtml": "<svg></svg><foo></foo>"
+      }
+    },
+    {
+      "data": "<!doctype html><div></body><!--foo-->",
+      "errors": [
+        "(1,27): expected-one-end-tag-but-got-another"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          },
+          "doctype": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div"
+                  }
+                ]
+              },
+              {
+                "comment": "foo"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><div></div></body><!--foo--></html>",
+        "noQuirksBodyHtml": "<div><!--foo--></div>"
+      }
+    },
+    {
+      "data": "<!doctype html><h1><div><h3><span></h1>foo",
+      "errors": [
+        "(1,39): end-tag-too-early",
+        "(1,42): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "h1": true,
+            "div": true,
+            "h3": true,
+            "span": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "h1",
+                    "children": [
+                      {
+                        "tag": "div",
+                        "children": [
+                          {
+                            "tag": "h3",
+                            "children": [
+                              {
+                                "tag": "span"
+                              }
+                            ]
+                          },
+                          {
+                            "text": "foo"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><h1><div><h3><span></span></h3>foo</div></h1></body></html>",
+        "noQuirksBodyHtml": "<h1><div><h3><span></span></h3>foo</div></h1>"
+      }
+    },
+    {
+      "data": "<!doctype html><p></h3>foo",
+      "errors": [
+        "(1,23): end-tag-too-early"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "foo"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p>foo</p></body></html>",
+        "noQuirksBodyHtml": "<p>foo</p>"
+      }
+    },
+    {
+      "data": "<!doctype html><h3><li>abc</h2>foo",
+      "errors": [
+        "(1,31): end-tag-too-early"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "h3": true,
+            "li": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "h3",
+                    "children": [
+                      {
+                        "tag": "li",
+                        "children": [
+                          {
+                            "text": "abc"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "text": "foo"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><h3><li>abc</li></h3>foo</body></html>",
+        "noQuirksBodyHtml": "<h3><li>abc</li></h3>foo"
+      }
+    },
+    {
+      "data": "<!doctype html><table>abc<!--foo-->",
+      "errors": [
+        "(1,23): foster-parenting-character",
+        "(1,24): foster-parenting-character",
+        "(1,25): foster-parenting-character",
+        "(1,35): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true
+          },
+          "doctype": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "abc"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "comment": "foo"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>abc<table><!--foo--></table></body></html>",
+        "noQuirksBodyHtml": "abc<table><!--foo--></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table>  <!--foo-->",
+      "errors": [
+        "(1,34): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true
+          },
+          "doctype": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "text": "  "
+                      },
+                      {
+                        "comment": "foo"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table>  <!--foo--></table></body></html>",
+        "noQuirksBodyHtml": "<table>  <!--foo--></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table> b <!--foo-->",
+      "errors": [
+        "(1,23): foster-parenting-character",
+        "(1,24): foster-parenting-character",
+        "(1,25): foster-parenting-character",
+        "(1,35): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true
+          },
+          "doctype": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": " b "
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "comment": "foo"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body> b <table><!--foo--></table></body></html>",
+        "noQuirksBodyHtml": " b <table><!--foo--></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><select><option><option>",
+      "errors": [
+        "(1,39): eof-in-select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "option": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "tag": "option"
+                      },
+                      {
+                        "tag": "option"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select><option></option><option></option></select></body></html>",
+        "noQuirksBodyHtml": "<select><option></option><option></option></select>"
+      }
+    },
+    {
+      "data": "<!doctype html><select><option></optgroup>",
+      "errors": [
+        "(1,42): unexpected-end-tag-in-select",
+        "(1,42): eof-in-select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "option": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "tag": "option"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select><option></option></select></body></html>",
+        "noQuirksBodyHtml": "<select><option></option></select>"
+      }
+    },
+    {
+      "data": "<!doctype html><select><option></optgroup>",
+      "errors": [
+        "(1,42): unexpected-end-tag-in-select",
+        "(1,42): eof-in-select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "option": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "tag": "option"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select><option></option></select></body></html>",
+        "noQuirksBodyHtml": "<select><option></option></select>"
+      }
+    },
+    {
+      "data": "<!doctype html><dd><optgroup><dd>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "dd": true,
+            "optgroup": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "dd",
+                    "children": [
+                      {
+                        "tag": "optgroup"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "dd"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><dd><optgroup></optgroup></dd><dd></dd></body></html>",
+        "noQuirksBodyHtml": "<dd><optgroup></optgroup></dd><dd></dd>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><math><mi><p><h1>",
+      "errors": [
+        "(1,35): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "math math": true,
+            "math mi": true,
+            "h1": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "math",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "mi",
+                            "ns": "http://www.w3.org/1998/Math/MathML",
+                            "children": [
+                              {
+                                "tag": "p"
+                              },
+                              {
+                                "tag": "h1"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><math><mi><p></p><h1></h1></mi></math></p></body></html>",
+        "noQuirksBodyHtml": "<p><math><mi><p></p><h1></h1></mi></math></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><math><mo><p><h1>",
+      "errors": [
+        "(1,35): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "math math": true,
+            "math mo": true,
+            "h1": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "math",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "mo",
+                            "ns": "http://www.w3.org/1998/Math/MathML",
+                            "children": [
+                              {
+                                "tag": "p"
+                              },
+                              {
+                                "tag": "h1"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><math><mo><p></p><h1></h1></mo></math></p></body></html>",
+        "noQuirksBodyHtml": "<p><math><mo><p></p><h1></h1></mo></math></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><math><mn><p><h1>",
+      "errors": [
+        "(1,35): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "math math": true,
+            "math mn": true,
+            "h1": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "math",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "mn",
+                            "ns": "http://www.w3.org/1998/Math/MathML",
+                            "children": [
+                              {
+                                "tag": "p"
+                              },
+                              {
+                                "tag": "h1"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><math><mn><p></p><h1></h1></mn></math></p></body></html>",
+        "noQuirksBodyHtml": "<p><math><mn><p></p><h1></h1></mn></math></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><math><ms><p><h1>",
+      "errors": [
+        "(1,35): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "math math": true,
+            "math ms": true,
+            "h1": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "math",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "ms",
+                            "ns": "http://www.w3.org/1998/Math/MathML",
+                            "children": [
+                              {
+                                "tag": "p"
+                              },
+                              {
+                                "tag": "h1"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><math><ms><p></p><h1></h1></ms></math></p></body></html>",
+        "noQuirksBodyHtml": "<p><math><ms><p></p><h1></h1></ms></math></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><math><mtext><p><h1>",
+      "errors": [
+        "(1,38): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "math math": true,
+            "math mtext": true,
+            "h1": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "math",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "mtext",
+                            "ns": "http://www.w3.org/1998/Math/MathML",
+                            "children": [
+                              {
+                                "tag": "p"
+                              },
+                              {
+                                "tag": "h1"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><math><mtext><p></p><h1></h1></mtext></math></p></body></html>",
+        "noQuirksBodyHtml": "<p><math><mtext><p></p><h1></h1></mtext></math></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><frameset></noframes>",
+      "errors": [
+        "(1,36): unexpected-end-tag-in-frameset",
+        "(1,36): eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!doctype html><html c=d><body></html><html a=b>",
+      "errors": [
+        "(1,48): non-html-root"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "attrs": [
+              {
+                "name": "a",
+                "value": "b"
+              },
+              {
+                "name": "c",
+                "value": "d"
+              }
+            ],
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html c=\"d\" a=\"b\"><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!doctype html><html c=d><frameset></frameset></html><html a=b>",
+      "errors": [
+        "(1,63): non-html-root"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "attrs": [
+              {
+                "name": "a",
+                "value": "b"
+              },
+              {
+                "name": "c",
+                "value": "d"
+              }
+            ],
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html c=\"d\" a=\"b\"><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!doctype html><html><frameset></frameset></html><!--foo-->",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          },
+          "doctype": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          },
+          {
+            "comment": "foo"
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html><!--foo-->",
+        "noQuirksBodyHtml": "<!--foo-->"
+      }
+    },
+    {
+      "data": "<!doctype html><html><frameset></frameset></html>  ",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              },
+              {
+                "text": "  "
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset></frameset>  </html>",
+        "noQuirksBodyHtml": "  "
+      }
+    },
+    {
+      "data": "<!doctype html><html><frameset></frameset></html>abc",
+      "errors": [
+        "(1,50): expected-eof-but-got-char",
+        "(1,51): expected-eof-but-got-char",
+        "(1,52): expected-eof-but-got-char"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": "abc"
+      }
+    },
+    {
+      "data": "<!doctype html><html><frameset></frameset></html><p>",
+      "errors": [
+        "(1,52): expected-eof-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": "<p></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><html><frameset></frameset></html></p>",
+      "errors": [
+        "(1,53): expected-eof-but-got-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": "<p></p>"
+      }
+    },
+    {
+      "data": "<html><frameset></frameset></html><!doctype html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,49): unexpected-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!doctype html><body><frameset>",
+      "errors": [
+        "(1,31): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!doctype html><p><frameset><frame>",
+      "errors": [
+        "(1,28): unexpected-start-tag",
+        "(1,35): eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true,
+            "frame": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset",
+                "children": [
+                  {
+                    "tag": "frame"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset><frame></frameset></html>",
+        "noQuirksBodyHtml": "<p></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p>a<frameset>",
+      "errors": [
+        "(1,29): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "a"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p>a</p></body></html>",
+        "noQuirksBodyHtml": "<p>a</p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p> <frameset><frame>",
+      "errors": [
+        "(1,29): unexpected-start-tag",
+        "(1,36): eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true,
+            "frame": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset",
+                "children": [
+                  {
+                    "tag": "frame"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset><frame></frameset></html>",
+        "noQuirksBodyHtml": "<p> </p>"
+      }
+    },
+    {
+      "data": "<!doctype html><pre><frameset>",
+      "errors": [
+        "(1,30): unexpected-start-tag",
+        "(1,30): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "pre": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "pre"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><pre></pre></body></html>",
+        "noQuirksBodyHtml": "<pre></pre>"
+      }
+    },
+    {
+      "data": "<!doctype html><listing><frameset>",
+      "errors": [
+        "(1,34): unexpected-start-tag",
+        "(1,34): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "listing": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "listing"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><listing></listing></body></html>",
+        "noQuirksBodyHtml": "<listing></listing>"
+      }
+    },
+    {
+      "data": "<!doctype html><li><frameset>",
+      "errors": [
+        "(1,29): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "li": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "li"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><li></li></body></html>",
+        "noQuirksBodyHtml": "<li></li>"
+      }
+    },
+    {
+      "data": "<!doctype html><dd><frameset>",
+      "errors": [
+        "(1,29): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "dd": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "dd"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><dd></dd></body></html>",
+        "noQuirksBodyHtml": "<dd></dd>"
+      }
+    },
+    {
+      "data": "<!doctype html><dt><frameset>",
+      "errors": [
+        "(1,29): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "dt": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "dt"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><dt></dt></body></html>",
+        "noQuirksBodyHtml": "<dt></dt>"
+      }
+    },
+    {
+      "data": "<!doctype html><button><frameset>",
+      "errors": [
+        "(1,33): unexpected-start-tag",
+        "(1,33): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "button": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "button"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><button></button></body></html>",
+        "noQuirksBodyHtml": "<button></button>"
+      }
+    },
+    {
+      "data": "<!doctype html><applet><frameset>",
+      "errors": [
+        "(1,33): unexpected-start-tag",
+        "(1,33): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "applet": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "applet"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><applet></applet></body></html>",
+        "noQuirksBodyHtml": "<applet></applet>"
+      }
+    },
+    {
+      "data": "<!doctype html><marquee><frameset>",
+      "errors": [
+        "(1,34): unexpected-start-tag",
+        "(1,34): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "marquee": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "marquee"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><marquee></marquee></body></html>",
+        "noQuirksBodyHtml": "<marquee></marquee>"
+      }
+    },
+    {
+      "data": "<!doctype html><object><frameset>",
+      "errors": [
+        "(1,33): unexpected-start-tag",
+        "(1,33): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "object": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "object"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><object></object></body></html>",
+        "noQuirksBodyHtml": "<object></object>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><frameset>",
+      "errors": [
+        "(1,32): unexpected-start-tag-implies-table-voodoo",
+        "(1,32): unexpected-start-tag",
+        "(1,32): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table></table></body></html>",
+        "noQuirksBodyHtml": "<table></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><area><frameset>",
+      "errors": [
+        "(1,31): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "area": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "area"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><area></body></html>",
+        "noQuirksBodyHtml": "<area>"
+      }
+    },
+    {
+      "data": "<!doctype html><basefont><frameset>",
+      "errors": [
+        "(1,35): eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "basefont": true,
+            "frameset": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "basefont"
+                  }
+                ]
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><basefont></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": "<basefont>"
+      }
+    },
+    {
+      "data": "<!doctype html><bgsound><frameset>",
+      "errors": [
+        "(1,34): eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "bgsound": true,
+            "frameset": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "bgsound"
+                  }
+                ]
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><bgsound></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": "<bgsound>"
+      }
+    },
+    {
+      "data": "<!doctype html><br><frameset>",
+      "errors": [
+        "(1,29): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "br": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "br"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><br></body></html>",
+        "noQuirksBodyHtml": "<br>"
+      }
+    },
+    {
+      "data": "<!doctype html><embed><frameset>",
+      "errors": [
+        "(1,32): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "embed": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "embed"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><embed></body></html>",
+        "noQuirksBodyHtml": "<embed>"
+      }
+    },
+    {
+      "data": "<!doctype html><img><frameset>",
+      "errors": [
+        "(1,30): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "img": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "img"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><img></body></html>",
+        "noQuirksBodyHtml": "<img>"
+      }
+    },
+    {
+      "data": "<!doctype html><input><frameset>",
+      "errors": [
+        "(1,32): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "input": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "input"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><input></body></html>",
+        "noQuirksBodyHtml": "<input>"
+      }
+    },
+    {
+      "data": "<!doctype html><keygen><frameset>",
+      "errors": [
+        "(1,33): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "keygen": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "keygen"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><keygen></body></html>",
+        "noQuirksBodyHtml": "<keygen>"
+      }
+    },
+    {
+      "data": "<!doctype html><wbr><frameset>",
+      "errors": [
+        "(1,30): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "wbr": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "wbr"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><wbr></body></html>",
+        "noQuirksBodyHtml": "<wbr>"
+      }
+    },
+    {
+      "data": "<!doctype html><hr><frameset>",
+      "errors": [
+        "(1,29): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "hr": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "hr"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><hr></body></html>",
+        "noQuirksBodyHtml": "<hr>"
+      }
+    },
+    {
+      "data": "<!doctype html><textarea></textarea><frameset>",
+      "errors": [
+        "(1,46): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "textarea": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "textarea"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><textarea></textarea></body></html>",
+        "noQuirksBodyHtml": "<textarea></textarea>"
+      }
+    },
+    {
+      "data": "<!doctype html><xmp></xmp><frameset>",
+      "errors": [
+        "(1,36): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "xmp": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "xmp"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><xmp></xmp></body></html>",
+        "noQuirksBodyHtml": "<xmp></xmp>"
+      }
+    },
+    {
+      "data": "<!doctype html><iframe></iframe><frameset>",
+      "errors": [
+        "(1,42): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "iframe": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "iframe"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><iframe></iframe></body></html>",
+        "noQuirksBodyHtml": "<iframe></iframe>"
+      }
+    },
+    {
+      "data": "<!doctype html><select></select><frameset>",
+      "errors": [
+        "(1,42): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select></select></body></html>",
+        "noQuirksBodyHtml": "<select></select>"
+      }
+    },
+    {
+      "data": "<!doctype html><svg></svg><frameset><frame>",
+      "errors": [
+        "(1,36): unexpected-start-tag",
+        "(1,43): eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true,
+            "frame": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset",
+                "children": [
+                  {
+                    "tag": "frame"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset><frame></frameset></html>",
+        "noQuirksBodyHtml": "<svg></svg>"
+      }
+    },
+    {
+      "data": "<!doctype html><math></math><frameset><frame>",
+      "errors": [
+        "(1,38): unexpected-start-tag",
+        "(1,45): eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true,
+            "frame": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset",
+                "children": [
+                  {
+                    "tag": "frame"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset><frame></frameset></html>",
+        "noQuirksBodyHtml": "<math></math>"
+      }
+    },
+    {
+      "data": "<!doctype html><svg><foreignObject><div> <frameset><frame>",
+      "errors": [
+        "(1,51): unexpected-start-tag",
+        "(1,58): eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true,
+            "frame": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset",
+                "children": [
+                  {
+                    "tag": "frame"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset><frame></frameset></html>",
+        "noQuirksBodyHtml": "<svg><foreignObject><div> </div></foreignObject></svg>"
+      }
+    },
+    {
+      "data": "<!doctype html><svg>a</svg><frameset><frame>",
+      "errors": [
+        "(1,37): unexpected-start-tag",
+        "(1,44): unexpected-start-tag-ignored"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "a"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg>a</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>a</svg>"
+      }
+    },
+    {
+      "data": "<!doctype html><svg> </svg><frameset><frame>",
+      "errors": [
+        "(1,37): unexpected-start-tag",
+        "(1,44): eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true,
+            "frame": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset",
+                "children": [
+                  {
+                    "tag": "frame"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset><frame></frameset></html>",
+        "noQuirksBodyHtml": "<svg> </svg>"
+      }
+    },
+    {
+      "data": "<html>aaa<frameset></frameset>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,19): unexpected-start-tag",
+        "(1,30): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "aaa"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>aaa</body></html>",
+        "noQuirksBodyHtml": "aaa"
+      }
+    },
+    {
+      "data": "<html> a <frameset></frameset>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,19): unexpected-start-tag",
+        "(1,30): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "a "
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>a </body></html>",
+        "noQuirksBodyHtml": " a "
+      }
+    },
+    {
+      "data": "<!doctype html><div><frameset>",
+      "errors": [
+        "(1,30): unexpected-start-tag",
+        "(1,30): eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": "<div></div>"
+      }
+    },
+    {
+      "data": "<!doctype html><div><body><frameset>",
+      "errors": [
+        "(1,26): unexpected-start-tag",
+        "(1,36): unexpected-start-tag",
+        "(1,36): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><div></div></body></html>",
+        "noQuirksBodyHtml": "<div></div>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><math></p>a",
+      "errors": [
+        "(1,28): unexpected-end-tag",
+        "(1,28): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "math math": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "math",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      }
+                    ]
+                  },
+                  {
+                    "text": "a"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><math></math></p>a</body></html>",
+        "noQuirksBodyHtml": "<p><math></math></p>a"
+      }
+    },
+    {
+      "data": "<!doctype html><p><math><mn><span></p>a",
+      "errors": [
+        "(1,38): unexpected-end-tag",
+        "(1,39): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "math math": true,
+            "math mn": true,
+            "span": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "math",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "mn",
+                            "ns": "http://www.w3.org/1998/Math/MathML",
+                            "children": [
+                              {
+                                "tag": "span",
+                                "children": [
+                                  {
+                                    "tag": "p"
+                                  },
+                                  {
+                                    "text": "a"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><math><mn><span><p></p>a</span></mn></math></p></body></html>",
+        "noQuirksBodyHtml": "<p><math><mn><span><p></p>a</span></mn></math></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><math></html>",
+      "errors": [
+        "(1,28): unexpected-end-tag",
+        "(1,28): expected-one-end-tag-but-got-another",
+        "(1,28): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math></math></body></html>",
+        "noQuirksBodyHtml": "<math></math>"
+      }
+    },
+    {
+      "data": "<!doctype html><meta charset=\"ascii\">",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "meta": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "meta",
+                    "attrs": [
+                      {
+                        "name": "charset",
+                        "value": "ascii"
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><meta charset=\"ascii\"></head><body></body></html>",
+        "noQuirksBodyHtml": "<meta charset=\"ascii\">"
+      }
+    },
+    {
+      "data": "<!doctype html><meta http-equiv=\"content-type\" content=\"text/html;charset=ascii\">",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "meta": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "meta",
+                    "attrs": [
+                      {
+                        "name": "content",
+                        "value": "text/html;charset=ascii"
+                      },
+                      {
+                        "name": "http-equiv",
+                        "value": "content-type"
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><meta http-equiv=\"content-type\" content=\"text/html;charset=ascii\"></head><body></body></html>",
+        "noQuirksBodyHtml": "<meta http-equiv=\"content-type\" content=\"text/html;charset=ascii\">"
+      }
+    },
+    {
+      "data": "<!doctype html><head><!--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa--><meta charset=\"utf8\">",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "meta": true,
+            "body": true
+          },
+          "doctype": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "comment": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+                  },
+                  {
+                    "tag": "meta",
+                    "attrs": [
+                      {
+                        "name": "charset",
+                        "value": "utf8"
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><!--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa--><meta charset=\"utf8\"></head><body></body></html>",
+        "noQuirksBodyHtml": "<!--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa--><meta charset=\"utf8\">"
+      }
+    },
+    {
+      "data": "<!doctype html><html a=b><head></head><html c=d>",
+      "errors": [
+        "(1,48): non-html-root"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "attrs": [
+              {
+                "name": "a",
+                "value": "b"
+              },
+              {
+                "name": "c",
+                "value": "d"
+              }
+            ],
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html a=\"b\" c=\"d\"><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!doctype html><image/>",
+      "errors": [
+        "(1,23): image-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "img": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "img"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><img></body></html>",
+        "noQuirksBodyHtml": "<img>"
+      }
+    },
+    {
+      "data": "<!doctype html>a<i>b<table>c<b>d</i>e</b>f",
+      "errors": [
+        "(1,28): foster-parenting-character",
+        "(1,31): foster-parenting-start-tag",
+        "(1,32): foster-parenting-character",
+        "(1,36): foster-parenting-end-tag",
+        "(1,36): adoption-agency-1.3",
+        "(1,37): foster-parenting-character",
+        "(1,41): foster-parenting-end-tag",
+        "(1,42): foster-parenting-character",
+        "(1,42): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "i": true,
+            "b": true,
+            "table": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "a"
+                  },
+                  {
+                    "tag": "i",
+                    "children": [
+                      {
+                        "text": "bc"
+                      },
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": "de"
+                          }
+                        ]
+                      },
+                      {
+                        "text": "f"
+                      },
+                      {
+                        "tag": "table"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>a<i>bc<b>de</b>f<table></table></i></body></html>",
+        "noQuirksBodyHtml": "a<i>bc<b>de</b>f<table></table></i>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f",
+      "errors": [
+        "(1,25): foster-parenting-start-tag",
+        "(1,26): foster-parenting-character",
+        "(1,29): foster-parenting-start-tag",
+        "(1,30): foster-parenting-character",
+        "(1,35): foster-parenting-start-tag",
+        "(1,36): foster-parenting-character",
+        "(1,39): foster-parenting-start-tag",
+        "(1,40): foster-parenting-character",
+        "(1,44): foster-parenting-end-tag",
+        "(1,44): adoption-agency-1.3",
+        "(1,44): adoption-agency-1.3",
+        "(1,45): foster-parenting-character",
+        "(1,49): foster-parenting-end-tag",
+        "(1,49): adoption-agency-1.3",
+        "(1,49): adoption-agency-1.3",
+        "(1,50): foster-parenting-character",
+        "(1,50): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "i": true,
+            "b": true,
+            "div": true,
+            "a": true,
+            "table": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "i",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": "b"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "b"
+                  },
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "text": "c"
+                              },
+                              {
+                                "tag": "a",
+                                "children": [
+                                  {
+                                    "text": "d"
+                                  }
+                                ]
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "a",
+                            "children": [
+                              {
+                                "text": "e"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "a",
+                        "children": [
+                          {
+                            "text": "f"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><i>a<b>b</b></i><b></b><div><b><i>c<a>d</a></i><a>e</a></b><a>f</a></div><table></table></body></html>",
+        "noQuirksBodyHtml": "<i>a<b>b</b></i><b></b><div><b><i>c<a>d</a></i><a>e</a></b><a>f</a></div><table></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><i>a<b>b<div>c<a>d</i>e</b>f",
+      "errors": [
+        "(1,37): adoption-agency-1.3",
+        "(1,37): adoption-agency-1.3",
+        "(1,42): adoption-agency-1.3",
+        "(1,42): adoption-agency-1.3",
+        "(1,43): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "i": true,
+            "b": true,
+            "div": true,
+            "a": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "i",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": "b"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "b"
+                  },
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "text": "c"
+                              },
+                              {
+                                "tag": "a",
+                                "children": [
+                                  {
+                                    "text": "d"
+                                  }
+                                ]
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "a",
+                            "children": [
+                              {
+                                "text": "e"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "a",
+                        "children": [
+                          {
+                            "text": "f"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><i>a<b>b</b></i><b></b><div><b><i>c<a>d</a></i><a>e</a></b><a>f</a></div></body></html>",
+        "noQuirksBodyHtml": "<i>a<b>b</b></i><b></b><div><b><i>c<a>d</a></i><a>e</a></b><a>f</a></div>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><i>a<b>b<div>c</i>",
+      "errors": [
+        "(1,25): foster-parenting-start-tag",
+        "(1,26): foster-parenting-character",
+        "(1,29): foster-parenting-start-tag",
+        "(1,30): foster-parenting-character",
+        "(1,35): foster-parenting-start-tag",
+        "(1,36): foster-parenting-character",
+        "(1,40): foster-parenting-end-tag",
+        "(1,40): adoption-agency-1.3",
+        "(1,40): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "i": true,
+            "b": true,
+            "div": true,
+            "table": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "i",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": "b"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "div",
+                        "children": [
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "text": "c"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><i>a<b>b</b></i><b><div><i>c</i></div></b><table></table></body></html>",
+        "noQuirksBodyHtml": "<i>a<b>b</b></i><b><div><i>c</i></div></b><table></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f",
+      "errors": [
+        "(1,25): foster-parenting-start-tag",
+        "(1,26): foster-parenting-character",
+        "(1,29): foster-parenting-start-tag",
+        "(1,30): foster-parenting-character",
+        "(1,35): foster-parenting-start-tag",
+        "(1,36): foster-parenting-character",
+        "(1,39): foster-parenting-start-tag",
+        "(1,40): foster-parenting-character",
+        "(1,44): foster-parenting-end-tag",
+        "(1,44): adoption-agency-1.3",
+        "(1,44): adoption-agency-1.3",
+        "(1,45): foster-parenting-character",
+        "(1,49): foster-parenting-end-tag",
+        "(1,44): adoption-agency-1.3",
+        "(1,44): adoption-agency-1.3",
+        "(1,50): foster-parenting-character",
+        "(1,50): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "i": true,
+            "b": true,
+            "div": true,
+            "a": true,
+            "table": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "i",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": "b"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "b"
+                  },
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "text": "c"
+                              },
+                              {
+                                "tag": "a",
+                                "children": [
+                                  {
+                                    "text": "d"
+                                  }
+                                ]
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "a",
+                            "children": [
+                              {
+                                "text": "e"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "a",
+                        "children": [
+                          {
+                            "text": "f"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><i>a<b>b</b></i><b></b><div><b><i>c<a>d</a></i><a>e</a></b><a>f</a></div><table></table></body></html>",
+        "noQuirksBodyHtml": "<i>a<b>b</b></i><b></b><div><b><i>c<a>d</a></i><a>e</a></b><a>f</a></div><table></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><i>a<div>b<tr>c<b>d</i>e",
+      "errors": [
+        "(1,25): foster-parenting-start-tag",
+        "(1,26): foster-parenting-character",
+        "(1,31): foster-parenting-start-tag",
+        "(1,32): foster-parenting-character",
+        "(1,37): foster-parenting-character",
+        "(1,40): foster-parenting-start-tag",
+        "(1,41): foster-parenting-character",
+        "(1,45): foster-parenting-end-tag",
+        "(1,45): adoption-agency-1.3",
+        "(1,46): foster-parenting-character",
+        "(1,46): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "i": true,
+            "div": true,
+            "b": true,
+            "table": true,
+            "tbody": true,
+            "tr": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "i",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "div",
+                        "children": [
+                          {
+                            "text": "b"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "i",
+                    "children": [
+                      {
+                        "text": "c"
+                      },
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": "d"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "text": "e"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><i>a<div>b</div></i><i>c<b>d</b></i><b>e</b><table><tbody><tr></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<i>a<div>b</div></i><i>c<b>d</b></i><b>e</b><table><tbody><tr></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><td><table><i>a<div>b<b>c</i>d",
+      "errors": [
+        "(1,26): unexpected-cell-in-table-body",
+        "(1,36): foster-parenting-start-tag",
+        "(1,37): foster-parenting-character",
+        "(1,42): foster-parenting-start-tag",
+        "(1,43): foster-parenting-character",
+        "(1,46): foster-parenting-start-tag",
+        "(1,47): foster-parenting-character",
+        "(1,51): foster-parenting-end-tag",
+        "(1,51): adoption-agency-1.3",
+        "(1,51): adoption-agency-1.3",
+        "(1,52): foster-parenting-character",
+        "(1,52): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "i": true,
+            "div": true,
+            "b": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "i",
+                                    "children": [
+                                      {
+                                        "text": "a"
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "tag": "div",
+                                    "children": [
+                                      {
+                                        "tag": "i",
+                                        "children": [
+                                          {
+                                            "text": "b"
+                                          },
+                                          {
+                                            "tag": "b",
+                                            "children": [
+                                              {
+                                                "text": "c"
+                                              }
+                                            ]
+                                          }
+                                        ]
+                                      },
+                                      {
+                                        "tag": "b",
+                                        "children": [
+                                          {
+                                            "text": "d"
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "tag": "table"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><i>a</i><div><i>b<b>c</b></i><b>d</b></div><table></table></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td><i>a</i><div><i>b<b>c</b></i><b>d</b></div><table></table></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><body><bgsound>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "bgsound": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "bgsound"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><bgsound></body></html>",
+        "noQuirksBodyHtml": "<bgsound>"
+      }
+    },
+    {
+      "data": "<!doctype html><body><basefont>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "basefont": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "basefont"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><basefont></body></html>",
+        "noQuirksBodyHtml": "<basefont>"
+      }
+    },
+    {
+      "data": "<!doctype html><a><b></a><basefont>",
+      "errors": [
+        "(1,25): adoption-agency-1.3"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "b": true,
+            "basefont": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "children": [
+                      {
+                        "tag": "b"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "basefont"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><a><b></b></a><basefont></body></html>",
+        "noQuirksBodyHtml": "<a><b></b></a><basefont>"
+      }
+    },
+    {
+      "data": "<!doctype html><a><b></a><bgsound>",
+      "errors": [
+        "(1,25): adoption-agency-1.3"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "b": true,
+            "bgsound": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "children": [
+                      {
+                        "tag": "b"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "bgsound"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><a><b></b></a><bgsound></body></html>",
+        "noQuirksBodyHtml": "<a><b></b></a><bgsound>"
+      }
+    },
+    {
+      "data": "<!doctype html><figcaption><article></figcaption>a",
+      "errors": [
+        "(1,49): end-tag-too-early"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "figcaption": true,
+            "article": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "figcaption",
+                    "children": [
+                      {
+                        "tag": "article"
+                      }
+                    ]
+                  },
+                  {
+                    "text": "a"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><figcaption><article></article></figcaption>a</body></html>",
+        "noQuirksBodyHtml": "<figcaption><article></article></figcaption>a"
+      }
+    },
+    {
+      "data": "<!doctype html><summary><article></summary>a",
+      "errors": [
+        "(1,43): end-tag-too-early"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "summary": true,
+            "article": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "summary",
+                    "children": [
+                      {
+                        "tag": "article"
+                      }
+                    ]
+                  },
+                  {
+                    "text": "a"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><summary><article></article></summary>a</body></html>",
+        "noQuirksBodyHtml": "<summary><article></article></summary>a"
+      }
+    },
+    {
+      "data": "<!doctype html><p><a><plaintext>b",
+      "errors": [
+        "(1,32): unexpected-end-tag",
+        "(1,33): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "a": true,
+            "plaintext": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "a"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "plaintext",
+                    "children": [
+                      {
+                        "tag": "a",
+                        "children": [
+                          {
+                            "text": "b"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><a></a></p><plaintext><a>b</a></plaintext></body></html>",
+        "noQuirksBodyHtml": "<p><a></a></p><plaintext><a>b</a></plaintext>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><div>a<a></div>b<p>c</p>d",
+      "errors": [
+        "(1,30): end-tag-too-early",
+        "(1,40): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "a": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "a"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "a",
+                    "children": [
+                      {
+                        "text": "b"
+                      },
+                      {
+                        "tag": "p",
+                        "children": [
+                          {
+                            "text": "c"
+                          }
+                        ]
+                      },
+                      {
+                        "text": "d"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><div>a<a></a></div><a>b<p>c</p>d</a></body></html>",
+        "noQuirksBodyHtml": "<div>a<a></a></div><a>b<p>c</p>d</a>"
+      }
+    }
+  ],
+  "tests2.dat": [
+    {
+      "data": "<!DOCTYPE html>Test",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Test"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>Test</body></html>",
+        "noQuirksBodyHtml": "Test"
+      }
+    },
+    {
+      "data": "<textarea>test</div>test",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag",
+        "(1,24): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "textarea": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "textarea",
+                    "children": [
+                      {
+                        "text": "test</div>test",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><textarea>test&lt;/div&gt;test</textarea></body></html>",
+        "noQuirksBodyHtml": "<textarea>test&lt;/div&gt;test</textarea>"
+      }
+    },
+    {
+      "data": "<table><td>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,11): unexpected-cell-in-table-body",
+        "(1,11): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><tr><td></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<table><td>test</tbody></table>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,11): unexpected-cell-in-table-body"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "text": "test"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><tr><td>test</td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td>test</td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<frame>test",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,7): unexpected-start-tag-ignored"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "test"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>test</body></html>",
+        "noQuirksBodyHtml": "test"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><frameset>test",
+      "errors": [
+        "(1,29): unexpected-char-in-frameset",
+        "(1,29): unexpected-char-in-frameset",
+        "(1,29): unexpected-char-in-frameset",
+        "(1,29): unexpected-char-in-frameset",
+        "(1,29): eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": "test"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><frameset> te st",
+      "errors": [
+        "(1,29): unexpected-char-in-frameset",
+        "(1,29): unexpected-char-in-frameset",
+        "(1,29): unexpected-char-in-frameset",
+        "(1,29): unexpected-char-in-frameset",
+        "(1,29): eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset",
+                "children": [
+                  {
+                    "text": "  "
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset>  </frameset></html>",
+        "noQuirksBodyHtml": " te st"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><frameset></frameset> te st",
+      "errors": [
+        "(1,29): unexpected-char-after-frameset",
+        "(1,29): unexpected-char-after-frameset",
+        "(1,29): unexpected-char-after-frameset",
+        "(1,29): unexpected-char-after-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              },
+              {
+                "text": "  "
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset></frameset>  </html>",
+        "noQuirksBodyHtml": " te st"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><frameset><!DOCTYPE html>",
+      "errors": [
+        "(1,40): unexpected-doctype",
+        "(1,40): eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><font><p><b>test</font>",
+      "errors": [
+        "(1,38): adoption-agency-1.3",
+        "(1,38): adoption-agency-1.3"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "font": true,
+            "p": true,
+            "b": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "font"
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "font",
+                        "children": [
+                          {
+                            "tag": "b",
+                            "children": [
+                              {
+                                "text": "test"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><font></font><p><font><b>test</b></font></p></body></html>",
+        "noQuirksBodyHtml": "<font></font><p><font><b>test</b></font></p>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><dt><div><dd>",
+      "errors": [
+        "(1,28): end-tag-too-early"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "dt": true,
+            "div": true,
+            "dd": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "dt",
+                    "children": [
+                      {
+                        "tag": "div"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "dd"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><dt><div></div></dt><dd></dd></body></html>",
+        "noQuirksBodyHtml": "<dt><div></div></dt><dd></dd>"
+      }
+    },
+    {
+      "data": "<script></x",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,11): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "</x",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script></x</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></x</script>"
+      }
+    },
+    {
+      "data": "<table><plaintext><td>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,18): unexpected-start-tag-implies-table-voodoo",
+        "(1,22): foster-parenting-character-in-table",
+        "(1,22): foster-parenting-character-in-table",
+        "(1,22): foster-parenting-character-in-table",
+        "(1,22): foster-parenting-character-in-table",
+        "(1,22): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "plaintext": true,
+            "table": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "plaintext",
+                    "children": [
+                      {
+                        "text": "<td>",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><plaintext><td></plaintext><table></table></body></html>",
+        "noQuirksBodyHtml": "<plaintext><td></plaintext><table></table>"
+      }
+    },
+    {
+      "data": "<plaintext></plaintext>",
+      "errors": [
+        "(1,11): expected-doctype-but-got-start-tag",
+        "(1,23): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "plaintext": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "plaintext",
+                    "children": [
+                      {
+                        "text": "</plaintext>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><plaintext></plaintext></plaintext></body></html>",
+        "noQuirksBodyHtml": "<plaintext></plaintext></plaintext>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><table><tr>TEST",
+      "errors": [
+        "(1,30): foster-parenting-character-in-table",
+        "(1,30): foster-parenting-character-in-table",
+        "(1,30): foster-parenting-character-in-table",
+        "(1,30): foster-parenting-character-in-table",
+        "(1,30): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "TEST"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>TEST<table><tbody><tr></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "TEST<table><tbody><tr></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body t1=1><body t2=2><body t3=3 t4=4>",
+      "errors": [
+        "(1,37): unexpected-start-tag",
+        "(1,53): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "attrs": [
+                  {
+                    "name": "t1",
+                    "value": "1"
+                  },
+                  {
+                    "name": "t2",
+                    "value": "2"
+                  },
+                  {
+                    "name": "t3",
+                    "value": "3"
+                  },
+                  {
+                    "name": "t4",
+                    "value": "4"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body t1=\"1\" t2=\"2\" t3=\"3\" t4=\"4\"></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "</b test",
+      "errors": [
+        "(1,8): eof-in-attribute-name",
+        "(1,8): expected-doctype-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!DOCTYPE html></b test<b &=&amp>X",
+      "errors": [
+        "(1,24): invalid-character-in-attribute-name",
+        "(1,32): named-entity-without-semicolon",
+        "(1,33): attributes-in-end-tag",
+        "(1,33): unexpected-end-tag-before-html"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "X"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>X</body></html>",
+        "noQuirksBodyHtml": "X"
+      }
+    },
+    {
+      "data": "<!doctypehtml><scrIPt type=text/x-foobar;baz>X</SCRipt",
+      "errors": [
+        "(1,9): need-space-after-doctype",
+        "(1,54): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "text/x-foobar;baz"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "X</SCRipt",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script type=\"text/x-foobar;baz\">X</SCRipt</script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script type=\"text/x-foobar;baz\">X</SCRipt</script>"
+      }
+    },
+    {
+      "data": "&",
+      "errors": [
+        "(1,1): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "&",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>&amp;</body></html>",
+        "noQuirksBodyHtml": "&amp;"
+      }
+    },
+    {
+      "data": "&#",
+      "errors": [
+        "(1,2): expected-numeric-entity",
+        "(1,2): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "&#",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>&amp;#</body></html>",
+        "noQuirksBodyHtml": "&amp;#"
+      }
+    },
+    {
+      "data": "&#X",
+      "errors": [
+        "(1,3): expected-numeric-entity",
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "&#X",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>&amp;#X</body></html>",
+        "noQuirksBodyHtml": "&amp;#X"
+      }
+    },
+    {
+      "data": "&#x",
+      "errors": [
+        "(1,3): expected-numeric-entity",
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "&#x",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>&amp;#x</body></html>",
+        "noQuirksBodyHtml": "&amp;#x"
+      }
+    },
+    {
+      "data": "&#45",
+      "errors": [
+        "(1,4): numeric-entity-without-semicolon",
+        "(1,4): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "-"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>-</body></html>",
+        "noQuirksBodyHtml": "-"
+      }
+    },
+    {
+      "data": "&x-test",
+      "errors": [
+        "(1,2): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "&x-test",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>&amp;x-test</body></html>",
+        "noQuirksBodyHtml": "&amp;x-test"
+      }
+    },
+    {
+      "data": "<!doctypehtml><p><li>",
+      "errors": [
+        "(1,9): need-space-after-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "li": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p"
+                  },
+                  {
+                    "tag": "li"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p></p><li></li></body></html>",
+        "noQuirksBodyHtml": "<p></p><li></li>"
+      }
+    },
+    {
+      "data": "<!doctypehtml><p><dt>",
+      "errors": [
+        "(1,9): need-space-after-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "dt": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p"
+                  },
+                  {
+                    "tag": "dt"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p></p><dt></dt></body></html>",
+        "noQuirksBodyHtml": "<p></p><dt></dt>"
+      }
+    },
+    {
+      "data": "<!doctypehtml><p><dd>",
+      "errors": [
+        "(1,9): need-space-after-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "dd": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p"
+                  },
+                  {
+                    "tag": "dd"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p></p><dd></dd></body></html>",
+        "noQuirksBodyHtml": "<p></p><dd></dd>"
+      }
+    },
+    {
+      "data": "<!doctypehtml><p><form>",
+      "errors": [
+        "(1,9): need-space-after-doctype",
+        "(1,23): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "form": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p"
+                  },
+                  {
+                    "tag": "form"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p></p><form></form></body></html>",
+        "noQuirksBodyHtml": "<p></p><form></form>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><p></P>X",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p"
+                  },
+                  {
+                    "text": "X"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p></p>X</body></html>",
+        "noQuirksBodyHtml": "<p></p>X"
+      }
+    },
+    {
+      "data": "&AMP",
+      "errors": [
+        "(1,4): named-entity-without-semicolon",
+        "(1,4): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "&",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>&amp;</body></html>",
+        "noQuirksBodyHtml": "&amp;"
+      }
+    },
+    {
+      "data": "&AMp;",
+      "errors": [
+        "(1,3): expected-named-entity",
+        "(1,3): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "&AMp;",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>&amp;AMp;</body></html>",
+        "noQuirksBodyHtml": "&amp;AMp;"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><html><head></head><body><thisISasillyTESTelementNameToMakeSureCrazyTagNamesArePARSEDcorrectLY>",
+      "errors": [
+        "(1,110): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly></thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly></body></html>",
+        "noQuirksBodyHtml": "<thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly></thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html>X</body>X",
+      "errors": [
+        "(1,24): unexpected-char-after-body"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "XX"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>XX</body></html>",
+        "noQuirksBodyHtml": "XX"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><!-- X",
+      "errors": [
+        "(1,21): eof-in-comment"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "comment": " X"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><!-- X--><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": "<!-- X-->"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><table><caption>test TEST</caption><td>test",
+      "errors": [
+        "(1,54): unexpected-cell-in-table-body",
+        "(1,58): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "caption": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "caption",
+                        "children": [
+                          {
+                            "text": "test TEST"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "text": "test"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><caption>test TEST</caption><tbody><tr><td>test</td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><caption>test TEST</caption><tbody><tr><td>test</td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><select><option><optgroup>",
+      "errors": [
+        "(1,41): eof-in-select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "option": true,
+            "optgroup": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "tag": "option"
+                      },
+                      {
+                        "tag": "optgroup"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select><option></option><optgroup></optgroup></select></body></html>",
+        "noQuirksBodyHtml": "<select><option></option><optgroup></optgroup></select>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><select><optgroup><option></optgroup><option><select><option>",
+      "errors": [
+        "(1,68): unexpected-select-in-select",
+        "(1,76): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "optgroup": true,
+            "option": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "tag": "optgroup",
+                        "children": [
+                          {
+                            "tag": "option"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "option"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "option"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select><optgroup><option></option></optgroup><option></option></select><option></option></body></html>",
+        "noQuirksBodyHtml": "<select><optgroup><option></option></optgroup><option></option></select><option></option>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><select><optgroup><option><optgroup>",
+      "errors": [
+        "(1,51): eof-in-select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "optgroup": true,
+            "option": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "tag": "optgroup",
+                        "children": [
+                          {
+                            "tag": "option"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "optgroup"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select><optgroup><option></option></optgroup><optgroup></optgroup></select></body></html>",
+        "noQuirksBodyHtml": "<select><optgroup><option></option></optgroup><optgroup></optgroup></select>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><datalist><option>foo</datalist>bar",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "datalist": true,
+            "option": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "datalist",
+                    "children": [
+                      {
+                        "tag": "option",
+                        "children": [
+                          {
+                            "text": "foo"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "text": "bar"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><datalist><option>foo</option></datalist>bar</body></html>",
+        "noQuirksBodyHtml": "<datalist><option>foo</option></datalist>bar"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><font><input><input></font>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "font": true,
+            "input": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "font",
+                    "children": [
+                      {
+                        "tag": "input"
+                      },
+                      {
+                        "tag": "input"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><font><input><input></font></body></html>",
+        "noQuirksBodyHtml": "<font><input><input></font>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><!-- XXX - XXX -->",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "comment": " XXX - XXX "
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><!-- XXX - XXX --><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": "<!-- XXX - XXX -->"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><!-- XXX - XXX",
+      "errors": [
+        "(1,29): eof-in-comment"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "comment": " XXX - XXX"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><!-- XXX - XXX--><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": "<!-- XXX - XXX-->"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><!-- XXX - XXX - XXX -->",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "comment": " XXX - XXX - XXX "
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><!-- XXX - XXX - XXX --><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": "<!-- XXX - XXX - XXX -->"
+      }
+    },
+    {
+      "data": "<isindex test=x name=x>",
+      "errors": [
+        "(1,23): expected-doctype-but-got-start-tag",
+        "(1,23): deprecated-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "form": true,
+            "hr": true,
+            "label": true,
+            "input": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "form",
+                    "children": [
+                      {
+                        "tag": "hr"
+                      },
+                      {
+                        "tag": "label",
+                        "children": [
+                          {
+                            "text": "This is a searchable index. Enter search keywords: "
+                          },
+                          {
+                            "tag": "input",
+                            "attrs": [
+                              {
+                                "name": "name",
+                                "value": "isindex"
+                              },
+                              {
+                                "name": "test",
+                                "value": "x"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "hr"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\" test=\"x\"></label><hr></form></body></html>",
+        "noQuirksBodyHtml": "<form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\" test=\"x\"></label><hr></form>"
+      }
+    },
+    {
+      "data": "test\ntest",
+      "errors": [
+        "(2,4): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "test\ntest"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>test\ntest</body></html>",
+        "noQuirksBodyHtml": "test\ntest"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><title>test</body></title>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "title": true
+          },
+          "doctype": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "test</body>",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><title>test&lt;/body&gt;</title></body></html>",
+        "noQuirksBodyHtml": "<title>test&lt;/body&gt;</title>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><title>X</title><meta name=z><link rel=foo><style>\nx { content:\"</style\" } </style>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "title": true,
+            "meta": true,
+            "link": true,
+            "style": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "X"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "meta",
+                    "attrs": [
+                      {
+                        "name": "name",
+                        "value": "z"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "link",
+                    "attrs": [
+                      {
+                        "name": "rel",
+                        "value": "foo"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": "\nx { content:\"</style\" } ",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><title>X</title><meta name=\"z\"><link rel=\"foo\"><style>\nx { content:\"</style\" } </style></body></html>",
+        "noQuirksBodyHtml": "<title>X</title><meta name=\"z\"><link rel=\"foo\"><style>\nx { content:\"</style\" } </style>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><select><optgroup></optgroup></select>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "optgroup": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "tag": "optgroup"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select><optgroup></optgroup></select></body></html>",
+        "noQuirksBodyHtml": "<select><optgroup></optgroup></select>"
+      }
+    },
+    {
+      "data": " \n ",
+      "errors": [
+        "(2,1): expected-doctype-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": " \n "
+      }
+    },
+    {
+      "data": "<!DOCTYPE html>  <html>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": "  "
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><script>\n</script>  <title>x</title>  </head>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "title": true,
+            "body": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "\n",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "  "
+                  },
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "x"
+                      }
+                    ]
+                  },
+                  {
+                    "text": "  "
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><script>\n</script>  <title>x</title>  </head><body></body></html>",
+        "noQuirksBodyHtml": "<script>\n</script>  <title>x</title>  "
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><html><body><html id=x>",
+      "errors": [
+        "(1,38): non-html-root"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "attrs": [
+              {
+                "name": "id",
+                "value": "x"
+              }
+            ],
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html id=\"x\"><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!DOCTYPE html>X</body><html id=\"x\">",
+      "errors": [
+        "(1,36): non-html-root"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "attrs": [
+              {
+                "name": "id",
+                "value": "x"
+              }
+            ],
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "X"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html id=\"x\"><head></head><body>X</body></html>",
+        "noQuirksBodyHtml": "X"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><head><html id=x>",
+      "errors": [
+        "(1,32): non-html-root"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "attrs": [
+              {
+                "name": "id",
+                "value": "x"
+              }
+            ],
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html id=\"x\"><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!DOCTYPE html>X</html>X",
+      "errors": [
+        "(1,24): expected-eof-but-got-char"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "XX"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>XX</body></html>",
+        "noQuirksBodyHtml": "XX"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html>X</html> ",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "X "
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>X </body></html>",
+        "noQuirksBodyHtml": "X "
+      }
+    },
+    {
+      "data": "<!DOCTYPE html>X</html><p>X",
+      "errors": [
+        "(1,26): expected-eof-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "X"
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "X"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>X<p>X</p></body></html>",
+        "noQuirksBodyHtml": "X<p>X</p>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html>X<p/x/y/z>",
+      "errors": [
+        "(1,19): unexpected-character-after-solidus-in-tag",
+        "(1,21): unexpected-character-after-solidus-in-tag",
+        "(1,23): unexpected-character-after-solidus-in-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "X"
+                  },
+                  {
+                    "tag": "p",
+                    "attrs": [
+                      {
+                        "name": "x",
+                        "value": ""
+                      },
+                      {
+                        "name": "y",
+                        "value": ""
+                      },
+                      {
+                        "name": "z",
+                        "value": ""
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>X<p x=\"\" y=\"\" z=\"\"></p></body></html>",
+        "noQuirksBodyHtml": "X<p x=\"\" y=\"\" z=\"\"></p>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><!--x--",
+      "errors": [
+        "(1,22): eof-in-comment-double-dash"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "comment": "x"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><!--x--><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": "<!--x-->"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><table><tr><td></p></table>",
+      "errors": [
+        "(1,34): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "p"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><p></p></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td><p></p></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE <!DOCTYPE HTML>><!--<!--x-->-->",
+      "errors": [
+        "(1,20): expected-space-or-right-bracket-in-doctype",
+        "(1,25): unknown-doctype",
+        "(1,35): unexpected-char-in-comment"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true,
+          "escaped": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "doctype": "<!doctype"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": ">",
+                    "escaped": true
+                  },
+                  {
+                    "comment": "<!--x"
+                  },
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE <!doctype><html><head></head><body>&gt;<!--<!--x-->--&gt;</body></html>",
+        "noQuirksBodyHtml": "&gt;<!--<!--x-->--&gt;"
+      }
+    },
+    {
+      "data": "<!doctype html><div><form></form><div></div></div>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "form": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "form"
+                      },
+                      {
+                        "tag": "div"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><div><form></form><div></div></div></body></html>",
+        "noQuirksBodyHtml": "<div><form></form><div></div></div>"
+      }
+    }
+  ],
+  "tests20.dat": [
+    {
+      "data": "<!doctype html><p><button><button>",
+      "errors": [
+        "(1,34): unexpected-start-tag-implies-end-tag",
+        "(1,34): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "button": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "button"
+                      },
+                      {
+                        "tag": "button"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><button></button><button></button></p></body></html>",
+        "noQuirksBodyHtml": "<p><button></button><button></button></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><button><address>",
+      "errors": [
+        "(1,35): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "button": true,
+            "address": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "button",
+                        "children": [
+                          {
+                            "tag": "address"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><button><address></address></button></p></body></html>",
+        "noQuirksBodyHtml": "<p><button><address></address></button></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><button><blockquote>",
+      "errors": [
+        "(1,38): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "button": true,
+            "blockquote": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "button",
+                        "children": [
+                          {
+                            "tag": "blockquote"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><button><blockquote></blockquote></button></p></body></html>",
+        "noQuirksBodyHtml": "<p><button><blockquote></blockquote></button></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><button><menu>",
+      "errors": [
+        "(1,32): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "button": true,
+            "menu": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "button",
+                        "children": [
+                          {
+                            "tag": "menu"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><button><menu></menu></button></p></body></html>",
+        "noQuirksBodyHtml": "<p><button><menu></menu></button></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><button><p>",
+      "errors": [
+        "(1,29): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "button": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "button",
+                        "children": [
+                          {
+                            "tag": "p"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><button><p></p></button></p></body></html>",
+        "noQuirksBodyHtml": "<p><button><p></p></button></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><button><ul>",
+      "errors": [
+        "(1,30): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "button": true,
+            "ul": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "button",
+                        "children": [
+                          {
+                            "tag": "ul"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><button><ul></ul></button></p></body></html>",
+        "noQuirksBodyHtml": "<p><button><ul></ul></button></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><button><h1>",
+      "errors": [
+        "(1,30): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "button": true,
+            "h1": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "button",
+                        "children": [
+                          {
+                            "tag": "h1"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><button><h1></h1></button></p></body></html>",
+        "noQuirksBodyHtml": "<p><button><h1></h1></button></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><button><h6>",
+      "errors": [
+        "(1,30): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "button": true,
+            "h6": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "button",
+                        "children": [
+                          {
+                            "tag": "h6"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><button><h6></h6></button></p></body></html>",
+        "noQuirksBodyHtml": "<p><button><h6></h6></button></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><button><listing>",
+      "errors": [
+        "(1,35): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "button": true,
+            "listing": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "button",
+                        "children": [
+                          {
+                            "tag": "listing"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><button><listing></listing></button></p></body></html>",
+        "noQuirksBodyHtml": "<p><button><listing></listing></button></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><button><pre>",
+      "errors": [
+        "(1,31): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "button": true,
+            "pre": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "button",
+                        "children": [
+                          {
+                            "tag": "pre"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><button><pre></pre></button></p></body></html>",
+        "noQuirksBodyHtml": "<p><button><pre></pre></button></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><button><form>",
+      "errors": [
+        "(1,32): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "button": true,
+            "form": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "button",
+                        "children": [
+                          {
+                            "tag": "form"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><button><form></form></button></p></body></html>",
+        "noQuirksBodyHtml": "<p><button><form></form></button></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><button><li>",
+      "errors": [
+        "(1,30): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "button": true,
+            "li": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "button",
+                        "children": [
+                          {
+                            "tag": "li"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><button><li></li></button></p></body></html>",
+        "noQuirksBodyHtml": "<p><button><li></li></button></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><button><dd>",
+      "errors": [
+        "(1,30): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "button": true,
+            "dd": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "button",
+                        "children": [
+                          {
+                            "tag": "dd"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><button><dd></dd></button></p></body></html>",
+        "noQuirksBodyHtml": "<p><button><dd></dd></button></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><button><dt>",
+      "errors": [
+        "(1,30): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "button": true,
+            "dt": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "button",
+                        "children": [
+                          {
+                            "tag": "dt"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><button><dt></dt></button></p></body></html>",
+        "noQuirksBodyHtml": "<p><button><dt></dt></button></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><button><plaintext>",
+      "errors": [
+        "(1,37): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "button": true,
+            "plaintext": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "button",
+                        "children": [
+                          {
+                            "tag": "plaintext"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><button><plaintext></plaintext></button></p></body></html>",
+        "noQuirksBodyHtml": "<p><button><plaintext></plaintext></button></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><button><table>",
+      "errors": [
+        "(1,33): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "button": true,
+            "table": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "button",
+                        "children": [
+                          {
+                            "tag": "table"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><button><table></table></button></p></body></html>",
+        "noQuirksBodyHtml": "<p><button><table></table></button></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><button><hr>",
+      "errors": [
+        "(1,30): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "button": true,
+            "hr": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "button",
+                        "children": [
+                          {
+                            "tag": "hr"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><button><hr></button></p></body></html>",
+        "noQuirksBodyHtml": "<p><button><hr></button></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><button><xmp>",
+      "errors": [
+        "(1,31): expected-named-closing-tag-but-got-eof",
+        "(1,31): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "button": true,
+            "xmp": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "button",
+                        "children": [
+                          {
+                            "tag": "xmp"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><button><xmp></xmp></button></p></body></html>",
+        "noQuirksBodyHtml": "<p><button><xmp></xmp></button></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><button></p>",
+      "errors": [
+        "(1,30): unexpected-end-tag",
+        "(1,30): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "button": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "button",
+                        "children": [
+                          {
+                            "tag": "p"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><button><p></p></button></p></body></html>",
+        "noQuirksBodyHtml": "<p><button><p></p></button></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><address><button></address>a",
+      "errors": [
+        "(1,42): end-tag-too-early"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "address": true,
+            "button": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "address",
+                    "children": [
+                      {
+                        "tag": "button"
+                      }
+                    ]
+                  },
+                  {
+                    "text": "a"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><address><button></button></address>a</body></html>",
+        "noQuirksBodyHtml": "<address><button></button></address>a"
+      }
+    },
+    {
+      "data": "<!doctype html><address><button></address>a",
+      "errors": [
+        "(1,42): end-tag-too-early"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "address": true,
+            "button": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "address",
+                    "children": [
+                      {
+                        "tag": "button"
+                      }
+                    ]
+                  },
+                  {
+                    "text": "a"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><address><button></button></address>a</body></html>",
+        "noQuirksBodyHtml": "<address><button></button></address>a"
+      }
+    },
+    {
+      "data": "<p><table></p>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,14): unexpected-end-tag-implies-table-voodoo",
+        "(1,14): unexpected-end-tag",
+        "(1,14): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "table": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "p"
+                      },
+                      {
+                        "tag": "table"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><p><p></p><table></table></p></body></html>",
+        "noQuirksBodyHtml": "<p></p><p></p><table></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><svg>",
+      "errors": [
+        "(1,20): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg></svg></body></html>",
+        "noQuirksBodyHtml": "<svg></svg>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><figcaption>",
+      "errors": [
+        "(1,30): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "figcaption": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p"
+                  },
+                  {
+                    "tag": "figcaption"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p></p><figcaption></figcaption></body></html>",
+        "noQuirksBodyHtml": "<p></p><figcaption></figcaption>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><summary>",
+      "errors": [
+        "(1,27): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "summary": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p"
+                  },
+                  {
+                    "tag": "summary"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p></p><summary></summary></body></html>",
+        "noQuirksBodyHtml": "<p></p><summary></summary>"
+      }
+    },
+    {
+      "data": "<!doctype html><form><table><form>",
+      "errors": [
+        "(1,34): unexpected-form-in-table",
+        "(1,34): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "form": true,
+            "table": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "form",
+                    "children": [
+                      {
+                        "tag": "table"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><form><table></table></form></body></html>",
+        "noQuirksBodyHtml": "<form><table></table></form>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><form><form>",
+      "errors": [
+        "(1,28): unexpected-form-in-table",
+        "(1,34): unexpected-form-in-table",
+        "(1,34): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "form": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "form"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><form></form></table></body></html>",
+        "noQuirksBodyHtml": "<table><form></form></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><form></table><form>",
+      "errors": [
+        "(1,28): unexpected-form-in-table",
+        "(1,42): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "form": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "form"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><form></form></table></body></html>",
+        "noQuirksBodyHtml": "<table><form></form></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><svg><foreignObject><p>",
+      "errors": [
+        "(1,38): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg foreignObject": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "foreignObject",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "tag": "p"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg><foreignObject><p></p></foreignObject></svg></body></html>",
+        "noQuirksBodyHtml": "<svg><foreignObject><p></p></foreignObject></svg>"
+      }
+    },
+    {
+      "data": "<!doctype html><svg><title>abc",
+      "errors": [
+        "(1,30): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg title": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "title",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "text": "abc"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg><title>abc</title></svg></body></html>",
+        "noQuirksBodyHtml": "<svg><title>abc</title></svg>"
+      }
+    },
+    {
+      "data": "<option><span><option>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,22): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "option": true,
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "option",
+                    "children": [
+                      {
+                        "tag": "span",
+                        "children": [
+                          {
+                            "tag": "option"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><option><span><option></option></span></option></body></html>",
+        "noQuirksBodyHtml": "<option><span><option></option></span></option>"
+      }
+    },
+    {
+      "data": "<option><option>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,16): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "option": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "option"
+                  },
+                  {
+                    "tag": "option"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><option></option><option></option></body></html>",
+        "noQuirksBodyHtml": "<option></option><option></option>"
+      }
+    },
+    {
+      "data": "<math><annotation-xml><div>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,27): unexpected-html-element-in-foreign-content",
+        "(1,27): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math annotation-xml": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "annotation-xml",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "div"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><annotation-xml></annotation-xml></math><div></div></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml><div></div></annotation-xml></math>"
+      }
+    },
+    {
+      "data": "<math><annotation-xml encoding=\"application/svg+xml\"><div>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,58): unexpected-html-element-in-foreign-content",
+        "(1,58): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math annotation-xml": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "annotation-xml",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "attrs": [
+                          {
+                            "name": "encoding",
+                            "value": "application/svg+xml"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "div"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><annotation-xml encoding=\"application/svg+xml\"></annotation-xml></math><div></div></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"application/svg+xml\"><div></div></annotation-xml></math>"
+      }
+    },
+    {
+      "data": "<math><annotation-xml encoding=\"application/xhtml+xml\"><div>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,60): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math annotation-xml": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "annotation-xml",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "attrs": [
+                          {
+                            "name": "encoding",
+                            "value": "application/xhtml+xml"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "div"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><annotation-xml encoding=\"application/xhtml+xml\"><div></div></annotation-xml></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"application/xhtml+xml\"><div></div></annotation-xml></math>"
+      }
+    },
+    {
+      "data": "<math><annotation-xml encoding=\"aPPlication/xhtmL+xMl\"><div>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,60): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math annotation-xml": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "annotation-xml",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "attrs": [
+                          {
+                            "name": "encoding",
+                            "value": "aPPlication/xhtmL+xMl"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "div"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><annotation-xml encoding=\"aPPlication/xhtmL+xMl\"><div></div></annotation-xml></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"aPPlication/xhtmL+xMl\"><div></div></annotation-xml></math>"
+      }
+    },
+    {
+      "data": "<math><annotation-xml encoding=\"text/html\"><div>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,48): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math annotation-xml": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "annotation-xml",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "attrs": [
+                          {
+                            "name": "encoding",
+                            "value": "text/html"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "div"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><annotation-xml encoding=\"text/html\"><div></div></annotation-xml></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"text/html\"><div></div></annotation-xml></math>"
+      }
+    },
+    {
+      "data": "<math><annotation-xml encoding=\"Text/htmL\"><div>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,48): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math annotation-xml": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "annotation-xml",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "attrs": [
+                          {
+                            "name": "encoding",
+                            "value": "Text/htmL"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "div"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><annotation-xml encoding=\"Text/htmL\"><div></div></annotation-xml></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"Text/htmL\"><div></div></annotation-xml></math>"
+      }
+    },
+    {
+      "data": "<math><annotation-xml encoding=\" text/html \"><div>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,50): unexpected-html-element-in-foreign-content",
+        "(1,50): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math annotation-xml": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "annotation-xml",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "attrs": [
+                          {
+                            "name": "encoding",
+                            "value": " text/html "
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "div"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><annotation-xml encoding=\" text/html \"></annotation-xml></math><div></div></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml encoding=\" text/html \"><div></div></annotation-xml></math>"
+      }
+    }
+  ],
+  "tests21.dat": [
+    {
+      "data": "<svg><![CDATA[foo]]>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,20): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "foo"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>foo</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>foo</svg>"
+      }
+    },
+    {
+      "data": "<math><![CDATA[foo]]>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,21): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "text": "foo"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math>foo</math></body></html>",
+        "noQuirksBodyHtml": "<math>foo</math>"
+      }
+    },
+    {
+      "data": "<div><![CDATA[foo]]>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,7): expected-dashes-or-doctype",
+        "(1,20): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "comment": "[CDATA[foo]]"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div><!--[CDATA[foo]]--></div></body></html>",
+        "noQuirksBodyHtml": "<div><!--[CDATA[foo]]--></div>"
+      }
+    },
+    {
+      "data": "<svg><![CDATA[foo",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,17): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "foo"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>foo</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>foo</svg>"
+      }
+    },
+    {
+      "data": "<svg><![CDATA[foo",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,17): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "foo"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>foo</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>foo</svg>"
+      }
+    },
+    {
+      "data": "<svg><![CDATA[",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,14): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg></svg></body></html>",
+        "noQuirksBodyHtml": "<svg></svg>"
+      }
+    },
+    {
+      "data": "<svg><![CDATA[]]>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,17): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg></svg></body></html>",
+        "noQuirksBodyHtml": "<svg></svg>"
+      }
+    },
+    {
+      "data": "<svg><![CDATA[]] >]]>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,21): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "]] >",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>]] &gt;</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>]] &gt;</svg>"
+      }
+    },
+    {
+      "data": "<svg><![CDATA[]] >]]>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,21): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "]] >",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>]] &gt;</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>]] &gt;</svg>"
+      }
+    },
+    {
+      "data": "<svg><![CDATA[]]",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,16): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "]]"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>]]</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>]]</svg>"
+      }
+    },
+    {
+      "data": "<svg><![CDATA[]",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,15): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "]"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>]</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>]</svg>"
+      }
+    },
+    {
+      "data": "<svg><![CDATA[]>a",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,17): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "]>a",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>]&gt;a</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>]&gt;a</svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><svg><![CDATA[foo]]]>",
+      "errors": [
+        "(1,36): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "foo]"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg>foo]</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>foo]</svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><svg><![CDATA[foo]]]]>",
+      "errors": [
+        "(1,37): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "foo]]"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg>foo]]</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>foo]]</svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><svg><![CDATA[foo]]]]]>",
+      "errors": [
+        "(1,38): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "foo]]]"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg>foo]]]</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>foo]]]</svg>"
+      }
+    },
+    {
+      "data": "<svg><foreignObject><div><![CDATA[foo]]>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,27): expected-dashes-or-doctype",
+        "(1,40): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg foreignObject": true,
+            "div": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "foreignObject",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "tag": "div",
+                            "children": [
+                              {
+                                "comment": "[CDATA[foo]]"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg><foreignObject><div><!--[CDATA[foo]]--></div></foreignObject></svg></body></html>",
+        "noQuirksBodyHtml": "<svg><foreignObject><div><!--[CDATA[foo]]--></div></foreignObject></svg>"
+      }
+    },
+    {
+      "data": "<svg><![CDATA[<svg>]]>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,22): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "<svg>",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>&lt;svg&gt;</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>&lt;svg&gt;</svg>"
+      }
+    },
+    {
+      "data": "<svg><![CDATA[</svg>a]]>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,24): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "</svg>a",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>&lt;/svg&gt;a</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>&lt;/svg&gt;a</svg>"
+      }
+    },
+    {
+      "data": "<svg><![CDATA[<svg>a",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,20): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "<svg>a",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>&lt;svg&gt;a</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>&lt;svg&gt;a</svg>"
+      }
+    },
+    {
+      "data": "<svg><![CDATA[</svg>a",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,21): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "</svg>a",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>&lt;/svg&gt;a</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>&lt;/svg&gt;a</svg>"
+      }
+    },
+    {
+      "data": "<svg><![CDATA[<svg>]]><path>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,28): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg path": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "<svg>",
+                        "escaped": true
+                      },
+                      {
+                        "tag": "path",
+                        "ns": "http://www.w3.org/2000/svg"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>&lt;svg&gt;<path></path></svg></body></html>",
+        "noQuirksBodyHtml": "<svg>&lt;svg&gt;<path></path></svg>"
+      }
+    },
+    {
+      "data": "<svg><![CDATA[<svg>]]></path>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,29): unexpected-end-tag",
+        "(1,29): unexpected-end-tag",
+        "(1,29): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "<svg>",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>&lt;svg&gt;</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>&lt;svg&gt;</svg>"
+      }
+    },
+    {
+      "data": "<svg><![CDATA[<svg>]]><!--path-->",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,33): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "escaped": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "<svg>",
+                        "escaped": true
+                      },
+                      {
+                        "comment": "path"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>&lt;svg&gt;<!--path--></svg></body></html>",
+        "noQuirksBodyHtml": "<svg>&lt;svg&gt;<!--path--></svg>"
+      }
+    },
+    {
+      "data": "<svg><![CDATA[<svg>]]>path",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,26): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "<svg>path",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>&lt;svg&gt;path</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>&lt;svg&gt;path</svg>"
+      }
+    },
+    {
+      "data": "<svg><![CDATA[<!--svg-->]]>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,27): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "text": "<!--svg-->",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg>&lt;!--svg--&gt;</svg></body></html>",
+        "noQuirksBodyHtml": "<svg>&lt;!--svg--&gt;</svg>"
+      }
+    }
+  ],
+  "tests22.dat": [
+    {
+      "data": "<a><b><big><em><strong><div>X</a>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,33): adoption-agency-1.3",
+        "(1,33): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "b": true,
+            "big": true,
+            "em": true,
+            "strong": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "tag": "big",
+                            "children": [
+                              {
+                                "tag": "em",
+                                "children": [
+                                  {
+                                    "tag": "strong"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "big",
+                    "children": [
+                      {
+                        "tag": "em",
+                        "children": [
+                          {
+                            "tag": "strong",
+                            "children": [
+                              {
+                                "tag": "div",
+                                "children": [
+                                  {
+                                    "tag": "a",
+                                    "children": [
+                                      {
+                                        "text": "X"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a><b><big><em><strong></strong></em></big></b></a><big><em><strong><div><a>X</a></div></strong></em></big></body></html>",
+        "noQuirksBodyHtml": "<a><b><big><em><strong></strong></em></big></b></a><big><em><strong><div><a>X</a></div></strong></em></big>"
+      }
+    },
+    {
+      "data": "<a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8>A</a>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,91): adoption-agency-1.3",
+        "(1,91): adoption-agency-1.3",
+        "(1,91): adoption-agency-1.3",
+        "(1,91): adoption-agency-1.3",
+        "(1,91): adoption-agency-1.3",
+        "(1,91): adoption-agency-1.3",
+        "(1,91): adoption-agency-1.3",
+        "(1,91): adoption-agency-1.3",
+        "(1,91): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "b": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "children": [
+                      {
+                        "tag": "b"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "div",
+                        "attrs": [
+                          {
+                            "name": "id",
+                            "value": "1"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "a"
+                          },
+                          {
+                            "tag": "div",
+                            "attrs": [
+                              {
+                                "name": "id",
+                                "value": "2"
+                              }
+                            ],
+                            "children": [
+                              {
+                                "tag": "a"
+                              },
+                              {
+                                "tag": "div",
+                                "attrs": [
+                                  {
+                                    "name": "id",
+                                    "value": "3"
+                                  }
+                                ],
+                                "children": [
+                                  {
+                                    "tag": "a"
+                                  },
+                                  {
+                                    "tag": "div",
+                                    "attrs": [
+                                      {
+                                        "name": "id",
+                                        "value": "4"
+                                      }
+                                    ],
+                                    "children": [
+                                      {
+                                        "tag": "a"
+                                      },
+                                      {
+                                        "tag": "div",
+                                        "attrs": [
+                                          {
+                                            "name": "id",
+                                            "value": "5"
+                                          }
+                                        ],
+                                        "children": [
+                                          {
+                                            "tag": "a"
+                                          },
+                                          {
+                                            "tag": "div",
+                                            "attrs": [
+                                              {
+                                                "name": "id",
+                                                "value": "6"
+                                              }
+                                            ],
+                                            "children": [
+                                              {
+                                                "tag": "a"
+                                              },
+                                              {
+                                                "tag": "div",
+                                                "attrs": [
+                                                  {
+                                                    "name": "id",
+                                                    "value": "7"
+                                                  }
+                                                ],
+                                                "children": [
+                                                  {
+                                                    "tag": "a"
+                                                  },
+                                                  {
+                                                    "tag": "div",
+                                                    "attrs": [
+                                                      {
+                                                        "name": "id",
+                                                        "value": "8"
+                                                      }
+                                                    ],
+                                                    "children": [
+                                                      {
+                                                        "tag": "a",
+                                                        "children": [
+                                                          {
+                                                            "text": "A"
+                                                          }
+                                                        ]
+                                                      }
+                                                    ]
+                                                  }
+                                                ]
+                                              }
+                                            ]
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a><b></b></a><b><div id=\"1\"><a></a><div id=\"2\"><a></a><div id=\"3\"><a></a><div id=\"4\"><a></a><div id=\"5\"><a></a><div id=\"6\"><a></a><div id=\"7\"><a></a><div id=\"8\"><a>A</a></div></div></div></div></div></div></div></div></b></body></html>",
+        "noQuirksBodyHtml": "<a><b></b></a><b><div id=\"1\"><a></a><div id=\"2\"><a></a><div id=\"3\"><a></a><div id=\"4\"><a></a><div id=\"5\"><a></a><div id=\"6\"><a></a><div id=\"7\"><a></a><div id=\"8\"><a>A</a></div></div></div></div></div></div></div></div></b>"
+      }
+    },
+    {
+      "data": "<a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8><div id=9>A</a>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,101): adoption-agency-1.3",
+        "(1,101): adoption-agency-1.3",
+        "(1,101): adoption-agency-1.3",
+        "(1,101): adoption-agency-1.3",
+        "(1,101): adoption-agency-1.3",
+        "(1,101): adoption-agency-1.3",
+        "(1,101): adoption-agency-1.3",
+        "(1,101): adoption-agency-1.3",
+        "(1,101): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "b": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "children": [
+                      {
+                        "tag": "b"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "div",
+                        "attrs": [
+                          {
+                            "name": "id",
+                            "value": "1"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "a"
+                          },
+                          {
+                            "tag": "div",
+                            "attrs": [
+                              {
+                                "name": "id",
+                                "value": "2"
+                              }
+                            ],
+                            "children": [
+                              {
+                                "tag": "a"
+                              },
+                              {
+                                "tag": "div",
+                                "attrs": [
+                                  {
+                                    "name": "id",
+                                    "value": "3"
+                                  }
+                                ],
+                                "children": [
+                                  {
+                                    "tag": "a"
+                                  },
+                                  {
+                                    "tag": "div",
+                                    "attrs": [
+                                      {
+                                        "name": "id",
+                                        "value": "4"
+                                      }
+                                    ],
+                                    "children": [
+                                      {
+                                        "tag": "a"
+                                      },
+                                      {
+                                        "tag": "div",
+                                        "attrs": [
+                                          {
+                                            "name": "id",
+                                            "value": "5"
+                                          }
+                                        ],
+                                        "children": [
+                                          {
+                                            "tag": "a"
+                                          },
+                                          {
+                                            "tag": "div",
+                                            "attrs": [
+                                              {
+                                                "name": "id",
+                                                "value": "6"
+                                              }
+                                            ],
+                                            "children": [
+                                              {
+                                                "tag": "a"
+                                              },
+                                              {
+                                                "tag": "div",
+                                                "attrs": [
+                                                  {
+                                                    "name": "id",
+                                                    "value": "7"
+                                                  }
+                                                ],
+                                                "children": [
+                                                  {
+                                                    "tag": "a"
+                                                  },
+                                                  {
+                                                    "tag": "div",
+                                                    "attrs": [
+                                                      {
+                                                        "name": "id",
+                                                        "value": "8"
+                                                      }
+                                                    ],
+                                                    "children": [
+                                                      {
+                                                        "tag": "a",
+                                                        "children": [
+                                                          {
+                                                            "tag": "div",
+                                                            "attrs": [
+                                                              {
+                                                                "name": "id",
+                                                                "value": "9"
+                                                              }
+                                                            ],
+                                                            "children": [
+                                                              {
+                                                                "text": "A"
+                                                              }
+                                                            ]
+                                                          }
+                                                        ]
+                                                      }
+                                                    ]
+                                                  }
+                                                ]
+                                              }
+                                            ]
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a><b></b></a><b><div id=\"1\"><a></a><div id=\"2\"><a></a><div id=\"3\"><a></a><div id=\"4\"><a></a><div id=\"5\"><a></a><div id=\"6\"><a></a><div id=\"7\"><a></a><div id=\"8\"><a><div id=\"9\">A</div></a></div></div></div></div></div></div></div></div></b></body></html>",
+        "noQuirksBodyHtml": "<a><b></b></a><b><div id=\"1\"><a></a><div id=\"2\"><a></a><div id=\"3\"><a></a><div id=\"4\"><a></a><div id=\"5\"><a></a><div id=\"6\"><a></a><div id=\"7\"><a></a><div id=\"8\"><a><div id=\"9\">A</div></a></div></div></div></div></div></div></div></div></b>"
+      }
+    },
+    {
+      "data": "<a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8><div id=9><div id=10>A</a>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,112): adoption-agency-1.3",
+        "(1,112): adoption-agency-1.3",
+        "(1,112): adoption-agency-1.3",
+        "(1,112): adoption-agency-1.3",
+        "(1,112): adoption-agency-1.3",
+        "(1,112): adoption-agency-1.3",
+        "(1,112): adoption-agency-1.3",
+        "(1,112): adoption-agency-1.3",
+        "(1,112): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "b": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "children": [
+                      {
+                        "tag": "b"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "div",
+                        "attrs": [
+                          {
+                            "name": "id",
+                            "value": "1"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "a"
+                          },
+                          {
+                            "tag": "div",
+                            "attrs": [
+                              {
+                                "name": "id",
+                                "value": "2"
+                              }
+                            ],
+                            "children": [
+                              {
+                                "tag": "a"
+                              },
+                              {
+                                "tag": "div",
+                                "attrs": [
+                                  {
+                                    "name": "id",
+                                    "value": "3"
+                                  }
+                                ],
+                                "children": [
+                                  {
+                                    "tag": "a"
+                                  },
+                                  {
+                                    "tag": "div",
+                                    "attrs": [
+                                      {
+                                        "name": "id",
+                                        "value": "4"
+                                      }
+                                    ],
+                                    "children": [
+                                      {
+                                        "tag": "a"
+                                      },
+                                      {
+                                        "tag": "div",
+                                        "attrs": [
+                                          {
+                                            "name": "id",
+                                            "value": "5"
+                                          }
+                                        ],
+                                        "children": [
+                                          {
+                                            "tag": "a"
+                                          },
+                                          {
+                                            "tag": "div",
+                                            "attrs": [
+                                              {
+                                                "name": "id",
+                                                "value": "6"
+                                              }
+                                            ],
+                                            "children": [
+                                              {
+                                                "tag": "a"
+                                              },
+                                              {
+                                                "tag": "div",
+                                                "attrs": [
+                                                  {
+                                                    "name": "id",
+                                                    "value": "7"
+                                                  }
+                                                ],
+                                                "children": [
+                                                  {
+                                                    "tag": "a"
+                                                  },
+                                                  {
+                                                    "tag": "div",
+                                                    "attrs": [
+                                                      {
+                                                        "name": "id",
+                                                        "value": "8"
+                                                      }
+                                                    ],
+                                                    "children": [
+                                                      {
+                                                        "tag": "a",
+                                                        "children": [
+                                                          {
+                                                            "tag": "div",
+                                                            "attrs": [
+                                                              {
+                                                                "name": "id",
+                                                                "value": "9"
+                                                              }
+                                                            ],
+                                                            "children": [
+                                                              {
+                                                                "tag": "div",
+                                                                "attrs": [
+                                                                  {
+                                                                    "name": "id",
+                                                                    "value": "10"
+                                                                  }
+                                                                ],
+                                                                "children": [
+                                                                  {
+                                                                    "text": "A"
+                                                                  }
+                                                                ]
+                                                              }
+                                                            ]
+                                                          }
+                                                        ]
+                                                      }
+                                                    ]
+                                                  }
+                                                ]
+                                              }
+                                            ]
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a><b></b></a><b><div id=\"1\"><a></a><div id=\"2\"><a></a><div id=\"3\"><a></a><div id=\"4\"><a></a><div id=\"5\"><a></a><div id=\"6\"><a></a><div id=\"7\"><a></a><div id=\"8\"><a><div id=\"9\"><div id=\"10\">A</div></div></a></div></div></div></div></div></div></div></div></b></body></html>",
+        "noQuirksBodyHtml": "<a><b></b></a><b><div id=\"1\"><a></a><div id=\"2\"><a></a><div id=\"3\"><a></a><div id=\"4\"><a></a><div id=\"5\"><a></a><div id=\"6\"><a></a><div id=\"7\"><a></a><div id=\"8\"><a><div id=\"9\"><div id=\"10\">A</div></div></a></div></div></div></div></div></div></div></div></b>"
+      }
+    },
+    {
+      "data": "<cite><b><cite><i><cite><i><cite><i><div>X</b>TEST",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,46): adoption-agency-1.3",
+        "(1,50): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "cite": true,
+            "b": true,
+            "i": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "cite",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "tag": "cite",
+                            "children": [
+                              {
+                                "tag": "i",
+                                "children": [
+                                  {
+                                    "tag": "cite",
+                                    "children": [
+                                      {
+                                        "tag": "i",
+                                        "children": [
+                                          {
+                                            "tag": "cite",
+                                            "children": [
+                                              {
+                                                "tag": "i"
+                                              }
+                                            ]
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "i",
+                        "children": [
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "tag": "div",
+                                "children": [
+                                  {
+                                    "tag": "b",
+                                    "children": [
+                                      {
+                                        "text": "X"
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "text": "TEST"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><cite><b><cite><i><cite><i><cite><i></i></cite></i></cite></i></cite></b><i><i><div><b>X</b>TEST</div></i></i></cite></body></html>",
+        "noQuirksBodyHtml": "<cite><b><cite><i><cite><i><cite><i></i></cite></i></cite></i></cite></b><i><i><div><b>X</b>TEST</div></i></i></cite>"
+      }
+    }
+  ],
+  "tests23.dat": [
+    {
+      "data": "<p><font size=4><font color=red><font size=4><font size=4><font size=4><font size=4><font size=4><font color=red><p>X",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,116): unexpected-end-tag",
+        "(1,117): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "font": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "font",
+                        "attrs": [
+                          {
+                            "name": "size",
+                            "value": "4"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "font",
+                            "attrs": [
+                              {
+                                "name": "color",
+                                "value": "red"
+                              }
+                            ],
+                            "children": [
+                              {
+                                "tag": "font",
+                                "attrs": [
+                                  {
+                                    "name": "size",
+                                    "value": "4"
+                                  }
+                                ],
+                                "children": [
+                                  {
+                                    "tag": "font",
+                                    "attrs": [
+                                      {
+                                        "name": "size",
+                                        "value": "4"
+                                      }
+                                    ],
+                                    "children": [
+                                      {
+                                        "tag": "font",
+                                        "attrs": [
+                                          {
+                                            "name": "size",
+                                            "value": "4"
+                                          }
+                                        ],
+                                        "children": [
+                                          {
+                                            "tag": "font",
+                                            "attrs": [
+                                              {
+                                                "name": "size",
+                                                "value": "4"
+                                              }
+                                            ],
+                                            "children": [
+                                              {
+                                                "tag": "font",
+                                                "attrs": [
+                                                  {
+                                                    "name": "size",
+                                                    "value": "4"
+                                                  }
+                                                ],
+                                                "children": [
+                                                  {
+                                                    "tag": "font",
+                                                    "attrs": [
+                                                      {
+                                                        "name": "color",
+                                                        "value": "red"
+                                                      }
+                                                    ]
+                                                  }
+                                                ]
+                                              }
+                                            ]
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "font",
+                        "attrs": [
+                          {
+                            "name": "color",
+                            "value": "red"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "font",
+                            "attrs": [
+                              {
+                                "name": "size",
+                                "value": "4"
+                              }
+                            ],
+                            "children": [
+                              {
+                                "tag": "font",
+                                "attrs": [
+                                  {
+                                    "name": "size",
+                                    "value": "4"
+                                  }
+                                ],
+                                "children": [
+                                  {
+                                    "tag": "font",
+                                    "attrs": [
+                                      {
+                                        "name": "size",
+                                        "value": "4"
+                                      }
+                                    ],
+                                    "children": [
+                                      {
+                                        "tag": "font",
+                                        "attrs": [
+                                          {
+                                            "name": "color",
+                                            "value": "red"
+                                          }
+                                        ],
+                                        "children": [
+                                          {
+                                            "text": "X"
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><p><font size=\"4\"><font color=\"red\"><font size=\"4\"><font size=\"4\"><font size=\"4\"><font size=\"4\"><font size=\"4\"><font color=\"red\"></font></font></font></font></font></font></font></font></p><p><font color=\"red\"><font size=\"4\"><font size=\"4\"><font size=\"4\"><font color=\"red\">X</font></font></font></font></font></p></body></html>",
+        "noQuirksBodyHtml": "<p><font size=\"4\"><font color=\"red\"><font size=\"4\"><font size=\"4\"><font size=\"4\"><font size=\"4\"><font size=\"4\"><font color=\"red\"></font></font></font></font></font></font></font></font></p><p><font color=\"red\"><font size=\"4\"><font size=\"4\"><font size=\"4\"><font color=\"red\">X</font></font></font></font></font></p>"
+      }
+    },
+    {
+      "data": "<p><font size=4><font size=4><font size=4><font size=4><p>X",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,58): unexpected-end-tag",
+        "(1,59): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "font": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "font",
+                        "attrs": [
+                          {
+                            "name": "size",
+                            "value": "4"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "font",
+                            "attrs": [
+                              {
+                                "name": "size",
+                                "value": "4"
+                              }
+                            ],
+                            "children": [
+                              {
+                                "tag": "font",
+                                "attrs": [
+                                  {
+                                    "name": "size",
+                                    "value": "4"
+                                  }
+                                ],
+                                "children": [
+                                  {
+                                    "tag": "font",
+                                    "attrs": [
+                                      {
+                                        "name": "size",
+                                        "value": "4"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "font",
+                        "attrs": [
+                          {
+                            "name": "size",
+                            "value": "4"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "font",
+                            "attrs": [
+                              {
+                                "name": "size",
+                                "value": "4"
+                              }
+                            ],
+                            "children": [
+                              {
+                                "tag": "font",
+                                "attrs": [
+                                  {
+                                    "name": "size",
+                                    "value": "4"
+                                  }
+                                ],
+                                "children": [
+                                  {
+                                    "text": "X"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><p><font size=\"4\"><font size=\"4\"><font size=\"4\"><font size=\"4\"></font></font></font></font></p><p><font size=\"4\"><font size=\"4\"><font size=\"4\">X</font></font></font></p></body></html>",
+        "noQuirksBodyHtml": "<p><font size=\"4\"><font size=\"4\"><font size=\"4\"><font size=\"4\"></font></font></font></font></p><p><font size=\"4\"><font size=\"4\"><font size=\"4\">X</font></font></font></p>"
+      }
+    },
+    {
+      "data": "<p><font size=4><font size=4><font size=4><font size=\"5\"><font size=4><p>X",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,73): unexpected-end-tag",
+        "(1,74): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "font": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "font",
+                        "attrs": [
+                          {
+                            "name": "size",
+                            "value": "4"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "font",
+                            "attrs": [
+                              {
+                                "name": "size",
+                                "value": "4"
+                              }
+                            ],
+                            "children": [
+                              {
+                                "tag": "font",
+                                "attrs": [
+                                  {
+                                    "name": "size",
+                                    "value": "4"
+                                  }
+                                ],
+                                "children": [
+                                  {
+                                    "tag": "font",
+                                    "attrs": [
+                                      {
+                                        "name": "size",
+                                        "value": "5"
+                                      }
+                                    ],
+                                    "children": [
+                                      {
+                                        "tag": "font",
+                                        "attrs": [
+                                          {
+                                            "name": "size",
+                                            "value": "4"
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "font",
+                        "attrs": [
+                          {
+                            "name": "size",
+                            "value": "4"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "font",
+                            "attrs": [
+                              {
+                                "name": "size",
+                                "value": "4"
+                              }
+                            ],
+                            "children": [
+                              {
+                                "tag": "font",
+                                "attrs": [
+                                  {
+                                    "name": "size",
+                                    "value": "5"
+                                  }
+                                ],
+                                "children": [
+                                  {
+                                    "tag": "font",
+                                    "attrs": [
+                                      {
+                                        "name": "size",
+                                        "value": "4"
+                                      }
+                                    ],
+                                    "children": [
+                                      {
+                                        "text": "X"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><p><font size=\"4\"><font size=\"4\"><font size=\"4\"><font size=\"5\"><font size=\"4\"></font></font></font></font></font></p><p><font size=\"4\"><font size=\"4\"><font size=\"5\"><font size=\"4\">X</font></font></font></font></p></body></html>",
+        "noQuirksBodyHtml": "<p><font size=\"4\"><font size=\"4\"><font size=\"4\"><font size=\"5\"><font size=\"4\"></font></font></font></font></font></p><p><font size=\"4\"><font size=\"4\"><font size=\"5\"><font size=\"4\">X</font></font></font></font></p>"
+      }
+    },
+    {
+      "data": "<p><font size=4 id=a><font size=4 id=b><font size=4><font size=4><p>X",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,68): unexpected-end-tag",
+        "(1,69): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "font": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "font",
+                        "attrs": [
+                          {
+                            "name": "id",
+                            "value": "a"
+                          },
+                          {
+                            "name": "size",
+                            "value": "4"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "font",
+                            "attrs": [
+                              {
+                                "name": "id",
+                                "value": "b"
+                              },
+                              {
+                                "name": "size",
+                                "value": "4"
+                              }
+                            ],
+                            "children": [
+                              {
+                                "tag": "font",
+                                "attrs": [
+                                  {
+                                    "name": "size",
+                                    "value": "4"
+                                  }
+                                ],
+                                "children": [
+                                  {
+                                    "tag": "font",
+                                    "attrs": [
+                                      {
+                                        "name": "size",
+                                        "value": "4"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "font",
+                        "attrs": [
+                          {
+                            "name": "id",
+                            "value": "a"
+                          },
+                          {
+                            "name": "size",
+                            "value": "4"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "font",
+                            "attrs": [
+                              {
+                                "name": "id",
+                                "value": "b"
+                              },
+                              {
+                                "name": "size",
+                                "value": "4"
+                              }
+                            ],
+                            "children": [
+                              {
+                                "tag": "font",
+                                "attrs": [
+                                  {
+                                    "name": "size",
+                                    "value": "4"
+                                  }
+                                ],
+                                "children": [
+                                  {
+                                    "tag": "font",
+                                    "attrs": [
+                                      {
+                                        "name": "size",
+                                        "value": "4"
+                                      }
+                                    ],
+                                    "children": [
+                                      {
+                                        "text": "X"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><p><font size=\"4\" id=\"a\"><font size=\"4\" id=\"b\"><font size=\"4\"><font size=\"4\"></font></font></font></font></p><p><font size=\"4\" id=\"a\"><font size=\"4\" id=\"b\"><font size=\"4\"><font size=\"4\">X</font></font></font></font></p></body></html>",
+        "noQuirksBodyHtml": "<p><font size=\"4\" id=\"a\"><font size=\"4\" id=\"b\"><font size=\"4\"><font size=\"4\"></font></font></font></font></p><p><font size=\"4\" id=\"a\"><font size=\"4\" id=\"b\"><font size=\"4\"><font size=\"4\">X</font></font></font></font></p>"
+      }
+    },
+    {
+      "data": "<p><b id=a><b id=a><b id=a><b><object><b id=a><b id=a>X</object><p>Y",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,64): end-tag-too-early",
+        "(1,67): unexpected-end-tag",
+        "(1,68): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "b": true,
+            "object": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "attrs": [
+                          {
+                            "name": "id",
+                            "value": "a"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "b",
+                            "attrs": [
+                              {
+                                "name": "id",
+                                "value": "a"
+                              }
+                            ],
+                            "children": [
+                              {
+                                "tag": "b",
+                                "attrs": [
+                                  {
+                                    "name": "id",
+                                    "value": "a"
+                                  }
+                                ],
+                                "children": [
+                                  {
+                                    "tag": "b",
+                                    "children": [
+                                      {
+                                        "tag": "object",
+                                        "children": [
+                                          {
+                                            "tag": "b",
+                                            "attrs": [
+                                              {
+                                                "name": "id",
+                                                "value": "a"
+                                              }
+                                            ],
+                                            "children": [
+                                              {
+                                                "tag": "b",
+                                                "attrs": [
+                                                  {
+                                                    "name": "id",
+                                                    "value": "a"
+                                                  }
+                                                ],
+                                                "children": [
+                                                  {
+                                                    "text": "X"
+                                                  }
+                                                ]
+                                              }
+                                            ]
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "attrs": [
+                          {
+                            "name": "id",
+                            "value": "a"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "b",
+                            "attrs": [
+                              {
+                                "name": "id",
+                                "value": "a"
+                              }
+                            ],
+                            "children": [
+                              {
+                                "tag": "b",
+                                "attrs": [
+                                  {
+                                    "name": "id",
+                                    "value": "a"
+                                  }
+                                ],
+                                "children": [
+                                  {
+                                    "tag": "b",
+                                    "children": [
+                                      {
+                                        "text": "Y"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><p><b id=\"a\"><b id=\"a\"><b id=\"a\"><b><object><b id=\"a\"><b id=\"a\">X</b></b></object></b></b></b></b></p><p><b id=\"a\"><b id=\"a\"><b id=\"a\"><b>Y</b></b></b></b></p></body></html>",
+        "noQuirksBodyHtml": "<p><b id=\"a\"><b id=\"a\"><b id=\"a\"><b><object><b id=\"a\"><b id=\"a\">X</b></b></object></b></b></b></b></p><p><b id=\"a\"><b id=\"a\"><b id=\"a\"><b>Y</b></b></b></b></p>"
+      }
+    }
+  ],
+  "tests24.dat": [
+    {
+      "data": "<!DOCTYPE html>&NotEqualTilde;",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "≂̸"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>≂̸</body></html>",
+        "noQuirksBodyHtml": "≂̸"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html>&NotEqualTilde;A",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "≂̸A"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>≂̸A</body></html>",
+        "noQuirksBodyHtml": "≂̸A"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html>&ThickSpace;",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "  "
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>  </body></html>",
+        "noQuirksBodyHtml": "  "
+      }
+    },
+    {
+      "data": "<!DOCTYPE html>&ThickSpace;A",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "  A"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>  A</body></html>",
+        "noQuirksBodyHtml": "  A"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html>&NotSubset;",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "⊂⃒"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>⊂⃒</body></html>",
+        "noQuirksBodyHtml": "⊂⃒"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html>&NotSubset;A",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "⊂⃒A"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>⊂⃒A</body></html>",
+        "noQuirksBodyHtml": "⊂⃒A"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html>&Gopf;",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "𝔾"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>𝔾</body></html>",
+        "noQuirksBodyHtml": "𝔾"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html>&Gopf;A",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "𝔾A"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>𝔾A</body></html>",
+        "noQuirksBodyHtml": "𝔾A"
+      }
+    }
+  ],
+  "tests25.dat": [
+    {
+      "data": "<!DOCTYPE html><body><foo>A",
+      "errors": [
+        "(1,27): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "foo": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "foo",
+                    "children": [
+                      {
+                        "text": "A"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><foo>A</foo></body></html>",
+        "noQuirksBodyHtml": "<foo>A</foo>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><area>A",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "area": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "area"
+                  },
+                  {
+                    "text": "A"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><area>A</body></html>",
+        "noQuirksBodyHtml": "<area>A"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><base>A",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "base": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "base"
+                  },
+                  {
+                    "text": "A"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><base>A</body></html>",
+        "noQuirksBodyHtml": "<base>A"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><basefont>A",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "basefont": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "basefont"
+                  },
+                  {
+                    "text": "A"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><basefont>A</body></html>",
+        "noQuirksBodyHtml": "<basefont>A"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><bgsound>A",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "bgsound": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "bgsound"
+                  },
+                  {
+                    "text": "A"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><bgsound>A</body></html>",
+        "noQuirksBodyHtml": "<bgsound>A"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><br>A",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "br": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "br"
+                  },
+                  {
+                    "text": "A"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><br>A</body></html>",
+        "noQuirksBodyHtml": "<br>A"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><col>A",
+      "errors": [
+        "(1,26): unexpected-start-tag-ignored"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "A"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>A</body></html>",
+        "noQuirksBodyHtml": "A"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><command>A",
+      "errors": [
+        "eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "command": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "command",
+                    "children": [
+                      {
+                        "text": "A"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><command>A</command></body></html>",
+        "noQuirksBodyHtml": "<command>A</command>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><menuitem>A",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem"
+                  },
+                  {
+                    "text": "A"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><menuitem>A</body></html>",
+        "noQuirksBodyHtml": "<menuitem>A"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><embed>A",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "embed": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "embed"
+                  },
+                  {
+                    "text": "A"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><embed>A</body></html>",
+        "noQuirksBodyHtml": "<embed>A"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><frame>A",
+      "errors": [
+        "(1,28): unexpected-start-tag-ignored"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "A"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>A</body></html>",
+        "noQuirksBodyHtml": "A"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><hr>A",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "hr": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "hr"
+                  },
+                  {
+                    "text": "A"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><hr>A</body></html>",
+        "noQuirksBodyHtml": "<hr>A"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><img>A",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "img": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "img"
+                  },
+                  {
+                    "text": "A"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><img>A</body></html>",
+        "noQuirksBodyHtml": "<img>A"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><input>A",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "input": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "input"
+                  },
+                  {
+                    "text": "A"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><input>A</body></html>",
+        "noQuirksBodyHtml": "<input>A"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><keygen>A",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "keygen": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "keygen"
+                  },
+                  {
+                    "text": "A"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><keygen>A</body></html>",
+        "noQuirksBodyHtml": "<keygen>A"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><link>A",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "link": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "link"
+                  },
+                  {
+                    "text": "A"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><link>A</body></html>",
+        "noQuirksBodyHtml": "<link>A"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><meta>A",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "meta": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "meta"
+                  },
+                  {
+                    "text": "A"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><meta>A</body></html>",
+        "noQuirksBodyHtml": "<meta>A"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><param>A",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "param": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "param"
+                  },
+                  {
+                    "text": "A"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><param>A</body></html>",
+        "noQuirksBodyHtml": "<param>A"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><source>A",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "source": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "source"
+                  },
+                  {
+                    "text": "A"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><source>A</body></html>",
+        "noQuirksBodyHtml": "<source>A"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><track>A",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "track": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "track"
+                  },
+                  {
+                    "text": "A"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><track>A</body></html>",
+        "noQuirksBodyHtml": "<track>A"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><wbr>A",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "wbr": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "wbr"
+                  },
+                  {
+                    "text": "A"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><wbr>A</body></html>",
+        "noQuirksBodyHtml": "<wbr>A"
+      }
+    }
+  ],
+  "tests26.dat": [
+    {
+      "data": "<!DOCTYPE html><body><a href='#1'><nobr>1<nobr></a><br><a href='#2'><nobr>2<nobr></a><br><a href='#3'><nobr>3<nobr></a>",
+      "errors": [
+        "(1,47): unexpected-start-tag-implies-end-tag",
+        "(1,51): adoption-agency-1.3",
+        "(1,74): unexpected-start-tag-implies-end-tag",
+        "(1,74): adoption-agency-1.3",
+        "(1,81): unexpected-start-tag-implies-end-tag",
+        "(1,85): adoption-agency-1.3",
+        "(1,108): unexpected-start-tag-implies-end-tag",
+        "(1,108): adoption-agency-1.3",
+        "(1,115): unexpected-start-tag-implies-end-tag",
+        "(1,119): adoption-agency-1.3"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "nobr": true,
+            "br": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "attrs": [
+                      {
+                        "name": "href",
+                        "value": "#1"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "tag": "nobr",
+                        "children": [
+                          {
+                            "text": "1"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "nobr"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "nobr",
+                    "children": [
+                      {
+                        "tag": "br"
+                      },
+                      {
+                        "tag": "a",
+                        "attrs": [
+                          {
+                            "name": "href",
+                            "value": "#2"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "a",
+                    "attrs": [
+                      {
+                        "name": "href",
+                        "value": "#2"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "tag": "nobr",
+                        "children": [
+                          {
+                            "text": "2"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "nobr"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "nobr",
+                    "children": [
+                      {
+                        "tag": "br"
+                      },
+                      {
+                        "tag": "a",
+                        "attrs": [
+                          {
+                            "name": "href",
+                            "value": "#3"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "a",
+                    "attrs": [
+                      {
+                        "name": "href",
+                        "value": "#3"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "tag": "nobr",
+                        "children": [
+                          {
+                            "text": "3"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "nobr"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><a href=\"#1\"><nobr>1</nobr><nobr></nobr></a><nobr><br><a href=\"#2\"></a></nobr><a href=\"#2\"><nobr>2</nobr><nobr></nobr></a><nobr><br><a href=\"#3\"></a></nobr><a href=\"#3\"><nobr>3</nobr><nobr></nobr></a></body></html>",
+        "noQuirksBodyHtml": "<a href=\"#1\"><nobr>1</nobr><nobr></nobr></a><nobr><br><a href=\"#2\"></a></nobr><a href=\"#2\"><nobr>2</nobr><nobr></nobr></a><nobr><br><a href=\"#3\"></a></nobr><a href=\"#3\"><nobr>3</nobr><nobr></nobr></a>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><b><nobr>1<nobr></b><i><nobr>2<nobr></i>3",
+      "errors": [
+        "(1,37): unexpected-start-tag-implies-end-tag",
+        "(1,41): adoption-agency-1.3",
+        "(1,50): unexpected-start-tag-implies-end-tag",
+        "(1,50): adoption-agency-1.3",
+        "(1,57): unexpected-start-tag-implies-end-tag",
+        "(1,61): adoption-agency-1.3",
+        "(1,62): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "nobr": true,
+            "i": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "nobr",
+                        "children": [
+                          {
+                            "text": "1"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "nobr"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "nobr",
+                    "children": [
+                      {
+                        "tag": "i"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "i",
+                    "children": [
+                      {
+                        "tag": "nobr",
+                        "children": [
+                          {
+                            "text": "2"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "nobr"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "nobr",
+                    "children": [
+                      {
+                        "text": "3"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><b><nobr>1</nobr><nobr></nobr></b><nobr><i></i></nobr><i><nobr>2</nobr><nobr></nobr></i><nobr>3</nobr></body></html>",
+        "noQuirksBodyHtml": "<b><nobr>1</nobr><nobr></nobr></b><nobr><i></i></nobr><i><nobr>2</nobr><nobr></nobr></i><nobr>3</nobr>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><b><nobr>1<table><nobr></b><i><nobr>2<nobr></i>3",
+      "errors": [
+        "(1,44): foster-parenting-start-tag",
+        "(1,48): foster-parenting-end-tag",
+        "(1,48): adoption-agency-1.3",
+        "(1,51): foster-parenting-start-tag",
+        "(1,57): foster-parenting-start-tag",
+        "(1,57): nobr-already-in-scope",
+        "(1,57): adoption-agency-1.2",
+        "(1,58): foster-parenting-character",
+        "(1,64): foster-parenting-start-tag",
+        "(1,64): nobr-already-in-scope",
+        "(1,68): foster-parenting-end-tag",
+        "(1,68): adoption-agency-1.2",
+        "(1,69): foster-parenting-character",
+        "(1,69): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "nobr": true,
+            "i": true,
+            "table": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "nobr",
+                        "children": [
+                          {
+                            "text": "1"
+                          },
+                          {
+                            "tag": "nobr",
+                            "children": [
+                              {
+                                "tag": "i"
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "tag": "nobr",
+                                "children": [
+                                  {
+                                    "text": "2"
+                                  }
+                                ]
+                              },
+                              {
+                                "tag": "nobr"
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "nobr",
+                            "children": [
+                              {
+                                "text": "3"
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "table"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><b><nobr>1<nobr><i></i></nobr><i><nobr>2</nobr><nobr></nobr></i><nobr>3</nobr><table></table></nobr></b></body></html>",
+        "noQuirksBodyHtml": "<b><nobr>1<nobr><i></i></nobr><i><nobr>2</nobr><nobr></nobr></i><nobr>3</nobr><table></table></nobr></b>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><b><nobr>1<table><tr><td><nobr></b><i><nobr>2<nobr></i>3",
+      "errors": [
+        "(1,56): unexpected-end-tag",
+        "(1,65): unexpected-start-tag-implies-end-tag",
+        "(1,65): adoption-agency-1.3",
+        "(1,72): unexpected-start-tag-implies-end-tag",
+        "(1,76): adoption-agency-1.3",
+        "(1,77): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "nobr": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "i": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "nobr",
+                        "children": [
+                          {
+                            "text": "1"
+                          },
+                          {
+                            "tag": "table",
+                            "children": [
+                              {
+                                "tag": "tbody",
+                                "children": [
+                                  {
+                                    "tag": "tr",
+                                    "children": [
+                                      {
+                                        "tag": "td",
+                                        "children": [
+                                          {
+                                            "tag": "nobr",
+                                            "children": [
+                                              {
+                                                "tag": "i"
+                                              }
+                                            ]
+                                          },
+                                          {
+                                            "tag": "i",
+                                            "children": [
+                                              {
+                                                "tag": "nobr",
+                                                "children": [
+                                                  {
+                                                    "text": "2"
+                                                  }
+                                                ]
+                                              },
+                                              {
+                                                "tag": "nobr"
+                                              }
+                                            ]
+                                          },
+                                          {
+                                            "tag": "nobr",
+                                            "children": [
+                                              {
+                                                "text": "3"
+                                              }
+                                            ]
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><b><nobr>1<table><tbody><tr><td><nobr><i></i></nobr><i><nobr>2</nobr><nobr></nobr></i><nobr>3</nobr></td></tr></tbody></table></nobr></b></body></html>",
+        "noQuirksBodyHtml": "<b><nobr>1<table><tbody><tr><td><nobr><i></i></nobr><i><nobr>2</nobr><nobr></nobr></i><nobr>3</nobr></td></tr></tbody></table></nobr></b>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><b><nobr>1<div><nobr></b><i><nobr>2<nobr></i>3",
+      "errors": [
+        "(1,42): unexpected-start-tag-implies-end-tag",
+        "(1,42): adoption-agency-1.3",
+        "(1,46): adoption-agency-1.3",
+        "(1,46): adoption-agency-1.3",
+        "(1,55): unexpected-start-tag-implies-end-tag",
+        "(1,55): adoption-agency-1.3",
+        "(1,62): unexpected-start-tag-implies-end-tag",
+        "(1,66): adoption-agency-1.3",
+        "(1,67): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "nobr": true,
+            "div": true,
+            "i": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "nobr",
+                        "children": [
+                          {
+                            "text": "1"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "tag": "nobr"
+                          },
+                          {
+                            "tag": "nobr"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "nobr",
+                        "children": [
+                          {
+                            "tag": "i"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "i",
+                        "children": [
+                          {
+                            "tag": "nobr",
+                            "children": [
+                              {
+                                "text": "2"
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "nobr"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "nobr",
+                        "children": [
+                          {
+                            "text": "3"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><b><nobr>1</nobr></b><div><b><nobr></nobr><nobr></nobr></b><nobr><i></i></nobr><i><nobr>2</nobr><nobr></nobr></i><nobr>3</nobr></div></body></html>",
+        "noQuirksBodyHtml": "<b><nobr>1</nobr></b><div><b><nobr></nobr><nobr></nobr></b><nobr><i></i></nobr><i><nobr>2</nobr><nobr></nobr></i><nobr>3</nobr></div>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><b><nobr>1<nobr></b><div><i><nobr>2<nobr></i>3",
+      "errors": [
+        "(1,37): unexpected-start-tag-implies-end-tag",
+        "(1,41): adoption-agency-1.3",
+        "(1,55): unexpected-start-tag-implies-end-tag",
+        "(1,55): adoption-agency-1.3",
+        "(1,62): unexpected-start-tag-implies-end-tag",
+        "(1,66): adoption-agency-1.3",
+        "(1,67): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "nobr": true,
+            "div": true,
+            "i": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "nobr",
+                        "children": [
+                          {
+                            "text": "1"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "nobr"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "nobr",
+                        "children": [
+                          {
+                            "tag": "i"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "i",
+                        "children": [
+                          {
+                            "tag": "nobr",
+                            "children": [
+                              {
+                                "text": "2"
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "nobr"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "nobr",
+                        "children": [
+                          {
+                            "text": "3"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><b><nobr>1</nobr><nobr></nobr></b><div><nobr><i></i></nobr><i><nobr>2</nobr><nobr></nobr></i><nobr>3</nobr></div></body></html>",
+        "noQuirksBodyHtml": "<b><nobr>1</nobr><nobr></nobr></b><div><nobr><i></i></nobr><i><nobr>2</nobr><nobr></nobr></i><nobr>3</nobr></div>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><b><nobr>1<nobr><ins></b><i><nobr>",
+      "errors": [
+        "(1,37): unexpected-start-tag-implies-end-tag",
+        "(1,46): adoption-agency-1.3",
+        "(1,55): unexpected-start-tag-implies-end-tag",
+        "(1,55): adoption-agency-1.3",
+        "(1,55): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "nobr": true,
+            "ins": true,
+            "i": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "nobr",
+                        "children": [
+                          {
+                            "text": "1"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "nobr",
+                        "children": [
+                          {
+                            "tag": "ins"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "nobr",
+                    "children": [
+                      {
+                        "tag": "i"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "i",
+                    "children": [
+                      {
+                        "tag": "nobr"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><b><nobr>1</nobr><nobr><ins></ins></nobr></b><nobr><i></i></nobr><i><nobr></nobr></i></body></html>",
+        "noQuirksBodyHtml": "<b><nobr>1</nobr><nobr><ins></ins></nobr></b><nobr><i></i></nobr><i><nobr></nobr></i>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><b><nobr>1<ins><nobr></b><i>2",
+      "errors": [
+        "(1,42): unexpected-start-tag-implies-end-tag",
+        "(1,42): adoption-agency-1.3",
+        "(1,46): adoption-agency-1.3",
+        "(1,50): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "nobr": true,
+            "ins": true,
+            "i": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "nobr",
+                        "children": [
+                          {
+                            "text": "1"
+                          },
+                          {
+                            "tag": "ins"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "nobr"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "nobr",
+                    "children": [
+                      {
+                        "tag": "i",
+                        "children": [
+                          {
+                            "text": "2"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><b><nobr>1<ins></ins></nobr><nobr></nobr></b><nobr><i>2</i></nobr></body></html>",
+        "noQuirksBodyHtml": "<b><nobr>1<ins></ins></nobr><nobr></nobr></b><nobr><i>2</i></nobr>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><b>1<nobr></b><i><nobr>2</i>",
+      "errors": [
+        "(1,35): adoption-agency-1.3",
+        "(1,44): unexpected-start-tag-implies-end-tag",
+        "(1,44): adoption-agency-1.3",
+        "(1,49): adoption-agency-1.3"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "nobr": true,
+            "i": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "text": "1"
+                      },
+                      {
+                        "tag": "nobr"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "nobr",
+                    "children": [
+                      {
+                        "tag": "i"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "i",
+                    "children": [
+                      {
+                        "tag": "nobr",
+                        "children": [
+                          {
+                            "text": "2"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><b>1<nobr></nobr></b><nobr><i></i></nobr><i><nobr>2</nobr></i></body></html>",
+        "noQuirksBodyHtml": "<b>1<nobr></nobr></b><nobr><i></i></nobr><i><nobr>2</nobr></i>"
+      }
+    },
+    {
+      "data": "<p><code x</code></p>\n",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,11): invalid-character-in-attribute-name",
+        "(1,12): unexpected-character-after-solidus-in-tag",
+        "(1,21): unexpected-end-tag",
+        "(2,0): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "code": true
+          },
+          "attrWithFunnyChar": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "code",
+                        "attrs": [
+                          {
+                            "name": "code",
+                            "value": ""
+                          },
+                          {
+                            "name": "x<",
+                            "value": ""
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "code",
+                    "attrs": [
+                      {
+                        "name": "code",
+                        "value": ""
+                      },
+                      {
+                        "name": "x<",
+                        "value": ""
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "\n"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><p><code x<=\"\" code=\"\"></code></p><code x<=\"\" code=\"\">\n</code></body></html>",
+        "noQuirksBodyHtml": "<p><code x<=\"\" code=\"\"></code></p><code x<=\"\" code=\"\">\n</code>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><svg><foreignObject><p><i></p>a",
+      "errors": [
+        "(1,45): unexpected-end-tag",
+        "(1,46): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg foreignObject": true,
+            "p": true,
+            "i": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "foreignObject",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "tag": "p",
+                            "children": [
+                              {
+                                "tag": "i"
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "text": "a"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg><foreignObject><p><i></i></p><i>a</i></foreignObject></svg></body></html>",
+        "noQuirksBodyHtml": "<svg><foreignObject><p><i></i></p><i>a</i></foreignObject></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><table><tr><td><svg><foreignObject><p><i></p>a",
+      "errors": [
+        "(1,60): unexpected-end-tag",
+        "(1,61): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "svg svg": true,
+            "svg foreignObject": true,
+            "p": true,
+            "i": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "svg",
+                                    "ns": "http://www.w3.org/2000/svg",
+                                    "children": [
+                                      {
+                                        "tag": "foreignObject",
+                                        "ns": "http://www.w3.org/2000/svg",
+                                        "children": [
+                                          {
+                                            "tag": "p",
+                                            "children": [
+                                              {
+                                                "tag": "i"
+                                              }
+                                            ]
+                                          },
+                                          {
+                                            "tag": "i",
+                                            "children": [
+                                              {
+                                                "text": "a"
+                                              }
+                                            ]
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><svg><foreignObject><p><i></i></p><i>a</i></foreignObject></svg></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td><svg><foreignObject><p><i></i></p><i>a</i></foreignObject></svg></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><math><mtext><p><i></p>a",
+      "errors": [
+        "(1,38): unexpected-end-tag",
+        "(1,39): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mtext": true,
+            "p": true,
+            "i": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mtext",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "p",
+                            "children": [
+                              {
+                                "tag": "i"
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "text": "a"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math><mtext><p><i></i></p><i>a</i></mtext></math></body></html>",
+        "noQuirksBodyHtml": "<math><mtext><p><i></i></p><i>a</i></mtext></math>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><table><tr><td><math><mtext><p><i></p>a",
+      "errors": [
+        "(1,53): unexpected-end-tag",
+        "(1,54): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "math math": true,
+            "math mtext": true,
+            "p": true,
+            "i": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "math",
+                                    "ns": "http://www.w3.org/1998/Math/MathML",
+                                    "children": [
+                                      {
+                                        "tag": "mtext",
+                                        "ns": "http://www.w3.org/1998/Math/MathML",
+                                        "children": [
+                                          {
+                                            "tag": "p",
+                                            "children": [
+                                              {
+                                                "tag": "i"
+                                              }
+                                            ]
+                                          },
+                                          {
+                                            "tag": "i",
+                                            "children": [
+                                              {
+                                                "text": "a"
+                                              }
+                                            ]
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><math><mtext><p><i></i></p><i>a</i></mtext></math></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td><math><mtext><p><i></i></p><i>a</i></mtext></math></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><div><!/div>a",
+      "errors": [
+        "(1,28): expected-dashes-or-doctype",
+        "(1,34): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          },
+          "doctype": true,
+          "comment": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "comment": "/div"
+                      },
+                      {
+                        "text": "a"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><div><!--/div-->a</div></body></html>",
+        "noQuirksBodyHtml": "<div><!--/div-->a</div>"
+      }
+    },
+    {
+      "data": "<button><p><button>",
+      "errors": [
+        "Line 1 Col 8 Unexpected start tag (button). Expected DOCTYPE.",
+        "Line 1 Col 19 Unexpected start tag (button) implies end tag (button).",
+        "Line 1 Col 19 Expected closing tag. Unexpected end of file."
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "button": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "button",
+                    "children": [
+                      {
+                        "tag": "p"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "button"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><button><p></p></button><button></button></body></html>",
+        "noQuirksBodyHtml": "<button><p></p></button><button></button>"
+      }
+    }
+  ],
+  "tests3.dat": [
+    {
+      "data": "<head></head><style></style>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,20): unexpected-start-tag-out-of-my-head"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style"
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><style></style></head><body></body></html>",
+        "noQuirksBodyHtml": "<style></style>"
+      }
+    },
+    {
+      "data": "<head></head><script></script>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,21): unexpected-start-tag-out-of-my-head"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script"
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script></script></head><body></body></html>",
+        "noQuirksBodyHtml": "<script></script>"
+      }
+    },
+    {
+      "data": "<head></head><!-- --><style></style><!-- --><script></script>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,28): unexpected-start-tag-out-of-my-head",
+        "(1,52): unexpected-start-tag-out-of-my-head"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "script": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style"
+                  },
+                  {
+                    "tag": "script"
+                  }
+                ]
+              },
+              {
+                "comment": " "
+              },
+              {
+                "comment": " "
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><style></style><script></script></head><!-- --><!-- --><body></body></html>",
+        "noQuirksBodyHtml": "<!-- --><style></style><!-- --><script></script>"
+      }
+    },
+    {
+      "data": "<head></head><!-- -->x<style></style><!-- --><script></script>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "style": true,
+            "script": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "comment": " "
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "x"
+                  },
+                  {
+                    "tag": "style"
+                  },
+                  {
+                    "comment": " "
+                  },
+                  {
+                    "tag": "script"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><!-- --><body>x<style></style><!-- --><script></script></body></html>",
+        "noQuirksBodyHtml": "<!-- -->x<style></style><!-- --><script></script>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><html><head></head><body><pre>\n</pre></body></html>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "pre": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "pre"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><pre></pre></body></html>",
+        "noQuirksBodyHtml": "<pre></pre>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><html><head></head><body><pre>\nfoo</pre></body></html>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "pre": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "pre",
+                    "children": [
+                      {
+                        "text": "foo"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><pre>foo</pre></body></html>",
+        "noQuirksBodyHtml": "<pre>foo</pre>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><html><head></head><body><pre>\n\nfoo</pre></body></html>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "pre": true
+          },
+          "doctype": true,
+          "extraNL": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "pre",
+                    "children": [
+                      {
+                        "text": "\nfoo",
+                        "extraNL": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><pre>\n\nfoo</pre></body></html>",
+        "noQuirksBodyHtml": "<pre>\n\nfoo</pre>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><html><head></head><body><pre>\nfoo\n</pre></body></html>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "pre": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "pre",
+                    "children": [
+                      {
+                        "text": "foo\n"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><pre>foo\n</pre></body></html>",
+        "noQuirksBodyHtml": "<pre>foo\n</pre>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><html><head></head><body><pre>x</pre><span>\n</span></body></html>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "pre": true,
+            "span": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "pre",
+                    "children": [
+                      {
+                        "text": "x"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "span",
+                    "children": [
+                      {
+                        "text": "\n"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><pre>x</pre><span>\n</span></body></html>",
+        "noQuirksBodyHtml": "<pre>x</pre><span>\n</span>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><html><head></head><body><pre>x\ny</pre></body></html>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "pre": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "pre",
+                    "children": [
+                      {
+                        "text": "x\ny"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><pre>x\ny</pre></body></html>",
+        "noQuirksBodyHtml": "<pre>x\ny</pre>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><html><head></head><body><pre>x<div>\ny</pre></body></html>",
+      "errors": [
+        "(2,7): end-tag-too-early"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "pre": true,
+            "div": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "pre",
+                    "children": [
+                      {
+                        "text": "x"
+                      },
+                      {
+                        "tag": "div",
+                        "children": [
+                          {
+                            "text": "\ny"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><pre>x<div>\ny</div></pre></body></html>",
+        "noQuirksBodyHtml": "<pre>x<div>\ny</div></pre>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><pre>&#x0a;&#x0a;A</pre>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "pre": true
+          },
+          "doctype": true,
+          "extraNL": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "pre",
+                    "children": [
+                      {
+                        "text": "\nA",
+                        "extraNL": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><pre>\n\nA</pre></body></html>",
+        "noQuirksBodyHtml": "<pre>\n\nA</pre>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><HTML><META><HEAD></HEAD></HTML>",
+      "errors": [
+        "(1,33): two-heads-are-not-better-than-one"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "meta": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "meta"
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><meta></head><body></body></html>",
+        "noQuirksBodyHtml": "<meta>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><HTML><HEAD><head></HEAD></HTML>",
+      "errors": [
+        "(1,33): two-heads-are-not-better-than-one"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<textarea>foo<span>bar</span><i>baz",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag",
+        "(1,35): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "textarea": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "textarea",
+                    "children": [
+                      {
+                        "text": "foo<span>bar</span><i>baz",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><textarea>foo&lt;span&gt;bar&lt;/span&gt;&lt;i&gt;baz</textarea></body></html>",
+        "noQuirksBodyHtml": "<textarea>foo&lt;span&gt;bar&lt;/span&gt;&lt;i&gt;baz</textarea>"
+      }
+    },
+    {
+      "data": "<title>foo<span>bar</em><i>baz",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,30): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "title": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "foo<span>bar</em><i>baz",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><title>foo&lt;span&gt;bar&lt;/em&gt;&lt;i&gt;baz</title></head><body></body></html>",
+        "noQuirksBodyHtml": "<title>foo&lt;span&gt;bar&lt;/em&gt;&lt;i&gt;baz</title>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><textarea>\n</textarea>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "textarea": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "textarea"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><textarea></textarea></body></html>",
+        "noQuirksBodyHtml": "<textarea></textarea>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><textarea>\nfoo</textarea>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "textarea": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "textarea",
+                    "children": [
+                      {
+                        "text": "foo"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><textarea>foo</textarea></body></html>",
+        "noQuirksBodyHtml": "<textarea>foo</textarea>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><textarea>\n\nfoo</textarea>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "textarea": true
+          },
+          "doctype": true,
+          "extraNL": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "textarea",
+                    "children": [
+                      {
+                        "text": "\nfoo",
+                        "extraNL": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><textarea>\n\nfoo</textarea></body></html>",
+        "noQuirksBodyHtml": "<textarea>\n\nfoo</textarea>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><html><head></head><body><ul><li><div><p><li></ul></body></html>",
+      "errors": [
+        "(1,60): end-tag-too-early"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ul": true,
+            "li": true,
+            "div": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ul",
+                    "children": [
+                      {
+                        "tag": "li",
+                        "children": [
+                          {
+                            "tag": "div",
+                            "children": [
+                              {
+                                "tag": "p"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "li"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><ul><li><div><p></p></div></li><li></li></ul></body></html>",
+        "noQuirksBodyHtml": "<ul><li><div><p></p></div></li><li></li></ul>"
+      }
+    },
+    {
+      "data": "<!doctype html><nobr><nobr><nobr>",
+      "errors": [
+        "(1,27): unexpected-start-tag-implies-end-tag",
+        "(1,33): unexpected-start-tag-implies-end-tag",
+        "(1,33): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "nobr": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "nobr"
+                  },
+                  {
+                    "tag": "nobr"
+                  },
+                  {
+                    "tag": "nobr"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><nobr></nobr><nobr></nobr><nobr></nobr></body></html>",
+        "noQuirksBodyHtml": "<nobr></nobr><nobr></nobr><nobr></nobr>"
+      }
+    },
+    {
+      "data": "<!doctype html><nobr><nobr></nobr><nobr>",
+      "errors": [
+        "(1,27): unexpected-start-tag-implies-end-tag",
+        "(1,40): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "nobr": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "nobr"
+                  },
+                  {
+                    "tag": "nobr"
+                  },
+                  {
+                    "tag": "nobr"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><nobr></nobr><nobr></nobr><nobr></nobr></body></html>",
+        "noQuirksBodyHtml": "<nobr></nobr><nobr></nobr><nobr></nobr>"
+      }
+    },
+    {
+      "data": "<!doctype html><html><body><p><table></table></body></html>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "table": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p"
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p></p><table></table></body></html>",
+        "noQuirksBodyHtml": "<p></p><table></table>"
+      }
+    },
+    {
+      "data": "<p><table></table>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "table": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "table"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><p><table></table></p></body></html>",
+        "noQuirksBodyHtml": "<p></p><table></table>"
+      }
+    }
+  ],
+  "tests4.dat": [
+    {
+      "data": "direct div content",
+      "errors": [],
+      "fragment": {
+        "name": "div"
+      },
+      "document": {
+        "props": {
+          "tags": {}
+        },
+        "tree": [
+          {
+            "text": "direct div content"
+          }
+        ],
+        "html": "direct div content",
+        "noQuirksBodyHtml": "direct div content"
+      }
+    },
+    {
+      "data": "direct textarea content",
+      "errors": [],
+      "fragment": {
+        "name": "textarea"
+      },
+      "document": {
+        "props": {
+          "tags": {}
+        },
+        "tree": [
+          {
+            "text": "direct textarea content"
+          }
+        ],
+        "html": "direct textarea content",
+        "noQuirksBodyHtml": "direct textarea content"
+      }
+    },
+    {
+      "data": "textarea content with <em>pseudo</em> <foo>markup",
+      "errors": [],
+      "fragment": {
+        "name": "textarea"
+      },
+      "document": {
+        "props": {
+          "tags": {},
+          "escaped": true
+        },
+        "tree": [
+          {
+            "text": "textarea content with <em>pseudo</em> <foo>markup",
+            "escaped": true
+          }
+        ],
+        "html": "textarea content with &lt;em&gt;pseudo&lt;/em&gt; &lt;foo&gt;markup",
+        "noQuirksBodyHtml": "textarea content with <em>pseudo</em> <foo>markup</foo>"
+      }
+    },
+    {
+      "data": "this is &#x0043;DATA inside a <style> element",
+      "errors": [],
+      "fragment": {
+        "name": "style"
+      },
+      "document": {
+        "props": {
+          "tags": {},
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "text": "this is &#x0043;DATA inside a <style> element",
+            "no_escape": true
+          }
+        ],
+        "html": "this is &#x0043;DATA inside a <style> element",
+        "noQuirksBodyHtml": "this is CDATA inside a <style> element</style>"
+      }
+    },
+    {
+      "data": "</plaintext>",
+      "errors": [],
+      "fragment": {
+        "name": "plaintext"
+      },
+      "document": {
+        "props": {
+          "tags": {},
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "text": "</plaintext>",
+            "no_escape": true
+          }
+        ],
+        "html": "</plaintext>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "setting html's innerHTML",
+      "errors": [],
+      "fragment": {
+        "name": "html"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "head"
+          },
+          {
+            "tag": "body",
+            "children": [
+              {
+                "text": "setting html's innerHTML"
+              }
+            ]
+          }
+        ],
+        "html": "<head></head><body>setting html's innerHTML</body>",
+        "noQuirksBodyHtml": "setting html's innerHTML"
+      }
+    },
+    {
+      "data": "<title>setting head's innerHTML</title>",
+      "errors": [],
+      "fragment": {
+        "name": "head"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "title": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "title",
+            "children": [
+              {
+                "text": "setting head's innerHTML"
+              }
+            ]
+          }
+        ],
+        "html": "<title>setting head's innerHTML</title>",
+        "noQuirksBodyHtml": "<title>setting head's innerHTML</title>"
+      }
+    }
+  ],
+  "tests5.dat": [
+    {
+      "data": "<style> <!-- </style>x",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": " <!-- ",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "x"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><style> <!-- </style></head><body>x</body></html>",
+        "noQuirksBodyHtml": "<style> <!-- </style>x"
+      }
+    },
+    {
+      "data": "<style> <!-- </style> --> </style>x",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,34): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          },
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": " <!-- ",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": " "
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "--> x",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><style> <!-- </style> </head><body>--&gt; x</body></html>",
+        "noQuirksBodyHtml": "<style> <!-- </style> --&gt; x"
+      }
+    },
+    {
+      "data": "<style> <!--> </style>x",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": " <!--> ",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "x"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><style> <!--> </style></head><body>x</body></html>",
+        "noQuirksBodyHtml": "<style> <!--> </style>x"
+      }
+    },
+    {
+      "data": "<style> <!---> </style>x",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": " <!---> ",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "x"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><style> <!---> </style></head><body>x</body></html>",
+        "noQuirksBodyHtml": "<style> <!---> </style>x"
+      }
+    },
+    {
+      "data": "<iframe> <!---> </iframe>x",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "iframe": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "iframe",
+                    "children": [
+                      {
+                        "text": " <!---> ",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "x"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><iframe> <!---> </iframe>x</body></html>",
+        "noQuirksBodyHtml": "<iframe> <!---> </iframe>x"
+      }
+    },
+    {
+      "data": "<iframe> <!--- </iframe>->x</iframe> --> </iframe>x",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,36): unexpected-end-tag",
+        "(1,50): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "iframe": true
+          },
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "iframe",
+                    "children": [
+                      {
+                        "text": " <!--- ",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "->x --> x",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><iframe> <!--- </iframe>-&gt;x --&gt; x</body></html>",
+        "noQuirksBodyHtml": "<iframe> <!--- </iframe>-&gt;x --&gt; x"
+      }
+    },
+    {
+      "data": "<script> <!-- </script> --> </script>x",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,37): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "script": true,
+            "body": true
+          },
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": " <!-- ",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": " "
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "--> x",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><script> <!-- </script> </head><body>--&gt; x</body></html>",
+        "noQuirksBodyHtml": "<script> <!-- </script> --&gt; x"
+      }
+    },
+    {
+      "data": "<title> <!-- </title> --> </title>x",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,34): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "title": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": " <!-- ",
+                        "escaped": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": " "
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "--> x",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><title> &lt;!-- </title> </head><body>--&gt; x</body></html>",
+        "noQuirksBodyHtml": "<title> &lt;!-- </title> --&gt; x"
+      }
+    },
+    {
+      "data": "<textarea> <!--- </textarea>->x</textarea> --> </textarea>x",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag",
+        "(1,42): unexpected-end-tag",
+        "(1,58): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "textarea": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "textarea",
+                    "children": [
+                      {
+                        "text": " <!--- ",
+                        "escaped": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "->x --> x",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><textarea> &lt;!--- </textarea>-&gt;x --&gt; x</body></html>",
+        "noQuirksBodyHtml": "<textarea> &lt;!--- </textarea>-&gt;x --&gt; x"
+      }
+    },
+    {
+      "data": "<style> <!</-- </style>x",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style",
+                    "children": [
+                      {
+                        "text": " <!</-- ",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "x"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><style> <!</-- </style></head><body>x</body></html>",
+        "noQuirksBodyHtml": "<style> <!</-- </style>x"
+      }
+    },
+    {
+      "data": "<p><xmp></xmp>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "xmp": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p"
+                  },
+                  {
+                    "tag": "xmp"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><p></p><xmp></xmp></body></html>",
+        "noQuirksBodyHtml": "<p></p><xmp></xmp>"
+      }
+    },
+    {
+      "data": "<xmp> <!-- > --> </xmp>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "xmp": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "xmp",
+                    "children": [
+                      {
+                        "text": " <!-- > --> ",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><xmp> <!-- > --> </xmp></body></html>",
+        "noQuirksBodyHtml": "<xmp> <!-- > --> </xmp>"
+      }
+    },
+    {
+      "data": "<title>&amp;</title>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "title": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "&",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><title>&amp;</title></head><body></body></html>",
+        "noQuirksBodyHtml": "<title>&amp;</title>"
+      }
+    },
+    {
+      "data": "<title><!--&amp;--></title>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "title": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "<!--&-->",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><title>&lt;!--&amp;--&gt;</title></head><body></body></html>",
+        "noQuirksBodyHtml": "<title>&lt;!--&amp;--&gt;</title>"
+      }
+    },
+    {
+      "data": "<title><!--</title>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "title": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "<!--",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><title>&lt;!--</title></head><body></body></html>",
+        "noQuirksBodyHtml": "<title>&lt;!--</title>"
+      }
+    },
+    {
+      "data": "<noscript><!--</noscript>--></noscript>",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag",
+        "(1,39): unexpected-end-tag"
+      ],
+      "script": "on",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "no_escape": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "text": "<!--",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "-->",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><noscript><!--</noscript></head><body>--&gt;</body></html>",
+        "noQuirksBodyHtml": "<noscript>&lt;!--</noscript>--&gt;"
+      }
+    },
+    {
+      "data": "<noscript><!--</noscript>--></noscript>",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag"
+      ],
+      "script": "off",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "comment": "</noscript>"
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><noscript><!--</noscript>--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript>&lt;!--</noscript>--&gt;"
+      }
+    }
+  ],
+  "tests6.dat": [
+    {
+      "data": "<!doctype html></head> <head>",
+      "errors": [
+        "(1,29): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "text": " "
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head> <body></body></html>",
+        "noQuirksBodyHtml": " "
+      }
+    },
+    {
+      "data": "<!doctype html><form><div></form><div>",
+      "errors": [
+        "(1,33): end-tag-too-early-ignored",
+        "(1,38): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "form": true,
+            "div": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "form",
+                    "children": [
+                      {
+                        "tag": "div",
+                        "children": [
+                          {
+                            "tag": "div"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><form><div><div></div></div></form></body></html>",
+        "noQuirksBodyHtml": "<form><div><div></div></div></form>"
+      }
+    },
+    {
+      "data": "<!doctype html><title>&amp;</title>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "title": true,
+            "body": true
+          },
+          "doctype": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "&",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><title>&amp;</title></head><body></body></html>",
+        "noQuirksBodyHtml": "<title>&amp;</title>"
+      }
+    },
+    {
+      "data": "<!doctype html><title><!--&amp;--></title>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "title": true,
+            "body": true
+          },
+          "doctype": true,
+          "escaped": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "<!--&-->",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><title>&lt;!--&amp;--&gt;</title></head><body></body></html>",
+        "noQuirksBodyHtml": "<title>&lt;!--&amp;--&gt;</title>"
+      }
+    },
+    {
+      "data": "<!doctype>",
+      "errors": [
+        "(1,9): need-space-after-doctype",
+        "(1,10): expected-doctype-name-but-got-right-bracket",
+        "(1,10): unknown-doctype"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": ""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE ><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!---x",
+      "errors": [
+        "(1,6): eof-in-comment",
+        "(1,6): expected-doctype-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "comment": "-x"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!---x--><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": "<!---x-->"
+      }
+    },
+    {
+      "data": "<body>\n<div>",
+      "errors": [
+        "(1,6): unexpected-start-tag",
+        "(2,5): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "div"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "text": "\n"
+          },
+          {
+            "tag": "div"
+          }
+        ],
+        "html": "\n<div></div>",
+        "noQuirksBodyHtml": "\n<div></div>"
+      }
+    },
+    {
+      "data": "<frameset></frameset>\nfoo",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag",
+        "(2,1): unexpected-char-after-frameset",
+        "(2,2): unexpected-char-after-frameset",
+        "(2,3): unexpected-char-after-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              },
+              {
+                "text": "\n"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset>\n</html>",
+        "noQuirksBodyHtml": "\nfoo"
+      }
+    },
+    {
+      "data": "<frameset></frameset>\n<noframes>",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag",
+        "(2,10): expected-named-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true,
+            "noframes": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              },
+              {
+                "text": "\n"
+              },
+              {
+                "tag": "noframes"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset>\n<noframes></noframes></html>",
+        "noQuirksBodyHtml": "\n<noframes></noframes>"
+      }
+    },
+    {
+      "data": "<frameset></frameset>\n<div>",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag",
+        "(2,5): unexpected-start-tag-after-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              },
+              {
+                "text": "\n"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset>\n</html>",
+        "noQuirksBodyHtml": "\n<div></div>"
+      }
+    },
+    {
+      "data": "<frameset></frameset>\n</html>",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              },
+              {
+                "text": "\n"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset>\n</html>",
+        "noQuirksBodyHtml": "\n"
+      }
+    },
+    {
+      "data": "<frameset></frameset>\n</div>",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag",
+        "(2,6): unexpected-end-tag-after-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              },
+              {
+                "text": "\n"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset>\n</html>",
+        "noQuirksBodyHtml": "\n"
+      }
+    },
+    {
+      "data": "<form><form>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,12): unexpected-start-tag",
+        "(1,12): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "form": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "form"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><form></form></body></html>",
+        "noQuirksBodyHtml": "<form></form>"
+      }
+    },
+    {
+      "data": "<button><button>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,16): unexpected-start-tag-implies-end-tag",
+        "(1,16): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "button": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "button"
+                  },
+                  {
+                    "tag": "button"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><button></button><button></button></body></html>",
+        "noQuirksBodyHtml": "<button></button><button></button>"
+      }
+    },
+    {
+      "data": "<table><tr><td></th>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,20): unexpected-end-tag",
+        "(1,20): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><tr><td></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<table><caption><td>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,20): unexpected-cell-in-table-body",
+        "(1,20): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "caption": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "caption"
+                      },
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><caption></caption><tbody><tr><td></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><caption></caption><tbody><tr><td></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<table><caption><div>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,21): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "caption": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "caption",
+                        "children": [
+                          {
+                            "tag": "div"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><caption><div></div></caption></table></body></html>",
+        "noQuirksBodyHtml": "<table><caption><div></div></caption></table>"
+      }
+    },
+    {
+      "data": "</caption><div>",
+      "errors": [
+        "(1,10): XXX-undefined-error",
+        "(1,15): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "caption"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "div"
+          }
+        ],
+        "html": "<div></div>",
+        "noQuirksBodyHtml": "<div></div>"
+      }
+    },
+    {
+      "data": "<table><caption><div></caption>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,31): expected-one-end-tag-but-got-another",
+        "(1,31): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "caption": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "caption",
+                        "children": [
+                          {
+                            "tag": "div"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><caption><div></div></caption></table></body></html>",
+        "noQuirksBodyHtml": "<table><caption><div></div></caption></table>"
+      }
+    },
+    {
+      "data": "<table><caption></table>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "caption": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "caption"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><caption></caption></table></body></html>",
+        "noQuirksBodyHtml": "<table><caption></caption></table>"
+      }
+    },
+    {
+      "data": "</table><div>",
+      "errors": [
+        "(1,8): unexpected-end-tag",
+        "(1,13): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "caption"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "div"
+          }
+        ],
+        "html": "<div></div>",
+        "noQuirksBodyHtml": "<div></div>"
+      }
+    },
+    {
+      "data": "<table><caption></body></col></colgroup></html></tbody></td></tfoot></th></thead></tr>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,23): unexpected-end-tag",
+        "(1,29): unexpected-end-tag",
+        "(1,40): unexpected-end-tag",
+        "(1,47): unexpected-end-tag",
+        "(1,55): unexpected-end-tag",
+        "(1,60): unexpected-end-tag",
+        "(1,68): unexpected-end-tag",
+        "(1,73): unexpected-end-tag",
+        "(1,81): unexpected-end-tag",
+        "(1,86): unexpected-end-tag",
+        "(1,86): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "caption": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "caption"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><caption></caption></table></body></html>",
+        "noQuirksBodyHtml": "<table><caption></caption></table>"
+      }
+    },
+    {
+      "data": "<table><caption><div></div>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,27): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "caption": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "caption",
+                        "children": [
+                          {
+                            "tag": "div"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><caption><div></div></caption></table></body></html>",
+        "noQuirksBodyHtml": "<table><caption><div></div></caption></table>"
+      }
+    },
+    {
+      "data": "<table><tr><td></body></caption></col></colgroup></html>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,22): unexpected-end-tag",
+        "(1,32): unexpected-end-tag",
+        "(1,38): unexpected-end-tag",
+        "(1,49): unexpected-end-tag",
+        "(1,56): unexpected-end-tag",
+        "(1,56): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><tr><td></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "</table></tbody></tfoot></thead></tr><div>",
+      "errors": [
+        "(1,8): unexpected-end-tag",
+        "(1,16): unexpected-end-tag",
+        "(1,24): unexpected-end-tag",
+        "(1,32): unexpected-end-tag",
+        "(1,37): unexpected-end-tag",
+        "(1,42): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "td"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "div"
+          }
+        ],
+        "html": "<div></div>",
+        "noQuirksBodyHtml": "<div></div>"
+      }
+    },
+    {
+      "data": "<table><colgroup>foo",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,18): foster-parenting-character-in-table",
+        "(1,19): foster-parenting-character-in-table",
+        "(1,20): foster-parenting-character-in-table",
+        "(1,20): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "colgroup": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "foo"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "colgroup"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>foo<table><colgroup></colgroup></table></body></html>",
+        "noQuirksBodyHtml": "foo<table><colgroup></colgroup></table>"
+      }
+    },
+    {
+      "data": "foo<col>",
+      "errors": [
+        "(1,1): unexpected-character-in-colgroup",
+        "(1,2): unexpected-character-in-colgroup",
+        "(1,3): unexpected-character-in-colgroup"
+      ],
+      "fragment": {
+        "name": "colgroup"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "col": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "col"
+          }
+        ],
+        "html": "<col>",
+        "noQuirksBodyHtml": "foo"
+      }
+    },
+    {
+      "data": "<table><colgroup></col>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,23): no-end-tag",
+        "(1,23): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "colgroup": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "colgroup"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><colgroup></colgroup></table></body></html>",
+        "noQuirksBodyHtml": "<table><colgroup></colgroup></table>"
+      }
+    },
+    {
+      "data": "<frameset><div>",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag",
+        "(1,15): unexpected-start-tag-in-frameset",
+        "(1,15): eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": "<div></div>"
+      }
+    },
+    {
+      "data": "</frameset><frame>",
+      "errors": [
+        "(1,11): unexpected-frameset-in-frameset-innerhtml"
+      ],
+      "fragment": {
+        "name": "frameset"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "frame": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "frame"
+          }
+        ],
+        "html": "<frame>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<frameset></div>",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag",
+        "(1,16): unexpected-end-tag-in-frameset",
+        "(1,16): eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "</body><div>",
+      "errors": [
+        "(1,7): unexpected-close-tag",
+        "(1,12): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "body"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "div"
+          }
+        ],
+        "html": "<div></div>",
+        "noQuirksBodyHtml": "<div></div>"
+      }
+    },
+    {
+      "data": "<table><tr><div>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,16): unexpected-start-tag-implies-table-voodoo",
+        "(1,16): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "table": true,
+            "tbody": true,
+            "tr": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div></div><table><tbody><tr></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<div></div><table><tbody><tr></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "</tr><td>",
+      "errors": [
+        "(1,5): unexpected-end-tag"
+      ],
+      "fragment": {
+        "name": "tr"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "td"
+          }
+        ],
+        "html": "<td></td>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "</tbody></tfoot></thead><td>",
+      "errors": [
+        "(1,8): unexpected-end-tag",
+        "(1,16): unexpected-end-tag",
+        "(1,24): unexpected-end-tag"
+      ],
+      "fragment": {
+        "name": "tr"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "td"
+          }
+        ],
+        "html": "<td></td>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<table><tr><div><td>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,16): foster-parenting-start-tag",
+        "(1,20): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div></div><table><tbody><tr><td></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<div></div><table><tbody><tr><td></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<caption><col><colgroup><tbody><tfoot><thead><tr>",
+      "errors": [
+        "(1,9): unexpected-start-tag",
+        "(1,14): unexpected-start-tag",
+        "(1,24): unexpected-start-tag",
+        "(1,31): unexpected-start-tag",
+        "(1,38): unexpected-start-tag",
+        "(1,45): unexpected-start-tag"
+      ],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "tr": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "tr"
+          }
+        ],
+        "html": "<tr></tr>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<table><tbody></thead>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,22): unexpected-end-tag-in-table-body",
+        "(1,22): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody></tbody></table>"
+      }
+    },
+    {
+      "data": "</table><tr>",
+      "errors": [
+        "(1,8): unexpected-end-tag"
+      ],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "tr": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "tr"
+          }
+        ],
+        "html": "<tr></tr>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<table><tbody></body></caption></col></colgroup></html></td></th></tr>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,21): unexpected-end-tag-in-table-body",
+        "(1,31): unexpected-end-tag-in-table-body",
+        "(1,37): unexpected-end-tag-in-table-body",
+        "(1,48): unexpected-end-tag-in-table-body",
+        "(1,55): unexpected-end-tag-in-table-body",
+        "(1,60): unexpected-end-tag-in-table-body",
+        "(1,65): unexpected-end-tag-in-table-body",
+        "(1,70): unexpected-end-tag-in-table-body",
+        "(1,70): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody></tbody></table>"
+      }
+    },
+    {
+      "data": "<table><tbody></div>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,20): unexpected-end-tag-implies-table-voodoo",
+        "(1,20): end-tag-too-early",
+        "(1,20): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody></tbody></table>"
+      }
+    },
+    {
+      "data": "<table><table>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,14): unexpected-start-tag-implies-end-tag",
+        "(1,14): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table"
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table></table><table></table></body></html>",
+        "noQuirksBodyHtml": "<table></table><table></table>"
+      }
+    },
+    {
+      "data": "<table></body></caption></col></colgroup></html></tbody></td></tfoot></th></thead></tr>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,14): unexpected-end-tag",
+        "(1,24): unexpected-end-tag",
+        "(1,30): unexpected-end-tag",
+        "(1,41): unexpected-end-tag",
+        "(1,48): unexpected-end-tag",
+        "(1,56): unexpected-end-tag",
+        "(1,61): unexpected-end-tag",
+        "(1,69): unexpected-end-tag",
+        "(1,74): unexpected-end-tag",
+        "(1,82): unexpected-end-tag",
+        "(1,87): unexpected-end-tag",
+        "(1,87): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table></table></body></html>",
+        "noQuirksBodyHtml": "<table></table>"
+      }
+    },
+    {
+      "data": "</table><tr>",
+      "errors": [
+        "(1,8): unexpected-end-tag"
+      ],
+      "fragment": {
+        "name": "table"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "tbody": true,
+            "tr": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "tbody",
+            "children": [
+              {
+                "tag": "tr"
+              }
+            ]
+          }
+        ],
+        "html": "<tbody><tr></tr></tbody>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<body></body></html>",
+      "errors": [
+        "(1,20): unexpected-end-tag-after-body-innerhtml"
+      ],
+      "fragment": {
+        "name": "html"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "head"
+          },
+          {
+            "tag": "body"
+          }
+        ],
+        "html": "<head></head><body></body>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<html><frameset></frameset></html> ",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              },
+              {
+                "text": " "
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset> </html>",
+        "noQuirksBodyHtml": " "
+      }
+    },
+    {
+      "data": "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\"><html></html>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html \"-//W3C//DTD HTML 4.01//EN\" \"\""
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<param><frameset></frameset>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,17): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": "<param>"
+      }
+    },
+    {
+      "data": "<source><frameset></frameset>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,18): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": "<source>"
+      }
+    },
+    {
+      "data": "<track><frameset></frameset>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,17): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": "<track>"
+      }
+    },
+    {
+      "data": "</html><frameset></frameset>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-end-tag",
+        "(1,17): expected-eof-but-got-start-tag",
+        "(1,17): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "</body><frameset></frameset>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-end-tag",
+        "(1,17): unexpected-start-tag-after-body",
+        "(1,17): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": ""
+      }
+    }
+  ],
+  "tests7.dat": [
+    {
+      "data": "<!doctype html><body><title>X</title>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "title": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "X"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><title>X</title></body></html>",
+        "noQuirksBodyHtml": "<title>X</title>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><title>X</title></table>",
+      "errors": [
+        "(1,29): unexpected-start-tag-implies-table-voodoo"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "title": true,
+            "table": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "X"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><title>X</title><table></table></body></html>",
+        "noQuirksBodyHtml": "<title>X</title><table></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><head></head><title>X</title>",
+      "errors": [
+        "(1,35): unexpected-start-tag-out-of-my-head"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "title": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "X"
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><title>X</title></head><body></body></html>",
+        "noQuirksBodyHtml": "<title>X</title>"
+      }
+    },
+    {
+      "data": "<!doctype html></head><title>X</title>",
+      "errors": [
+        "(1,29): unexpected-start-tag-out-of-my-head"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "title": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "title",
+                    "children": [
+                      {
+                        "text": "X"
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head><title>X</title></head><body></body></html>",
+        "noQuirksBodyHtml": "<title>X</title>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><meta></table>",
+      "errors": [
+        "(1,28): unexpected-start-tag-implies-table-voodoo"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "meta": true,
+            "table": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "meta"
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><meta><table></table></body></html>",
+        "noQuirksBodyHtml": "<meta><table></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table>X<tr><td><table> <meta></table></table>",
+      "errors": [
+        "unexpected text in table",
+        "(1,45): unexpected-start-tag-implies-table-voodoo"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "meta": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "X"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "meta"
+                                  },
+                                  {
+                                    "tag": "table",
+                                    "children": [
+                                      {
+                                        "text": " "
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>X<table><tbody><tr><td><meta><table> </table></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "X<table><tbody><tr><td><meta><table> </table></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><html> <head>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": " "
+      }
+    },
+    {
+      "data": "<!doctype html> <head>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": " "
+      }
+    },
+    {
+      "data": "<!doctype html><table><style> <tr>x </style> </table>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "style": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "style",
+                        "children": [
+                          {
+                            "text": " <tr>x ",
+                            "no_escape": true
+                          }
+                        ]
+                      },
+                      {
+                        "text": " "
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><style> <tr>x </style> </table></body></html>",
+        "noQuirksBodyHtml": "<table><style> <tr>x </style> </table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><TBODY><script> <tr>x </script> </table>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "script": true
+          },
+          "doctype": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "script",
+                            "children": [
+                              {
+                                "text": " <tr>x ",
+                                "no_escape": true
+                              }
+                            ]
+                          },
+                          {
+                            "text": " "
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><script> <tr>x </script> </tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><script> <tr>x </script> </tbody></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><applet><p>X</p></applet>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "applet": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "applet",
+                        "children": [
+                          {
+                            "tag": "p",
+                            "children": [
+                              {
+                                "text": "X"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><applet><p>X</p></applet></p></body></html>",
+        "noQuirksBodyHtml": "<p><applet><p>X</p></applet></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><p><object type=\"application/x-non-existant-plugin\"><p>X</p></object>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "object": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "object",
+                        "attrs": [
+                          {
+                            "name": "type",
+                            "value": "application/x-non-existant-plugin"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "p",
+                            "children": [
+                              {
+                                "text": "X"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><object type=\"application/x-non-existant-plugin\"><p>X</p></object></p></body></html>",
+        "noQuirksBodyHtml": "<p><object type=\"application/x-non-existant-plugin\"><p>X</p></object></p>"
+      }
+    },
+    {
+      "data": "<!doctype html><listing>\nX</listing>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "listing": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "listing",
+                    "children": [
+                      {
+                        "text": "X"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><listing>X</listing></body></html>",
+        "noQuirksBodyHtml": "<listing>X</listing>"
+      }
+    },
+    {
+      "data": "<!doctype html><select><input>X",
+      "errors": [
+        "(1,30): unexpected-input-in-select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "input": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select"
+                  },
+                  {
+                    "tag": "input"
+                  },
+                  {
+                    "text": "X"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select></select><input>X</body></html>",
+        "noQuirksBodyHtml": "<select></select><input>X"
+      }
+    },
+    {
+      "data": "<!doctype html><select><select>X",
+      "errors": [
+        "(1,31): unexpected-select-in-select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select"
+                  },
+                  {
+                    "text": "X"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select></select>X</body></html>",
+        "noQuirksBodyHtml": "<select></select>X"
+      }
+    },
+    {
+      "data": "<!doctype html><table><input type=hidDEN></table>",
+      "errors": [
+        "(1,41): unexpected-hidden-input-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "input": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "input",
+                        "attrs": [
+                          {
+                            "name": "type",
+                            "value": "hidDEN"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><input type=\"hidDEN\"></table></body></html>",
+        "noQuirksBodyHtml": "<table><input type=\"hidDEN\"></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table>X<input type=hidDEN></table>",
+      "errors": [
+        "(1,23): foster-parenting-character",
+        "(1,42): unexpected-hidden-input-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "input": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "X"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "input",
+                        "attrs": [
+                          {
+                            "name": "type",
+                            "value": "hidDEN"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>X<table><input type=\"hidDEN\"></table></body></html>",
+        "noQuirksBodyHtml": "X<table><input type=\"hidDEN\"></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table>  <input type=hidDEN></table>",
+      "errors": [
+        "(1,43): unexpected-hidden-input-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "input": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "text": "  "
+                      },
+                      {
+                        "tag": "input",
+                        "attrs": [
+                          {
+                            "name": "type",
+                            "value": "hidDEN"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table>  <input type=\"hidDEN\"></table></body></html>",
+        "noQuirksBodyHtml": "<table>  <input type=\"hidDEN\"></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table>  <input type='hidDEN'></table>",
+      "errors": [
+        "(1,45): unexpected-hidden-input-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "input": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "text": "  "
+                      },
+                      {
+                        "tag": "input",
+                        "attrs": [
+                          {
+                            "name": "type",
+                            "value": "hidDEN"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table>  <input type=\"hidDEN\"></table></body></html>",
+        "noQuirksBodyHtml": "<table>  <input type=\"hidDEN\"></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><input type=\" hidden\"><input type=hidDEN></table>",
+      "errors": [
+        "(1,44): unexpected-start-tag-implies-table-voodoo",
+        "(1,63): unexpected-hidden-input-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "input": true,
+            "table": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "input",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": " hidden"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "input",
+                        "attrs": [
+                          {
+                            "name": "type",
+                            "value": "hidDEN"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><input type=\" hidden\"><table><input type=\"hidDEN\"></table></body></html>",
+        "noQuirksBodyHtml": "<input type=\" hidden\"><table><input type=\"hidDEN\"></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><table><select>X<tr>",
+      "errors": [
+        "(1,30): unexpected-start-tag-implies-table-voodoo",
+        "(1,35): unexpected-table-element-start-tag-in-select-in-table",
+        "(1,35): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "table": true,
+            "tbody": true,
+            "tr": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "text": "X"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select>X</select><table><tbody><tr></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<select>X</select><table><tbody><tr></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!doctype html><select>X</select>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "text": "X"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select>X</select></body></html>",
+        "noQuirksBodyHtml": "<select>X</select>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE hTmL><html></html>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!DOCTYPE HTML><html></html>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<body>X</body></body>",
+      "errors": [
+        "(1,21): unexpected-end-tag-after-body"
+      ],
+      "fragment": {
+        "name": "html"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "head"
+          },
+          {
+            "tag": "body",
+            "children": [
+              {
+                "text": "X"
+              }
+            ]
+          }
+        ],
+        "html": "<head></head><body>X</body>",
+        "noQuirksBodyHtml": "X"
+      }
+    },
+    {
+      "data": "<div><p>a</x> b",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,13): unexpected-end-tag",
+        "(1,15): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "p",
+                        "children": [
+                          {
+                            "text": "a b"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div><p>a b</p></div></body></html>",
+        "noQuirksBodyHtml": "<div><p>a b</p></div>"
+      }
+    },
+    {
+      "data": "<table><tr><td><code></code> </table>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "code": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "code"
+                                  },
+                                  {
+                                    "text": " "
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><tr><td><code></code> </td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td><code></code> </td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<table><b><tr><td>aaa</td></tr>bbb</table>ccc",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,10): foster-parenting-start-tag",
+        "(1,32): foster-parenting-character",
+        "(1,33): foster-parenting-character",
+        "(1,34): foster-parenting-character",
+        "(1,45): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b"
+                  },
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "text": "bbb"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "text": "aaa"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "text": "ccc"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><b></b><b>bbb</b><table><tbody><tr><td>aaa</td></tr></tbody></table><b>ccc</b></body></html>",
+        "noQuirksBodyHtml": "<b></b><b>bbb</b><table><tbody><tr><td>aaa</td></tr></tbody></table><b>ccc</b>"
+      }
+    },
+    {
+      "data": "A<table><tr> B</tr> B</table>",
+      "errors": [
+        "(1,1): expected-doctype-but-got-chars",
+        "(1,13): foster-parenting-character",
+        "(1,14): foster-parenting-character",
+        "(1,20): foster-parenting-character",
+        "(1,21): foster-parenting-character"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "A B B"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>A B B<table><tbody><tr></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "A B B<table><tbody><tr></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "A<table><tr> B</tr> </em>C</table>",
+      "errors": [
+        "(1,1): expected-doctype-but-got-chars",
+        "(1,13): foster-parenting-character",
+        "(1,14): foster-parenting-character",
+        "(1,20): foster-parenting-character",
+        "(1,25): unexpected-end-tag",
+        "(1,26): foster-parenting-character"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "A BC"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr"
+                          },
+                          {
+                            "text": " "
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>A BC<table><tbody><tr></tr> </tbody></table></body></html>",
+        "noQuirksBodyHtml": "A BC<table><tbody><tr></tr> </tbody></table>"
+      }
+    },
+    {
+      "data": "<select><keygen>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,16): unexpected-input-in-select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "keygen": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select"
+                  },
+                  {
+                    "tag": "keygen"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><select></select><keygen></body></html>",
+        "noQuirksBodyHtml": "<select></select><keygen>"
+      }
+    }
+  ],
+  "tests8.dat": [
+    {
+      "data": "<div>\n<div></div>\n</span>x",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(3,7): unexpected-end-tag",
+        "(3,8): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": "\n"
+                      },
+                      {
+                        "tag": "div"
+                      },
+                      {
+                        "text": "\nx"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div>\n<div></div>\nx</div></body></html>",
+        "noQuirksBodyHtml": "<div>\n<div></div>\nx</div>"
+      }
+    },
+    {
+      "data": "<div>x<div></div>\n</span>x",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(2,7): unexpected-end-tag",
+        "(2,8): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": "x"
+                      },
+                      {
+                        "tag": "div"
+                      },
+                      {
+                        "text": "\nx"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div>x<div></div>\nx</div></body></html>",
+        "noQuirksBodyHtml": "<div>x<div></div>\nx</div>"
+      }
+    },
+    {
+      "data": "<div>x<div></div>x</span>x",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,25): unexpected-end-tag",
+        "(1,26): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": "x"
+                      },
+                      {
+                        "tag": "div"
+                      },
+                      {
+                        "text": "xx"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div>x<div></div>xx</div></body></html>",
+        "noQuirksBodyHtml": "<div>x<div></div>xx</div>"
+      }
+    },
+    {
+      "data": "<div>x<div></div>y</span>z",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,25): unexpected-end-tag",
+        "(1,26): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": "x"
+                      },
+                      {
+                        "tag": "div"
+                      },
+                      {
+                        "text": "yz"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div>x<div></div>yz</div></body></html>",
+        "noQuirksBodyHtml": "<div>x<div></div>yz</div>"
+      }
+    },
+    {
+      "data": "<table><div>x<div></div>x</span>x",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,12): foster-parenting-start-tag",
+        "(1,13): foster-parenting-character",
+        "(1,18): foster-parenting-start-tag",
+        "(1,24): foster-parenting-end-tag",
+        "(1,25): foster-parenting-start-tag",
+        "(1,32): foster-parenting-end-tag",
+        "(1,32): unexpected-end-tag",
+        "(1,33): foster-parenting-character",
+        "(1,33): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "table": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": "x"
+                      },
+                      {
+                        "tag": "div"
+                      },
+                      {
+                        "text": "xx"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div>x<div></div>xx</div><table></table></body></html>",
+        "noQuirksBodyHtml": "<div>x<div></div>xx</div><table></table>"
+      }
+    },
+    {
+      "data": "x<table>x",
+      "errors": [
+        "(1,1): expected-doctype-but-got-chars",
+        "(1,9): foster-parenting-character",
+        "(1,9): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "xx"
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>xx<table></table></body></html>",
+        "noQuirksBodyHtml": "xx<table></table>"
+      }
+    },
+    {
+      "data": "x<table><table>x",
+      "errors": [
+        "(1,1): expected-doctype-but-got-chars",
+        "(1,15): unexpected-start-tag-implies-end-tag",
+        "(1,16): foster-parenting-character",
+        "(1,16): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "x"
+                  },
+                  {
+                    "tag": "table"
+                  },
+                  {
+                    "text": "x"
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>x<table></table>x<table></table></body></html>",
+        "noQuirksBodyHtml": "x<table></table>x<table></table>"
+      }
+    },
+    {
+      "data": "<b>a<div></div><div></b>y",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,24): adoption-agency-1.3",
+        "(1,25): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "text": "a"
+                      },
+                      {
+                        "tag": "div"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "b"
+                      },
+                      {
+                        "text": "y"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><b>a<div></div></b><div><b></b>y</div></body></html>",
+        "noQuirksBodyHtml": "<b>a<div></div></b><div><b></b>y</div>"
+      }
+    },
+    {
+      "data": "<a><div><p></a>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,15): adoption-agency-1.3",
+        "(1,15): adoption-agency-1.3",
+        "(1,15): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "div": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a"
+                  },
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "a"
+                      },
+                      {
+                        "tag": "p",
+                        "children": [
+                          {
+                            "tag": "a"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a></a><div><a></a><p><a></a></p></div></body></html>",
+        "noQuirksBodyHtml": "<a></a><div><a></a><p><a></a></p></div>"
+      }
+    }
+  ],
+  "tests9.dat": [
+    {
+      "data": "<!DOCTYPE html><math></math>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math></math></body></html>",
+        "noQuirksBodyHtml": "<math></math>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><math></math>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math></math></body></html>",
+        "noQuirksBodyHtml": "<math></math>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><math><mi>",
+      "errors": [
+        "(1,25) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mi": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math><mi></mi></math></body></html>",
+        "noQuirksBodyHtml": "<math><mi></mi></math>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><math><annotation-xml><svg><u>",
+      "errors": [
+        "(1,45) unexpected-html-element-in-foreign-content",
+        "(1,45) expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math annotation-xml": true,
+            "svg svg": true,
+            "u": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "annotation-xml",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "svg",
+                            "ns": "http://www.w3.org/2000/svg"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "u"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math><annotation-xml><svg></svg></annotation-xml></math><u></u></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml><svg><u></u></svg></annotation-xml></math>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><select><math></math></select>",
+      "errors": [
+        "(1,35) unexpected-start-tag-in-select",
+        "(1,42) unexpected-end-tag-in-select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select></select></body></html>",
+        "noQuirksBodyHtml": "<select></select>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><select><option><math></math></option></select>",
+      "errors": [
+        "(1,43) unexpected-start-tag-in-select",
+        "(1,50) unexpected-end-tag-in-select"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "option": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "tag": "option"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select><option></option></select></body></html>",
+        "noQuirksBodyHtml": "<select><option></option></select>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><math></math></table>",
+      "errors": [
+        "(1,34) unexpected-start-tag-implies-table-voodoo"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "table": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML"
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math></math><table></table></body></html>",
+        "noQuirksBodyHtml": "<math></math><table></table>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><math><mi>foo</mi></math></table>",
+      "errors": [
+        "(1,34) foster-parenting-start-token",
+        "(1,39) foster-parenting-character",
+        "(1,40) foster-parenting-character",
+        "(1,41) foster-parenting-character"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mi": true,
+            "table": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "text": "foo"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math><mi>foo</mi></math><table></table></body></html>",
+        "noQuirksBodyHtml": "<math><mi>foo</mi></math><table></table>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><math><mi>foo</mi><mi>bar</mi></math></table>",
+      "errors": [
+        "(1,34) foster-parenting-start-tag",
+        "(1,39) foster-parenting-character",
+        "(1,40) foster-parenting-character",
+        "(1,41) foster-parenting-character",
+        "(1,51) foster-parenting-character",
+        "(1,52) foster-parenting-character",
+        "(1,53) foster-parenting-character"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mi": true,
+            "table": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "text": "foo"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "text": "bar"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math><mi>foo</mi><mi>bar</mi></math><table></table></body></html>",
+        "noQuirksBodyHtml": "<math><mi>foo</mi><mi>bar</mi></math><table></table>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><tbody><math><mi>foo</mi><mi>bar</mi></math></tbody></table>",
+      "errors": [
+        "(1,41) foster-parenting-start-tag",
+        "(1,46) foster-parenting-character",
+        "(1,47) foster-parenting-character",
+        "(1,48) foster-parenting-character",
+        "(1,58) foster-parenting-character",
+        "(1,59) foster-parenting-character",
+        "(1,60) foster-parenting-character"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mi": true,
+            "table": true,
+            "tbody": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "text": "foo"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "text": "bar"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math><mi>foo</mi><mi>bar</mi></math><table><tbody></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<math><mi>foo</mi><mi>bar</mi></math><table><tbody></tbody></table>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><tbody><tr><math><mi>foo</mi><mi>bar</mi></math></tr></tbody></table>",
+      "errors": [
+        "(1,45) foster-parenting-start-tag",
+        "(1,50) foster-parenting-character",
+        "(1,51) foster-parenting-character",
+        "(1,52) foster-parenting-character",
+        "(1,62) foster-parenting-character",
+        "(1,63) foster-parenting-character",
+        "(1,64) foster-parenting-character"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mi": true,
+            "table": true,
+            "tbody": true,
+            "tr": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "text": "foo"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "text": "bar"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math><mi>foo</mi><mi>bar</mi></math><table><tbody><tr></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<math><mi>foo</mi><mi>bar</mi></math><table><tbody><tr></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math></td></tr></tbody></table>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "math math": true,
+            "math mi": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "math",
+                                    "ns": "http://www.w3.org/1998/Math/MathML",
+                                    "children": [
+                                      {
+                                        "tag": "mi",
+                                        "ns": "http://www.w3.org/1998/Math/MathML",
+                                        "children": [
+                                          {
+                                            "text": "foo"
+                                          }
+                                        ]
+                                      },
+                                      {
+                                        "tag": "mi",
+                                        "ns": "http://www.w3.org/1998/Math/MathML",
+                                        "children": [
+                                          {
+                                            "text": "bar"
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math><p>baz</td></tr></tbody></table>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "math math": true,
+            "math mi": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "math",
+                                    "ns": "http://www.w3.org/1998/Math/MathML",
+                                    "children": [
+                                      {
+                                        "tag": "mi",
+                                        "ns": "http://www.w3.org/1998/Math/MathML",
+                                        "children": [
+                                          {
+                                            "text": "foo"
+                                          }
+                                        ]
+                                      },
+                                      {
+                                        "tag": "mi",
+                                        "ns": "http://www.w3.org/1998/Math/MathML",
+                                        "children": [
+                                          {
+                                            "text": "bar"
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "tag": "p",
+                                    "children": [
+                                      {
+                                        "text": "baz"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math><p>baz</p></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math><p>baz</p></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi></math><p>baz</caption></table>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "caption": true,
+            "math math": true,
+            "math mi": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "caption",
+                        "children": [
+                          {
+                            "tag": "math",
+                            "ns": "http://www.w3.org/1998/Math/MathML",
+                            "children": [
+                              {
+                                "tag": "mi",
+                                "ns": "http://www.w3.org/1998/Math/MathML",
+                                "children": [
+                                  {
+                                    "text": "foo"
+                                  }
+                                ]
+                              },
+                              {
+                                "tag": "mi",
+                                "ns": "http://www.w3.org/1998/Math/MathML",
+                                "children": [
+                                  {
+                                    "text": "bar"
+                                  }
+                                ]
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "p",
+                            "children": [
+                              {
+                                "text": "baz"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><caption><math><mi>foo</mi><mi>bar</mi></math><p>baz</p></caption></table></body></html>",
+        "noQuirksBodyHtml": "<table><caption><math><mi>foo</mi><mi>bar</mi></math><p>baz</p></caption></table>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux",
+      "errors": [
+        "(1,70) unexpected-html-element-in-foreign-content"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "caption": true,
+            "math math": true,
+            "math mi": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "caption",
+                        "children": [
+                          {
+                            "tag": "math",
+                            "ns": "http://www.w3.org/1998/Math/MathML",
+                            "children": [
+                              {
+                                "tag": "mi",
+                                "ns": "http://www.w3.org/1998/Math/MathML",
+                                "children": [
+                                  {
+                                    "text": "foo"
+                                  }
+                                ]
+                              },
+                              {
+                                "tag": "mi",
+                                "ns": "http://www.w3.org/1998/Math/MathML",
+                                "children": [
+                                  {
+                                    "text": "bar"
+                                  }
+                                ]
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "p",
+                            "children": [
+                              {
+                                "text": "baz"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "quux"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><caption><math><mi>foo</mi><mi>bar</mi></math><p>baz</p></caption></table><p>quux</p></body></html>",
+        "noQuirksBodyHtml": "<table><caption><math><mi>foo</mi><mi>bar</mi><p>baz</p></math></caption></table><p>quux</p>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi>baz</table><p>quux",
+      "errors": [
+        "(1,78) unexpected-end-tag",
+        "(1,78) expected-one-end-tag-but-got-another"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "caption": true,
+            "math math": true,
+            "math mi": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "caption",
+                        "children": [
+                          {
+                            "tag": "math",
+                            "ns": "http://www.w3.org/1998/Math/MathML",
+                            "children": [
+                              {
+                                "tag": "mi",
+                                "ns": "http://www.w3.org/1998/Math/MathML",
+                                "children": [
+                                  {
+                                    "text": "foo"
+                                  }
+                                ]
+                              },
+                              {
+                                "tag": "mi",
+                                "ns": "http://www.w3.org/1998/Math/MathML",
+                                "children": [
+                                  {
+                                    "text": "bar"
+                                  }
+                                ]
+                              },
+                              {
+                                "text": "baz"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "quux"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><caption><math><mi>foo</mi><mi>bar</mi>baz</math></caption></table><p>quux</p></body></html>",
+        "noQuirksBodyHtml": "<table><caption><math><mi>foo</mi><mi>bar</mi>baz</math></caption></table><p>quux</p>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><colgroup><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux",
+      "errors": [
+        "(1,44) foster-parenting-start-tag",
+        "(1,49) foster-parenting-character",
+        "(1,50) foster-parenting-character",
+        "(1,51) foster-parenting-character",
+        "(1,61) foster-parenting-character",
+        "(1,62) foster-parenting-character",
+        "(1,63) foster-parenting-character",
+        "(1,71) unexpected-html-element-in-foreign-content",
+        "(1,71) foster-parenting-start-tag",
+        "(1,63) foster-parenting-character",
+        "(1,63) foster-parenting-character",
+        "(1,63) foster-parenting-character"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mi": true,
+            "p": true,
+            "table": true,
+            "colgroup": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "text": "foo"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "text": "bar"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "baz"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "colgroup"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "quux"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math><mi>foo</mi><mi>bar</mi></math><p>baz</p><table><colgroup></colgroup></table><p>quux</p></body></html>",
+        "noQuirksBodyHtml": "<math><mi>foo</mi><mi>bar</mi><p>baz</p></math><table><colgroup></colgroup></table><p>quux</p>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><tr><td><select><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux",
+      "errors": [
+        "(1,50) unexpected-start-tag-in-select",
+        "(1,54) unexpected-start-tag-in-select",
+        "(1,62) unexpected-end-tag-in-select",
+        "(1,66) unexpected-start-tag-in-select",
+        "(1,74) unexpected-end-tag-in-select",
+        "(1,77) unexpected-start-tag-in-select",
+        "(1,88) unexpected-table-element-end-tag-in-select-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "select": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "select",
+                                    "children": [
+                                      {
+                                        "text": "foobarbaz"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "quux"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><select>foobarbaz</select></td></tr></tbody></table><p>quux</p></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td><select>foobarbaz</select></td></tr></tbody></table><p>quux</p>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><table><select><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux",
+      "errors": [
+        "(1,36) unexpected-start-tag-implies-table-voodoo",
+        "(1,42) unexpected-start-tag-in-select",
+        "(1,46) unexpected-start-tag-in-select",
+        "(1,54) unexpected-end-tag-in-select",
+        "(1,58) unexpected-start-tag-in-select",
+        "(1,66) unexpected-end-tag-in-select",
+        "(1,69) unexpected-start-tag-in-select",
+        "(1,80) unexpected-table-element-end-tag-in-select-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "table": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "text": "foobarbaz"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table"
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "quux"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select>foobarbaz</select><table></table><p>quux</p></body></html>",
+        "noQuirksBodyHtml": "<select>foobarbaz</select><table></table><p>quux</p>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body></body></html><math><mi>foo</mi><mi>bar</mi><p>baz",
+      "errors": [
+        "(1,41) expected-eof-but-got-start-tag",
+        "(1,68) unexpected-html-element-in-foreign-content"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mi": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "text": "foo"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "text": "bar"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "baz"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math><mi>foo</mi><mi>bar</mi></math><p>baz</p></body></html>",
+        "noQuirksBodyHtml": "<math><mi>foo</mi><mi>bar</mi><p>baz</p></math>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body></body><math><mi>foo</mi><mi>bar</mi><p>baz",
+      "errors": [
+        "(1,34) unexpected-start-tag-after-body",
+        "(1,61) unexpected-html-element-in-foreign-content"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mi": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "text": "foo"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "text": "bar"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "baz"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math><mi>foo</mi><mi>bar</mi></math><p>baz</p></body></html>",
+        "noQuirksBodyHtml": "<math><mi>foo</mi><mi>bar</mi><p>baz</p></math>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><frameset><math><mi></mi><mi></mi><p><span>",
+      "errors": [
+        "(1,31) unexpected-start-tag-in-frameset",
+        "(1,35) unexpected-start-tag-in-frameset",
+        "(1,40) unexpected-end-tag-in-frameset",
+        "(1,44) unexpected-start-tag-in-frameset",
+        "(1,49) unexpected-end-tag-in-frameset",
+        "(1,52) unexpected-start-tag-in-frameset",
+        "(1,58) unexpected-start-tag-in-frameset",
+        "(1,58) eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": "<math><mi></mi><mi></mi><p><span></span></p></math>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><frameset></frameset><math><mi></mi><mi></mi><p><span>",
+      "errors": [
+        "(1,42) unexpected-start-tag-after-frameset",
+        "(1,46) unexpected-start-tag-after-frameset",
+        "(1,51) unexpected-end-tag-after-frameset",
+        "(1,55) unexpected-start-tag-after-frameset",
+        "(1,60) unexpected-end-tag-after-frameset",
+        "(1,63) unexpected-start-tag-after-frameset",
+        "(1,69) unexpected-start-tag-after-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": "<math><mi></mi><mi></mi><p><span></span></p></math>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body xlink:href=foo><math xlink:href=foo></math>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "attrs": [
+                  {
+                    "name": "xlink:href",
+                    "value": "foo"
+                  }
+                ],
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "attrs": [
+                      {
+                        "name": "href",
+                        "ns": "http://www.w3.org/1999/xlink",
+                        "value": "foo"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body xlink:href=\"foo\"><math xlink:href=\"foo\"></math></body></html>",
+        "noQuirksBodyHtml": "<math xlink:href=\"foo\"></math>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo></mi></math>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mi": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "attrs": [
+                  {
+                    "name": "xlink:href",
+                    "value": "foo"
+                  },
+                  {
+                    "name": "xml:lang",
+                    "value": "en"
+                  }
+                ],
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "attrs": [
+                          {
+                            "name": "href",
+                            "ns": "http://www.w3.org/1999/xlink",
+                            "value": "foo"
+                          },
+                          {
+                            "name": "lang",
+                            "ns": "http://www.w3.org/XML/1998/namespace",
+                            "value": "en"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body xlink:href=\"foo\" xml:lang=\"en\"><math><mi xml:lang=\"en\" xlink:href=\"foo\"></mi></math></body></html>",
+        "noQuirksBodyHtml": "<math><mi xml:lang=\"en\" xlink:href=\"foo\"></mi></math>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo /></math>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mi": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "attrs": [
+                  {
+                    "name": "xlink:href",
+                    "value": "foo"
+                  },
+                  {
+                    "name": "xml:lang",
+                    "value": "en"
+                  }
+                ],
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "attrs": [
+                          {
+                            "name": "href",
+                            "ns": "http://www.w3.org/1999/xlink",
+                            "value": "foo"
+                          },
+                          {
+                            "name": "lang",
+                            "ns": "http://www.w3.org/XML/1998/namespace",
+                            "value": "en"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body xlink:href=\"foo\" xml:lang=\"en\"><math><mi xml:lang=\"en\" xlink:href=\"foo\"></mi></math></body></html>",
+        "noQuirksBodyHtml": "<math><mi xml:lang=\"en\" xlink:href=\"foo\"></mi></math>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo />bar</math>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mi": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "attrs": [
+                  {
+                    "name": "xlink:href",
+                    "value": "foo"
+                  },
+                  {
+                    "name": "xml:lang",
+                    "value": "en"
+                  }
+                ],
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mi",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "attrs": [
+                          {
+                            "name": "href",
+                            "ns": "http://www.w3.org/1999/xlink",
+                            "value": "foo"
+                          },
+                          {
+                            "name": "lang",
+                            "ns": "http://www.w3.org/XML/1998/namespace",
+                            "value": "en"
+                          }
+                        ]
+                      },
+                      {
+                        "text": "bar"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body xlink:href=\"foo\" xml:lang=\"en\"><math><mi xml:lang=\"en\" xlink:href=\"foo\"></mi>bar</math></body></html>",
+        "noQuirksBodyHtml": "<math><mi xml:lang=\"en\" xlink:href=\"foo\"></mi>bar</math>"
+      }
+    }
+  ],
+  "tests_innerHTML_1.dat": [
+    {
+      "data": "<body><span>",
+      "errors": [
+        "(1,6): unexpected-start-tag",
+        "(1,12): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "body"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "span"
+          }
+        ],
+        "html": "<span></span>",
+        "noQuirksBodyHtml": "<span></span>"
+      }
+    },
+    {
+      "data": "<span><body>",
+      "errors": [
+        "(1,12): unexpected-start-tag",
+        "(1,12): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "body"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "span"
+          }
+        ],
+        "html": "<span></span>",
+        "noQuirksBodyHtml": "<span></span>"
+      }
+    },
+    {
+      "data": "<span><body>",
+      "errors": [
+        "(1,12): unexpected-start-tag",
+        "(1,12): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "div"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "span"
+          }
+        ],
+        "html": "<span></span>",
+        "noQuirksBodyHtml": "<span></span>"
+      }
+    },
+    {
+      "data": "<body><span>",
+      "errors": [
+        "(1,12): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "html"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "head": true,
+            "body": true,
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "head"
+          },
+          {
+            "tag": "body",
+            "children": [
+              {
+                "tag": "span"
+              }
+            ]
+          }
+        ],
+        "html": "<head></head><body><span></span></body>",
+        "noQuirksBodyHtml": "<span></span>"
+      }
+    },
+    {
+      "data": "<frameset><span>",
+      "errors": [
+        "(1,10): unexpected-start-tag",
+        "(1,16): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "body"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "span"
+          }
+        ],
+        "html": "<span></span>",
+        "noQuirksBodyHtml": "<span></span>"
+      }
+    },
+    {
+      "data": "<span><frameset>",
+      "errors": [
+        "(1,16): unexpected-start-tag",
+        "(1,16): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "body"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "span"
+          }
+        ],
+        "html": "<span></span>",
+        "noQuirksBodyHtml": "<span></span>"
+      }
+    },
+    {
+      "data": "<span><frameset>",
+      "errors": [
+        "(1,16): unexpected-start-tag",
+        "(1,16): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "div"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "span"
+          }
+        ],
+        "html": "<span></span>",
+        "noQuirksBodyHtml": "<span></span>"
+      }
+    },
+    {
+      "data": "<frameset><span>",
+      "errors": [
+        "(1,16): unexpected-start-tag-in-frameset",
+        "(1,16): eof-in-frameset"
+      ],
+      "fragment": {
+        "name": "html"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "head": true,
+            "frameset": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "head"
+          },
+          {
+            "tag": "frameset"
+          }
+        ],
+        "html": "<head></head><frameset></frameset>",
+        "noQuirksBodyHtml": "<span></span>"
+      }
+    },
+    {
+      "data": "<table><tr>",
+      "errors": [
+        "(1,7): unexpected-start-tag"
+      ],
+      "fragment": {
+        "name": "table"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "tbody": true,
+            "tr": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "tbody",
+            "children": [
+              {
+                "tag": "tr"
+              }
+            ]
+          }
+        ],
+        "html": "<tbody><tr></tr></tbody>",
+        "noQuirksBodyHtml": "<table><tbody><tr></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "</table><tr>",
+      "errors": [
+        "(1,8): unexpected-end-tag"
+      ],
+      "fragment": {
+        "name": "table"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "tbody": true,
+            "tr": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "tbody",
+            "children": [
+              {
+                "tag": "tr"
+              }
+            ]
+          }
+        ],
+        "html": "<tbody><tr></tr></tbody>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<a>",
+      "errors": [
+        "(1,3): unexpected-start-tag-implies-table-voodoo",
+        "(1,3): eof-in-table"
+      ],
+      "fragment": {
+        "name": "table"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          }
+        ],
+        "html": "<a></a>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<a>",
+      "errors": [
+        "(1,3): unexpected-start-tag-implies-table-voodoo",
+        "(1,3): eof-in-table"
+      ],
+      "fragment": {
+        "name": "table"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          }
+        ],
+        "html": "<a></a>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<a><caption>a",
+      "errors": [
+        "(1,3): unexpected-start-tag-implies-table-voodoo",
+        "(1,13): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "table"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true,
+            "caption": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          },
+          {
+            "tag": "caption",
+            "children": [
+              {
+                "text": "a"
+              }
+            ]
+          }
+        ],
+        "html": "<a></a><caption>a</caption>",
+        "noQuirksBodyHtml": "<a>a</a>"
+      }
+    },
+    {
+      "data": "<a><colgroup><col>",
+      "errors": [
+        "(1,3): foster-parenting-start-token",
+        "(1,18): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "table"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true,
+            "colgroup": true,
+            "col": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          },
+          {
+            "tag": "colgroup",
+            "children": [
+              {
+                "tag": "col"
+              }
+            ]
+          }
+        ],
+        "html": "<a></a><colgroup><col></colgroup>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<a><tbody><tr>",
+      "errors": [
+        "(1,3): foster-parenting-start-tag"
+      ],
+      "fragment": {
+        "name": "table"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true,
+            "tbody": true,
+            "tr": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          },
+          {
+            "tag": "tbody",
+            "children": [
+              {
+                "tag": "tr"
+              }
+            ]
+          }
+        ],
+        "html": "<a></a><tbody><tr></tr></tbody>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<a><tfoot><tr>",
+      "errors": [
+        "(1,3): foster-parenting-start-tag"
+      ],
+      "fragment": {
+        "name": "table"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true,
+            "tfoot": true,
+            "tr": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          },
+          {
+            "tag": "tfoot",
+            "children": [
+              {
+                "tag": "tr"
+              }
+            ]
+          }
+        ],
+        "html": "<a></a><tfoot><tr></tr></tfoot>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<a><thead><tr>",
+      "errors": [
+        "(1,3): foster-parenting-start-tag"
+      ],
+      "fragment": {
+        "name": "table"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true,
+            "thead": true,
+            "tr": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          },
+          {
+            "tag": "thead",
+            "children": [
+              {
+                "tag": "tr"
+              }
+            ]
+          }
+        ],
+        "html": "<a></a><thead><tr></tr></thead>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<a><tr>",
+      "errors": [
+        "(1,3): foster-parenting-start-tag"
+      ],
+      "fragment": {
+        "name": "table"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true,
+            "tbody": true,
+            "tr": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          },
+          {
+            "tag": "tbody",
+            "children": [
+              {
+                "tag": "tr"
+              }
+            ]
+          }
+        ],
+        "html": "<a></a><tbody><tr></tr></tbody>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<a><th>",
+      "errors": [
+        "(1,3): unexpected-start-tag-implies-table-voodoo",
+        "(1,7): unexpected-cell-in-table-body"
+      ],
+      "fragment": {
+        "name": "table"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true,
+            "tbody": true,
+            "tr": true,
+            "th": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          },
+          {
+            "tag": "tbody",
+            "children": [
+              {
+                "tag": "tr",
+                "children": [
+                  {
+                    "tag": "th"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<a></a><tbody><tr><th></th></tr></tbody>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<a><td>",
+      "errors": [
+        "(1,3): unexpected-start-tag-implies-table-voodoo",
+        "(1,7): unexpected-cell-in-table-body"
+      ],
+      "fragment": {
+        "name": "table"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          },
+          {
+            "tag": "tbody",
+            "children": [
+              {
+                "tag": "tr",
+                "children": [
+                  {
+                    "tag": "td"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<a></a><tbody><tr><td></td></tr></tbody>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<table></table><tbody>",
+      "errors": [
+        "(1,22): unexpected-start-tag"
+      ],
+      "fragment": {
+        "name": "caption"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "table": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "table"
+          }
+        ],
+        "html": "<table></table>",
+        "noQuirksBodyHtml": "<table></table>"
+      }
+    },
+    {
+      "data": "</table><span>",
+      "errors": [
+        "(1,8): unexpected-end-tag",
+        "(1,14): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "caption"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "span"
+          }
+        ],
+        "html": "<span></span>",
+        "noQuirksBodyHtml": "<span></span>"
+      }
+    },
+    {
+      "data": "<span></table>",
+      "errors": [
+        "(1,14): unexpected-end-tag",
+        "(1,14): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "caption"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "span"
+          }
+        ],
+        "html": "<span></span>",
+        "noQuirksBodyHtml": "<span></span>"
+      }
+    },
+    {
+      "data": "</caption><span>",
+      "errors": [
+        "(1,10): XXX-undefined-error",
+        "(1,16): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "caption"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "span"
+          }
+        ],
+        "html": "<span></span>",
+        "noQuirksBodyHtml": "<span></span>"
+      }
+    },
+    {
+      "data": "<span></caption><span>",
+      "errors": [
+        "(1,16): XXX-undefined-error",
+        "(1,22): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "caption"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "span",
+            "children": [
+              {
+                "tag": "span"
+              }
+            ]
+          }
+        ],
+        "html": "<span><span></span></span>",
+        "noQuirksBodyHtml": "<span><span></span></span>"
+      }
+    },
+    {
+      "data": "<span><caption><span>",
+      "errors": [
+        "(1,15): unexpected-start-tag",
+        "(1,21): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "caption"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "span",
+            "children": [
+              {
+                "tag": "span"
+              }
+            ]
+          }
+        ],
+        "html": "<span><span></span></span>",
+        "noQuirksBodyHtml": "<span><span></span></span>"
+      }
+    },
+    {
+      "data": "<span><col><span>",
+      "errors": [
+        "(1,11): unexpected-start-tag",
+        "(1,17): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "caption"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "span",
+            "children": [
+              {
+                "tag": "span"
+              }
+            ]
+          }
+        ],
+        "html": "<span><span></span></span>",
+        "noQuirksBodyHtml": "<span><span></span></span>"
+      }
+    },
+    {
+      "data": "<span><colgroup><span>",
+      "errors": [
+        "(1,16): unexpected-start-tag",
+        "(1,22): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "caption"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "span",
+            "children": [
+              {
+                "tag": "span"
+              }
+            ]
+          }
+        ],
+        "html": "<span><span></span></span>",
+        "noQuirksBodyHtml": "<span><span></span></span>"
+      }
+    },
+    {
+      "data": "<span><html><span>",
+      "errors": [
+        "(1,12): non-html-root",
+        "(1,18): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "caption"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "span",
+            "children": [
+              {
+                "tag": "span"
+              }
+            ]
+          }
+        ],
+        "html": "<span><span></span></span>",
+        "noQuirksBodyHtml": "<span><span></span></span>"
+      }
+    },
+    {
+      "data": "<span><tbody><span>",
+      "errors": [
+        "(1,13): unexpected-start-tag",
+        "(1,19): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "caption"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "span",
+            "children": [
+              {
+                "tag": "span"
+              }
+            ]
+          }
+        ],
+        "html": "<span><span></span></span>",
+        "noQuirksBodyHtml": "<span><span></span></span>"
+      }
+    },
+    {
+      "data": "<span><td><span>",
+      "errors": [
+        "(1,10): unexpected-start-tag",
+        "(1,16): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "caption"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "span",
+            "children": [
+              {
+                "tag": "span"
+              }
+            ]
+          }
+        ],
+        "html": "<span><span></span></span>",
+        "noQuirksBodyHtml": "<span><span></span></span>"
+      }
+    },
+    {
+      "data": "<span><tfoot><span>",
+      "errors": [
+        "(1,13): unexpected-start-tag",
+        "(1,19): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "caption"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "span",
+            "children": [
+              {
+                "tag": "span"
+              }
+            ]
+          }
+        ],
+        "html": "<span><span></span></span>",
+        "noQuirksBodyHtml": "<span><span></span></span>"
+      }
+    },
+    {
+      "data": "<span><thead><span>",
+      "errors": [
+        "(1,13): unexpected-start-tag",
+        "(1,19): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "caption"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "span",
+            "children": [
+              {
+                "tag": "span"
+              }
+            ]
+          }
+        ],
+        "html": "<span><span></span></span>",
+        "noQuirksBodyHtml": "<span><span></span></span>"
+      }
+    },
+    {
+      "data": "<span><th><span>",
+      "errors": [
+        "(1,10): unexpected-start-tag",
+        "(1,16): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "caption"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "span",
+            "children": [
+              {
+                "tag": "span"
+              }
+            ]
+          }
+        ],
+        "html": "<span><span></span></span>",
+        "noQuirksBodyHtml": "<span><span></span></span>"
+      }
+    },
+    {
+      "data": "<span><tr><span>",
+      "errors": [
+        "(1,10): unexpected-start-tag",
+        "(1,16): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "caption"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "span",
+            "children": [
+              {
+                "tag": "span"
+              }
+            ]
+          }
+        ],
+        "html": "<span><span></span></span>",
+        "noQuirksBodyHtml": "<span><span></span></span>"
+      }
+    },
+    {
+      "data": "<span></table><span>",
+      "errors": [
+        "(1,14): unexpected-end-tag",
+        "(1,20): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "caption"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "span",
+            "children": [
+              {
+                "tag": "span"
+              }
+            ]
+          }
+        ],
+        "html": "<span><span></span></span>",
+        "noQuirksBodyHtml": "<span><span></span></span>"
+      }
+    },
+    {
+      "data": "</colgroup><col>",
+      "errors": [
+        "(1,11): XXX-undefined-error"
+      ],
+      "fragment": {
+        "name": "colgroup"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "col": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "col"
+          }
+        ],
+        "html": "<col>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<a><col>",
+      "errors": [
+        "(1,3): XXX-undefined-error"
+      ],
+      "fragment": {
+        "name": "colgroup"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "col": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "col"
+          }
+        ],
+        "html": "<col>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<caption><a>",
+      "errors": [
+        "(1,9): XXX-undefined-error",
+        "(1,12): unexpected-start-tag-implies-table-voodoo",
+        "(1,12): eof-in-table"
+      ],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          }
+        ],
+        "html": "<a></a>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<col><a>",
+      "errors": [
+        "(1,5): XXX-undefined-error",
+        "(1,8): unexpected-start-tag-implies-table-voodoo",
+        "(1,8): eof-in-table"
+      ],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          }
+        ],
+        "html": "<a></a>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<colgroup><a>",
+      "errors": [
+        "(1,10): XXX-undefined-error",
+        "(1,13): unexpected-start-tag-implies-table-voodoo",
+        "(1,13): eof-in-table"
+      ],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          }
+        ],
+        "html": "<a></a>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<tbody><a>",
+      "errors": [
+        "(1,7): XXX-undefined-error",
+        "(1,10): unexpected-start-tag-implies-table-voodoo",
+        "(1,10): eof-in-table"
+      ],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          }
+        ],
+        "html": "<a></a>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<tfoot><a>",
+      "errors": [
+        "(1,7): XXX-undefined-error",
+        "(1,10): unexpected-start-tag-implies-table-voodoo",
+        "(1,10): eof-in-table"
+      ],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          }
+        ],
+        "html": "<a></a>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<thead><a>",
+      "errors": [
+        "(1,7): XXX-undefined-error",
+        "(1,10): unexpected-start-tag-implies-table-voodoo",
+        "(1,10): eof-in-table"
+      ],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          }
+        ],
+        "html": "<a></a>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "</table><a>",
+      "errors": [
+        "(1,8): XXX-undefined-error",
+        "(1,11): unexpected-start-tag-implies-table-voodoo",
+        "(1,11): eof-in-table"
+      ],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          }
+        ],
+        "html": "<a></a>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<a><tr>",
+      "errors": [
+        "(1,3): unexpected-start-tag-implies-table-voodoo"
+      ],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true,
+            "tr": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          },
+          {
+            "tag": "tr"
+          }
+        ],
+        "html": "<a></a><tr></tr>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<a><td>",
+      "errors": [
+        "(1,3): unexpected-start-tag-implies-table-voodoo",
+        "(1,7): unexpected-cell-in-table-body"
+      ],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          },
+          {
+            "tag": "tr",
+            "children": [
+              {
+                "tag": "td"
+              }
+            ]
+          }
+        ],
+        "html": "<a></a><tr><td></td></tr>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<a><td>",
+      "errors": [
+        "(1,3): unexpected-start-tag-implies-table-voodoo",
+        "(1,7): unexpected-cell-in-table-body"
+      ],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          },
+          {
+            "tag": "tr",
+            "children": [
+              {
+                "tag": "td"
+              }
+            ]
+          }
+        ],
+        "html": "<a></a><tr><td></td></tr>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<a><td>",
+      "errors": [
+        "(1,3): unexpected-start-tag-implies-table-voodoo",
+        "(1,7): unexpected-cell-in-table-body"
+      ],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          },
+          {
+            "tag": "tr",
+            "children": [
+              {
+                "tag": "td"
+              }
+            ]
+          }
+        ],
+        "html": "<a></a><tr><td></td></tr>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<td><table><tbody><a><tr>",
+      "errors": [
+        "(1,4): unexpected-cell-in-table-body",
+        "(1,21): unexpected-start-tag-implies-table-voodoo",
+        "(1,25): eof-in-table"
+      ],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "tr": true,
+            "td": true,
+            "a": true,
+            "table": true,
+            "tbody": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "tr",
+            "children": [
+              {
+                "tag": "td",
+                "children": [
+                  {
+                    "tag": "a"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<tr><td><a></a><table><tbody><tr></tr></tbody></table></td></tr>",
+        "noQuirksBodyHtml": "<a></a><table><tbody><tr></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "</tr><td>",
+      "errors": [
+        "(1,5): XXX-undefined-error"
+      ],
+      "fragment": {
+        "name": "tr"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "td"
+          }
+        ],
+        "html": "<td></td>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<td><table><a><tr></tr><tr>",
+      "errors": [
+        "(1,14): unexpected-start-tag-implies-table-voodoo",
+        "(1,27): eof-in-table"
+      ],
+      "fragment": {
+        "name": "tr"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "td": true,
+            "a": true,
+            "table": true,
+            "tbody": true,
+            "tr": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "td",
+            "children": [
+              {
+                "tag": "a"
+              },
+              {
+                "tag": "table",
+                "children": [
+                  {
+                    "tag": "tbody",
+                    "children": [
+                      {
+                        "tag": "tr"
+                      },
+                      {
+                        "tag": "tr"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<td><a></a><table><tbody><tr></tr><tr></tr></tbody></table></td>",
+        "noQuirksBodyHtml": "<a></a><table><tbody><tr></tr><tr></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<caption><td>",
+      "errors": [
+        "(1,9): XXX-undefined-error"
+      ],
+      "fragment": {
+        "name": "tr"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "td"
+          }
+        ],
+        "html": "<td></td>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<col><td>",
+      "errors": [
+        "(1,5): XXX-undefined-error"
+      ],
+      "fragment": {
+        "name": "tr"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "td"
+          }
+        ],
+        "html": "<td></td>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<colgroup><td>",
+      "errors": [
+        "(1,10): XXX-undefined-error"
+      ],
+      "fragment": {
+        "name": "tr"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "td"
+          }
+        ],
+        "html": "<td></td>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<tbody><td>",
+      "errors": [
+        "(1,7): XXX-undefined-error"
+      ],
+      "fragment": {
+        "name": "tr"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "td"
+          }
+        ],
+        "html": "<td></td>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<tfoot><td>",
+      "errors": [
+        "(1,7): XXX-undefined-error"
+      ],
+      "fragment": {
+        "name": "tr"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "td"
+          }
+        ],
+        "html": "<td></td>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<thead><td>",
+      "errors": [
+        "(1,7): XXX-undefined-error"
+      ],
+      "fragment": {
+        "name": "tr"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "td"
+          }
+        ],
+        "html": "<td></td>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<tr><td>",
+      "errors": [
+        "(1,4): XXX-undefined-error"
+      ],
+      "fragment": {
+        "name": "tr"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "td"
+          }
+        ],
+        "html": "<td></td>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "</table><td>",
+      "errors": [
+        "(1,8): XXX-undefined-error"
+      ],
+      "fragment": {
+        "name": "tr"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "td"
+          }
+        ],
+        "html": "<td></td>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<td><table></table><td>",
+      "errors": [],
+      "fragment": {
+        "name": "tr"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "td": true,
+            "table": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "td",
+            "children": [
+              {
+                "tag": "table"
+              }
+            ]
+          },
+          {
+            "tag": "td"
+          }
+        ],
+        "html": "<td><table></table></td><td></td>",
+        "noQuirksBodyHtml": "<table></table>"
+      }
+    },
+    {
+      "data": "<td><table></table><td>",
+      "errors": [],
+      "fragment": {
+        "name": "tr"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "td": true,
+            "table": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "td",
+            "children": [
+              {
+                "tag": "table"
+              }
+            ]
+          },
+          {
+            "tag": "td"
+          }
+        ],
+        "html": "<td><table></table></td><td></td>",
+        "noQuirksBodyHtml": "<table></table>"
+      }
+    },
+    {
+      "data": "<caption><a>",
+      "errors": [
+        "(1,9): XXX-undefined-error",
+        "(1,12): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "td"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          }
+        ],
+        "html": "<a></a>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<col><a>",
+      "errors": [
+        "(1,5): XXX-undefined-error",
+        "(1,8): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "td"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          }
+        ],
+        "html": "<a></a>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<colgroup><a>",
+      "errors": [
+        "(1,10): XXX-undefined-error",
+        "(1,13): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "td"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          }
+        ],
+        "html": "<a></a>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<tbody><a>",
+      "errors": [
+        "(1,7): XXX-undefined-error",
+        "(1,10): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "td"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          }
+        ],
+        "html": "<a></a>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<tfoot><a>",
+      "errors": [
+        "(1,7): XXX-undefined-error",
+        "(1,10): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "td"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          }
+        ],
+        "html": "<a></a>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<th><a>",
+      "errors": [
+        "(1,4): XXX-undefined-error",
+        "(1,7): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "td"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          }
+        ],
+        "html": "<a></a>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<thead><a>",
+      "errors": [
+        "(1,7): XXX-undefined-error",
+        "(1,10): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "td"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          }
+        ],
+        "html": "<a></a>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<tr><a>",
+      "errors": [
+        "(1,4): XXX-undefined-error",
+        "(1,7): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "td"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          }
+        ],
+        "html": "<a></a>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "</table><a>",
+      "errors": [
+        "(1,8): XXX-undefined-error",
+        "(1,11): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "td"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          }
+        ],
+        "html": "<a></a>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "</tbody><a>",
+      "errors": [
+        "(1,8): XXX-undefined-error",
+        "(1,11): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "td"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          }
+        ],
+        "html": "<a></a>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "</td><a>",
+      "errors": [
+        "(1,5): unexpected-end-tag",
+        "(1,8): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "td"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          }
+        ],
+        "html": "<a></a>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "</tfoot><a>",
+      "errors": [
+        "(1,8): XXX-undefined-error",
+        "(1,11): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "td"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          }
+        ],
+        "html": "<a></a>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "</thead><a>",
+      "errors": [
+        "(1,8): XXX-undefined-error",
+        "(1,11): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "td"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          }
+        ],
+        "html": "<a></a>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "</th><a>",
+      "errors": [
+        "(1,5): unexpected-end-tag",
+        "(1,8): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "td"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          }
+        ],
+        "html": "<a></a>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "</tr><a>",
+      "errors": [
+        "(1,5): XXX-undefined-error",
+        "(1,8): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "td"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "a"
+          }
+        ],
+        "html": "<a></a>",
+        "noQuirksBodyHtml": "<a></a>"
+      }
+    },
+    {
+      "data": "<table><td><td>",
+      "errors": [
+        "(1,11): unexpected-cell-in-table-body",
+        "(1,15): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "td"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "table",
+            "children": [
+              {
+                "tag": "tbody",
+                "children": [
+                  {
+                    "tag": "tr",
+                    "children": [
+                      {
+                        "tag": "td"
+                      },
+                      {
+                        "tag": "td"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<table><tbody><tr><td></td><td></td></tr></tbody></table>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td></td><td></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "</select><option>",
+      "errors": [
+        "(1,9): XXX-undefined-error",
+        "(1,17): eof-in-select"
+      ],
+      "fragment": {
+        "name": "select"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "option": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "option"
+          }
+        ],
+        "html": "<option></option>",
+        "noQuirksBodyHtml": "<option></option>"
+      }
+    },
+    {
+      "data": "<input><option>",
+      "errors": [
+        "(1,7): unexpected-input-in-select",
+        "(1,15): eof-in-select"
+      ],
+      "fragment": {
+        "name": "select"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "option": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "option"
+          }
+        ],
+        "html": "<option></option>",
+        "noQuirksBodyHtml": "<input><option></option>"
+      }
+    },
+    {
+      "data": "<keygen><option>",
+      "errors": [
+        "(1,8): unexpected-input-in-select",
+        "(1,16): eof-in-select"
+      ],
+      "fragment": {
+        "name": "select"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "option": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "option"
+          }
+        ],
+        "html": "<option></option>",
+        "noQuirksBodyHtml": "<keygen><option></option>"
+      }
+    },
+    {
+      "data": "<textarea><option>",
+      "errors": [
+        "(1,10): unexpected-input-in-select",
+        "(1,18): eof-in-select"
+      ],
+      "fragment": {
+        "name": "select"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "option": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "option"
+          }
+        ],
+        "html": "<option></option>",
+        "noQuirksBodyHtml": "<textarea>&lt;option&gt;</textarea>"
+      }
+    },
+    {
+      "data": "</html><!--abc-->",
+      "errors": [
+        "(1,7): unexpected-end-tag-after-body-innerhtml"
+      ],
+      "fragment": {
+        "name": "html"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "head"
+          },
+          {
+            "tag": "body"
+          },
+          {
+            "comment": "abc"
+          }
+        ],
+        "html": "<head></head><body></body><!--abc-->",
+        "noQuirksBodyHtml": "<!--abc-->"
+      }
+    },
+    {
+      "data": "</frameset><frame>",
+      "errors": [
+        "(1,11): unexpected-frameset-in-frameset-innerhtml"
+      ],
+      "fragment": {
+        "name": "frameset"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "frame": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "frame"
+          }
+        ],
+        "html": "<frame>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "",
+      "errors": [],
+      "fragment": {
+        "name": "html"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "head"
+          },
+          {
+            "tag": "body"
+          }
+        ],
+        "html": "<head></head><body></body>",
+        "noQuirksBodyHtml": ""
+      }
+    }
+  ],
+  "tricky01.dat": [
+    {
+      "data": "<b><p>Bold </b> Not bold</p>\nAlso not bold.",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,15): adoption-agency-1.3"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b"
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "text": "Bold "
+                          }
+                        ]
+                      },
+                      {
+                        "text": " Not bold"
+                      }
+                    ]
+                  },
+                  {
+                    "text": "\nAlso not bold."
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><b></b><p><b>Bold </b> Not bold</p>\nAlso not bold.</body></html>",
+        "noQuirksBodyHtml": "<b></b><p><b>Bold </b> Not bold</p>\nAlso not bold."
+      }
+    },
+    {
+      "data": "<html>\n<font color=red><i>Italic and Red<p>Italic and Red </font> Just italic.</p> Italic only.</i> Plain\n<p>I should not be red. <font color=red>Red. <i>Italic and red.</p>\n<p>Italic and red. </i> Red.</font> I should not be red.</p>\n<b>Bold <i>Bold and italic</b> Only Italic </i> Plain",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(2,58): adoption-agency-1.3",
+        "(3,67): unexpected-end-tag",
+        "(4,23): adoption-agency-1.3",
+        "(4,35): adoption-agency-1.3",
+        "(5,30): adoption-agency-1.3"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "font": true,
+            "i": true,
+            "p": true,
+            "b": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "font",
+                    "attrs": [
+                      {
+                        "name": "color",
+                        "value": "red"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "tag": "i",
+                        "children": [
+                          {
+                            "text": "Italic and Red"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "i",
+                    "children": [
+                      {
+                        "tag": "p",
+                        "children": [
+                          {
+                            "tag": "font",
+                            "attrs": [
+                              {
+                                "name": "color",
+                                "value": "red"
+                              }
+                            ],
+                            "children": [
+                              {
+                                "text": "Italic and Red "
+                              }
+                            ]
+                          },
+                          {
+                            "text": " Just italic."
+                          }
+                        ]
+                      },
+                      {
+                        "text": " Italic only."
+                      }
+                    ]
+                  },
+                  {
+                    "text": " Plain\n"
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "I should not be red. "
+                      },
+                      {
+                        "tag": "font",
+                        "attrs": [
+                          {
+                            "name": "color",
+                            "value": "red"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "text": "Red. "
+                          },
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "text": "Italic and red."
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "font",
+                    "attrs": [
+                      {
+                        "name": "color",
+                        "value": "red"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "tag": "i",
+                        "children": [
+                          {
+                            "text": "\n"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "font",
+                        "attrs": [
+                          {
+                            "name": "color",
+                            "value": "red"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "text": "Italic and red. "
+                              }
+                            ]
+                          },
+                          {
+                            "text": " Red."
+                          }
+                        ]
+                      },
+                      {
+                        "text": " I should not be red."
+                      }
+                    ]
+                  },
+                  {
+                    "text": "\n"
+                  },
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "text": "Bold "
+                      },
+                      {
+                        "tag": "i",
+                        "children": [
+                          {
+                            "text": "Bold and italic"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "i",
+                    "children": [
+                      {
+                        "text": " Only Italic "
+                      }
+                    ]
+                  },
+                  {
+                    "text": " Plain"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><font color=\"red\"><i>Italic and Red</i></font><i><p><font color=\"red\">Italic and Red </font> Just italic.</p> Italic only.</i> Plain\n<p>I should not be red. <font color=\"red\">Red. <i>Italic and red.</i></font></p><font color=\"red\"><i>\n</i></font><p><font color=\"red\"><i>Italic and red. </i> Red.</font> I should not be red.</p>\n<b>Bold <i>Bold and italic</i></b><i> Only Italic </i> Plain</body></html>",
+        "noQuirksBodyHtml": "\n<font color=\"red\"><i>Italic and Red</i></font><i><p><font color=\"red\">Italic and Red </font> Just italic.</p> Italic only.</i> Plain\n<p>I should not be red. <font color=\"red\">Red. <i>Italic and red.</i></font></p><font color=\"red\"><i>\n</i></font><p><font color=\"red\"><i>Italic and red. </i> Red.</font> I should not be red.</p>\n<b>Bold <i>Bold and italic</i></b><i> Only Italic </i> Plain"
+      }
+    },
+    {
+      "data": "<html><body>\n<p><font size=\"7\">First paragraph.</p>\n<p>Second paragraph.</p></font>\n<b><p><i>Bold and Italic</b> Italic</p>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(2,38): unexpected-end-tag",
+        "(4,28): adoption-agency-1.3",
+        "(4,28): adoption-agency-1.3",
+        "(4,39): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "font": true,
+            "b": true,
+            "i": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "\n"
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "font",
+                        "attrs": [
+                          {
+                            "name": "size",
+                            "value": "7"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "text": "First paragraph."
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "font",
+                    "attrs": [
+                      {
+                        "name": "size",
+                        "value": "7"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "\n"
+                      },
+                      {
+                        "tag": "p",
+                        "children": [
+                          {
+                            "text": "Second paragraph."
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "text": "\n"
+                  },
+                  {
+                    "tag": "b"
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "tag": "i",
+                            "children": [
+                              {
+                                "text": "Bold and Italic"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "i",
+                        "children": [
+                          {
+                            "text": " Italic"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>\n<p><font size=\"7\">First paragraph.</font></p><font size=\"7\">\n<p>Second paragraph.</p></font>\n<b></b><p><b><i>Bold and Italic</i></b><i> Italic</i></p></body></html>",
+        "noQuirksBodyHtml": "\n<p><font size=\"7\">First paragraph.</font></p><font size=\"7\">\n<p>Second paragraph.</p></font>\n<b></b><p><b><i>Bold and Italic</i></b><i> Italic</i></p>"
+      }
+    },
+    {
+      "data": "<html>\n<dl>\n<dt><b>Boo\n<dd>Goo?\n</dl>\n</html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(4,4): end-tag-too-early",
+        "(5,5): end-tag-too-early",
+        "(6,7): expected-one-end-tag-but-got-another"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "dl": true,
+            "dt": true,
+            "b": true,
+            "dd": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "dl",
+                    "children": [
+                      {
+                        "text": "\n"
+                      },
+                      {
+                        "tag": "dt",
+                        "children": [
+                          {
+                            "tag": "b",
+                            "children": [
+                              {
+                                "text": "Boo\n"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "dd",
+                        "children": [
+                          {
+                            "tag": "b",
+                            "children": [
+                              {
+                                "text": "Goo?\n"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "text": "\n"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><dl>\n<dt><b>Boo\n</b></dt><dd><b>Goo?\n</b></dd></dl><b>\n</b></body></html>",
+        "noQuirksBodyHtml": "\n<dl>\n<dt><b>Boo\n</b></dt><dd><b>Goo?\n</b></dd></dl><b>\n</b>"
+      }
+    },
+    {
+      "data": "<html><body>\n<label><a><div>Hello<div>World</div></a></label>  \n</body></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(2,40): adoption-agency-1.3",
+        "(2,48): unexpected-end-tag",
+        "(3,7): expected-one-end-tag-but-got-another"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "label": true,
+            "a": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "\n"
+                  },
+                  {
+                    "tag": "label",
+                    "children": [
+                      {
+                        "tag": "a"
+                      },
+                      {
+                        "tag": "div",
+                        "children": [
+                          {
+                            "tag": "a",
+                            "children": [
+                              {
+                                "text": "Hello"
+                              },
+                              {
+                                "tag": "div",
+                                "children": [
+                                  {
+                                    "text": "World"
+                                  }
+                                ]
+                              }
+                            ]
+                          },
+                          {
+                            "text": "  \n"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>\n<label><a></a><div><a>Hello<div>World</div></a>  \n</div></label></body></html>",
+        "noQuirksBodyHtml": "\n<label><a></a><div><a>Hello<div>World</div></a>  \n</div></label>"
+      }
+    },
+    {
+      "data": "<table><center> <font>a</center> <img> <tr><td> </td> </tr> </table>",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,15): foster-parenting-start-tag",
+        "(1,16): foster-parenting-character",
+        "(1,22): foster-parenting-start-tag",
+        "(1,23): foster-parenting-character",
+        "(1,32): foster-parenting-end-tag",
+        "(1,32): end-tag-too-early",
+        "(1,33): foster-parenting-character",
+        "(1,38): foster-parenting-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "center": true,
+            "font": true,
+            "img": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "center",
+                    "children": [
+                      {
+                        "text": " "
+                      },
+                      {
+                        "tag": "font",
+                        "children": [
+                          {
+                            "text": "a"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "font",
+                    "children": [
+                      {
+                        "tag": "img"
+                      },
+                      {
+                        "text": " "
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "text": " "
+                      },
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "text": " "
+                                  }
+                                ]
+                              },
+                              {
+                                "text": " "
+                              }
+                            ]
+                          },
+                          {
+                            "text": " "
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><center> <font>a</font></center><font><img> </font><table> <tbody><tr><td> </td> </tr> </tbody></table></body></html>",
+        "noQuirksBodyHtml": "<center> <font>a</font></center><font><img> </font><table> <tbody><tr><td> </td> </tr> </tbody></table>"
+      }
+    },
+    {
+      "data": "<table><tr><p><a><p>You should see this text.",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,14): unexpected-start-tag-implies-table-voodoo",
+        "(1,17): unexpected-start-tag-implies-table-voodoo",
+        "(1,20): unexpected-start-tag-implies-table-voodoo",
+        "(1,20): closing-non-current-p-element",
+        "(1,21): foster-parenting-character",
+        "(1,22): foster-parenting-character",
+        "(1,23): foster-parenting-character",
+        "(1,24): foster-parenting-character",
+        "(1,25): foster-parenting-character",
+        "(1,26): foster-parenting-character",
+        "(1,27): foster-parenting-character",
+        "(1,28): foster-parenting-character",
+        "(1,29): foster-parenting-character",
+        "(1,30): foster-parenting-character",
+        "(1,31): foster-parenting-character",
+        "(1,32): foster-parenting-character",
+        "(1,33): foster-parenting-character",
+        "(1,34): foster-parenting-character",
+        "(1,35): foster-parenting-character",
+        "(1,36): foster-parenting-character",
+        "(1,37): foster-parenting-character",
+        "(1,38): foster-parenting-character",
+        "(1,39): foster-parenting-character",
+        "(1,40): foster-parenting-character",
+        "(1,41): foster-parenting-character",
+        "(1,42): foster-parenting-character",
+        "(1,43): foster-parenting-character",
+        "(1,44): foster-parenting-character",
+        "(1,45): foster-parenting-character",
+        "(1,45): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "a": true,
+            "table": true,
+            "tbody": true,
+            "tr": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "a"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "a",
+                        "children": [
+                          {
+                            "text": "You should see this text."
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><p><a></a></p><p><a>You should see this text.</a></p><table><tbody><tr></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<p><a></a></p><p><a>You should see this text.</a></p><table><tbody><tr></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<TABLE>\n<TR>\n<CENTER><CENTER><TD></TD></TR><TR>\n<FONT>\n<TABLE><tr></tr></TABLE>\n</P>\n<a></font><font></a>\nThis page contains an insanely badly-nested tag sequence.",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(3,8): unexpected-start-tag-implies-table-voodoo",
+        "(3,16): unexpected-start-tag-implies-table-voodoo",
+        "(4,6): unexpected-start-tag-implies-table-voodoo",
+        "(4,6): unexpected character token in table (the newline)",
+        "(5,7): unexpected-start-tag-implies-end-tag",
+        "(6,4): unexpected p end tag",
+        "(7,10): adoption-agency-1.3",
+        "(7,20): adoption-agency-1.3",
+        "(8,57): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "center": true,
+            "font": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "p": true,
+            "a": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "center",
+                    "children": [
+                      {
+                        "tag": "center"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "font",
+                    "children": [
+                      {
+                        "text": "\n"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "text": "\n"
+                      },
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "text": "\n"
+                              },
+                              {
+                                "tag": "td"
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "text": "\n"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "font",
+                    "children": [
+                      {
+                        "text": "\n"
+                      },
+                      {
+                        "tag": "p"
+                      },
+                      {
+                        "text": "\n"
+                      },
+                      {
+                        "tag": "a"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "a",
+                    "children": [
+                      {
+                        "tag": "font"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "font",
+                    "children": [
+                      {
+                        "text": "\nThis page contains an insanely badly-nested tag sequence."
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><center><center></center></center><font>\n</font><table>\n<tbody><tr>\n<td></td></tr><tr>\n</tr></tbody></table><table><tbody><tr></tr></tbody></table><font>\n<p></p>\n<a></a></font><a><font></font></a><font>\nThis page contains an insanely badly-nested tag sequence.</font></body></html>",
+        "noQuirksBodyHtml": "<center><center></center></center><font>\n</font><table>\n<tbody><tr>\n<td></td></tr><tr>\n</tr></tbody></table><table><tbody><tr></tr></tbody></table><font>\n<p></p>\n<a></a></font><a><font></font></a><font>\nThis page contains an insanely badly-nested tag sequence.</font>"
+      }
+    },
+    {
+      "data": "<html>\n<body>\n<b><nobr><div>This text is in a div inside a nobr</nobr>More text that should not be in the nobr, i.e., the\nnobr should have closed the div inside it implicitly. </b><pre>A pre tag outside everything else.</pre>\n</body>\n</html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(3,56): adoption-agency-1.3",
+        "(4,58): adoption-agency-1.3",
+        "(5,7): expected-one-end-tag-but-got-another"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "nobr": true,
+            "div": true,
+            "pre": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "\n"
+                  },
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "nobr"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "tag": "nobr",
+                            "children": [
+                              {
+                                "text": "This text is in a div inside a nobr"
+                              }
+                            ]
+                          },
+                          {
+                            "text": "More text that should not be in the nobr, i.e., the\nnobr should have closed the div inside it implicitly. "
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "pre",
+                        "children": [
+                          {
+                            "text": "A pre tag outside everything else."
+                          }
+                        ]
+                      },
+                      {
+                        "text": "\n\n"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>\n<b><nobr></nobr></b><div><b><nobr>This text is in a div inside a nobr</nobr>More text that should not be in the nobr, i.e., the\nnobr should have closed the div inside it implicitly. </b><pre>A pre tag outside everything else.</pre>\n\n</div></body></html>",
+        "noQuirksBodyHtml": "\n\n<b><nobr></nobr></b><div><b><nobr>This text is in a div inside a nobr</nobr>More text that should not be in the nobr, i.e., the\nnobr should have closed the div inside it implicitly. </b><pre>A pre tag outside everything else.</pre>\n\n</div>"
+      }
+    }
+  ],
+  "webkit01.dat": [
+    {
+      "data": "Test",
+      "errors": [
+        "(1,4): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Test"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>Test</body></html>",
+        "noQuirksBodyHtml": "Test"
+      }
+    },
+    {
+      "data": "<div></div>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div></div></body></html>",
+        "noQuirksBodyHtml": "<div></div>"
+      }
+    },
+    {
+      "data": "<div>Test</div>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": "Test"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div>Test</div></body></html>",
+        "noQuirksBodyHtml": "<div>Test</div>"
+      }
+    },
+    {
+      "data": "<di",
+      "errors": [
+        "(1,3): eof-in-tag-name",
+        "(1,3): expected-doctype-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<div>Hello</div>\n<script>\nconsole.log(\"PASS\");\n</script>\n<div>Bye</div>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "script": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": "Hello"
+                      }
+                    ]
+                  },
+                  {
+                    "text": "\n"
+                  },
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "\nconsole.log(\"PASS\");\n",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "\n"
+                  },
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": "Bye"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div>Hello</div>\n<script>\nconsole.log(\"PASS\");\n</script>\n<div>Bye</div></body></html>",
+        "noQuirksBodyHtml": "<div>Hello</div>\n<script>\nconsole.log(\"PASS\");\n</script>\n<div>Bye</div>"
+      }
+    },
+    {
+      "data": "<div foo=\"bar\">Hello</div>",
+      "errors": [
+        "(1,15): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "attrs": [
+                      {
+                        "name": "foo",
+                        "value": "bar"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "text": "Hello"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div foo=\"bar\">Hello</div></body></html>",
+        "noQuirksBodyHtml": "<div foo=\"bar\">Hello</div>"
+      }
+    },
+    {
+      "data": "<div>Hello</div>\n<script>\nconsole.log(\"FOO<span>BAR</span>BAZ\");\n</script>\n<div>Bye</div>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "script": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": "Hello"
+                      }
+                    ]
+                  },
+                  {
+                    "text": "\n"
+                  },
+                  {
+                    "tag": "script",
+                    "children": [
+                      {
+                        "text": "\nconsole.log(\"FOO<span>BAR</span>BAZ\");\n",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "text": "\n"
+                  },
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "text": "Bye"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div>Hello</div>\n<script>\nconsole.log(\"FOO<span>BAR</span>BAZ\");\n</script>\n<div>Bye</div></body></html>",
+        "noQuirksBodyHtml": "<div>Hello</div>\n<script>\nconsole.log(\"FOO<span>BAR</span>BAZ\");\n</script>\n<div>Bye</div>"
+      }
+    },
+    {
+      "data": "<foo bar=\"baz\"></foo><potato quack=\"duck\"></potato>",
+      "errors": [
+        "(1,15): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "foo": true,
+            "potato": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "foo",
+                    "attrs": [
+                      {
+                        "name": "bar",
+                        "value": "baz"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "potato",
+                    "attrs": [
+                      {
+                        "name": "quack",
+                        "value": "duck"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><foo bar=\"baz\"></foo><potato quack=\"duck\"></potato></body></html>",
+        "noQuirksBodyHtml": "<foo bar=\"baz\"></foo><potato quack=\"duck\"></potato>"
+      }
+    },
+    {
+      "data": "<foo bar=\"baz\"><potato quack=\"duck\"></potato></foo>",
+      "errors": [
+        "(1,15): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "foo": true,
+            "potato": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "foo",
+                    "attrs": [
+                      {
+                        "name": "bar",
+                        "value": "baz"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "tag": "potato",
+                        "attrs": [
+                          {
+                            "name": "quack",
+                            "value": "duck"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><foo bar=\"baz\"><potato quack=\"duck\"></potato></foo></body></html>",
+        "noQuirksBodyHtml": "<foo bar=\"baz\"><potato quack=\"duck\"></potato></foo>"
+      }
+    },
+    {
+      "data": "<foo></foo bar=\"baz\"><potato></potato quack=\"duck\">",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,21): attributes-in-end-tag",
+        "(1,51): attributes-in-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "foo": true,
+            "potato": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "foo"
+                  },
+                  {
+                    "tag": "potato"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><foo></foo><potato></potato></body></html>",
+        "noQuirksBodyHtml": "<foo></foo><potato></potato>"
+      }
+    },
+    {
+      "data": "</ tttt>",
+      "errors": [
+        "(1,2): expected-closing-tag-but-got-char",
+        "(1,8): expected-doctype-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "comment": " tttt"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!-- tttt--><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": "<!-- tttt-->"
+      }
+    },
+    {
+      "data": "<div FOO ><img><img></div>",
+      "errors": [
+        "(1,10): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "img": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "attrs": [
+                      {
+                        "name": "foo",
+                        "value": ""
+                      }
+                    ],
+                    "children": [
+                      {
+                        "tag": "img"
+                      },
+                      {
+                        "tag": "img"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div foo=\"\"><img><img></div></body></html>",
+        "noQuirksBodyHtml": "<div foo=\"\"><img><img></div>"
+      }
+    },
+    {
+      "data": "<p>Test</p<p>Test2</p>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,13): unexpected-end-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "text": "TestTest2"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><p>TestTest2</p></body></html>",
+        "noQuirksBodyHtml": "<p>TestTest2</p>"
+      }
+    },
+    {
+      "data": "<rdar://problem/6869687>",
+      "errors": [
+        "(1,7): unexpected-character-after-solidus-in-tag",
+        "(1,8): unexpected-character-after-solidus-in-tag",
+        "(1,16): unexpected-character-after-solidus-in-tag",
+        "(1,24): expected-doctype-but-got-start-tag",
+        "(1,24): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "rdar:": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "rdar:",
+                    "attrs": [
+                      {
+                        "name": "6869687",
+                        "value": ""
+                      },
+                      {
+                        "name": "problem",
+                        "value": ""
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><rdar: problem=\"\" 6869687=\"\"></rdar:></body></html>",
+        "noQuirksBodyHtml": "<rdar: problem=\"\" 6869687=\"\"></rdar:>"
+      }
+    },
+    {
+      "data": "<A>test< /A>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,8): expected-tag-name",
+        "(1,12): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a",
+                    "children": [
+                      {
+                        "text": "test< /A>",
+                        "escaped": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a>test&lt; /A&gt;</a></body></html>",
+        "noQuirksBodyHtml": "<a>test&lt; /A&gt;</a>"
+      }
+    },
+    {
+      "data": "&lt;",
+      "errors": [
+        "(1,4): expected-doctype-but-got-chars"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "escaped": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "<",
+                    "escaped": true
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>&lt;</body></html>",
+        "noQuirksBodyHtml": "&lt;"
+      }
+    },
+    {
+      "data": "<body foo='bar'><body foo='baz' yo='mama'>",
+      "errors": [
+        "(1,16): expected-doctype-but-got-start-tag",
+        "(1,42): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "attrs": [
+                  {
+                    "name": "foo",
+                    "value": "bar"
+                  },
+                  {
+                    "name": "yo",
+                    "value": "mama"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body foo=\"bar\" yo=\"mama\"></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<body></br foo=\"bar\"></body>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,21): attributes-in-end-tag",
+        "(1,21): unexpected-end-tag-treated-as"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "br": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "br"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><br></body></html>",
+        "noQuirksBodyHtml": "<br>"
+      }
+    },
+    {
+      "data": "<bdy><br foo=\"bar\"></body>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,26): expected-one-end-tag-but-got-another"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "bdy": true,
+            "br": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "bdy",
+                    "children": [
+                      {
+                        "tag": "br",
+                        "attrs": [
+                          {
+                            "name": "foo",
+                            "value": "bar"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><bdy><br foo=\"bar\"></bdy></body></html>",
+        "noQuirksBodyHtml": "<bdy><br foo=\"bar\"></bdy>"
+      }
+    },
+    {
+      "data": "<body></body></br foo=\"bar\">",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,28): attributes-in-end-tag",
+        "(1,28): unexpected-end-tag-after-body",
+        "(1,28): unexpected-end-tag-treated-as"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "br": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "br"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><br></body></html>",
+        "noQuirksBodyHtml": "<br>"
+      }
+    },
+    {
+      "data": "<bdy></body><br foo=\"bar\">",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,12): expected-one-end-tag-but-got-another",
+        "(1,26): unexpected-start-tag-after-body",
+        "(1,26): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "bdy": true,
+            "br": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "bdy",
+                    "children": [
+                      {
+                        "tag": "br",
+                        "attrs": [
+                          {
+                            "name": "foo",
+                            "value": "bar"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><bdy><br foo=\"bar\"></bdy></body></html>",
+        "noQuirksBodyHtml": "<bdy><br foo=\"bar\"></bdy>"
+      }
+    },
+    {
+      "data": "<html><body></body></html><!-- Hi there -->",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          },
+          {
+            "comment": " Hi there "
+          }
+        ],
+        "html": "<html><head></head><body></body></html><!-- Hi there -->",
+        "noQuirksBodyHtml": "<!-- Hi there -->"
+      }
+    },
+    {
+      "data": "<html><body></body></html>x<!-- Hi there -->",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,27): expected-eof-but-got-char"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "x"
+                  },
+                  {
+                    "comment": " Hi there "
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>x<!-- Hi there --></body></html>",
+        "noQuirksBodyHtml": "x<!-- Hi there -->"
+      }
+    },
+    {
+      "data": "<html><body></body></html>x<!-- Hi there --></html><!-- Again -->",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,27): expected-eof-but-got-char"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "x"
+                  },
+                  {
+                    "comment": " Hi there "
+                  }
+                ]
+              }
+            ]
+          },
+          {
+            "comment": " Again "
+          }
+        ],
+        "html": "<html><head></head><body>x<!-- Hi there --></body></html><!-- Again -->",
+        "noQuirksBodyHtml": "x<!-- Hi there --><!-- Again -->"
+      }
+    },
+    {
+      "data": "<html><body></body></html>x<!-- Hi there --></body></html><!-- Again -->",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,27): expected-eof-but-got-char"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "x"
+                  },
+                  {
+                    "comment": " Hi there "
+                  }
+                ]
+              }
+            ]
+          },
+          {
+            "comment": " Again "
+          }
+        ],
+        "html": "<html><head></head><body>x<!-- Hi there --></body></html><!-- Again -->",
+        "noQuirksBodyHtml": "x<!-- Hi there --><!-- Again -->"
+      }
+    },
+    {
+      "data": "<html><body><ruby><div><rp>xx</rp></div></ruby></body></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,27): XXX-undefined-error"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "div": true,
+            "rp": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "tag": "div",
+                        "children": [
+                          {
+                            "tag": "rp",
+                            "children": [
+                              {
+                                "text": "xx"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby><div><rp>xx</rp></div></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby><div><rp>xx</rp></div></ruby>"
+      }
+    },
+    {
+      "data": "<html><body><ruby><div><rt>xx</rt></div></ruby></body></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,27): XXX-undefined-error"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ruby": true,
+            "div": true,
+            "rt": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ruby",
+                    "children": [
+                      {
+                        "tag": "div",
+                        "children": [
+                          {
+                            "tag": "rt",
+                            "children": [
+                              {
+                                "text": "xx"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ruby><div><rt>xx</rt></div></ruby></body></html>",
+        "noQuirksBodyHtml": "<ruby><div><rt>xx</rt></div></ruby>"
+      }
+    },
+    {
+      "data": "<html><frameset><!--1--><noframes>A</noframes><!--2--></frameset><!--3--><noframes>B</noframes><!--4--></html><!--5--><noframes>C</noframes><!--6-->",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true,
+            "noframes": true
+          },
+          "comment": true,
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset",
+                "children": [
+                  {
+                    "comment": "1"
+                  },
+                  {
+                    "tag": "noframes",
+                    "children": [
+                      {
+                        "text": "A",
+                        "no_escape": true
+                      }
+                    ]
+                  },
+                  {
+                    "comment": "2"
+                  }
+                ]
+              },
+              {
+                "comment": "3"
+              },
+              {
+                "tag": "noframes",
+                "children": [
+                  {
+                    "text": "B",
+                    "no_escape": true
+                  }
+                ]
+              },
+              {
+                "comment": "4"
+              },
+              {
+                "tag": "noframes",
+                "children": [
+                  {
+                    "text": "C",
+                    "no_escape": true
+                  }
+                ]
+              }
+            ]
+          },
+          {
+            "comment": "5"
+          },
+          {
+            "comment": "6"
+          }
+        ],
+        "html": "<html><head></head><frameset><!--1--><noframes>A</noframes><!--2--></frameset><!--3--><noframes>B</noframes><!--4--><noframes>C</noframes></html><!--5--><!--6-->",
+        "noQuirksBodyHtml": "<!--1--><noframes>A</noframes><!--2--><!--3--><noframes>B</noframes><!--4--><!--5--><noframes>C</noframes><!--6-->"
+      }
+    },
+    {
+      "data": "<select><option>A<select><option>B<select><option>C<select><option>D<select><option>E<select><option>F<select><option>G<select>",
+      "errors": [
+        "(1,8): expected-doctype-but-got-start-tag",
+        "(1,25): unexpected-select-in-select",
+        "(1,59): unexpected-select-in-select",
+        "(1,93): unexpected-select-in-select",
+        "(1,127): unexpected-select-in-select",
+        "(1,127): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true,
+            "option": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select",
+                    "children": [
+                      {
+                        "tag": "option",
+                        "children": [
+                          {
+                            "text": "A"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "option",
+                    "children": [
+                      {
+                        "text": "B"
+                      },
+                      {
+                        "tag": "select",
+                        "children": [
+                          {
+                            "tag": "option",
+                            "children": [
+                              {
+                                "text": "C"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "option",
+                    "children": [
+                      {
+                        "text": "D"
+                      },
+                      {
+                        "tag": "select",
+                        "children": [
+                          {
+                            "tag": "option",
+                            "children": [
+                              {
+                                "text": "E"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "option",
+                    "children": [
+                      {
+                        "text": "F"
+                      },
+                      {
+                        "tag": "select",
+                        "children": [
+                          {
+                            "tag": "option",
+                            "children": [
+                              {
+                                "text": "G"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><select><option>A</option></select><option>B<select><option>C</option></select></option><option>D<select><option>E</option></select></option><option>F<select><option>G</option></select></option></body></html>",
+        "noQuirksBodyHtml": "<select><option>A</option></select><option>B<select><option>C</option></select></option><option>D<select><option>E</option></select></option><option>F<select><option>G</option></select></option>"
+      }
+    },
+    {
+      "data": "<dd><dd><dt><dt><dd><li><li>",
+      "errors": [
+        "(1,4): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "dd": true,
+            "dt": true,
+            "li": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "dd"
+                  },
+                  {
+                    "tag": "dd"
+                  },
+                  {
+                    "tag": "dt"
+                  },
+                  {
+                    "tag": "dt"
+                  },
+                  {
+                    "tag": "dd",
+                    "children": [
+                      {
+                        "tag": "li"
+                      },
+                      {
+                        "tag": "li"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><dd></dd><dd></dd><dt></dt><dt></dt><dd><li></li><li></li></dd></body></html>",
+        "noQuirksBodyHtml": "<dd></dd><dd></dd><dt></dt><dt></dt><dd><li></li><li></li></dd>"
+      }
+    },
+    {
+      "data": "<div><b></div><div><nobr>a<nobr>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,14): end-tag-too-early",
+        "(1,32): unexpected-start-tag-implies-end-tag",
+        "(1,32): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "b": true,
+            "nobr": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "b"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "b",
+                        "children": [
+                          {
+                            "tag": "nobr",
+                            "children": [
+                              {
+                                "text": "a"
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "nobr"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div><b></b></div><div><b><nobr>a</nobr><nobr></nobr></b></div></body></html>",
+        "noQuirksBodyHtml": "<div><b></b></div><div><b><nobr>a</nobr><nobr></nobr></b></div>"
+      }
+    },
+    {
+      "data": "<head></head>\n<body></body>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "text": "\n"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head>\n<body></body></html>",
+        "noQuirksBodyHtml": "\n"
+      }
+    },
+    {
+      "data": "<head></head> <style></style>ddd",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,21): unexpected-start-tag-out-of-my-head"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "style": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "style"
+                  }
+                ]
+              },
+              {
+                "text": " "
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "ddd"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><style></style></head> <body>ddd</body></html>",
+        "noQuirksBodyHtml": " <style></style>ddd"
+      }
+    },
+    {
+      "data": "<kbd><table></kbd><col><select><tr>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,18): unexpected-end-tag-implies-table-voodoo",
+        "(1,18): unexpected-end-tag",
+        "(1,31): unexpected-start-tag-implies-table-voodoo",
+        "(1,35): unexpected-table-element-start-tag-in-select-in-table",
+        "(1,35): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "kbd": true,
+            "select": true,
+            "table": true,
+            "colgroup": true,
+            "col": true,
+            "tbody": true,
+            "tr": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "kbd",
+                    "children": [
+                      {
+                        "tag": "select"
+                      },
+                      {
+                        "tag": "table",
+                        "children": [
+                          {
+                            "tag": "colgroup",
+                            "children": [
+                              {
+                                "tag": "col"
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "tbody",
+                            "children": [
+                              {
+                                "tag": "tr"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><kbd><select></select><table><colgroup><col></colgroup><tbody><tr></tr></tbody></table></kbd></body></html>",
+        "noQuirksBodyHtml": "<kbd><select></select><table><colgroup><col></colgroup><tbody><tr></tr></tbody></table></kbd>"
+      }
+    },
+    {
+      "data": "<kbd><table></kbd><col><select><tr></table><div>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,18): unexpected-end-tag-implies-table-voodoo",
+        "(1,18): unexpected-end-tag",
+        "(1,31): unexpected-start-tag-implies-table-voodoo",
+        "(1,35): unexpected-table-element-start-tag-in-select-in-table",
+        "(1,48): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "kbd": true,
+            "select": true,
+            "table": true,
+            "colgroup": true,
+            "col": true,
+            "tbody": true,
+            "tr": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "kbd",
+                    "children": [
+                      {
+                        "tag": "select"
+                      },
+                      {
+                        "tag": "table",
+                        "children": [
+                          {
+                            "tag": "colgroup",
+                            "children": [
+                              {
+                                "tag": "col"
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "tbody",
+                            "children": [
+                              {
+                                "tag": "tr"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "div"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><kbd><select></select><table><colgroup><col></colgroup><tbody><tr></tr></tbody></table><div></div></kbd></body></html>",
+        "noQuirksBodyHtml": "<kbd><select></select><table><colgroup><col></colgroup><tbody><tr></tr></tbody></table><div></div></kbd>"
+      }
+    },
+    {
+      "data": "<a><li><style></style><title></title></a>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,41): adoption-agency-1.3"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "li": true,
+            "style": true,
+            "title": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a"
+                  },
+                  {
+                    "tag": "li",
+                    "children": [
+                      {
+                        "tag": "a",
+                        "children": [
+                          {
+                            "tag": "style"
+                          },
+                          {
+                            "tag": "title"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a></a><li><a><style></style><title></title></a></li></body></html>",
+        "noQuirksBodyHtml": "<a></a><li><a><style></style><title></title></a></li>"
+      }
+    },
+    {
+      "data": "<font></p><p><meta><title></title></font>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,10): unexpected-end-tag",
+        "(1,41): adoption-agency-1.3"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "font": true,
+            "p": true,
+            "meta": true,
+            "title": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "font",
+                    "children": [
+                      {
+                        "tag": "p"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "font",
+                        "children": [
+                          {
+                            "tag": "meta"
+                          },
+                          {
+                            "tag": "title"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><font><p></p></font><p><font><meta><title></title></font></p></body></html>",
+        "noQuirksBodyHtml": "<font><p></p></font><p><font><meta><title></title></font></p>"
+      }
+    },
+    {
+      "data": "<a><center><title></title><a>",
+      "errors": [
+        "(1,3): expected-doctype-but-got-start-tag",
+        "(1,29): unexpected-start-tag-implies-end-tag",
+        "(1,29): adoption-agency-1.3",
+        "(1,29): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "a": true,
+            "center": true,
+            "title": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "a"
+                  },
+                  {
+                    "tag": "center",
+                    "children": [
+                      {
+                        "tag": "a",
+                        "children": [
+                          {
+                            "tag": "title"
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "a"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><a></a><center><a><title></title></a><a></a></center></body></html>",
+        "noQuirksBodyHtml": "<a></a><center><a><title></title></a><a></a></center>"
+      }
+    },
+    {
+      "data": "<svg><title><div>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,17): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg title": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "title",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "tag": "div"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg><title><div></div></title></svg></body></html>",
+        "noQuirksBodyHtml": "<svg><title><div></div></title></svg>"
+      }
+    },
+    {
+      "data": "<svg><title><rect><div>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,23): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg title": true,
+            "rect": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "title",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "tag": "rect",
+                            "children": [
+                              {
+                                "tag": "div"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg><title><rect><div></div></rect></title></svg></body></html>",
+        "noQuirksBodyHtml": "<svg><title><rect><div></div></rect></title></svg>"
+      }
+    },
+    {
+      "data": "<svg><title><svg><div>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,22): unexpected-html-element-in-foreign-content",
+        "(1,22): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg title": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "title",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "tag": "svg",
+                            "ns": "http://www.w3.org/2000/svg"
+                          },
+                          {
+                            "tag": "div"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg><title><svg></svg><div></div></title></svg></body></html>",
+        "noQuirksBodyHtml": "<svg><title><svg><div></div></svg></title></svg>"
+      }
+    },
+    {
+      "data": "<img <=\"\" FAIL>",
+      "errors": [
+        "(1,6): invalid-character-in-attribute-name",
+        "(1,15): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "img": true
+          },
+          "attrWithFunnyChar": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "img",
+                    "attrs": [
+                      {
+                        "name": "<",
+                        "value": ""
+                      },
+                      {
+                        "name": "fail",
+                        "value": ""
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><img <=\"\" fail=\"\"></body></html>",
+        "noQuirksBodyHtml": "<img <=\"\" fail=\"\">"
+      }
+    },
+    {
+      "data": "<ul><li><div id='foo'/>A</li><li>B<div>C</div></li></ul>",
+      "errors": [
+        "(1,4): expected-doctype-but-got-start-tag",
+        "(1,23): non-void-element-with-trailing-solidus",
+        "(1,29): end-tag-too-early"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "ul": true,
+            "li": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "ul",
+                    "children": [
+                      {
+                        "tag": "li",
+                        "children": [
+                          {
+                            "tag": "div",
+                            "attrs": [
+                              {
+                                "name": "id",
+                                "value": "foo"
+                              }
+                            ],
+                            "children": [
+                              {
+                                "text": "A"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "li",
+                        "children": [
+                          {
+                            "text": "B"
+                          },
+                          {
+                            "tag": "div",
+                            "children": [
+                              {
+                                "text": "C"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><ul><li><div id=\"foo\">A</div></li><li>B<div>C</div></li></ul></body></html>",
+        "noQuirksBodyHtml": "<ul><li><div id=\"foo\">A</div></li><li>B<div>C</div></li></ul>"
+      }
+    },
+    {
+      "data": "<svg><em><desc></em>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,9): unexpected-html-element-in-foreign-content",
+        "(1,20): adoption-agency-1.3"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "em": true,
+            "desc": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg"
+                  },
+                  {
+                    "tag": "em",
+                    "children": [
+                      {
+                        "tag": "desc"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg></svg><em><desc></desc></em></body></html>",
+        "noQuirksBodyHtml": "<svg><em><desc></desc></em></svg>"
+      }
+    },
+    {
+      "data": "<table><tr><td><svg><desc><td></desc><circle>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "svg svg": true,
+            "svg desc": true,
+            "circle": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "svg",
+                                    "ns": "http://www.w3.org/2000/svg",
+                                    "children": [
+                                      {
+                                        "tag": "desc",
+                                        "ns": "http://www.w3.org/2000/svg"
+                                      }
+                                    ]
+                                  }
+                                ]
+                              },
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "circle"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><tr><td><svg><desc></desc></svg></td><td><circle></circle></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td><svg><desc></desc></svg></td><td><circle></circle></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<svg><tfoot></mi><td>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag",
+        "(1,17): unexpected-end-tag",
+        "(1,17): unexpected-end-tag",
+        "(1,21): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg tfoot": true,
+            "svg td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "tfoot",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "tag": "td",
+                            "ns": "http://www.w3.org/2000/svg"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg><tfoot><td></td></tfoot></svg></body></html>",
+        "noQuirksBodyHtml": "<svg><tfoot><td></td></tfoot></svg>"
+      }
+    },
+    {
+      "data": "<math><mrow><mrow><mn>1</mn></mrow><mi>a</mi></mrow></math>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math mrow": true,
+            "math mn": true,
+            "math mi": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mrow",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "children": [
+                          {
+                            "tag": "mrow",
+                            "ns": "http://www.w3.org/1998/Math/MathML",
+                            "children": [
+                              {
+                                "tag": "mn",
+                                "ns": "http://www.w3.org/1998/Math/MathML",
+                                "children": [
+                                  {
+                                    "text": "1"
+                                  }
+                                ]
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "mi",
+                            "ns": "http://www.w3.org/1998/Math/MathML",
+                            "children": [
+                              {
+                                "text": "a"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><mrow><mrow><mn>1</mn></mrow><mi>a</mi></mrow></math></body></html>",
+        "noQuirksBodyHtml": "<math><mrow><mrow><mn>1</mn></mrow><mi>a</mi></mrow></math>"
+      }
+    },
+    {
+      "data": "<!doctype html><input type=\"hidden\"><frameset>",
+      "errors": [
+        "(1,46): unexpected-start-tag",
+        "(1,46): eof-in-frameset"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "frameset": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "frameset"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html>",
+        "noQuirksBodyHtml": "<input type=\"hidden\">"
+      }
+    },
+    {
+      "data": "<!doctype html><input type=\"button\"><frameset>",
+      "errors": [
+        "(1,46): unexpected-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "input": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "input",
+                    "attrs": [
+                      {
+                        "name": "type",
+                        "value": "button"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><input type=\"button\"></body></html>",
+        "noQuirksBodyHtml": "<input type=\"button\">"
+      }
+    }
+  ],
+  "webkit02.dat": [
+    {
+      "data": "<foo bar=qux/>",
+      "errors": [
+        "(1,14): expected-doctype-but-got-start-tag",
+        "(1,14): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "foo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "foo",
+                    "attrs": [
+                      {
+                        "name": "bar",
+                        "value": "qux/"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><foo bar=\"qux/\"></foo></body></html>",
+        "noQuirksBodyHtml": "<foo bar=\"qux/\"></foo>"
+      }
+    },
+    {
+      "data": "<p id=\"status\"><noscript><strong>A</strong></noscript><span>B</span></p>",
+      "errors": [
+        "(1,15): expected-doctype-but-got-start-tag"
+      ],
+      "script": "on",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "noscript": true,
+            "span": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "attrs": [
+                      {
+                        "name": "id",
+                        "value": "status"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "tag": "noscript",
+                        "children": [
+                          {
+                            "text": "<strong>A</strong>",
+                            "no_escape": true
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "span",
+                        "children": [
+                          {
+                            "text": "B"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><p id=\"status\"><noscript><strong>A</strong></noscript><span>B</span></p></body></html>",
+        "noQuirksBodyHtml": "<p id=\"status\"><noscript>&lt;strong&gt;A&lt;/strong&gt;</noscript><span>B</span></p>"
+      }
+    },
+    {
+      "data": "<p id=\"status\"><noscript><strong>A</strong></noscript><span>B</span></p>",
+      "errors": [
+        "(1,15): expected-doctype-but-got-start-tag"
+      ],
+      "script": "off",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "noscript": true,
+            "strong": true,
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "attrs": [
+                      {
+                        "name": "id",
+                        "value": "status"
+                      }
+                    ],
+                    "children": [
+                      {
+                        "tag": "noscript",
+                        "children": [
+                          {
+                            "tag": "strong",
+                            "children": [
+                              {
+                                "text": "A"
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      {
+                        "tag": "span",
+                        "children": [
+                          {
+                            "text": "B"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><p id=\"status\"><noscript><strong>A</strong></noscript><span>B</span></p></body></html>",
+        "noQuirksBodyHtml": "<p id=\"status\"><noscript>&lt;strong&gt;A&lt;/strong&gt;</noscript><span>B</span></p>"
+      }
+    },
+    {
+      "data": "<div><sarcasm><div></div></sarcasm></div>",
+      "errors": [
+        "(1,5): expected-doctype-but-got-start-tag"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "div": true,
+            "sarcasm": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "div",
+                    "children": [
+                      {
+                        "tag": "sarcasm",
+                        "children": [
+                          {
+                            "tag": "div"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><div><sarcasm><div></div></sarcasm></div></body></html>",
+        "noQuirksBodyHtml": "<div><sarcasm><div></div></sarcasm></div>"
+      }
+    },
+    {
+      "data": "<html><body><img src=\"\" border=\"0\" alt=\"><div>A</div></body></html>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,67): eof-in-attribute-value-double-quote"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<table><td></tbody>A",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,11): unexpected-cell-in-table-body",
+        "(1,20): foster-parenting-character",
+        "(1,20): eof-in-table"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "A"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>A<table><tbody><tr><td></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "A<table><tbody><tr><td></td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<table><td></thead>A",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,11): unexpected-cell-in-table-body",
+        "(1,19): XXX-undefined-error",
+        "(1,20): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "text": "A"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><tr><td>A</td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td>A</td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<table><td></tfoot>A",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,11): unexpected-cell-in-table-body",
+        "(1,19): XXX-undefined-error",
+        "(1,20): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "text": "A"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><tbody><tr><td>A</td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "<table><tbody><tr><td>A</td></tr></tbody></table>"
+      }
+    },
+    {
+      "data": "<table><thead><td></tbody>A",
+      "errors": [
+        "(1,7): expected-doctype-but-got-start-tag",
+        "(1,18): unexpected-cell-in-table-body",
+        "(1,26): XXX-undefined-error",
+        "(1,27): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "thead": true,
+            "tr": true,
+            "td": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "thead",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "text": "A"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><table><thead><tr><td>A</td></tr></thead></table></body></html>",
+        "noQuirksBodyHtml": "<table><thead><tr><td>A</td></tr></thead></table>"
+      }
+    },
+    {
+      "data": "<legend>test</legend>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "legend": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "legend",
+                    "children": [
+                      {
+                        "text": "test"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><legend>test</legend></body></html>",
+        "noQuirksBodyHtml": "<legend>test</legend>"
+      }
+    },
+    {
+      "data": "<table><input>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "input": true,
+            "table": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "input"
+                  },
+                  {
+                    "tag": "table"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><input><table></table></body></html>",
+        "noQuirksBodyHtml": "<input><table></table>"
+      }
+    },
+    {
+      "data": "<b><em><foo><foo><aside></b>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "em": true,
+            "foo": true,
+            "aside": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "em",
+                        "children": [
+                          {
+                            "tag": "foo",
+                            "children": [
+                              {
+                                "tag": "foo"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "em",
+                    "children": [
+                      {
+                        "tag": "aside",
+                        "children": [
+                          {
+                            "tag": "b"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><b><em><foo><foo></foo></foo></em></b><em><aside><b></b></aside></em></body></html>",
+        "noQuirksBodyHtml": "<b><em><foo><foo></foo></foo></em></b><em><aside><b></b></aside></em>"
+      }
+    },
+    {
+      "data": "<b><em><foo><foo><aside></b></em>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "em": true,
+            "foo": true,
+            "aside": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "em",
+                        "children": [
+                          {
+                            "tag": "foo",
+                            "children": [
+                              {
+                                "tag": "foo"
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "em"
+                  },
+                  {
+                    "tag": "aside",
+                    "children": [
+                      {
+                        "tag": "em",
+                        "children": [
+                          {
+                            "tag": "b"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><b><em><foo><foo></foo></foo></em></b><em></em><aside><em><b></b></em></aside></body></html>",
+        "noQuirksBodyHtml": "<b><em><foo><foo></foo></foo></em></b><em></em><aside><em><b></b></em></aside>"
+      }
+    },
+    {
+      "data": "<b><em><foo><foo><foo><aside></b>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "em": true,
+            "foo": true,
+            "aside": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "em",
+                        "children": [
+                          {
+                            "tag": "foo",
+                            "children": [
+                              {
+                                "tag": "foo",
+                                "children": [
+                                  {
+                                    "tag": "foo"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "aside",
+                    "children": [
+                      {
+                        "tag": "b"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><b><em><foo><foo><foo></foo></foo></foo></em></b><aside><b></b></aside></body></html>",
+        "noQuirksBodyHtml": "<b><em><foo><foo><foo></foo></foo></foo></em></b><aside><b></b></aside>"
+      }
+    },
+    {
+      "data": "<b><em><foo><foo><foo><aside></b></em>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "b": true,
+            "em": true,
+            "foo": true,
+            "aside": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "em",
+                        "children": [
+                          {
+                            "tag": "foo",
+                            "children": [
+                              {
+                                "tag": "foo",
+                                "children": [
+                                  {
+                                    "tag": "foo"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "aside",
+                    "children": [
+                      {
+                        "tag": "b"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><b><em><foo><foo><foo></foo></foo></foo></em></b><aside><b></b></aside></body></html>",
+        "noQuirksBodyHtml": "<b><em><foo><foo><foo></foo></foo></foo></em></b><aside><b></b></aside>"
+      }
+    },
+    {
+      "data": "<b><em><foo><foo><foo><foo><foo><foo><foo><foo><foo><foo><aside></b></em>",
+      "errors": [],
+      "fragment": {
+        "name": "div"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "b": true,
+            "em": true,
+            "foo": true,
+            "aside": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "b",
+            "children": [
+              {
+                "tag": "em",
+                "children": [
+                  {
+                    "tag": "foo",
+                    "children": [
+                      {
+                        "tag": "foo",
+                        "children": [
+                          {
+                            "tag": "foo",
+                            "children": [
+                              {
+                                "tag": "foo",
+                                "children": [
+                                  {
+                                    "tag": "foo",
+                                    "children": [
+                                      {
+                                        "tag": "foo",
+                                        "children": [
+                                          {
+                                            "tag": "foo",
+                                            "children": [
+                                              {
+                                                "tag": "foo",
+                                                "children": [
+                                                  {
+                                                    "tag": "foo",
+                                                    "children": [
+                                                      {
+                                                        "tag": "foo"
+                                                      }
+                                                    ]
+                                                  }
+                                                ]
+                                              }
+                                            ]
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          },
+          {
+            "tag": "aside",
+            "children": [
+              {
+                "tag": "b"
+              }
+            ]
+          }
+        ],
+        "html": "<b><em><foo><foo><foo><foo><foo><foo><foo><foo><foo><foo></foo></foo></foo></foo></foo></foo></foo></foo></foo></foo></em></b><aside><b></b></aside>",
+        "noQuirksBodyHtml": "<b><em><foo><foo><foo><foo><foo><foo><foo><foo><foo><foo></foo></foo></foo></foo></foo></foo></foo></foo></foo></foo></em></b><aside><b></b></aside>"
+      }
+    },
+    {
+      "data": "<b><em><foo><foob><foob><foob><foob><fooc><fooc><fooc><fooc><food><aside></b></em>",
+      "errors": [],
+      "fragment": {
+        "name": "div"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "b": true,
+            "em": true,
+            "foo": true,
+            "foob": true,
+            "fooc": true,
+            "food": true,
+            "aside": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "b",
+            "children": [
+              {
+                "tag": "em",
+                "children": [
+                  {
+                    "tag": "foo",
+                    "children": [
+                      {
+                        "tag": "foob",
+                        "children": [
+                          {
+                            "tag": "foob",
+                            "children": [
+                              {
+                                "tag": "foob",
+                                "children": [
+                                  {
+                                    "tag": "foob",
+                                    "children": [
+                                      {
+                                        "tag": "fooc",
+                                        "children": [
+                                          {
+                                            "tag": "fooc",
+                                            "children": [
+                                              {
+                                                "tag": "fooc",
+                                                "children": [
+                                                  {
+                                                    "tag": "fooc",
+                                                    "children": [
+                                                      {
+                                                        "tag": "food"
+                                                      }
+                                                    ]
+                                                  }
+                                                ]
+                                              }
+                                            ]
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          },
+          {
+            "tag": "aside",
+            "children": [
+              {
+                "tag": "b"
+              }
+            ]
+          }
+        ],
+        "html": "<b><em><foo><foob><foob><foob><foob><fooc><fooc><fooc><fooc><food></food></fooc></fooc></fooc></fooc></foob></foob></foob></foob></foo></em></b><aside><b></b></aside>",
+        "noQuirksBodyHtml": "<b><em><foo><foob><foob><foob><foob><fooc><fooc><fooc><fooc><food></food></fooc></fooc></fooc></fooc></foob></foob></foob></foob></foo></em></b><aside><b></b></aside>"
+      }
+    },
+    {
+      "data": "<isindex action=\"x\">",
+      "errors": [],
+      "fragment": {
+        "name": "table"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "form": true,
+            "hr": true,
+            "label": true,
+            "input": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "form",
+            "attrs": [
+              {
+                "name": "action",
+                "value": "x"
+              }
+            ],
+            "children": [
+              {
+                "tag": "hr"
+              },
+              {
+                "tag": "label",
+                "children": [
+                  {
+                    "text": "This is a searchable index. Enter search keywords: "
+                  },
+                  {
+                    "tag": "input",
+                    "attrs": [
+                      {
+                        "name": "name",
+                        "value": "isindex"
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "hr"
+              }
+            ]
+          }
+        ],
+        "html": "<form action=\"x\"><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form>",
+        "noQuirksBodyHtml": "<form action=\"x\"><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form>"
+      }
+    },
+    {
+      "data": "<option><XH<optgroup></optgroup>",
+      "errors": [],
+      "fragment": {
+        "name": "select"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "option": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "option"
+          }
+        ],
+        "html": "<option></option>",
+        "noQuirksBodyHtml": "<option><xh<optgroup></xh<optgroup></option>"
+      }
+    },
+    {
+      "data": "<svg><foreignObject><div>foo</div><plaintext></foreignObject></svg><div>bar</div>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg foreignObject": true,
+            "div": true,
+            "plaintext": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "foreignObject",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "tag": "div",
+                            "children": [
+                              {
+                                "text": "foo"
+                              }
+                            ]
+                          },
+                          {
+                            "tag": "plaintext",
+                            "children": [
+                              {
+                                "text": "</foreignObject></svg><div>bar</div>",
+                                "no_escape": true
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg><foreignObject><div>foo</div><plaintext></foreignObject></svg><div>bar</div></plaintext></foreignObject></svg></body></html>",
+        "noQuirksBodyHtml": "<svg><foreignObject><div>foo</div><plaintext></foreignObject></svg><div>bar</div></plaintext></foreignObject></svg>"
+      }
+    },
+    {
+      "data": "<svg><foreignObject></foreignObject><title></svg>foo",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg foreignObject": true,
+            "svg title": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "foreignObject",
+                        "ns": "http://www.w3.org/2000/svg"
+                      },
+                      {
+                        "tag": "title",
+                        "ns": "http://www.w3.org/2000/svg"
+                      }
+                    ]
+                  },
+                  {
+                    "text": "foo"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><svg><foreignObject></foreignObject><title></title></svg>foo</body></html>",
+        "noQuirksBodyHtml": "<svg><foreignObject></foreignObject><title></title></svg>foo"
+      }
+    },
+    {
+      "data": "</foreignObject><plaintext><div>foo</div>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "plaintext": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "plaintext",
+                    "children": [
+                      {
+                        "text": "<div>foo</div>",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><plaintext><div>foo</div></plaintext></body></html>",
+        "noQuirksBodyHtml": "<plaintext><div>foo</div></plaintext>"
+      }
+    }
+  ]
+}
diff --git a/tests/phpunit/includes/title/MediaWikiPageLinkRendererTest.php b/tests/phpunit/includes/title/MediaWikiPageLinkRendererTest.php
deleted file mode 100644 (file)
index c79471d..0000000
+++ /dev/null
@@ -1,168 +0,0 @@
-<?php
-/**
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @author Daniel Kinzler
- */
-
-/**
- * @covers MediaWikiPageLinkRenderer
- *
- * @group Title
- * @group Database
- */
-class MediaWikiPageLinkRendererTest extends MediaWikiTestCase {
-
-       protected function setUp() {
-               parent::setUp();
-
-               $this->setMwGlobals( [
-                       'wgContLang' => Language::factory( 'en' ),
-               ] );
-       }
-
-       /**
-        * Returns a mock GenderCache that will return "female" always.
-        *
-        * @return GenderCache
-        */
-       private function getGenderCache() {
-               $genderCache = $this->getMockBuilder( 'GenderCache' )
-                       ->disableOriginalConstructor()
-                       ->getMock();
-
-               $genderCache->expects( $this->any() )
-                       ->method( 'getGenderOf' )
-                       ->will( $this->returnValue( 'female' ) );
-
-               return $genderCache;
-       }
-
-       public static function provideGetPageUrl() {
-               return [
-                       [
-                               new TitleValue( NS_MAIN, 'Foo_Bar' ),
-                               [],
-                               '/Foo_Bar'
-                       ],
-                       [
-                               new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
-                               [ 'foo' => 'bar' ],
-                               '/User:Hansi_Maier?foo=bar#stuff'
-                       ],
-               ];
-       }
-
-       /**
-        * @dataProvider provideGetPageUrl
-        */
-       public function testGetPageUrl( TitleValue $title, $params, $url ) {
-               // NOTE: was of Feb 2014, MediaWikiPageLinkRenderer *ignores* the
-               // WikitextTitleFormatter we pass here, and relies on the Linker
-               // class for generating the link! This may break the test e.g.
-               // of Linker uses a different language for the namespace names.
-
-               $lang = Language::factory( 'en' );
-
-               $formatter = new MediaWikiTitleCodec( $lang, $this->getGenderCache() );
-               $renderer = new MediaWikiPageLinkRenderer( $formatter, '/' );
-               $actual = $renderer->getPageUrl( $title, $params );
-
-               $this->assertEquals( $url, $actual );
-       }
-
-       public static function provideRenderHtmlLink() {
-               return [
-                       [
-                               new TitleValue( NS_MAIN, 'Foo_Bar' ),
-                               'Foo Bar',
-                               '!<a .*href=".*?Foo_Bar.*?".*?>Foo Bar</a>!'
-                       ],
-                       [
-                               // NOTE: Linker doesn't include fragments in "broken" links
-                               // NOTE: once this no longer uses Linker, we will get "2" instead of "User" for the namespace.
-                               new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
-                               'Hansi Maier\'s Stuff',
-                               '!<a .*href=".*?User:Hansi_Maier.*?>Hansi Maier\'s Stuff</a>!'
-                       ],
-                       [
-                               // NOTE: Linker doesn't include fragments in "broken" links
-                               // NOTE: once this no longer uses Linker, we will get "2" instead of "User" for the namespace.
-                               new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
-                               null,
-                               '!<a .*href=".*?User:Hansi_Maier.*?>User:Hansi Maier#stuff</a>!'
-                       ],
-               ];
-       }
-
-       /**
-        * @dataProvider provideRenderHtmlLink
-        */
-       public function testRenderHtmlLink( TitleValue $title, $text, $pattern ) {
-               // NOTE: was of Feb 2014, MediaWikiPageLinkRenderer *ignores* the
-               // WikitextTitleFormatter we pass here, and relies on the Linker
-               // class for generating the link! This may break the test e.g.
-               // of Linker uses a different language for the namespace names.
-
-               $lang = Language::factory( 'en' );
-
-               $formatter = new MediaWikiTitleCodec( $lang, $this->getGenderCache() );
-               $renderer = new MediaWikiPageLinkRenderer( $formatter );
-               $actual = $renderer->renderHtmlLink( $title, $text );
-
-               $this->assertRegExp( $pattern, $actual );
-       }
-
-       public static function provideRenderWikitextLink() {
-               return [
-                       [
-                               new TitleValue( NS_MAIN, 'Foo_Bar' ),
-                               'Foo Bar',
-                               '[[:0:Foo Bar|Foo Bar]]'
-                       ],
-                       [
-                               new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
-                               'Hansi Maier\'s Stuff',
-                               '[[:2:Hansi Maier#stuff|Hansi Maier&#39;s Stuff]]'
-                       ],
-                       [
-                               new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
-                               null,
-                               '[[:2:Hansi Maier#stuff|2:Hansi Maier#stuff]]'
-                       ],
-               ];
-       }
-
-       /**
-        * @dataProvider provideRenderWikitextLink
-        */
-       public function testRenderWikitextLink( TitleValue $title, $text, $expected ) {
-               $formatter = $this->getMock( 'TitleFormatter' );
-               $formatter->expects( $this->any() )
-                       ->method( 'getFullText' )
-                       ->will( $this->returnCallback(
-                               function ( TitleValue $title ) {
-                                       return str_replace( '_', ' ', "$title" );
-                               }
-                       ) );
-
-               $renderer = new MediaWikiPageLinkRenderer( $formatter, '/' );
-               $actual = $renderer->renderWikitextLink( $title, $text );
-
-               $this->assertEquals( $expected, $actual );
-       }
-}
index 4d914e4..e7ac940 100644 (file)
@@ -355,9 +355,9 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                        // XML/HTML character entity references
                        // Note: Commented out because they are not marked invalid by the PHP test as
                        // Title::newFromText runs Sanitizer::decodeCharReferencesAndNormalize first.
-                       // array( 'A &eacute; B' ),
-                       // array( 'A &#233; B' ),
-                       // array( 'A &#x00E9; B' ),
+                       // [ 'A &eacute; B' ],
+                       // [ 'A &#233; B' ],
+                       // [ 'A &#x00E9; B' ],
                        // Subject of NS_TALK does not roundtrip to NS_MAIN
                        [ 'Talk:File:Example.svg' ],
                        // Directory navigation
index e0b57a7..9b25505 100644 (file)
@@ -7,7 +7,7 @@
  */
 class UploadStashTest extends MediaWikiTestCase {
        /**
-        * @var array Array of UploadStashTestUser
+        * @var TestUser[] Array of UploadStashTestUser
         */
        public static $users;
 
@@ -55,7 +55,7 @@ class UploadStashTest extends MediaWikiTestCase {
         * @todo give this test a real name explaining what is being tested here
         */
        public function testBug29408() {
-               $this->setMwGlobals( 'wgUser', self::$users['uploader']->user );
+               $this->setMwGlobals( 'wgUser', self::$users['uploader']->getUser() );
 
                $repo = RepoGroup::singleton()->getLocalRepo();
                $stash = new UploadStash( $repo );
index 1ef5082..cfd5f78 100644 (file)
@@ -290,7 +290,7 @@ class BotPasswordTest extends MediaWikiTestCase {
 
                // Wrong password
                $status = BotPassword::login(
-                       "{$this->testUserName}@BotPassword", $this->testUser->password, new FauxRequest );
+                       "{$this->testUserName}@BotPassword", $this->testUser->getPassword(), new FauxRequest );
                $this->assertEquals( Status::newFatal( 'wrongpassword' ), $status );
 
                // Success!
index 9e41a4e..e2e6492 100644 (file)
@@ -638,6 +638,24 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
+       /**
+        * sprintfDate should only calculate a TTL if the caller is going to use it.
+        * @covers Language::sprintfDate
+        */
+       public function testSprintfDateNoTtlIfNotNeeded() {
+               $noTtl = 'unused'; // Value used to represent that the caller didn't pass a variable in.
+               $ttl = null;
+               $this->getLang()->sprintfDate( 'YmdHis', wfTimestampNow(), null, $noTtl );
+               $this->getLang()->sprintfDate( 'YmdHis', wfTimestampNow(), null, $ttl );
+
+               $this->assertSame(
+                       'unused',
+                       $noTtl,
+                       'If the caller does not set the $ttl variable, do not compute it.'
+               );
+               $this->assertInternalType( 'int', $ttl, 'TTL should have been computed.' );
+       }
+
        public static function provideSprintfDateSamples() {
                return [
                        [
index b110e21..99992fe 100644 (file)
@@ -76,18 +76,30 @@ class MockOggHandler extends OggHandlerTMH {
        }
 
        function getLength( $file ) {
+               if ( $this->isAudio( $file ) ) {
+                       return 0.99875;
+               }
                return 4.3666666666667;
        }
 
        function getBitRate( $file ) {
+               if ( $this->isAudio( $file ) ) {
+                       return 41107;
+               }
                return 590013;
        }
 
        function getWebType( $file ) {
+               if ( $this->isAudio( $file ) ) {
+                       return "audio/ogg; codecs=\"vorbis\"";
+               }
                return "video/ogg; codecs=\"theora\"";
        }
 
        function getFramerate( $file ) {
+               if ( $this->isAudio( $file ) ) {
+                       return 0;
+               }
                return 30;
        }
 }
index 5c65c1e..6446416 100644 (file)
@@ -40,7 +40,7 @@ class ResourcesTest extends MediaWikiTestCase {
                $data = self::getAllModules();
                foreach ( $data['modules'] as $moduleName => $module ) {
                        $version = $module->getVersionHash( $data['context'] );
-                       $this->assertEquals( 8, strlen( $version ), "$moduleName must use ResourceLoader::makeHash" );
+                       $this->assertEquals( 7, strlen( $version ), "$moduleName must use ResourceLoader::makeHash" );
                }
        }
 
index a2d76e0..95f28c8 100644 (file)
@@ -84,6 +84,7 @@ return [
                        'tests/qunit/suites/resources/mediawiki/mediawiki.viewport.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.category.test.js',
+                       'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.edit.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.messages.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.options.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js',
index 1091d09..79f37dc 100644 (file)
@@ -1,5 +1,4 @@
 /*global CompletenessTest, sinon */
-/*jshint evil: true */
 ( function ( $, mw, QUnit ) {
        'use strict';
 
diff --git a/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.edit.test.js b/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.edit.test.js
new file mode 100644 (file)
index 0000000..f83f66c
--- /dev/null
@@ -0,0 +1,153 @@
+( function ( mw, $ ) {
+       QUnit.module( 'mediawiki.api.edit', QUnit.newMwEnvironment( {
+               setup: function () {
+                       this.server = this.sandbox.useFakeServer();
+                       this.server.respondImmediately = true;
+               }
+       } ) );
+
+       QUnit.test( 'edit( title, transform String )', function ( assert ) {
+               this.server.respond( function ( req ) {
+                       if ( /query.+titles=Sandbox/.test( req.url ) ) {
+                               req.respond( 200, { 'Content-Type': 'application/json' }, JSON.stringify( {
+                                       curtimestamp: '2016-01-02T12:00:00Z',
+                                       query: {
+                                               pages: [ {
+                                                       pageid: 1,
+                                                       ns: 0,
+                                                       title:  'Sandbox',
+                                                       revisions: [ {
+                                                               timestamp: '2016-01-01T12:00:00Z',
+                                                               contentformat: 'text/x-wiki',
+                                                               contentmodel: 'wikitext',
+                                                               content: 'Sand.'
+                                                       } ]
+                                               } ]
+                                       }
+                               } ) );
+                       }
+                       if ( /edit.+basetimestamp=2016-01-01.+starttimestamp=2016-01-02.+text=Box%2E/.test( req.requestBody ) ) {
+                               req.respond( 200, { 'Content-Type': 'application/json' }, JSON.stringify( {
+                                       edit: {
+                                               result: 'Success',
+                                               oldrevid: 11,
+                                               newrevid: 13,
+                                               newtimestamp: '2016-01-03T12:00:00Z'
+                                       }
+                               } ) );
+                       }
+               } );
+
+               return new mw.Api()
+                       .edit( 'Sandbox', function ( revision ) {
+                               return revision.content.replace( 'Sand', 'Box' );
+                       } )
+                       .then( function ( edit ) {
+                               assert.equal( edit.newrevid, 13 );
+                       } );
+       } );
+
+       QUnit.test( 'edit( title, transform Promise )', function ( assert ) {
+               this.server.respond( function ( req ) {
+                       if ( /query.+titles=Async/.test( req.url ) ) {
+                               req.respond( 200, { 'Content-Type': 'application/json' }, JSON.stringify( {
+                                       curtimestamp: '2016-02-02T12:00:00Z',
+                                       query: {
+                                               pages: [ {
+                                                       pageid: 4,
+                                                       ns: 0,
+                                                       title:  'Async',
+                                                       revisions: [ {
+                                                               timestamp: '2016-02-01T12:00:00Z',
+                                                               contentformat: 'text/x-wiki',
+                                                               contentmodel: 'wikitext',
+                                                               content: 'Async.'
+                                                       } ]
+                                               } ]
+                                       }
+                               } ) );
+                       }
+                       if ( /edit.+basetimestamp=2016-02-01.+starttimestamp=2016-02-02.+text=Promise%2E/.test( req.requestBody ) ) {
+                               req.respond( 200, { 'Content-Type': 'application/json' }, JSON.stringify( {
+                                       edit: {
+                                               result: 'Success',
+                                               oldrevid: 21,
+                                               newrevid: 23,
+                                               newtimestamp: '2016-02-03T12:00:00Z'
+                                       }
+                               } ) );
+                       }
+               } );
+
+               return new mw.Api()
+                       .edit( 'Async', function ( revision ) {
+                               return $.Deferred().resolve( revision.content.replace( 'Async', 'Promise' ) );
+                       } )
+                       .then( function ( edit ) {
+                               assert.equal( edit.newrevid, 23 );
+                       } );
+       } );
+
+       QUnit.test( 'edit( title, transform Object )', function ( assert ) {
+               this.server.respond( function ( req ) {
+                       if ( /query.+titles=Param/.test( req.url ) ) {
+                               req.respond( 200, { 'Content-Type': 'application/json' }, JSON.stringify( {
+                                       curtimestamp: '2016-03-02T12:00:00Z',
+                                       query: {
+                                               pages: [ {
+                                                       pageid: 3,
+                                                       ns: 0,
+                                                       title:  'Param',
+                                                       revisions: [ {
+                                                               timestamp: '2016-03-01T12:00:00Z',
+                                                               contentformat: 'text/x-wiki',
+                                                               contentmodel: 'wikitext',
+                                                               content: '...'
+                                                       } ]
+                                               } ]
+                                       }
+                               } ) );
+                       }
+                       if ( /edit.+basetimestamp=2016-03-01.+starttimestamp=2016-03-02.+text=Content&summary=Sum/.test( req.requestBody ) ) {
+                               req.respond( 200, { 'Content-Type': 'application/json' }, JSON.stringify( {
+                                       edit: {
+                                               result: 'Success',
+                                               oldrevid: 31,
+                                               newrevid: 33,
+                                               newtimestamp: '2016-03-03T12:00:00Z'
+                                       }
+                               } ) );
+                       }
+               } );
+
+               return new mw.Api()
+                       .edit( 'Param', function () {
+                               return { text: 'Content', summary: 'Sum' };
+                       } )
+                       .then( function ( edit ) {
+                               assert.equal( edit.newrevid, 33 );
+                       } );
+       } );
+
+       QUnit.test( 'create( title, content )', function ( assert ) {
+               this.server.respond( function ( req ) {
+                       if ( /edit.+text=Sand/.test( req.requestBody ) ) {
+                               req.respond( 200, { 'Content-Type': 'application/json' }, JSON.stringify( {
+                                       edit: {
+                                               'new': true,
+                                               result: 'Success',
+                                               newrevid: 41,
+                                               newtimestamp: '2016-04-01T12:00:00Z'
+                                       }
+                               } ) );
+                       }
+               } );
+
+               return new mw.Api()
+                       .create( 'Sandbox', { summary: 'Load sand particles.' }, 'Sand.' )
+                       .then( function ( page ) {
+                               assert.equal( page.newrevid, 41 );
+                       } );
+       } );
+
+}( mediaWiki, jQuery ) );
index aa68bb2..7133039 100644 (file)
@@ -1,6 +1,6 @@
 ( function ( mw, $ ) {
        var formatText, formatParse, formatnumTests, specialCharactersPageName, expectedListUsers,
-               expectedListUsersSitename, expectedEntrypoints,
+               expectedListUsersSitename, expectedLinkPagenamee, expectedEntrypoints,
                mwLanguageCache = {},
                hasOwn = Object.hasOwnProperty;
 
@@ -16,6 +16,8 @@
                        this.parserDefaults = mw.jqueryMsg.getParserDefaults();
                        mw.jqueryMsg.setParserDefaults( {
                                magic: {
+                                       PAGENAME: '2 + 2',
+                                       PAGENAMEE: mw.util.wikiUrlencode( '2 + 2' ),
                                        SITENAME: 'Wiki'
                                }
                        } );
@@ -25,6 +27,7 @@
                        expectedListUsers = '注册<a title="Special:ListUsers" href="/wiki/Special:ListUsers">用户</a>';
                        expectedListUsersSitename = '注册<a title="Special:ListUsers" href="/wiki/Special:ListUsers">用户' +
                                'Wiki</a>';
+                       expectedLinkPagenamee = '<a href="https://example.org/wiki/Foo?bar=baz#val/2_%2B_2">Test</a>';
 
                        expectedEntrypoints = '<a href="https://www.mediawiki.org/wiki/Manual:index.php">index.php</a>';
 
@@ -77,6 +80,7 @@
 
                        'jquerymsg-test-statistics-users': '注册[[Special:ListUsers|用户]]',
                        'jquerymsg-test-statistics-users-sitename': '注册[[Special:ListUsers|用户{{SITENAME}}]]',
+                       'jquerymsg-test-link-pagenamee': '[https://example.org/wiki/Foo?bar=baz#val/{{PAGENAMEE}} Test]',
 
                        'jquerymsg-test-version-entrypoints-index-php': '[https://www.mediawiki.org/wiki/Manual:index.php index.php]',
 
                process( tasks );
        } );
 
-       QUnit.test( 'Links', 14, function ( assert ) {
+       QUnit.test( 'Links', 15, function ( assert ) {
                var testCases,
                        expectedDisambiguationsText,
                        expectedMultipleBars,
                        'Piped wikilink with parser function in the text'
                );
 
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-test-link-pagenamee' ),
+                       expectedLinkPagenamee,
+                       'External link with parser function in the URL'
+               );
+
                testCases = [
                        [
                                'extlink-html-full',
index d04e0fc..1369406 100644 (file)
@@ -837,30 +837,60 @@ class DjVuSupport {
  * Initialize and detect the tidy support
  */
 class TidySupport {
-       private $internalTidy;
-       private $externalTidy;
+       private $enabled;
+       private $config;
 
        /**
         * Determine if there is a usable tidy.
         */
-       public function __construct() {
-               global $wgTidyBin;
-
-               $this->internalTidy = extension_loaded( 'tidy' ) &&
-                       class_exists( 'tidy' ) && !wfIsHHVM();
-
-               $this->externalTidy = is_executable( $wgTidyBin ) ||
-                       Installer::locateExecutableInDefaultPaths( [ $wgTidyBin ] )
-                       !== false;
-       }
-
-       /**
-        * Returns true if we should use internal tidy.
-        *
-        * @return bool
-        */
-       public function isInternal() {
-               return $this->internalTidy;
+       public function __construct( $useConfiguration = false ) {
+               global $IP, $wgUseTidy, $wgTidyBin, $wgTidyInternal, $wgTidyConfig,
+                       $wgTidyConf, $wgTidyOpts;
+
+               $this->enabled = true;
+               if ( $useConfiguration ) {
+                       if ( $wgTidyConfig !== null ) {
+                               $this->config = $wgTidyConfig;
+                       } elseif ( $wgUseTidy ) {
+                               $this->config = [
+                                       'tidyConfigFile' => $wgTidyConf,
+                                       'debugComment' => false,
+                                       'tidyBin' => $wgTidyBin,
+                                       'tidyCommandLine' => $wgTidyOpts
+                               ];
+                               if ( $wgTidyInternal ) {
+                                       $this->config['driver'] = wfIsHHVM() ? 'RaggettInternalHHVM' : 'RaggettInternalPHP';
+                               } else {
+                                       $this->config['driver'] = 'RaggettExternal';
+                               }
+                       } else {
+                               $this->enabled = false;
+                       }
+               } else {
+                       $this->config = [
+                               'tidyConfigFile' => "$IP/includes/tidy/tidy.conf",
+                               'tidyCommandLine' => '',
+                       ];
+                       if ( extension_loaded( 'tidy' ) && class_exists( 'tidy' ) ) {
+                               $this->config['driver'] = wfIsHHVM() ? 'RaggettInternalHHVM' : 'RaggettInternalPHP';
+                       } else {
+                               if ( is_executable( $wgTidyBin ) ) {
+                                       $this->config['driver'] = 'RaggettExternal';
+                                       $this->config['tidyBin'] = $wgTidyBin;
+                               } else {
+                                       $path = Installer::locateExecutableInDefaultPaths( $wgTidyBin );
+                                       if ( $path !== false ) {
+                                               $this->config['driver'] = 'RaggettExternal';
+                                               $this->config['tidyBin'] = $wgTidyBin;
+                                       } else {
+                                               $this->enabled = false;
+                                       }
+                               }
+                       }
+               }
+               if ( !$this->enabled ) {
+                       $this->config = [ 'driver' => 'disabled' ];
+               }
        }
 
        /**
@@ -869,6 +899,10 @@ class TidySupport {
         * @return bool
         */
        public function isEnabled() {
-               return $this->internalTidy || $this->externalTidy;
+               return $this->enabled;
+       }
+
+       public function getConfig() {
+               return $this->config;
        }
 }